Create two new functions to fetch mrc_cache data (replacing
mrc_cache_get_current):
- mrc_cache_load_current: fetches the mrc_cache data and drops it into
the given buffer. This is useful for ARM platforms where the mmap
operation is very expensive.
- mrc_cache_mmap_leak: fetch the mrc_cache data and puts it into a
given buffer. This is useful for platforms where the mmap operation
is a no-op (like x86 platforms). As the name mentions, we are not
freeing the memory that we allocated with the mmap, so it is the
caller's responsibility to do so.
Additionally, we are replacing mrc_cache_latest with
mrc_cache_get_latest_slot_info, which does not check the validity of
the data when retrieving the current mrc_cache slot. This allows the
caller some flexibility in deciding where they want the mrc_cache data
stored (either in an mmaped region or at a given address).
BUG=b:150502246
BRANCH=None
TEST=Testing on a nami (x86) device:
reboot from ec console. Make sure memory training happens.
reboot from ec console. Make sure that we don't do training again.
Signed-off-by: Shelley Chen <shchen@google.com>
Change-Id: I259dd4f550719d821bbafa2d445cbae6ea22e988
Reviewed-on: https://review.coreboot.org/c/coreboot/+/44006
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef _COMMON_MRC_CACHE_H_
|
|
#define _COMMON_MRC_CACHE_H_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <commonlib/region.h>
|
|
|
|
enum {
|
|
MRC_TRAINING_DATA,
|
|
MRC_VARIABLE_DATA,
|
|
};
|
|
|
|
/*
|
|
* It's up to the caller to decide when to retrieve and stash data. There is
|
|
* differentiation on recovery mode CONFIG(HAS_RECOVERY_MRC_CACHE), but that's
|
|
* only for locating where to retrieve and save the data. If a platform doesn't
|
|
* want to update the data then it shouldn't stash the data for saving.
|
|
* Similarly, if the platform doesn't need the data for booting because of a
|
|
* policy don't request the data.
|
|
*/
|
|
|
|
/* Get and stash data for saving provided the type passed in. */
|
|
|
|
/**
|
|
* mrc_cache_load_current
|
|
*
|
|
* Fill in the buffer with the latest slot data. This will be a
|
|
* common entry point for ARM platforms. Returns < 0 on error, 0 on
|
|
* success.
|
|
*/
|
|
int mrc_cache_load_current(int type, uint32_t version, void *buffer,
|
|
size_t buffer_size);
|
|
/**
|
|
* mrc_cache_mmap_leak
|
|
*
|
|
* Return a pointer to a buffer with the latest slot data. An mmap
|
|
* will be executed (without a matching unmap). This will be a common
|
|
* entry point for platforms where mmap is considered a noop, like x86
|
|
*/
|
|
void *mrc_cache_current_mmap_leak(int type, uint32_t version,
|
|
size_t *data_size);
|
|
/**
|
|
* Returns < 0 on error, 0 on success.
|
|
*/
|
|
int mrc_cache_stash_data(int type, uint32_t version, const void *data,
|
|
size_t size);
|
|
|
|
#endif /* _COMMON_MRC_CACHE_H_ */
|