coreboot: tiered imd
A tiered imd allows for both small and large allocations. The small allocations are packed into a large region. Utilizing a tiered imd reduces internal fragmentation within the imd. Change-Id: I0bcd6473aacbc714844815b24d77cb5c542abdd0 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/8623 Tested-by: build bot (Jenkins) Reviewed-by: Marc Jones <marc.jones@se-eng.com>
This commit is contained in:
@@ -58,6 +58,7 @@
|
||||
#define CBMEM_ID_HOB_POINTER 0x484f4221
|
||||
#define CBMEM_ID_IGD_OPREGION 0x4f444749
|
||||
#define CBMEM_ID_IMD_ROOT 0xff4017ff
|
||||
#define CBMEM_ID_IMD_SMALL 0x53a11439
|
||||
#define CBMEM_ID_MEMINFO 0x494D454D
|
||||
#define CBMEM_ID_MPTABLE 0x534d5054
|
||||
#define CBMEM_ID_MRCDATA 0x4d524344
|
||||
@@ -105,6 +106,7 @@ struct cbmem_id_to_name {
|
||||
{ CBMEM_ID_FREESPACE, "FREE SPACE " }, \
|
||||
{ CBMEM_ID_GDT, "GDT " }, \
|
||||
{ CBMEM_ID_IMD_ROOT, "IMD ROOT " }, \
|
||||
{ CBMEM_ID_IMD_SMALL, "IMD SMALL " }, \
|
||||
{ CBMEM_ID_MEMINFO, "MEM INFO " }, \
|
||||
{ CBMEM_ID_MPTABLE, "SMP TABLE " }, \
|
||||
{ CBMEM_ID_MRCDATA, "MRC DATA " }, \
|
||||
|
@@ -81,6 +81,18 @@ void imd_handle_init_partial_recovery(struct imd *imd);
|
||||
*/
|
||||
int imd_create_empty(struct imd *imd, size_t root_size, size_t entry_align);
|
||||
|
||||
/*
|
||||
* Create an empty imd with both large and small allocations. The small
|
||||
* allocations come from a fixed imd stored internally within the large
|
||||
* imd. The region allocated for tracking the smaller allocations is dependent
|
||||
* on the small root_size and the large entry alignment by calculating the
|
||||
* number of entries within the small imd and multiplying that by the small
|
||||
* entry alignment.
|
||||
*/
|
||||
int imd_create_tiered_empty(struct imd *imd,
|
||||
size_t lg_root_size, size_t lg_entry_align,
|
||||
size_t sm_root_size, size_t sm_entry_align);
|
||||
|
||||
/*
|
||||
* Recover a previously created imd.
|
||||
*/
|
||||
@@ -131,9 +143,13 @@ int imd_print_entries(const struct imd *imd, const struct imd_lookup *lookup,
|
||||
* NOTE: Do not directly touch any fields within this structure. An imd pointer
|
||||
* is meant to be opaque, but the fields are exposed for stack allocation.
|
||||
*/
|
||||
struct imd {
|
||||
struct imdr {
|
||||
uintptr_t limit;
|
||||
void *r;
|
||||
};
|
||||
struct imd {
|
||||
struct imdr lg;
|
||||
struct imdr sm;
|
||||
};
|
||||
|
||||
#endif /* _IMD_H_ */
|
||||
|
Reference in New Issue
Block a user