2020-04-02 23:48:27 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2009-04-14 09:40:01 +02:00
|
|
|
|
|
|
|
#ifndef _CBFS_H_
|
|
|
|
#define _CBFS_H_
|
|
|
|
|
2019-12-12 02:09:39 +01:00
|
|
|
#include <cbmem.h>
|
2015-12-15 20:33:51 +01:00
|
|
|
#include <commonlib/cbfs.h>
|
2015-05-16 06:39:23 +02:00
|
|
|
#include <program_loading.h>
|
2019-12-12 02:09:39 +01:00
|
|
|
#include <types.h>
|
2020-05-07 02:06:35 +02:00
|
|
|
#include <vb2_sha.h>
|
2009-04-14 09:40:01 +02:00
|
|
|
|
2015-05-16 06:39:23 +02:00
|
|
|
/***********************************************
|
|
|
|
* Perform CBFS operations on the boot device. *
|
|
|
|
***********************************************/
|
Extend CBFS to support arbitrary ROM source media.
Summary:
Isolate CBFS underlying I/O to board/arch-specific implementations as
"media stream", to allow loading and booting romstage on non-x86.
CBFS functions now all take a new "media source" parameter; use
CBFS_DEFAULT_MEDIA if you simply want to load from main firmware.
API Changes:
cbfs_find => cbfs_get_file.
cbfs_find_file => cbfs_get_file_content.
cbfs_get_file => cbfs_get_file_content with correct type.
CBFS used to work only on memory-mapped ROM (all x86). For platforms like ARM,
the ROM may come from USB, UART, or SPI -- any serial devices and not available
for memory mapping.
To support these devices (and allowing CBFS to read from multiple source
at the same time), CBFS operations are now virtual-ized into "cbfs_media". To
simplify porting existing code, every media source must support both "reading
into pre-allocated memory (read)" and "read and return an allocated buffer
(map)". For devices without native memory-mapped ROM, "cbfs_simple_buffer*"
provides simple memory mapping simulation.
Every CBFS function now takes a cbfs_media* as parameter. CBFS_DEFAULT_MEDIA
is defined for CBFS functions to automatically initialize a per-board default
media (CBFS will internally calls init_default_cbfs_media). Also revised CBFS
function names relying on memory mapped backend (ex, "cbfs_find" => actually
loads files). Now we only have two getters:
struct cbfs_file *entry = cbfs_get_file(media, name);
void *data = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, name, type);
Test results:
- Verified to work on x86/qemu.
- Compiles on ARM, and follow up commit will provide working SPI driver.
Change-Id: Iac911ded25a6f2feffbf3101a81364625bb07746
Signed-off-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-on: http://review.coreboot.org/2182
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
2013-01-22 11:57:56 +01:00
|
|
|
|
2016-07-28 21:25:21 +02:00
|
|
|
/* Return mapping of option ROM found in boot device. NULL on error. */
|
2015-05-16 06:39:23 +02:00
|
|
|
void *cbfs_boot_map_optionrom(uint16_t vendor, uint16_t device);
|
2020-01-21 17:28:40 +01:00
|
|
|
/* 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);
|
2020-12-30 02:33:30 +01:00
|
|
|
|
2015-05-16 06:39:23 +02:00
|
|
|
/* Locate file by name and optional type. Return 0 on success. < 0 on error. */
|
2015-09-17 23:09:30 +02:00
|
|
|
int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type);
|
2016-12-01 02:29:10 +01:00
|
|
|
/* Locate file in a specific region of fmap. Return 0 on success. < 0 on error*/
|
|
|
|
int cbfs_locate_file_in_region(struct cbfsf *fh, const char *region_name,
|
|
|
|
const char *name, uint32_t *type);
|
2020-12-30 02:33:30 +01:00
|
|
|
|
|
|
|
/* Map file into memory, returning a pointer to the mapping or NULL on error. If |size_out| is
|
|
|
|
not NULL, it will pass out the size of the mapped file.
|
|
|
|
NOTE: Since this may return a direct pointer to memory-mapped hardware, compressed files are
|
|
|
|
NOT transparently decompressed (unlike cbfs_load()). */
|
|
|
|
void *cbfs_map(const char *name, size_t *size_out);
|
|
|
|
/* Like cbfs_map(), except that it will always read from the read-only CBFS (the "COREBOOT" FMAP
|
|
|
|
region), even when CONFIG(VBOOT) is enabled. */
|
|
|
|
void *cbfs_ro_map(const char *name, size_t *size_out);
|
|
|
|
/* Removes a previously allocated CBFS mapping. Should try to unmap mappings in strict LIFO
|
|
|
|
order where possible, since mapping backends often don't support more complicated cases. */
|
|
|
|
int cbfs_unmap(void *mapping);
|
|
|
|
|
|
|
|
/* Load a file from CBFS into a buffer. Returns amount of loaded bytes on success or 0 on error.
|
|
|
|
File will get decompressed as necessary. */
|
cbfs: Simplify load/map API names, remove type arguments
This patch renames cbfs_boot_map_with_leak() and cbfs_boot_load_file()
to cbfs_map() and cbfs_load() respectively. This is supposed to be the
start of a new, better organized CBFS API where the most common
operations have the most simple and straight-forward names. Less
commonly used variants of these operations (e.g. cbfs_ro_load() or
cbfs_region_load()) can be introduced later. It seems unnecessary to
keep carrying around "boot" in the names of most CBFS APIs if the vast
majority of accesses go to the boot CBFS (instead, more unusual
operations should have longer names that describe how they diverge from
the common ones).
cbfs_map() is paired with a new cbfs_unmap() to allow callers to cleanly
reap mappings when desired. A few new cbfs_unmap() calls are added to
generic code where it makes sense, but it seems unnecessary to introduce
this everywhere in platform or architecture specific code where the boot
medium is known to be memory-mapped anyway. In fact, even for
non-memory-mapped platforms, sometimes leaking a mapping to the CBFS
cache is a much cleaner solution than jumping through hoops to provide
some other storage for some long-lived file object, and it shouldn't be
outright forbidden when it makes sense.
Additionally, remove the type arguments from these function signatures.
The goal is to eventually remove type arguments for lookup from the
whole CBFS API. Filenames already uniquely identify CBFS files. The type
field is just informational, and there should be APIs to allow callers
to check it when desired, but it's not clear what we gain from forcing
this as a parameter into every single CBFS access when the vast majority
of the time it provides no additional value and is just clutter.
Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: Ib24325400815a9c3d25f66c61829a24a239bb88e
Reviewed-on: https://review.coreboot.org/c/coreboot/+/39304
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Wim Vervoorn <wvervoorn@eltan.com>
Reviewed-by: Mariusz Szafrański <mariuszx.szafranski@intel.com>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
2020-03-05 01:52:08 +01:00
|
|
|
size_t cbfs_load(const char *name, void *buf, size_t buf_size);
|
2020-12-30 02:33:30 +01:00
|
|
|
/* Like cbfs_load(), except that it will always read from the read-only CBFS (the "COREBOOT"
|
|
|
|
FMAP region), even when CONFIG(VBOOT) is enabled. */
|
2020-01-23 03:00:18 +01:00
|
|
|
size_t cbfs_ro_load(const char *name, void *buf, size_t buf_size);
|
2020-12-30 02:33:30 +01:00
|
|
|
|
|
|
|
/* 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. */
|
2015-09-29 22:51:35 +02:00
|
|
|
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);
|
|
|
|
|
2015-05-16 06:39:23 +02:00
|
|
|
/* Load stage into memory filling in prog. Return 0 on success. < 0 on error. */
|
|
|
|
int cbfs_prog_stage_load(struct prog *prog);
|
2014-12-02 00:30:01 +01:00
|
|
|
|
2020-03-05 21:51:08 +01:00
|
|
|
/*
|
2020-12-30 02:33:30 +01:00
|
|
|
* Data structure that represents "a" CBFS boot device, with optional metadata cache. Generally
|
|
|
|
* we only have one of these, or two (RO and RW) when CONFIG(VBOOT) is set. The region device
|
|
|
|
* stored here must always be a subregion of boot_device_ro().
|
2020-03-05 21:51:08 +01:00
|
|
|
*/
|
2019-12-12 02:09:39 +01:00
|
|
|
struct cbfs_boot_device {
|
|
|
|
struct region_device rdev;
|
|
|
|
void *mcache;
|
|
|
|
size_t mcache_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Helper to fill out |mcache| and |mcache_size| in a cbfs_boot_device. */
|
|
|
|
void cbfs_boot_device_find_mcache(struct cbfs_boot_device *cbd, uint32_t id);
|
|
|
|
|
|
|
|
/*
|
2020-12-30 02:33:30 +01:00
|
|
|
* Retrieves the currently active CBFS boot device. If |force_ro| is set, will always return the
|
|
|
|
* read-only CBFS instead (this only makes a difference when CONFIG(VBOOT) is enabled). May
|
|
|
|
* perform certain CBFS initialization tasks. Returns NULL on error (e.g. boot device IO error).
|
2019-12-12 02:09:39 +01:00
|
|
|
*/
|
|
|
|
const struct cbfs_boot_device *cbfs_get_boot_device(bool force_ro);
|
Extend CBFS to support arbitrary ROM source media.
Summary:
Isolate CBFS underlying I/O to board/arch-specific implementations as
"media stream", to allow loading and booting romstage on non-x86.
CBFS functions now all take a new "media source" parameter; use
CBFS_DEFAULT_MEDIA if you simply want to load from main firmware.
API Changes:
cbfs_find => cbfs_get_file.
cbfs_find_file => cbfs_get_file_content.
cbfs_get_file => cbfs_get_file_content with correct type.
CBFS used to work only on memory-mapped ROM (all x86). For platforms like ARM,
the ROM may come from USB, UART, or SPI -- any serial devices and not available
for memory mapping.
To support these devices (and allowing CBFS to read from multiple source
at the same time), CBFS operations are now virtual-ized into "cbfs_media". To
simplify porting existing code, every media source must support both "reading
into pre-allocated memory (read)" and "read and return an allocated buffer
(map)". For devices without native memory-mapped ROM, "cbfs_simple_buffer*"
provides simple memory mapping simulation.
Every CBFS function now takes a cbfs_media* as parameter. CBFS_DEFAULT_MEDIA
is defined for CBFS functions to automatically initialize a per-board default
media (CBFS will internally calls init_default_cbfs_media). Also revised CBFS
function names relying on memory mapped backend (ex, "cbfs_find" => actually
loads files). Now we only have two getters:
struct cbfs_file *entry = cbfs_get_file(media, name);
void *data = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, name, type);
Test results:
- Verified to work on x86/qemu.
- Compiles on ARM, and follow up commit will provide working SPI driver.
Change-Id: Iac911ded25a6f2feffbf3101a81364625bb07746
Signed-off-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-on: http://review.coreboot.org/2182
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
2013-01-22 11:57:56 +01:00
|
|
|
|
2020-05-07 02:06:35 +02:00
|
|
|
/*
|
2020-12-30 02:33:30 +01:00
|
|
|
* Builds the mcache (if |cbd->mcache| is set) and verifies |metadata_hash| (if it is not NULL).
|
|
|
|
* If CB_CBFS_CACHE_FULL is returned, the mcache is incomplete but still valid and the metadata
|
|
|
|
* hash was still verified. Should be called once per *boot* (not once per stage) before the
|
|
|
|
* first CBFS access.
|
2020-05-07 02:06:35 +02:00
|
|
|
*/
|
|
|
|
cb_err_t cbfs_init_boot_device(const struct cbfs_boot_device *cbd,
|
|
|
|
struct vb2_hash *metadata_hash);
|
|
|
|
|
2009-04-14 09:40:01 +02:00
|
|
|
#endif
|