Merge branch 'master' of git://git.denx.de/u-boot
[platform/kernel/u-boot.git] / include / bloblist.h
index 8514401..9f007c7 100644 (file)
@@ -19,6 +19,7 @@ enum {
        BLOBLIST_ALIGN          = 16,
 };
 
+/* Supported tags - add new ones to tag_name in bloblist.c */
 enum bloblist_tag_t {
        BLOBLISTT_NONE = 0,
 
@@ -27,6 +28,18 @@ enum bloblist_tag_t {
        BLOBLISTT_SPL_HANDOFF,          /* Hand-off info from SPL */
        BLOBLISTT_VBOOT_CTX,            /* Chromium OS verified boot context */
        BLOBLISTT_VBOOT_HANDOFF,        /* Chromium OS internal handoff info */
+       /*
+        * 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_COUNT
 };
 
 /**
@@ -51,13 +64,13 @@ enum bloblist_tag_t {
  *     first bloblist_rec starts at this offset from the start of the header
  * @flags: Space for BLOBLISTF_... flags (none yet)
  * @magic: BLOBLIST_MAGIC
- * @size: Total size of all records (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.
- * @alloced: Total size allocated for this bloblist. When adding new records,
- *     the bloblist can grow up to this size. This starts out as
+ *     When adding new records, the bloblist can grow up to this size.
+ * @alloced: Total size allocated so far for this bloblist. This starts out as
  *     sizeof(bloblist_hdr) since we need at least that much space to store a
  *     valid bloblist
- * @spare: Space space
+ * @spare: Spare space (for future use)
  * @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.
@@ -104,7 +117,7 @@ struct bloblist_rec {
  * Searches the bloblist and returns the blob with the matching tag
  *
  * @tag:       Tag to search for (enum bloblist_tag_t)
- * @size:      Expected size of the blob
+ * @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
  */
@@ -121,10 +134,11 @@ 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
  */
-void *bloblist_add(uint tag, int size);
+void *bloblist_add(uint tag, int size, int align);
 
 /**
  * bloblist_ensure_size() - Find or add a blob
@@ -134,10 +148,11 @@ void *bloblist_add(uint tag, int size);
  * @tag:       Tag to add (enum bloblist_tag_t)
  * @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
  */
-int bloblist_ensure_size(uint tag, int size, void **blobp);
+int bloblist_ensure_size(uint tag, int size, int align, void **blobp);
 
 /**
  * bloblist_ensure() - Find or add a blob
@@ -152,6 +167,32 @@ int bloblist_ensure_size(uint tag, int size, void **blobp);
 void *bloblist_ensure(uint tag, int size);
 
 /**
+ * bloblist_ensure_size_ret() - Find or add a blob
+ *
+ * Find an existing blob, or add a new one if not found
+ *
+ * @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
+ */
+int bloblist_ensure_size_ret(uint tag, int *sizep, void **blobp);
+
+/**
+ * bloblist_resize() - resize a blob
+ *
+ * Any blobs above this one are relocated up or down. The resized blob remains
+ * in the same place.
+ *
+ * @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
+ */
+int bloblist_resize(uint tag, int new_size);
+
+/**
  * bloblist_new() - Create a new, empty bloblist of a given size
  *
  * @addr: Address of bloblist
@@ -170,7 +211,8 @@ int bloblist_new(ulong addr, uint size, uint flags);
  * @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
+ *     -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);
 
@@ -185,6 +227,49 @@ int bloblist_check(ulong addr, uint size);
 int bloblist_finish(void);
 
 /**
+ * bloblist_get_stats() - Get information about the bloblist
+ *
+ * This returns useful information about the bloblist
+ *
+ * @basep: Returns base address of bloblist
+ * @sizep: Returns the number of bytes used in the bloblist
+ * @allocedp: Returns the total space allocated to the bloblist
+ */
+void bloblist_get_stats(ulong *basep, ulong *sizep, ulong *allocedp);
+
+/**
+ * bloblist_show_stats() - Show information about the bloblist
+ *
+ * This shows useful information about the bloblist on the console
+ */
+void bloblist_show_stats(void);
+
+/**
+ * bloblist_show_list() - Show a list of blobs in the bloblist
+ *
+ * This shows a list of blobs, showing their address, size and tag.
+ */
+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
+ */
+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)
+ * @from: Pointer to bloblist to relocate
+ * @from_size: Size of bloblist to relocate
+ */
+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