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:
Tom Rini 2022-01-13 14:33:02 -05:00
commit 25711b07ca
16 changed files with 358 additions and 135 deletions

View file

@ -624,7 +624,13 @@ const char *os_dirent_get_typename(enum os_dirent_t type)
return os_dirent_typename[OS_FILET_UNKNOWN]; 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; struct stat buf;
int ret; int ret;
@ -667,7 +673,7 @@ int os_read_ram_buf(const char *fname)
{ {
struct sandbox_state *state = state_get_current(); struct sandbox_state *state = state_get_current();
int fd, ret; int fd, ret;
loff_t size; long long size;
ret = os_get_filesize(fname, &size); ret = os_get_filesize(fname, &size);
if (ret < 0) if (ret < 0)

View file

@ -23,7 +23,7 @@ int dram_init(void)
{ {
struct spl_handoff *ho; struct spl_handoff *ho;
ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(*ho)); ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(*ho));
if (!ho) if (!ho)
return log_msg_ret("Missing SPL hand-off info", -ENOENT); return log_msg_ret("Missing SPL hand-off info", -ENOENT);
handoff_load_dram_size(ho); handoff_load_dram_size(ho);
@ -56,7 +56,7 @@ int dram_init_banksize(void)
{ {
struct spl_handoff *ho; struct spl_handoff *ho;
ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(*ho)); ho = bloblist_find(BLOBLISTT_U_BOOT_SPL_HANDOFF, sizeof(*ho));
if (!ho) if (!ho)
return log_msg_ret("Missing SPL hand-off info", -ENOENT); return log_msg_ret("Missing SPL hand-off info", -ENOENT);
handoff_load_dram_banks(ho); handoff_load_dram_banks(ho);

View file

@ -717,7 +717,7 @@ config BLOBLIST
from TPL to SPL to U-Boot proper (and potentially to Linux). The 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, blob list supports multiple binary blobs of data, each with a tag,
so that different U-Boot components can store data which can survive 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 config SPL_BLOBLIST
bool "Support for a bloblist in SPL" bool "Support for a bloblist in SPL"
@ -738,15 +738,17 @@ config TPL_BLOBLIST
if BLOBLIST if BLOBLIST
config BLOBLIST_SIZE choice
hex "Size of bloblist" prompt "Bloblist location"
depends on BLOBLIST
default 0x400
help help
Sets the size of the bloblist in bytes. This must include all Select the location of the bloblist, via various means.
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 config BLOBLIST_FIXED
proper), and this sane bloblist is used for subsequent stages. 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 config BLOBLIST_ALLOC
bool "Allocate bloblist" bool "Allocate bloblist"
@ -755,18 +757,31 @@ config BLOBLIST_ALLOC
specify a fixed address on systems where this is unknown or can specify a fixed address on systems where this is unknown or can
change at runtime. change at runtime.
endchoice
config BLOBLIST_ADDR config BLOBLIST_ADDR
hex "Address of bloblist" hex "Address of bloblist"
default 0xc000 if SANDBOX default 0xc000 if SANDBOX
depends on BLOBLIST_FIXED
help help
Sets the address of the bloblist, set up by the first part of U-Boot 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. 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 config BLOBLIST_SIZE_RELOC
hex "Size of bloblist after relocation" hex "Size of bloblist after relocation"
default BLOBLIST_SIZE default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC
default 0 if BLOBLIST_PASSAGE
help help
Sets the size of the bloblist in bytes after relocation. Since U-Boot 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 has a lot more memory available then, it is possible to use a larger
@ -775,6 +790,64 @@ config BLOBLIST_SIZE_RELOC
endif # BLOBLIST 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 endmenu
source "common/spl/Kconfig" source "common/spl/Kconfig"

View file

@ -1,9 +1,12 @@
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
/* /*
* Copyright 2018 Google, Inc * Copyright 2018 Google, Inc
* Written by Simon Glass <sjg@chromium.org> * Written by Simon Glass <sjg@chromium.org>
*/ */
#define LOG_DEBUG
#define LOG_CATEGORY LOGC_BLOBLIST
#include <common.h> #include <common.h>
#include <bloblist.h> #include <bloblist.h>
#include <log.h> #include <log.h>
@ -29,26 +32,39 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
static const char *const tag_name[] = { static struct tag_name {
[BLOBLISTT_NONE] = "(none)", enum bloblist_tag_t tag;
[BLOBLISTT_EC_HOSTEVENT] = "EC host event", const char *name;
[BLOBLISTT_SPL_HANDOFF] = "SPL hand-off", } tag_name[] = {
[BLOBLISTT_VBOOT_CTX] = "Chrome OS vboot context", { BLOBLISTT_NONE, "(none)" },
[BLOBLISTT_VBOOT_HANDOFF] = "Chrome OS vboot hand-off",
[BLOBLISTT_ACPI_GNVS] = "ACPI GNVS", /* BLOBLISTT_AREA_FIRMWARE_TOP */
[BLOBLISTT_INTEL_VBT] = "Intel Video-BIOS table",
[BLOBLISTT_TPM2_TCG_LOG] = "TPM v2 log space", /* BLOBLISTT_AREA_FIRMWARE */
[BLOBLISTT_TCPA_LOG] = "TPM log space", { BLOBLISTT_ACPI_GNVS, "ACPI GNVS" },
[BLOBLISTT_ACPI_TABLES] = "ACPI tables for x86", { BLOBLISTT_INTEL_VBT, "Intel Video-BIOS table" },
[BLOBLISTT_SMBIOS_TABLES] = "SMBIOS tables for x86", { 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) const char *bloblist_tag_name(enum bloblist_tag_t tag)
{ {
if (tag < 0 || tag >= BLOBLISTT_COUNT) int i;
return "invalid";
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) 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); new_alloced = data_start + ALIGN(size, align);
if (new_alloced > hdr->size) { if (new_alloced > hdr->size) {
log(LOGC_BLOBLIST, LOGL_ERR, log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
"Failed to allocate %x bytes size=%x, need size=%x\n", size, hdr->size, new_alloced);
size, hdr->size, new_alloced);
return log_msg_ret("bloblist add", -ENOSPC); return log_msg_ret("bloblist add", -ENOSPC);
} }
rec = (void *)hdr + hdr->alloced; 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); expand_by = ALIGN(new_size - rec->size, BLOBLIST_ALIGN);
new_alloced = ALIGN(hdr->alloced + expand_by, BLOBLIST_ALIGN); new_alloced = ALIGN(hdr->alloced + expand_by, BLOBLIST_ALIGN);
if (new_size < 0) { if (new_size < 0) {
log(LOGC_BLOBLIST, LOGL_DEBUG, log_debug("Attempt to shrink blob size below 0 (%x)\n",
"Attempt to shrink blob size below 0 (%x)\n", new_size); new_size);
return log_msg_ret("size", -EINVAL); return log_msg_ret("size", -EINVAL);
} }
if (new_alloced > hdr->size) { if (new_alloced > hdr->size) {
log(LOGC_BLOBLIST, LOGL_ERR, log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
"Failed to allocate %x bytes size=%x, need size=%x\n", new_size, hdr->size, new_alloced);
new_size, hdr->size, new_alloced);
return log_msg_ret("alloc", -ENOSPC); return log_msg_ret("alloc", -ENOSPC);
} }
@ -334,8 +348,7 @@ int bloblist_check(ulong addr, uint size)
return log_msg_ret("Bad size", -EFBIG); return log_msg_ret("Bad size", -EFBIG);
chksum = bloblist_calc_chksum(hdr); chksum = bloblist_calc_chksum(hdr);
if (hdr->chksum != chksum) { if (hdr->chksum != chksum) {
log(LOGC_BLOBLIST, LOGL_ERR, "Checksum %x != %x\n", hdr->chksum, log_err("Checksum %x != %x\n", hdr->chksum, chksum);
chksum);
return log_msg_ret("Bad checksum", -EIO); return log_msg_ret("Bad checksum", -EIO);
} }
gd->bloblist = hdr; gd->bloblist = hdr;
@ -348,10 +361,24 @@ int bloblist_finish(void)
struct bloblist_hdr *hdr = gd->bloblist; struct bloblist_hdr *hdr = gd->bloblist;
hdr->chksum = bloblist_calc_chksum(hdr); 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; 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) void bloblist_get_stats(ulong *basep, ulong *sizep, ulong *allocedp)
{ {
struct bloblist_hdr *hdr = gd->bloblist; struct bloblist_hdr *hdr = gd->bloblist;
@ -383,10 +410,10 @@ void bloblist_show_list(void)
struct bloblist_hdr *hdr = gd->bloblist; struct bloblist_hdr *hdr = gd->bloblist;
struct bloblist_rec *rec; 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; for (rec = bloblist_first_blob(hdr); rec;
rec = bloblist_next_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), (ulong)map_to_sysmem((void *)rec + rec->hdr_size),
rec->size, rec->tag, bloblist_tag_name(rec->tag)); 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) int bloblist_init(void)
{ {
bool expected;
int ret = -ENOENT; int ret = -ENOENT;
ulong addr, size;
bool expected;
/** /**
* Wed expect to find an existing bloblist in the first phase of U-Boot * 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(); expected = !u_boot_first_phase();
if (spl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST)) if (spl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST))
expected = false; expected = false;
if (expected) addr = bloblist_addr();
ret = bloblist_check(CONFIG_BLOBLIST_ADDR, size = CONFIG_BLOBLIST_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) { if (ret) {
ulong addr; if (CONFIG_IS_ENABLED(BLOBLIST_ALLOC)) {
void *ptr = memalign(BLOBLIST_ALIGN, size);
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 (!ptr) if (!ptr)
return log_msg_ret("alloc", -ENOMEM); return log_msg_ret("alloc", -ENOMEM);
addr = map_to_sysmem(ptr); 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 { } else {
log(LOGC_BLOBLIST, LOGL_DEBUG, "Found existing bloblist\n"); log_debug("Found existing bloblist size %lx at %lx\n", size,
addr);
} }
return ret; return ret;

View file

@ -283,7 +283,7 @@ static int setup_mon_len(void)
static int setup_spl_handoff(void) static int setup_spl_handoff(void)
{ {
#if CONFIG_IS_ENABLED(HANDOFF) #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)); sizeof(struct spl_handoff));
debug("Found SPL hand-off info %p\n", gd->spl_handoff); debug("Found SPL hand-off info %p\n", gd->spl_handoff);
#endif #endif

View file

@ -408,7 +408,7 @@ static int setup_spl_handoff(void)
{ {
struct spl_handoff *ho; 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) if (!ho)
return -ENOENT; return -ENOENT;
@ -425,7 +425,7 @@ static int write_spl_handoff(void)
struct spl_handoff *ho; struct spl_handoff *ho;
int ret; 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) if (!ho)
return -ENOENT; return -ENOENT;
handoff_save_dram(ho); handoff_save_dram(ho);

View file

@ -31,7 +31,7 @@ Blobs
While each blob in the bloblist can be of any length, bloblists are designed to 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 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 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 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. passing information between U-Boot parts.
API documentation
-----------------
.. kernel-doc:: include/bloblist.h
Simon Glass Simon Glass
sjg@chromium.org sjg@chromium.org
12-Aug-2018 12-Aug-2018

View file

@ -518,6 +518,14 @@ int device_probe(struct udevice *dev)
dev_or_flags(dev, DM_FLAG_ACTIVATED); 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 * Process pinctrl for everything except the root device, and
* continue regardless of the result of pinctrl. Don't process pinctrl * 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)); 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 && if (CONFIG_IS_ENABLED(IOMMU) && dev->parent &&
(device_get_uclass_id(dev) != UCLASS_IOMMU)) { (device_get_uclass_id(dev) != UCLASS_IOMMU)) {
ret = dev_iommu_enable(dev); ret = dev_iommu_enable(dev);

View file

@ -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 * Try to use CONFIG_CONS_INDEX if available (it is numbered
* from 1!). * from 1!).

View file

@ -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 * This provides a standard way of passing information between boot phases
* (TPL -> SPL -> U-Boot proper.) * (TPL -> SPL -> U-Boot proper.)
@ -13,6 +13,8 @@
#ifndef __BLOBLIST_H #ifndef __BLOBLIST_H
#define __BLOBLIST_H #define __BLOBLIST_H
#include <mapmem.h>
enum { enum {
BLOBLIST_VERSION = 0, BLOBLIST_VERSION = 0,
BLOBLIST_MAGIC = 0xb00757a3, BLOBLIST_MAGIC = 0xb00757a3,
@ -23,23 +25,57 @@ enum {
enum bloblist_tag_t { enum bloblist_tag_t {
BLOBLISTT_NONE = 0, BLOBLISTT_NONE = 0,
/* Vendor-specific tags are permitted here */ /*
BLOBLISTT_EC_HOSTEVENT, /* Chromium OS EC host-event mask */ * Standard area to allocate blobs used across firmware components, for
BLOBLISTT_SPL_HANDOFF, /* Hand-off info from SPL */ * things that are very commonly used, particularly in multiple
BLOBLISTT_VBOOT_CTX, /* Chromium OS verified boot context */ * projects.
BLOBLISTT_VBOOT_HANDOFF, /* Chromium OS internal handoff info */ */
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 * Advanced Configuration and Power Interface Global Non-Volatile
* Sleeping table. This forms part of the ACPI tables passed to Linux. * Sleeping table. This forms part of the ACPI tables passed to Linux.
*/ */
BLOBLISTT_ACPI_GNVS, BLOBLISTT_ACPI_GNVS = 0x100,
BLOBLISTT_INTEL_VBT, /* Intel Video-BIOS table */ BLOBLISTT_INTEL_VBT = 0x101, /* Intel Video-BIOS table */
BLOBLISTT_TPM2_TCG_LOG, /* TPM v2 log space */ BLOBLISTT_TPM2_TCG_LOG = 0x102, /* TPM v2 log space */
BLOBLISTT_TCPA_LOG, /* TPM log space */ BLOBLISTT_TCPA_LOG = 0x103, /* TPM log space */
BLOBLISTT_ACPI_TABLES, /* ACPI tables for x86 */ BLOBLISTT_ACPI_TABLES = 0x104, /* ACPI tables for x86 */
BLOBLISTT_SMBIOS_TABLES, /* SMBIOS 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 * same place in memory as SPL and U-Boot execute, but it can be safely moved
* around. * around.
* *
* None of the bloblist structures contain pointers but it is possible to put * None of the bloblist headers themselves contain pointers but it is possible
* pointers inside a bloblist record if desired. This is not encouraged, * 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 * 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 * no-longer valid. It is better to just store all the data inside a bloblist
* record. * record.
@ -59,11 +95,11 @@ enum bloblist_tag_t {
* Each bloblist record is aligned to a 16-byte boundary and follows immediately * Each bloblist record is aligned to a 16-byte boundary and follows immediately
* from the last. * from the last.
* *
* @magic: BLOBLIST_MAGIC
* @version: BLOBLIST_VERSION * @version: BLOBLIST_VERSION
* @hdr_size: Size of this header, normally sizeof(struct bloblist_hdr). The * @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 * first bloblist_rec starts at this offset from the start of the header
* @flags: Space for BLOBLISTF_... flags (none yet) * @flags: Space for BLOBLISTF... flags (none yet)
* @magic: BLOBLIST_MAGIC
* @size: Total size of the bloblist (non-zero if valid) including this header. * @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. * 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. * 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 * @chksum: CRC32 for the entire bloblist allocated area. Since any of the
* blobs can be altered after being created, this checksum is only valid * 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. * 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 * Note that chksum is last to make it easier to exclude it from the
* calculation. * checksum calculation.
*/ */
struct bloblist_hdr { struct bloblist_hdr {
u32 magic;
u32 version; u32 version;
u32 hdr_size; u32 hdr_size;
u32 flags; u32 flags;
u32 magic;
u32 size; u32 size;
u32 alloced; u32 alloced;
@ -92,11 +128,11 @@ struct bloblist_hdr {
/** /**
* struct bloblist_rec - record for the bloblist * 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 * The bloblist contains a number of records each consisting of this record
* structure followed by the data contained. Each records is 16-byte aligned. * 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 * @tag: Tag indicating what the record contains
* @hdr_size: Size of this header, normally sizeof(struct bloblist_rec). The * @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 * record's data starts at this offset from the start of the record
@ -111,6 +147,35 @@ struct bloblist_rec {
u32 spare; 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 * bloblist_find() - Find a blob
* *
@ -118,8 +183,8 @@ struct bloblist_rec {
* *
* @tag: Tag to search for (enum bloblist_tag_t) * @tag: Tag to search for (enum bloblist_tag_t)
* @size: Expected size of the blob, or 0 for any size * @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 * Return: pointer to blob if found, or NULL if not found, or a blob was found
* but it is the wrong size * but it is the wrong size
*/ */
void *bloblist_find(uint tag, int 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) * @tag: Tag to add (enum bloblist_tag_t)
* @size: Size of the blob * @size: Size of the blob
* @align: Alignment of the blob (in bytes), 0 for default * @align: Alignment of the blob (in bytes), 0 for default
* @return pointer to the newly added block, or NULL if there is not enough * Return: pointer to the newly added block, or NULL if there is not enough
* space for the blob * space for the blob
*/ */
void *bloblist_add(uint tag, int size, int align); 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 * @size: Size of the blob
* @blobp: Returns a pointer to blob on success * @blobp: Returns a pointer to blob on success
* @align: Alignment of the blob (in bytes), 0 for default * @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 * 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 * of space, or -ESPIPE it exists but has the wrong size
*/ */
int bloblist_ensure_size(uint tag, int size, int align, void **blobp); 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) * @tag: Tag to add (enum bloblist_tag_t)
* @size: Size of the blob * @size: Size of the blob
* @return pointer to blob, or NULL if it is missing and could not be added due * 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 * to lack of space, or it exists but has the wrong size
*/ */
void *bloblist_ensure(uint tag, int 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) * @tag: Tag to add (enum bloblist_tag_t)
* @sizep: Size of the blob to create; returns size of actual blob * @sizep: Size of the blob to create; returns size of actual blob
* @blobp: Returns a pointer to blob on success * @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 * Return: 0 if OK, -ENOSPC if it is missing and could not be added due to lack
* of space * of space
*/ */
int bloblist_ensure_size_ret(uint tag, int *sizep, void **blobp); 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) * @tag: Tag to add (enum bloblist_tag_t)
* @new_size: New size of the blob (>0 to expand, <0 to contract) * @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 * Return: 0 if OK, -ENOSPC if the bloblist does not have enough space, -ENOENT
* if the tag is not found * if the tag is not found
*/ */
int bloblist_resize(uint tag, int new_size); int bloblist_resize(uint tag, int new_size);
@ -198,8 +263,8 @@ int bloblist_resize(uint tag, int new_size);
* @addr: Address of bloblist * @addr: Address of bloblist
* @size: Initial size for bloblist * @size: Initial size for bloblist
* @flags: Flags to use for bloblist * @flags: Flags to use for bloblist
* @return 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the * Return: 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the
* area is not large enough * area is not large enough
*/ */
int bloblist_new(ulong addr, uint size, uint flags); 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 * @addr: Address of bloblist
* @size: Expected size of blobsize, or 0 to detect the size * @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 * Return: 0 if OK, -ENOENT if the magic number doesn't match (indicating that
* there problem is no bloblist at the given address), -EPROTONOSUPPORT * there problem is no bloblist at the given address), -EPROTONOSUPPORT
* if the version does not match, -EIO if the checksum does not match, * 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 * -EFBIG if the expected size does not match the detected size, -ENOSPC
* if the size is not large enough to hold the headers * if the size is not large enough to hold the headers
*/ */
int bloblist_check(ulong addr, uint size); 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 * This sets the correct checksum for the bloblist. This ensures that the
* bloblist will be detected correctly by the next phase of U-Boot. * bloblist will be detected correctly by the next phase of U-Boot.
* *
* @return 0 * Return: 0
*/ */
int bloblist_finish(void); int bloblist_finish(void);
@ -237,6 +302,20 @@ int bloblist_finish(void);
*/ */
void bloblist_get_stats(ulong *basep, ulong *sizep, ulong *allocedp); 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 * 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 * bloblist_tag_name() - Get the name for a tag
* *
* @tag: Tag to check * @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); 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 * bloblist_reloc() - Relocate the bloblist and optionally resize it
* *
* @to: Pointer to new bloblist location (must not overlap old location) * @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: Pointer to bloblist to relocate
* @from_size: Size of 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 * bloblist_init() - Init the bloblist system with a single bloblist
* *
* This uses CONFIG_BLOBLIST_ADDR and CONFIG_BLOBLIST_SIZE to set up a bloblist * This locates and sets up the blocklist for use.
* for use by U-Boot. *
* 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); int bloblist_init(void);

