1 /* SPDX-License-Identifier: GPL-2.0-only */
6 #include <boot/coreboot_tables.h>
11 * Bootmem types match to LB_MEM tags, except for the following:
12 * BM_MEM_RAMSTAGE : Memory where any kind of boot firmware resides and that
13 * should not be touched by bootmem (by example: stack,
15 * BM_MEM_PAYLOAD : Memory where any kind of payload resides and that should
16 * not be touched by bootmem.
17 * Start at 0x10000 to make sure that the caller doesn't provide LB_MEM tags.
20 BM_MEM_INVALID
= 0, /* Invalid type (used in optional arguments). */
22 BM_MEM_FIRST
= 0x10000, /* First entry in this list */
23 BM_MEM_RAM
, /* Memory anyone can use */
24 BM_MEM_RESERVED
, /* Don't use this memory region */
25 BM_MEM_SOFT_RESERVED
, /* Specific purpose memory */
26 BM_MEM_ACPI
, /* ACPI Tables */
27 BM_MEM_NVS
, /* ACPI NVS Memory */
28 BM_MEM_UNUSABLE
, /* Unusable address space */
29 BM_MEM_VENDOR_RSVD
, /* Vendor Reserved */
30 BM_MEM_OPENSBI
, /* Risc-V OpenSBI */
31 BM_MEM_BL31
, /* Arm64 BL31 executable */
32 BM_MEM_TABLE
, /* Ram configuration tables are kept in */
33 /* Tags below this point are ignored for the OS table. */
34 BM_MEM_OS_CUTOFF
= BM_MEM_TABLE
,
37 BM_MEM_LAST
, /* Last entry in this list */
41 * Write memory coreboot table. Current resource map is serialized into
42 * memtable (LB_MEM_* types). bootmem library is unusable until this function
43 * is called first in the write tables path before payload is loaded.
45 * Bootmem types match to LB_MEM tags, except for the following:
46 * BM_MEM_RAMSTAGE : Translates to LB_MEM_RAM.
47 * BM_MEM_PAYLOAD : Translates to LB_MEM_RAM.
48 * BM_MEM_BL31 : Translates to LB_MEM_RESERVED.
49 * BM_MEM_OPENSBI : Translates to LB_MEM_RESERVED.
51 void bootmem_write_memory_table(struct lb_memory
*mem
);
53 /* Architecture hook to add bootmem areas the architecture controls when
54 * bootmem_write_memory_table() is called. */
55 void bootmem_arch_add_ranges(void);
57 /* Platform hook to add bootmem areas the platform / board controls. */
58 void bootmem_platform_add_ranges(void);
60 /* Add a range of a given type to the bootmem address space. */
61 void bootmem_add_range(uint64_t start
, uint64_t size
,
62 const enum bootmem_type tag
);
64 /* Print current range map of boot memory. */
65 void bootmem_dump_ranges(void);
67 typedef bool (*range_action_t
)(const struct range_entry
*r
, void *arg
);
70 * Walk memory tables from OS point of view and call the provided function,
71 * for every region. The caller has to return false to break out of the loop any
72 * time, or return true to continue.
74 * @param action The function to call for each memory range.
75 * @param arg Pointer passed to function @action. Set to NULL if unused.
76 * @return true if the function 'action' returned false.
78 bool bootmem_walk_os_mem(range_action_t action
, void *arg
);
81 * Walk memory tables and call the provided function, for every region.
82 * The caller has to return false to break out of the loop any time, or
83 * return true to continue.
85 * @param action The function to call for each memory range.
86 * @param arg Pointer passed to function @action. Set to NULL if unused.
87 * @return true if the function 'action' returned false.
89 bool bootmem_walk(range_action_t action
, void *arg
);
91 /* Returns 1 if the requested memory range is all tagged as type dest_type.
92 * Otherwise returns 0.
94 int bootmem_region_targets_type(uint64_t start
, uint64_t size
,
95 enum bootmem_type dest_type
);
97 /* Allocate a temporary buffer from the unused RAM areas. */
98 void *bootmem_allocate_buffer(size_t size
);
100 #endif /* BOOTMEM_H */