Attention is currently required from: Furquan Shaikh, Aaron Durbin.

Julius Werner would like Furquan Shaikh and Aaron Durbin to review this change.

View Change

cbfs: Simplify cbfs_load_and_decompress() and stop exporting it

With the last external user to cbfs_load_and_decompress() gone, we can
stop exporting this function to the rest of coreboot and make it local
to cbfs.c. Also remove a couple of arguments that no longer really make
a difference and fold the stage-specific code for in-place LZ4
decompression into cbfs_prog_stage_load().

Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: I4b459650a28e020c4342a66090f55264fbd26363
---
M src/include/cbfs.h
M src/lib/cbfs.c
2 files changed, 21 insertions(+), 45 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/83/52083/1
diff --git a/src/include/cbfs.h b/src/include/cbfs.h
index 37bac30..9ed5233 100644
--- a/src/include/cbfs.h
+++ b/src/include/cbfs.h
@@ -165,13 +165,6 @@
/* Return mapping of option ROM with revision number. Returns NULL on error. */
void *cbfs_boot_map_optionrom_revision(uint16_t vendor, uint16_t device, uint8_t rev);

-/* Load |in_size| bytes from |rdev| at |offset| to the |buffer_size| bytes large |buffer|,
- decompressing it according to |compression| in the process. Returns the decompressed file
- size, or 0 on error. LZMA files will be mapped for decompression. LZ4 files will be
- decompressed in-place with the buffer size requirements outlined in compression.h. */
-size_t cbfs_load_and_decompress(const struct region_device *rdev, size_t offset,
- size_t in_size, void *buffer, size_t buffer_size, uint32_t compression);
-

/**********************************************************************************************
* INTERNAL HELPERS FOR INLINES, DO NOT USE. *
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 65bb721..9135b2f 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -186,19 +186,20 @@
return true;
}

-size_t cbfs_load_and_decompress(const struct region_device *rdev, size_t offset, size_t in_size,
- void *buffer, size_t buffer_size, uint32_t compression)
+static size_t cbfs_load_and_decompress(const struct region_device *rdev,
+ void *buffer, size_t buffer_size, uint32_t compression)
{
+ size_t in_size = region_device_sz(rdev);
size_t out_size;
void *map;

- DEBUG("Decompressing %zu bytes to %p with algo %d\n", buffer_size, buffer, compression);
+ DEBUG("Decompressing %zu bytes to %p with algo %d\n", in_size, buffer, compression);

switch (compression) {
case CBFS_COMPRESS_NONE:
if (buffer_size < in_size)
return 0;
- if (rdev_readat(rdev, buffer, offset, in_size) != in_size)
+ if (rdev_readat(rdev, buffer, 0, in_size) != in_size)
return 0;
return in_size;

@@ -206,9 +207,9 @@
if (!cbfs_lz4_enabled())
return 0;

- /* cbfs_stage_load_and_decompress() takes care of in-place LZ4 decompression by
+ /* cbfs_prog_stage_load() takes care of in-place LZ4 decompression by
setting up the rdev to be in memory. */
- map = rdev_mmap(rdev, offset, in_size);
+ map = rdev_mmap_full(rdev);
if (map == NULL)
return 0;

@@ -223,7 +224,7 @@
case CBFS_COMPRESS_LZMA:
if (!cbfs_lzma_enabled())
return 0;
- map = rdev_mmap(rdev, offset, in_size);
+ map = rdev_mmap_full(rdev);
if (map == NULL)
return 0;

@@ -241,33 +242,6 @@
}
}

-static size_t cbfs_stage_load_and_decompress(const struct region_device *rdev, size_t offset,
- size_t in_size, void *buffer, size_t buffer_size, uint32_t compression)
-{
- struct region_device rdev_src;
-
- if (compression == CBFS_COMPRESS_LZ4) {
- if (!cbfs_lz4_enabled())
- return 0;
- /* Load the compressed image to the end of the available memory area for
- in-place decompression. It is the responsibility of the caller to ensure that
- buffer_size is large enough (see compression.h, guaranteed by cbfstool for
- stages). */
- void *compr_start = buffer + buffer_size - in_size;
- if (rdev_readat(rdev, compr_start, offset, in_size) != in_size)
- return 0;
- /* Create a region device backed by memory. */
- rdev_chain(&rdev_src, &addrspace_32bit.rdev, (uintptr_t)compr_start, in_size);
-
- return cbfs_load_and_decompress(&rdev_src, 0, in_size, buffer, buffer_size,
- compression);
- }
-
- /* All other algorithms can use the generic implementation. */
- return cbfs_load_and_decompress(rdev, offset, in_size, buffer, buffer_size,
- compression);
-}
-
static inline int tohex4(unsigned int c)
{
return (c <= 9) ? (c + '0') : (c - 10 + 'a');
@@ -361,8 +335,7 @@
return NULL;
}

- size = cbfs_load_and_decompress(&rdev, 0, region_device_sz(&rdev),
- loc, size, compression);
+ size = cbfs_load_and_decompress(&rdev, loc, size, compression);
if (!size)
return NULL;

@@ -421,8 +394,18 @@
return CB_SUCCESS;
}

- size_t fsize = cbfs_stage_load_and_decompress(&rdev, 0, region_device_sz(&rdev),
- prog_start(pstage), prog_size(pstage), compression);
+ /* LZ4 stages can be decompressed in-place to save mapping scratch space. Load the
+ compressed data to the end of the buffer and point &rdev to that memory location. */
+ if (cbfs_lz4_enabled() && compression == CBFS_COMPRESS_LZ4) {
+ size_t in_size = region_device_sz(&rdev);
+ void *compr_start = prog_start(pstage) + prog_size(pstage) - in_size;
+ if (rdev_readat(&rdev, compr_start, 0, in_size) != in_size)
+ return CB_ERR;
+ rdev_chain(&rdev, &addrspace_32bit.rdev, (uintptr_t)compr_start, in_size);
+ }
+
+ size_t fsize = cbfs_load_and_decompress(&rdev, prog_start(pstage), prog_size(pstage),
+ compression);
if (!fsize)
return CB_ERR;


To view, visit change 52083. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I4b459650a28e020c4342a66090f55264fbd26363
Gerrit-Change-Number: 52083
Gerrit-PatchSet: 1
Gerrit-Owner: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Aaron Durbin <adurbin@chromium.org>
Gerrit-Reviewer: Furquan Shaikh <furquan@google.com>
Gerrit-Attention: Furquan Shaikh <furquan@google.com>
Gerrit-Attention: Aaron Durbin <adurbin@chromium.org>
Gerrit-MessageType: newchange