View file

@ -49,12 +49,6 @@ struct fdt_memory {
struct bd_info; 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 * enum fdt_source_t - indicates where the devicetree came from
* *

View file

@ -1,6 +1,8 @@
#ifndef _LINUX_STDDEF_H #ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H #define _LINUX_STDDEF_H
#include <linux/compiler_types.h>
#undef NULL #undef NULL
#if defined(__cplusplus) #if defined(__cplusplus)
#define NULL 0 #define NULL 0
@ -14,7 +16,11 @@
#ifndef __CHECKER__ #ifndef __CHECKER__
#undef offsetof #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
#endif #endif

View file

@ -266,7 +266,7 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
* @size: size of file is returned if no error * @size: size of file is returned if no error
* Return: 0 on success or -1 if an error ocurred * 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 * os_putc() - write a character to the controlling OS terminal

View file

@ -19,9 +19,9 @@ DECLARE_GLOBAL_DATA_PTR;
UNIT_TEST(_name, _flags, bloblist_test) UNIT_TEST(_name, _flags, bloblist_test)
enum { enum {
TEST_TAG = 1, TEST_TAG = BLOBLISTT_U_BOOT_SPL_HANDOFF,
TEST_TAG2 = 2, TEST_TAG2 = BLOBLISTT_VBOOT_CTX,
TEST_TAG_MISSING = 3, TEST_TAG_MISSING = 0x10000,
TEST_SIZE = 10, TEST_SIZE = 10,
TEST_SIZE2 = 20, TEST_SIZE2 = 20,
@ -71,7 +71,9 @@ static int bloblist_test_init(struct unit_test_state *uts)
hdr = clear_bloblist(); hdr = clear_bloblist();
ut_asserteq(-ENOENT, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE)); 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_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
ut_asserteq_ptr(hdr, bloblist_check_magic(TEST_ADDR));
hdr->version++; hdr->version++;
ut_asserteq(-EPROTONOSUPPORT, bloblist_check(TEST_ADDR, ut_asserteq(-EPROTONOSUPPORT, bloblist_check(TEST_ADDR,
TEST_BLOBLIST_SIZE)); 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_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
ut_assertok(bloblist_finish()); ut_assertok(bloblist_finish());
ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE)); ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
hdr->magic++;
ut_asserteq_ptr(NULL, bloblist_check_magic(TEST_ADDR));
hdr->magic--;
hdr->flags++; hdr->flags++;
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE)); 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(); hdr = clear_bloblist();
ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE)); ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0)); 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); ut_asserteq(map_to_sysmem(hdr), TEST_ADDR);
/* Add a record and check that we can find it */ /* 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); ut_silence_console(uts);
console_record_reset(); console_record_reset();
run_command("bloblist list", 0); run_command("bloblist list", 0);
ut_assert_nextline("Address Size Tag Name"); ut_assert_nextline("Address Size Tag Name");
ut_assert_nextline("%08lx %8x 1 EC host event", ut_assert_nextline("%08lx %8x 8000 SPL hand-off",
(ulong)map_to_sysmem(data), TEST_SIZE); (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); (ulong)map_to_sysmem(data2), TEST_SIZE2);
ut_assert_console_end(); ut_assert_console_end();
ut_unsilence_console(uts); ut_unsilence_console(uts);

View file

@ -430,7 +430,7 @@ def main():
# Add options here # Add options here
parser.add_option('-f', '--force', action="store_true", default=False, parser.add_option('-f', '--force', action="store_true", default=False,
help='regenerate the output even if it is new') 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') help='the number of jobs to run simultaneously')
parser.add_option('-o', '--output', default=OUTPUT_FILE, parser.add_option('-o', '--output', default=OUTPUT_FILE,
help='output file [default=%s]' % OUTPUT_FILE) help='output file [default=%s]' % OUTPUT_FILE)

View file

@ -616,9 +616,14 @@ def GetAliasFile():
""" """
fname = command.OutputOneLine('git', 'config', 'sendemail.aliasesfile', fname = command.OutputOneLine('git', 'config', 'sendemail.aliasesfile',
raise_on_error=False) raise_on_error=False)
if fname: if not fname:
fname = os.path.join(GetTopLevel(), fname.strip()) return None
return fname
fname = os.path.expanduser(fname.strip())
if os.path.isabs(fname):
return fname
return os.path.join(GetTopLevel(), fname)
def GetDefaultUserName(): def GetDefaultUserName():
"""Gets the user.name from .gitconfig file. """Gets the user.name from .gitconfig file.