bloblist prep for standard passage
switch order of pinctrl and power domain calls various minor fixes -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAmHgaSsRHHNqZ0BjaHJv bWl1bS5vcmcACgkQfxc6PpAIrea/vwgAljnA0eqFc6nUg2nAF53fkbhiSJ76sRi2 7WTeEj1grRWK/6Ox0p5bk3lo9bC0gqdDsg9CugPIeiMoLrEdZhKlKZ6qAbYpLrSr 55aJ4gIz2iyLcVGrfvM7ln/azO35VIF5LaMAZpiPlH9QsxmhFz/qFXzxgP/pg3U4 KQpPRleuhwtg8//Tb2To8Lb/kiOs99QA5OtH+rTSzXu+4r13CvwRc2+s3a1jKkyW wetOdpj3GzSQ/9Jd4NgYTDHSKuNxC9/HJCZpDnR3L7EIivh+V2TA8xKcvoLza61X 3gZW/Zv0V9vW6euZcRRpbaYHfUEEdgS6ZUHORlSh3LYu7dizcZD+Qg== =HSGe -----END PGP SIGNATURE----- Merge tag 'dm-pull-13jan22' of https://source.denx.de/u-boot/custodians/u-boot-dm bloblist prep for standard passage switch order of pinctrl and power domain calls various minor fixes
This commit is contained in:
commit
25711b07ca
16 changed files with 358 additions and 135 deletions
|
@ -624,7 +624,13 @@ const char *os_dirent_get_typename(enum os_dirent_t type)
|
|||
return os_dirent_typename[OS_FILET_UNKNOWN];
|
||||
}
|
||||
|
||||
int os_get_filesize(const char *fname, loff_t *size)
|
||||
/*
|
||||
* For compatibility reasons avoid loff_t here.
|
||||
* U-Boot defines loff_t as long long.
|
||||
* But /usr/include/linux/types.h may not define it at all.
|
||||
* Alpine Linux being one example.
|
||||
*/
|
||||
int os_get_filesize(const char *fname, long long *size)
|
||||
{
|
||||
struct stat buf;
|
||||
int ret;
|
||||
|
@ -667,7 +673,7 @@ int os_read_ram_buf(const char *fname)
|
|||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
int fd, ret;
|
||||
loff_t size;
|
||||
long long size;
|
||||
|
||||
ret = os_get_filesize(fname, &size);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -23,7 +23,7 @@ int dram_init(void)
|
|||
{
|
||||
struct spl_handoff *ho;
|
||||
|
||||
ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(*ho));
|
||||
ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(*ho));
|
||||
if (!ho)
|
||||
return log_msg_ret("Missing SPL hand-off info", -ENOENT);
|
||||
handoff_load_dram_size(ho);
|
||||
|
@ -56,7 +56,7 @@ int dram_init_banksize(void)
|
|||
{
|
||||
struct spl_handoff *ho;
|
||||
|
||||
ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(*ho));
|
||||
ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(*ho));
|
||||
if (!ho)
|
||||
return log_msg_ret("Missing SPL hand-off info", -ENOENT);
|
||||
handoff_load_dram_banks(ho);
|
||||
|
|
|
@ -717,7 +717,7 @@ config BLOBLIST
|
|||
from TPL to SPL to U-Boot proper (and potentially to Linux). The
|
||||
blob list supports multiple binary blobs of data, each with a tag,
|
||||
so that different U-Boot components can store data which can survive
|
||||
through to the next stage of the boot.
|
||||
through to the next phase of the boot.
|
||||
|
||||
config SPL_BLOBLIST
|
||||
bool "Support for a bloblist in SPL"
|
||||
|
@ -738,15 +738,17 @@ config TPL_BLOBLIST
|
|||
|
||||
if BLOBLIST
|
||||
|
||||
config BLOBLIST_SIZE
|
||||
hex "Size of bloblist"
|
||||
depends on BLOBLIST
|
||||
default 0x400
|
||||
choice
|
||||
prompt "Bloblist location"
|
||||
help
|
||||
Sets the size of the bloblist in bytes. This must include all
|
||||
overhead (alignment, bloblist header, record header). The bloblist
|
||||
is set up in the first part of U-Boot to run (TPL, SPL or U-Boot
|
||||
proper), and this sane bloblist is used for subsequent stages.
|
||||
Select the location of the bloblist, via various means.
|
||||
|
||||
config BLOBLIST_FIXED
|
||||
bool "Place bloblist at a fixed address in memory"
|
||||
help
|
||||
Select this to used a fixed memory address for the bloblist. If the
|
||||
bloblist exists at this address from a previous phase, it used as is.
|
||||
If not it is created at this address in U-Boot.
|
||||
|
||||
config BLOBLIST_ALLOC
|
||||
bool "Allocate bloblist"
|
||||
|
@ -755,18 +757,31 @@ config BLOBLIST_ALLOC
|
|||
specify a fixed address on systems where this is unknown or can
|
||||
change at runtime.
|
||||
|
||||
endchoice
|
||||
|
||||
config BLOBLIST_ADDR
|
||||
hex "Address of bloblist"
|
||||
default 0xc000 if SANDBOX
|
||||
depends on BLOBLIST_FIXED
|
||||
help
|
||||
Sets the address of the bloblist, set up by the first part of U-Boot
|
||||
which runs. Subsequent U-Boot stages typically use the same address.
|
||||
which runs. Subsequent U-Boot phases typically use the same address.
|
||||
|
||||
This is not used if BLOBLIST_ALLOC is selected.
|
||||
|
||||
config BLOBLIST_SIZE
|
||||
hex "Size of bloblist"
|
||||
default 0x400
|
||||
help
|
||||
Sets the size of the bloblist in bytes. This must include all
|
||||
overhead (alignment, bloblist header, record header). The bloblist
|
||||
is set up in the first part of U-Boot to run (TPL, SPL or U-Boot
|
||||
proper), and this sane bloblist is used for subsequent phases.
|
||||
|
||||
config BLOBLIST_SIZE_RELOC
|
||||
hex "Size of bloblist after relocation"
|
||||
default BLOBLIST_SIZE
|
||||
default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC
|
||||
default 0 if BLOBLIST_PASSAGE
|
||||
help
|
||||
Sets the size of the bloblist in bytes after relocation. Since U-Boot
|
||||
has a lot more memory available then, it is possible to use a larger
|
||||
|
@ -775,6 +790,64 @@ config BLOBLIST_SIZE_RELOC
|
|||
|
||||
endif # BLOBLIST
|
||||
|
||||
if SPL_BLOBLIST
|
||||
|
||||
choice
|
||||
prompt "Bloblist location in SPL"
|
||||
help
|
||||
Select the location of the bloblist, via various means. Typically
|
||||
you should use the same value for SPL as for U-Boot, since they need
|
||||
to look in the same place. But if BLOBLIST_ALLOC is used, then a
|
||||
fresh bloblist will be created each time, since there is no shared
|
||||
address (between phases) for the bloblist.
|
||||
|
||||
config SPL_BLOBLIST_FIXED
|
||||
bool "Place bloblist at a fixed address in memory"
|
||||
help
|
||||
Select this to used a fixed memory address for the bloblist. If the
|
||||
bloblist exists at this address from a previous phase, it used as is.
|
||||
If not it is created at this address in SPL.
|
||||
|
||||
config SPL_BLOBLIST_ALLOC
|
||||
bool "Allocate bloblist"
|
||||
help
|
||||
Allocate the bloblist using malloc(). This avoids the need to
|
||||
specify a fixed address on systems where this is unknown or can
|
||||
change at runtime.
|
||||
|
||||
endchoice
|
||||
|
||||
endif # SPL_BLOBLIST
|
||||
|
||||
if TPL_BLOBLIST
|
||||
|
||||
choice
|
||||
prompt "Bloblist location in TPL"
|
||||
help
|
||||
Select the location of the bloblist, via various means. Typically
|
||||
you should use the same value for SPL as for U-Boot, since they need
|
||||
to look in the same place. But if BLOBLIST_ALLOC is used, then a
|
||||
fresh bloblist will be created each time, since there is no shared
|
||||
address (between phases) for the bloblist.
|
||||
|
||||
config TPL_BLOBLIST_FIXED
|
||||
bool "Place bloblist at a fixed address in memory"
|
||||
help
|
||||
Select this to used a fixed memory address for the bloblist. If the
|
||||
bloblist exists at this address from a previous phase, it used as is.
|
||||
If not it is created at this address in TPL.
|
||||
|
||||
config TPL_BLOBLIST_ALLOC
|
||||
bool "Allocate bloblist"
|
||||
help
|
||||
Allocate the bloblist using malloc(). This avoids the need to
|
||||
specify a fixed address on systems where this is unknown or can
|
||||
change at runtime.
|
||||
|
||||
endchoice
|
||||
|
||||
endif # TPL_BLOBLIST
|
||||
|
||||
endmenu
|
||||
|
||||
source "common/spl/Kconfig"
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
// SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
|
||||
/*
|
||||
* Copyright 2018 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#define LOG_DEBUG
|
||||
#define LOG_CATEGORY LOGC_BLOBLIST
|
||||
|
||||
#include <common.h>
|
||||
#include <bloblist.h>
|
||||
#include <log.h>
|
||||
|
@ -29,26 +32,39 @@
|
|||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static const char *const tag_name[] = {
|
||||
[BLOBLISTT_NONE] = "(none)",
|
||||
[BLOBLISTT_EC_HOSTEVENT] = "EC host event",
|
||||
[BLOBLISTT_SPL_HANDOFF] = "SPL hand-off",
|
||||
[BLOBLISTT_VBOOT_CTX] = "Chrome OS vboot context",
|
||||
[BLOBLISTT_VBOOT_HANDOFF] = "Chrome OS vboot hand-off",
|
||||
[BLOBLISTT_ACPI_GNVS] = "ACPI GNVS",
|
||||
[BLOBLISTT_INTEL_VBT] = "Intel Video-BIOS table",
|
||||
[BLOBLISTT_TPM2_TCG_LOG] = "TPM v2 log space",
|
||||
[BLOBLISTT_TCPA_LOG] = "TPM log space",
|
||||
[BLOBLISTT_ACPI_TABLES] = "ACPI tables for x86",
|
||||
[BLOBLISTT_SMBIOS_TABLES] = "SMBIOS tables for x86",
|
||||
static struct tag_name {
|
||||
enum bloblist_tag_t tag;
|
||||
const char *name;
|
||||
} tag_name[] = {
|
||||
{ BLOBLISTT_NONE, "(none)" },
|
||||
|
||||
/* BLOBLISTT_AREA_FIRMWARE_TOP */
|
||||
|
||||
/* BLOBLISTT_AREA_FIRMWARE */
|
||||
{ BLOBLISTT_ACPI_GNVS, "ACPI GNVS" },
|
||||
{ BLOBLISTT_INTEL_VBT, "Intel Video-BIOS table" },
|
||||
{ BLOBLISTT_TPM2_TCG_LOG, "TPM v2 log space" },
|
||||
{ BLOBLISTT_TCPA_LOG, "TPM log space" },
|
||||
{ BLOBLISTT_ACPI_TABLES, "ACPI tables for x86" },
|
||||
{ BLOBLISTT_SMBIOS_TABLES, "SMBIOS tables for x86" },
|
||||
{ BLOBLISTT_VBOOT_CTX, "Chrome OS vboot context" },
|
||||
|
||||
/* BLOBLISTT_PROJECT_AREA */
|
||||
{ BLOBLISTT_U_BOOT_SPL_HANDOFF, "SPL hand-off" },
|
||||
|
||||
/* BLOBLISTT_VENDOR_AREA */
|
||||
};
|
||||
|
||||
const char *bloblist_tag_name(enum bloblist_tag_t tag)
|
||||
{
|
||||
if (tag < 0 || tag >= BLOBLISTT_COUNT)
|
||||
return "invalid";
|
||||
int i;
|
||||
|
||||
return tag_name[tag];
|
||||
for (i = 0; i < ARRAY_SIZE(tag_name); i++) {
|
||||
if (tag_name[i].tag == tag)
|
||||
return tag_name[i].name;
|
||||
}
|
||||
|
||||
return "invalid";
|
||||
}
|
||||
|
||||
static struct bloblist_rec *bloblist_first_blob(struct bloblist_hdr *hdr)
|
||||
|
@ -120,9 +136,8 @@ static int bloblist_addrec(uint tag, int size, int align,
|
|||
new_alloced = data_start + ALIGN(size, align);
|
||||
|
||||
if (new_alloced > hdr->size) {
|
||||
log(LOGC_BLOBLIST, LOGL_ERR,
|
||||
"Failed to allocate %x bytes size=%x, need size=%x\n",
|
||||
size, hdr->size, new_alloced);
|
||||
log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
|
||||
size, hdr->size, new_alloced);
|
||||
return log_msg_ret("bloblist add", -ENOSPC);
|
||||
}
|
||||
rec = (void *)hdr + hdr->alloced;
|
||||
|
@ -236,14 +251,13 @@ static int bloblist_resize_rec(struct bloblist_hdr *hdr,
|
|||
expand_by = ALIGN(new_size - rec->size, BLOBLIST_ALIGN);
|
||||
new_alloced = ALIGN(hdr->alloced + expand_by, BLOBLIST_ALIGN);
|
||||
if (new_size < 0) {
|
||||
log(LOGC_BLOBLIST, LOGL_DEBUG,
|
||||
"Attempt to shrink blob size below 0 (%x)\n", new_size);
|
||||
log_debug("Attempt to shrink blob size below 0 (%x)\n",
|
||||
new_size);
|
||||
return log_msg_ret("size", -EINVAL);
|
||||
}
|
||||
if (new_alloced > hdr->size) {
|
||||
log(LOGC_BLOBLIST, LOGL_ERR,
|
||||
"Failed to allocate %x bytes size=%x, need size=%x\n",
|
||||
new_size, hdr->size, new_alloced);
|
||||
log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
|
||||
new_size, hdr->size, new_alloced);
|
||||
return log_msg_ret("alloc", -ENOSPC);
|
||||
}
|
||||
|
||||
|
@ -334,8 +348,7 @@ int bloblist_check(ulong addr, uint size)
|
|||
return log_msg_ret("Bad size", -EFBIG);
|
||||
chksum = bloblist_calc_chksum(hdr);
|
||||
if (hdr->chksum != chksum) {
|
||||
log(LOGC_BLOBLIST, LOGL_ERR, "Checksum %x != %x\n", hdr->chksum,
|
||||
chksum);
|
||||
log_err("Checksum %x != %x\n", hdr->chksum, chksum);
|
||||
return log_msg_ret("Bad checksum", -EIO);
|
||||
}
|
||||
gd->bloblist = hdr;
|
||||
|
@ -348,10 +361,24 @@ int bloblist_finish(void)
|
|||
struct bloblist_hdr *hdr = gd->bloblist;
|
||||
|
||||
hdr->chksum = bloblist_calc_chksum(hdr);
|
||||
log_debug("Finished bloblist size %lx at %lx\n", (ulong)hdr->size,
|
||||
(ulong)map_to_sysmem(hdr));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ulong bloblist_get_base(void)
|
||||
{
|
||||
return map_to_sysmem(gd->bloblist);
|
||||
}
|
||||
|
||||
ulong bloblist_get_size(void)
|
||||
{
|
||||
struct bloblist_hdr *hdr = gd->bloblist;
|
||||
|
||||
return hdr->size;
|
||||
}
|
||||
|
||||
void bloblist_get_stats(ulong *basep, ulong *sizep, ulong *allocedp)
|
||||
{
|
||||
struct bloblist_hdr *hdr = gd->bloblist;
|
||||
|
@ -383,10 +410,10 @@ void bloblist_show_list(void)
|
|||
struct bloblist_hdr *hdr = gd->bloblist;
|
||||
struct bloblist_rec *rec;
|
||||
|
||||
printf("%-8s %8s Tag Name\n", "Address", "Size");
|
||||
printf("%-8s %8s Tag Name\n", "Address", "Size");
|
||||
for (rec = bloblist_first_blob(hdr); rec;
|
||||
rec = bloblist_next_blob(hdr, rec)) {
|
||||
printf("%08lx %8x %3d %s\n",
|
||||
printf("%08lx %8x %4x %s\n",
|
||||
(ulong)map_to_sysmem((void *)rec + rec->hdr_size),
|
||||
rec->size, rec->tag, bloblist_tag_name(rec->tag));
|
||||
}
|
||||
|
@ -403,8 +430,9 @@ void bloblist_reloc(void *to, uint to_size, void *from, uint from_size)
|
|||
|
||||
int bloblist_init(void)
|
||||
{
|
||||
bool expected;
|
||||
int ret = -ENOENT;
|
||||
ulong addr, size;
|
||||
bool expected;
|
||||
|
||||
/**
|
||||
* Wed expect to find an existing bloblist in the first phase of U-Boot
|
||||
|
@ -413,27 +441,32 @@ int bloblist_init(void)
|
|||
expected = !u_boot_first_phase();
|
||||
if (spl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST))
|
||||
expected = false;
|
||||
if (expected)
|
||||
ret = bloblist_check(CONFIG_BLOBLIST_ADDR,
|
||||
CONFIG_BLOBLIST_SIZE);
|
||||
addr = bloblist_addr();
|
||||
size = CONFIG_BLOBLIST_SIZE;
|
||||
if (expected) {
|
||||
ret = bloblist_check(addr, size);
|
||||
if (ret) {
|
||||
log_warning("Expected bloblist at %lx not found (err=%d)\n",
|
||||
addr, ret);
|
||||
} else {
|
||||
/* Get the real size, if it is not what we expected */
|
||||
size = gd->bloblist->size;
|
||||
}
|
||||
}
|
||||
if (ret) {
|
||||
ulong addr;
|
||||
|
||||
log(LOGC_BLOBLIST, expected ? LOGL_WARNING : LOGL_DEBUG,
|
||||
"Existing bloblist not found: creating new bloblist\n");
|
||||
if (IS_ENABLED(CONFIG_BLOBLIST_ALLOC)) {
|
||||
void *ptr = memalign(BLOBLIST_ALIGN,
|
||||
CONFIG_BLOBLIST_SIZE);
|
||||
if (CONFIG_IS_ENABLED(BLOBLIST_ALLOC)) {
|
||||
void *ptr = memalign(BLOBLIST_ALIGN, size);
|
||||
|
||||
if (!ptr)
|
||||
return log_msg_ret("alloc", -ENOMEM);
|
||||
addr = map_to_sysmem(ptr);
|
||||
} else {
|
||||
addr = CONFIG_BLOBLIST_ADDR;
|
||||
}
|
||||
ret = bloblist_new(addr, CONFIG_BLOBLIST_SIZE, 0);
|
||||
log_debug("Creating new bloblist size %lx at %lx\n", size,
|
||||
addr);
|
||||
ret = bloblist_new(addr, size, 0);
|
||||
} else {
|
||||
log(LOGC_BLOBLIST, LOGL_DEBUG, "Found existing bloblist\n");
|
||||
log_debug("Found existing bloblist size %lx at %lx\n", size,
|
||||
addr);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -283,7 +283,7 @@ static int setup_mon_len(void)
|
|||
static int setup_spl_handoff(void)
|
||||
{
|
||||
#if CONFIG_IS_ENABLED(HANDOFF)
|
||||
gd->spl_handoff = bloblist_find(BLOBLISTT_SPL_HANDOFF,
|
||||
gd->spl_handoff = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF,
|
||||
sizeof(struct spl_handoff));
|
||||
debug("Found SPL hand-off info %p\n", gd->spl_handoff);
|
||||
#endif
|
||||
|
|
|
@ -408,7 +408,7 @@ static int setup_spl_handoff(void)
|
|||
{
|
||||
struct spl_handoff *ho;
|
||||
|
||||
ho = bloblist_ensure(BLOBLISTT_SPL_HANDOFF, sizeof(struct spl_handoff));
|
||||
ho = bloblist_ensure(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(struct spl_handoff));
|
||||
if (!ho)
|
||||
return -ENOENT;
|
||||
|
||||
|
@ -425,7 +425,7 @@ static int write_spl_handoff(void)
|
|||
struct spl_handoff *ho;
|
||||
int ret;
|
||||
|
||||
ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(struct spl_handoff));
|
||||
ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(struct spl_handoff));
|
||||
if (!ho)
|
||||
return -ENOENT;
|
||||
handoff_save_dram(ho);
|
||||
|
|
|
@ -31,7 +31,7 @@ Blobs
|
|||
While each blob in the bloblist can be of any length, bloblists are designed to
|
||||
hold small amounts of data, typically a few KB at most. It is not possible to
|
||||
change the length of a blob once it has been written. Each blob is normally
|
||||
created from a C structure which can beused to access its fields.
|
||||
created from a C structure which can be used to access its fields.
|
||||
|
||||
|
||||
Blob tags
|
||||
|
@ -93,6 +93,12 @@ This should move to using bloblist, to avoid having its own mechanism for
|
|||
passing information between U-Boot parts.
|
||||
|
||||
|
||||
API documentation
|
||||
-----------------
|
||||
|
||||
.. kernel-doc:: include/bloblist.h
|
||||
|
||||
|
||||
Simon Glass
|
||||
sjg@chromium.org
|
||||
12-Aug-2018
|
||||
|
|
|
@ -518,6 +518,14 @@ int device_probe(struct udevice *dev)
|
|||
|
||||
dev_or_flags(dev, DM_FLAG_ACTIVATED);
|
||||
|
||||
if (CONFIG_IS_ENABLED(POWER_DOMAIN) && dev->parent &&
|
||||
(device_get_uclass_id(dev) != UCLASS_POWER_DOMAIN) &&
|
||||
!(drv->flags & DM_FLAG_DEFAULT_PD_CTRL_OFF)) {
|
||||
ret = dev_power_domain_on(dev);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process pinctrl for everything except the root device, and
|
||||
* continue regardless of the result of pinctrl. Don't process pinctrl
|
||||
|
@ -540,14 +548,6 @@ int device_probe(struct udevice *dev)
|
|||
dev->name, ret, errno_str(ret));
|
||||
}
|
||||
|
||||
if (CONFIG_IS_ENABLED(POWER_DOMAIN) && dev->parent &&
|
||||
(device_get_uclass_id(dev) != UCLASS_POWER_DOMAIN) &&
|
||||
!(drv->flags & DM_FLAG_DEFAULT_PD_CTRL_OFF)) {
|
||||
ret = dev_power_domain_on(dev);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (CONFIG_IS_ENABLED(IOMMU) && dev->parent &&
|
||||
(device_get_uclass_id(dev) != UCLASS_IOMMU)) {
|
||||
ret = dev_iommu_enable(dev);
|
||||
|
|
|
@ -104,7 +104,8 @@ static void serial_find_console_or_panic(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!SPL_BUILD || !CONFIG_IS_ENABLED(OF_CONTROL) || !blob) {
|
||||
if (!IS_ENABLED(CONFIG_SPL_BUILD) || !CONFIG_IS_ENABLED(OF_CONTROL) ||
|
||||
!blob) {
|
||||
/*
|
||||
* Try to use CONFIG_CONS_INDEX if available (it is numbered
|
||||
* from 1!).
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/* SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause */
|
||||
/*
|
||||
* This provides a standard way of passing information between boot phases
|
||||
* (TPL -> SPL -> U-Boot proper.)
|
||||
|
@ -13,6 +13,8 @@
|
|||
#ifndef __BLOBLIST_H
|
||||
#define __BLOBLIST_H
|
||||
|
||||
#include <mapmem.h>
|
||||
|
||||
enum {
|
||||
BLOBLIST_VERSION = 0,
|
||||
BLOBLIST_MAGIC = 0xb00757a3,
|
||||
|
@ -23,23 +25,57 @@ enum {
|
|||
enum bloblist_tag_t {
|
||||
BLOBLISTT_NONE = 0,
|
||||
|
||||
/* Vendor-specific tags are permitted here */
|
||||
BLOBLISTT_EC_HOSTEVENT, /* Chromium OS EC host-event mask */
|
||||
BLOBLISTT_SPL_HANDOFF, /* Hand-off info from SPL */
|
||||
BLOBLISTT_VBOOT_CTX, /* Chromium OS verified boot context */
|
||||
BLOBLISTT_VBOOT_HANDOFF, /* Chromium OS internal handoff info */
|
||||
/*
|
||||
* Standard area to allocate blobs used across firmware components, for
|
||||
* things that are very commonly used, particularly in multiple
|
||||
* projects.
|
||||
*/
|
||||
BLOBLISTT_AREA_FIRMWARE_TOP = 0x1,
|
||||
|
||||
/* Standard area to allocate blobs used across firmware components */
|
||||
BLOBLISTT_AREA_FIRMWARE = 0x100,
|
||||
/*
|
||||
* Advanced Configuration and Power Interface Global Non-Volatile
|
||||
* Sleeping table. This forms part of the ACPI tables passed to Linux.
|
||||
*/
|
||||
BLOBLISTT_ACPI_GNVS,
|
||||
BLOBLISTT_INTEL_VBT, /* Intel Video-BIOS table */
|
||||
BLOBLISTT_TPM2_TCG_LOG, /* TPM v2 log space */
|
||||
BLOBLISTT_TCPA_LOG, /* TPM log space */
|
||||
BLOBLISTT_ACPI_TABLES, /* ACPI tables for x86 */
|
||||
BLOBLISTT_SMBIOS_TABLES, /* SMBIOS tables for x86 */
|
||||
BLOBLISTT_ACPI_GNVS = 0x100,
|
||||
BLOBLISTT_INTEL_VBT = 0x101, /* Intel Video-BIOS table */
|
||||
BLOBLISTT_TPM2_TCG_LOG = 0x102, /* TPM v2 log space */
|
||||
BLOBLISTT_TCPA_LOG = 0x103, /* TPM log space */
|
||||
BLOBLISTT_ACPI_TABLES = 0x104, /* ACPI tables for x86 */
|
||||
BLOBLISTT_SMBIOS_TABLES = 0x105, /* SMBIOS tables for x86 */
|
||||
BLOBLISTT_VBOOT_CTX = 0x106, /* Chromium OS verified boot context */
|
||||
|
||||
BLOBLISTT_COUNT
|
||||
/*
|
||||
* Project-specific tags are permitted here. Projects can be open source
|
||||
* or not, but the format of the data must be fuily documented in an
|
||||
* open source project, including all fields, bits, etc. Naming should
|
||||
* be: BLOBLISTT_<project>_<purpose_here>
|
||||
*/
|
||||
BLOBLISTT_PROJECT_AREA = 0x8000,
|
||||
BLOBLISTT_U_BOOT_SPL_HANDOFF = 0x8000, /* Hand-off info from SPL */
|
||||
|
||||
/*
|
||||
* Vendor-specific tags are permitted here. Projects can be open source
|
||||
* or not, but the format of the data must be fuily documented in an
|
||||
* open source project, including all fields, bits, etc. Naming should
|
||||
* be BLOBLISTT_<vendor>_<purpose_here>
|
||||
*/
|
||||
BLOBLISTT_VENDOR_AREA = 0xc000,
|
||||
|
||||
/* Tags after this are not allocated for now */
|
||||
BLOBLISTT_EXPANSION = 0x10000,
|
||||
|
||||
/*
|
||||
* Tags from here are on reserved for private use within a single
|
||||
* firmware binary (i.e. a single executable or phase of a project).
|
||||
* These tags can be passed between binaries within a local
|
||||
* implementation, but cannot be used in upstream code. Allocate a
|
||||
* tag in one of the areas above if you want that.
|
||||
*
|
||||
* This area may move in future.
|
||||
*/
|
||||
BLOBLISTT_PRIVATE_AREA = 0xffff0000,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -50,8 +86,8 @@ enum bloblist_tag_t {
|
|||
* same place in memory as SPL and U-Boot execute, but it can be safely moved
|
||||
* around.
|
||||
*
|
||||
* None of the bloblist structures contain pointers but it is possible to put
|
||||
* pointers inside a bloblist record if desired. This is not encouraged,
|
||||
* None of the bloblist headers themselves contain pointers but it is possible
|
||||
* to put pointers inside a bloblist record if desired. This is not encouraged,
|
||||
* since it can make part of the bloblist inaccessible if the pointer is
|
||||
* no-longer valid. It is better to just store all the data inside a bloblist
|
||||
* record.
|
||||
|
@ -59,11 +95,11 @@ enum bloblist_tag_t {
|
|||
* Each bloblist record is aligned to a 16-byte boundary and follows immediately
|
||||
* from the last.
|
||||
*
|
||||
* @magic: BLOBLIST_MAGIC
|
||||
* @version: BLOBLIST_VERSION
|
||||
* @hdr_size: Size of this header, normally sizeof(struct bloblist_hdr). The
|
||||
* first bloblist_rec starts at this offset from the start of the header
|
||||
* @flags: Space for BLOBLISTF_... flags (none yet)
|
||||
* @magic: BLOBLIST_MAGIC
|
||||
* @flags: Space for BLOBLISTF... flags (none yet)
|
||||
* @size: Total size of the bloblist (non-zero if valid) including this header.
|
||||
* The bloblist extends for this many bytes from the start of this header.
|
||||
* When adding new records, the bloblist can grow up to this size.
|
||||
|
@ -74,14 +110,14 @@ enum bloblist_tag_t {
|
|||
* @chksum: CRC32 for the entire bloblist allocated area. Since any of the
|
||||
* blobs can be altered after being created, this checksum is only valid
|
||||
* when the bloblist is finalised before jumping to the next stage of boot.
|
||||
* Note: @chksum is last to make it easier to exclude it from the checksum
|
||||
* calculation.
|
||||
* Note that chksum is last to make it easier to exclude it from the
|
||||
* checksum calculation.
|
||||
*/
|
||||
struct bloblist_hdr {
|
||||
u32 magic;
|
||||
u32 version;
|
||||
u32 hdr_size;
|
||||
u32 flags;
|
||||
u32 magic;
|
||||
|
||||
u32 size;
|
||||
u32 alloced;
|
||||
|
@ -92,11 +128,11 @@ struct bloblist_hdr {
|
|||
/**
|
||||
* struct bloblist_rec - record for the bloblist
|
||||
*
|
||||
* NOTE: Only exported for testing purposes. Do not use this struct.
|
||||
*
|
||||
* The bloblist contains a number of records each consisting of this record
|
||||
* structure followed by the data contained. Each records is 16-byte aligned.
|
||||
*
|
||||
* NOTE: Only exported for testing purposes. Do not use this struct.
|
||||
*
|
||||
* @tag: Tag indicating what the record contains
|
||||
* @hdr_size: Size of this header, normally sizeof(struct bloblist_rec). The
|
||||
* record's data starts at this offset from the start of the record
|
||||
|
@ -111,6 +147,35 @@ struct bloblist_rec {
|
|||
u32 spare;
|
||||
};
|
||||
|
||||
/* access CONFIG_BLOBLIST_ADDR, dealing with it possibly not being defined */
|
||||
static inline ulong bloblist_addr(void)
|
||||
{
|
||||
#ifdef CONFIG_BLOBLIST_FIXED
|
||||
return CONFIG_BLOBLIST_ADDR;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* bloblist_check_magic() - return a bloblist if the magic matches
|
||||
*
|
||||
* @addr: Address to check
|
||||
* Return: pointer to bloblist, if the magic matches, else NULL
|
||||
*/
|
||||
static inline void *bloblist_check_magic(ulong addr)
|
||||
{
|
||||
u32 *ptr;
|
||||
|
||||
if (!addr)
|
||||
return NULL;
|
||||
ptr = map_sysmem(addr, 0);
|
||||
if (*ptr != BLOBLIST_MAGIC)
|
||||
return NULL;
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* bloblist_find() - Find a blob
|
||||
*
|
||||
|
@ -118,8 +183,8 @@ struct bloblist_rec {
|
|||
*
|
||||
* @tag: Tag to search for (enum bloblist_tag_t)
|
||||
* @size: Expected size of the blob, or 0 for any size
|
||||
* @return pointer to blob if found, or NULL if not found, or a blob was found
|
||||
* but it is the wrong size
|
||||
* Return: pointer to blob if found, or NULL if not found, or a blob was found
|
||||
* but it is the wrong size
|
||||
*/
|
||||
void *bloblist_find(uint tag, int size);
|
||||
|
||||
|
@ -135,8 +200,8 @@ void *bloblist_find(uint tag, int size);
|
|||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @size: Size of the blob
|
||||
* @align: Alignment of the blob (in bytes), 0 for default
|
||||
* @return pointer to the newly added block, or NULL if there is not enough
|
||||
* space for the blob
|
||||
* Return: pointer to the newly added block, or NULL if there is not enough
|
||||
* space for the blob
|
||||
*/
|
||||
void *bloblist_add(uint tag, int size, int align);
|
||||
|
||||
|
@ -149,8 +214,8 @@ void *bloblist_add(uint tag, int size, int align);
|
|||
* @size: Size of the blob
|
||||
* @blobp: Returns a pointer to blob on success
|
||||
* @align: Alignment of the blob (in bytes), 0 for default
|
||||
* @return 0 if OK, -ENOSPC if it is missing and could not be added due to lack
|
||||
* of space, or -ESPIPE it exists but has the wrong size
|
||||
* Return: 0 if OK, -ENOSPC if it is missing and could not be added due to lack
|
||||
* of space, or -ESPIPE it exists but has the wrong size
|
||||
*/
|
||||
int bloblist_ensure_size(uint tag, int size, int align, void **blobp);
|
||||
|
||||
|
@ -161,8 +226,8 @@ int bloblist_ensure_size(uint tag, int size, int align, void **blobp);
|
|||
*
|
||||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @size: Size of the blob
|
||||
* @return pointer to blob, or NULL if it is missing and could not be added due
|
||||
* to lack of space, or it exists but has the wrong size
|
||||
* Return: pointer to blob, or NULL if it is missing and could not be added due
|
||||
* to lack of space, or it exists but has the wrong size
|
||||
*/
|
||||
void *bloblist_ensure(uint tag, int size);
|
||||
|
||||
|
@ -174,8 +239,8 @@ void *bloblist_ensure(uint tag, int size);
|
|||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @sizep: Size of the blob to create; returns size of actual blob
|
||||
* @blobp: Returns a pointer to blob on success
|
||||
* @return 0 if OK, -ENOSPC if it is missing and could not be added due to lack
|
||||
* of space
|
||||
* Return: 0 if OK, -ENOSPC if it is missing and could not be added due to lack
|
||||
* of space
|
||||
*/
|
||||
int bloblist_ensure_size_ret(uint tag, int *sizep, void **blobp);
|
||||
|
||||
|
@ -187,8 +252,8 @@ int bloblist_ensure_size_ret(uint tag, int *sizep, void **blobp);
|
|||
*
|
||||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @new_size: New size of the blob (>0 to expand, <0 to contract)
|
||||
* @return 0 if OK, -ENOSPC if the bloblist does not have enough space, -ENOENT
|
||||
* if the tag is not found
|
||||
* Return: 0 if OK, -ENOSPC if the bloblist does not have enough space, -ENOENT
|
||||
* if the tag is not found
|
||||
*/
|
||||
int bloblist_resize(uint tag, int new_size);
|
||||
|
||||
|
@ -198,8 +263,8 @@ int bloblist_resize(uint tag, int new_size);
|
|||
* @addr: Address of bloblist
|
||||
* @size: Initial size for bloblist
|
||||
* @flags: Flags to use for bloblist
|
||||
* @return 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the
|
||||
* area is not large enough
|
||||
* Return: 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the
|
||||
* area is not large enough
|
||||
*/
|
||||
int bloblist_new(ulong addr, uint size, uint flags);
|
||||
|
||||
|
@ -208,11 +273,11 @@ int bloblist_new(ulong addr, uint size, uint flags);
|
|||
*
|
||||
* @addr: Address of bloblist
|
||||
* @size: Expected size of blobsize, or 0 to detect the size
|
||||
* @return 0 if OK, -ENOENT if the magic number doesn't match (indicating that
|
||||
* there problem is no bloblist at the given address), -EPROTONOSUPPORT
|
||||
* if the version does not match, -EIO if the checksum does not match,
|
||||
* -EFBIG if the expected size does not match the detected size, -ENOSPC
|
||||
* if the size is not large enough to hold the headers
|
||||
* Return: 0 if OK, -ENOENT if the magic number doesn't match (indicating that
|
||||
* there problem is no bloblist at the given address), -EPROTONOSUPPORT
|
||||
* if the version does not match, -EIO if the checksum does not match,
|
||||
* -EFBIG if the expected size does not match the detected size, -ENOSPC
|
||||
* if the size is not large enough to hold the headers
|
||||
*/
|
||||
int bloblist_check(ulong addr, uint size);
|
||||
|
||||
|
@ -222,7 +287,7 @@ int bloblist_check(ulong addr, uint size);
|
|||
* This sets the correct checksum for the bloblist. This ensures that the
|
||||
* bloblist will be detected correctly by the next phase of U-Boot.
|
||||
*
|
||||
* @return 0
|
||||
* Return: 0
|
||||
*/
|
||||
int bloblist_finish(void);
|
||||
|
||||
|
@ -237,6 +302,20 @@ int bloblist_finish(void);
|
|||
*/
|
||||
void bloblist_get_stats(ulong *basep, ulong *sizep, ulong *allocedp);
|
||||
|
||||
/**
|
||||
* bloblist_get_base() - Get the base address of the bloblist
|
||||
*
|
||||
* Return: base address of bloblist
|
||||
*/
|
||||
ulong bloblist_get_base(void);
|
||||
|
||||
/**
|
||||
* bloblist_get_size() - Get the size of the bloblist
|
||||
*
|
||||
* Return: the size in bytes
|
||||
*/
|
||||
ulong bloblist_get_size(void);
|
||||
|
||||
/**
|
||||
* bloblist_show_stats() - Show information about the bloblist
|
||||
*
|
||||
|
@ -255,7 +334,7 @@ void bloblist_show_list(void);
|
|||
* bloblist_tag_name() - Get the name for a tag
|
||||
*
|
||||
* @tag: Tag to check
|
||||
* @return name of tag, or "invalid" if an invalid tag is provided
|
||||
* Return: name of tag, or "invalid" if an invalid tag is provided
|
||||
*/
|
||||
const char *bloblist_tag_name(enum bloblist_tag_t tag);
|
||||
|
||||
|
@ -263,7 +342,7 @@ const char *bloblist_tag_name(enum bloblist_tag_t tag);
|
|||
* bloblist_reloc() - Relocate the bloblist and optionally resize it
|
||||
*
|
||||
* @to: Pointer to new bloblist location (must not overlap old location)
|
||||
* @to:size: New size for bloblist (must be larger than from_size)
|
||||
* @to_size: New size for bloblist (must be larger than from_size)
|
||||
* @from: Pointer to bloblist to relocate
|
||||
* @from_size: Size of bloblist to relocate
|
||||
*/
|
||||
|
@ -272,8 +351,19 @@ void bloblist_reloc(void *to, uint to_size, void *from, uint from_size);
|
|||
/**
|
||||
* bloblist_init() - Init the bloblist system with a single bloblist
|
||||
*
|
||||
* This uses CONFIG_BLOBLIST_ADDR and CONFIG_BLOBLIST_SIZE to set up a bloblist
|
||||
* for use by U-Boot.
|
||||
* This locates and sets up the blocklist for use.
|
||||
*
|
||||
* If CONFIG_BLOBLIST_FIXED is selected, it uses CONFIG_BLOBLIST_ADDR and
|
||||
* CONFIG_BLOBLIST_SIZE to set up a bloblist for use by U-Boot.
|
||||
*
|
||||
* If CONFIG_BLOBLIST_ALLOC is selected, it allocates memory for a bloblist of
|
||||
* size CONFIG_BLOBLIST_SIZE.
|
||||
*
|
||||
* If CONFIG_BLOBLIST_PASSAGE is selected, it uses the bloblist in the incoming
|
||||
* standard passage. The size is detected automatically so CONFIG_BLOBLIST_SIZE
|
||||
* can be 0.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error
|
||||
*/
|
||||
int bloblist_init(void);
|
||||
|
||||
|
|
|
@ -49,12 +49,6 @@ struct fdt_memory {
|
|||
|
||||
struct bd_info;
|
||||
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
#define SPL_BUILD 1
|
||||
#else
|
||||
#define SPL_BUILD 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* enum fdt_source_t - indicates where the devicetree came from
|
||||
*
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _LINUX_STDDEF_H
|
||||
#define _LINUX_STDDEF_H
|
||||
|
||||
#include <linux/compiler_types.h>
|
||||
|
||||
#undef NULL
|
||||
#if defined(__cplusplus)
|
||||
#define NULL 0
|
||||
|
@ -14,7 +16,11 @@
|
|||
|
||||
#ifndef __CHECKER__
|
||||
#undef offsetof
|
||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||
#ifdef __compiler_offsetof
|
||||
#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
|
||||
#else
|
||||
#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -266,7 +266,7 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
|
|||
* @size: size of file is returned if no error
|
||||
* Return: 0 on success or -1 if an error ocurred
|
||||
*/
|
||||
int os_get_filesize(const char *fname, loff_t *size);
|
||||
int os_get_filesize(const char *fname, long long *size);
|
||||
|
||||
/**
|
||||
* os_putc() - write a character to the controlling OS terminal
|
||||
|
|
|
@ -19,9 +19,9 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||
UNIT_TEST(_name, _flags, bloblist_test)
|
||||
|
||||
enum {
|
||||
TEST_TAG = 1,
|
||||
TEST_TAG2 = 2,
|
||||
TEST_TAG_MISSING = 3,
|
||||
TEST_TAG = BLOBLISTT_U_BOOT_SPL_HANDOFF,
|
||||
TEST_TAG2 = BLOBLISTT_VBOOT_CTX,
|
||||
TEST_TAG_MISSING = 0x10000,
|
||||
|
||||
TEST_SIZE = 10,
|
||||
TEST_SIZE2 = 20,
|
||||
|
@ -71,7 +71,9 @@ static int bloblist_test_init(struct unit_test_state *uts)
|
|||
|
||||
hdr = clear_bloblist();
|
||||
ut_asserteq(-ENOENT, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
ut_asserteq_ptr(NULL, bloblist_check_magic(TEST_ADDR));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_asserteq_ptr(hdr, bloblist_check_magic(TEST_ADDR));
|
||||
hdr->version++;
|
||||
ut_asserteq(-EPROTONOSUPPORT, bloblist_check(TEST_ADDR,
|
||||
TEST_BLOBLIST_SIZE));
|
||||
|
@ -83,6 +85,11 @@ static int bloblist_test_init(struct unit_test_state *uts)
|
|||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
ut_assertok(bloblist_finish());
|
||||
ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
|
||||
hdr->magic++;
|
||||
ut_asserteq_ptr(NULL, bloblist_check_magic(TEST_ADDR));
|
||||
hdr->magic--;
|
||||
|
||||
hdr->flags++;
|
||||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
|
||||
|
@ -100,6 +107,8 @@ static int bloblist_test_blob(struct unit_test_state *uts)
|
|||
hdr = clear_bloblist();
|
||||
ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_asserteq(TEST_BLOBLIST_SIZE, bloblist_get_size());
|
||||
ut_asserteq(TEST_ADDR, bloblist_get_base());
|
||||
ut_asserteq(map_to_sysmem(hdr), TEST_ADDR);
|
||||
|
||||
/* Add a record and check that we can find it */
|
||||
|
@ -281,10 +290,10 @@ static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
|||
ut_silence_console(uts);
|
||||
console_record_reset();
|
||||
run_command("bloblist list", 0);
|
||||
ut_assert_nextline("Address Size Tag Name");
|
||||
ut_assert_nextline("%08lx %8x 1 EC host event",
|
||||
ut_assert_nextline("Address Size Tag Name");
|
||||
ut_assert_nextline("%08lx %8x 8000 SPL hand-off",
|
||||
(ulong)map_to_sysmem(data), TEST_SIZE);
|
||||
ut_assert_nextline("%08lx %8x 2 SPL hand-off",
|
||||
ut_assert_nextline("%08lx %8x 106 Chrome OS vboot context",
|
||||
(ulong)map_to_sysmem(data2), TEST_SIZE2);
|
||||
ut_assert_console_end();
|
||||
ut_unsilence_console(uts);
|
||||
|
|
|
@ -430,7 +430,7 @@ def main():
|
|||
# Add options here
|
||||
parser.add_option('-f', '--force', action="store_true", default=False,
|
||||
help='regenerate the output even if it is new')
|
||||
parser.add_option('-j', '--jobs', type='int', default=cpu_count,
|
||||
parser.add_option('-j', '--jobs', type='int', default=min(cpu_count, 240),
|
||||
help='the number of jobs to run simultaneously')
|
||||
parser.add_option('-o', '--output', default=OUTPUT_FILE,
|
||||
help='output file [default=%s]' % OUTPUT_FILE)
|
||||
|
|
|
@ -616,9 +616,14 @@ def GetAliasFile():
|
|||
"""
|
||||
fname = command.OutputOneLine('git', 'config', 'sendemail.aliasesfile',
|
||||
raise_on_error=False)
|
||||
if fname:
|
||||
fname = os.path.join(GetTopLevel(), fname.strip())
|
||||
return fname
|
||||
if not fname:
|
||||
return None
|
||||
|
||||
fname = os.path.expanduser(fname.strip())
|
||||
if os.path.isabs(fname):
|
||||
return fname
|
||||
|
||||
return os.path.join(GetTopLevel(), fname)
|
||||
|
||||
def GetDefaultUserName():
|
||||
"""Gets the user.name from .gitconfig file.
|
||||
|
|
Loading…
Reference in a new issue