blob: 0478a12755f448f053fe1afbd9bee85137f06b75 [file] [log] [blame]
Angel Pons32859fc2020-04-02 23:48:27 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbin49048022014-02-18 21:55:02 -06002
3#ifndef BOOTMEM_H
4#define BOOTMEM_H
5
Aaron Durbin49048022014-02-18 21:55:02 -06006#include <boot/coreboot_tables.h>
Julius Wernera2148372019-11-13 19:50:33 -08007#include <memrange.h>
8#include <types.h>
Aaron Durbin49048022014-02-18 21:55:02 -06009
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020010/**
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020011 * 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,
14 * TTB, program, ...).
15 * BM_MEM_PAYLOAD : Memory where any kind of payload resides and that should
16 * not be touched by bootmem.
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020017 * Start at 0x10000 to make sure that the caller doesn't provide LB_MEM tags.
18 */
19enum bootmem_type {
Julius Werner965846f2021-01-11 16:07:02 -080020 BM_MEM_INVALID = 0, /* Invalid type (used in optional arguments). */
21
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020022 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 */
Jonathan Zhange111de02021-04-21 10:40:31 -070025 BM_MEM_SOFT_RESERVED, /* Specific purpose memory */
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020026 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 */
Patrick Rudolph4c3da702019-07-07 13:10:56 +020030 BM_MEM_OPENSBI, /* Risc-V OpenSBI */
Elyes HAOUAS5f73e222020-01-15 21:13:45 +010031 BM_MEM_BL31, /* Arm64 BL31 executable */
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020032 BM_MEM_TABLE, /* Ram configuration tables are kept in */
Julius Wernerae05d092018-05-08 17:09:57 -070033 /* Tags below this point are ignored for the OS table. */
34 BM_MEM_OS_CUTOFF = BM_MEM_TABLE,
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020035 BM_MEM_RAMSTAGE,
36 BM_MEM_PAYLOAD,
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020037 BM_MEM_LAST, /* Last entry in this list */
38};
39
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020040/**
41 * Write memory coreboot table. Current resource map is serialized into
Aaron Durbin4677f6b2018-04-03 00:08:12 -060042 * memtable (LB_MEM_* types). bootmem library is unusable until this function
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020043 * is called first in the write tables path before payload is loaded.
44 *
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.
Ting Shendff29e02019-01-28 18:15:00 +080048 * BM_MEM_BL31 : Translates to LB_MEM_RESERVED.
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020049 */
Aaron Durbin4677f6b2018-04-03 00:08:12 -060050void bootmem_write_memory_table(struct lb_memory *mem);
Aaron Durbin49048022014-02-18 21:55:02 -060051
Aaron Durbin4677f6b2018-04-03 00:08:12 -060052/* Architecture hook to add bootmem areas the architecture controls when
53 * bootmem_write_memory_table() is called. */
Aaron Durbind4afa932016-04-19 17:25:59 -050054void bootmem_arch_add_ranges(void);
55
Patrick Rudolph23d62dd2018-04-12 10:36:57 +020056/* Platform hook to add bootmem areas the platform / board controls. */
57void bootmem_platform_add_ranges(void);
58
Aaron Durbin49048022014-02-18 21:55:02 -060059/* Add a range of a given type to the bootmem address space. */
Patrick Rudolph9ab9db02018-04-05 09:14:51 +020060void bootmem_add_range(uint64_t start, uint64_t size,
61 const enum bootmem_type tag);
Aaron Durbin49048022014-02-18 21:55:02 -060062
Aaron Durbin49048022014-02-18 21:55:02 -060063/* Print current range map of boot memory. */
64void bootmem_dump_ranges(void);
65
Patrick Rudolphc6536232018-04-10 09:34:29 +020066typedef bool (*range_action_t)(const struct range_entry *r, void *arg);
67
68/**
Patrick Rudolph64049be2018-04-20 10:37:51 +020069 * Walk memory tables from OS point of view and call the provided function,
70 * for every region. The caller has to return false to break out of the loop any
71 * time, or return true to continue.
72 *
73 * @param action The function to call for each memory range.
74 * @param arg Pointer passed to function @action. Set to NULL if unused.
75 * @return true if the function 'action' returned false.
76 */
77bool bootmem_walk_os_mem(range_action_t action, void *arg);
78
79/**
Patrick Rudolphc6536232018-04-10 09:34:29 +020080 * Walk memory tables and call the provided function, for every region.
81 * The caller has to return false to break out of the loop any time, or
82 * return true to continue.
83 *
84 * @param action The function to call for each memory range.
85 * @param arg Pointer passed to function @action. Set to NULL if unused.
86 * @return true if the function 'action' returned false.
87 */
88bool bootmem_walk(range_action_t action, void *arg);
89
Ting Shen05532262019-01-28 17:22:22 +080090/* Returns 1 if the requested memory range is all tagged as type dest_type.
91 * Otherwise returns 0.
92 */
93int bootmem_region_targets_type(uint64_t start, uint64_t size,
94 enum bootmem_type dest_type);
Aaron Durbin49048022014-02-18 21:55:02 -060095
Aaron Durbin49048022014-02-18 21:55:02 -060096/* Allocate a temporary buffer from the unused RAM areas. */
97void *bootmem_allocate_buffer(size_t size);
98
99#endif /* BOOTMEM_H */