1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _ASM_E820_TYPES_H |
3 | #define _ASM_E820_TYPES_H |
4 | |
5 | #include <uapi/asm/bootparam.h> |
6 | |
7 | /* |
8 | * These are the E820 types known to the kernel: |
9 | */ |
10 | enum e820_type { |
11 | E820_TYPE_RAM = 1, |
12 | E820_TYPE_RESERVED = 2, |
13 | E820_TYPE_ACPI = 3, |
14 | E820_TYPE_NVS = 4, |
15 | E820_TYPE_UNUSABLE = 5, |
16 | E820_TYPE_PMEM = 7, |
17 | |
18 | /* |
19 | * This is a non-standardized way to represent ADR or |
20 | * NVDIMM regions that persist over a reboot. |
21 | * |
22 | * The kernel will ignore their special capabilities |
23 | * unless the CONFIG_X86_PMEM_LEGACY=y option is set. |
24 | * |
25 | * ( Note that older platforms also used 6 for the same |
26 | * type of memory, but newer versions switched to 12 as |
27 | * 6 was assigned differently. Some time they will learn... ) |
28 | */ |
29 | E820_TYPE_PRAM = 12, |
30 | |
31 | /* |
32 | * Reserved RAM used by the kernel itself if |
33 | * CONFIG_INTEL_TXT=y is enabled, memory of this type |
34 | * will be included in the S3 integrity calculation |
35 | * and so should not include any memory that the BIOS |
36 | * might alter over the S3 transition: |
37 | */ |
38 | E820_TYPE_RESERVED_KERN = 128, |
39 | }; |
40 | |
41 | /* |
42 | * A single E820 map entry, describing a memory range of [addr...addr+size-1], |
43 | * of 'type' memory type: |
44 | * |
45 | * (We pack it because there can be thousands of them on large systems.) |
46 | */ |
47 | struct e820_entry { |
48 | u64 addr; |
49 | u64 size; |
50 | enum e820_type type; |
51 | } __attribute__((packed)); |
52 | |
53 | /* |
54 | * The legacy E820 BIOS limits us to 128 (E820_MAX_ENTRIES_ZEROPAGE) nodes |
55 | * due to the constrained space in the zeropage. |
56 | * |
57 | * On large systems we can easily have thousands of nodes with RAM, |
58 | * which cannot be fit into so few entries - so we have a mechanism |
59 | * to extend the e820 table size at build-time, via the E820_MAX_ENTRIES |
60 | * define below. |
61 | * |
62 | * ( Those extra entries are enumerated via the EFI memory map, not |
63 | * via the legacy zeropage mechanism. ) |
64 | * |
65 | * Size our internal memory map tables to have room for these additional |
66 | * entries, based on a heuristic calculation: up to three entries per |
67 | * NUMA node, plus E820_MAX_ENTRIES_ZEROPAGE for some extra space. |
68 | * |
69 | * This allows for bootstrap/firmware quirks such as possible duplicate |
70 | * E820 entries that might need room in the same arrays, prior to the |
71 | * call to e820__update_table() to remove duplicates. The allowance |
72 | * of three memory map entries per node is "enough" entries for |
73 | * the initial hardware platform motivating this mechanism to make |
74 | * use of additional EFI map entries. Future platforms may want |
75 | * to allow more than three entries per node or otherwise refine |
76 | * this size. |
77 | */ |
78 | |
79 | #include <linux/numa.h> |
80 | |
81 | #define E820_MAX_ENTRIES (E820_MAX_ENTRIES_ZEROPAGE + 3*MAX_NUMNODES) |
82 | |
83 | /* |
84 | * The whole array of E820 entries: |
85 | */ |
86 | struct e820_table { |
87 | __u32 nr_entries; |
88 | struct e820_entry entries[E820_MAX_ENTRIES]; |
89 | }; |
90 | |
91 | /* |
92 | * Various well-known legacy memory ranges in physical memory: |
93 | */ |
94 | #define ISA_START_ADDRESS 0x000a0000 |
95 | #define ISA_END_ADDRESS 0x00100000 |
96 | |
97 | #define BIOS_BEGIN 0x000a0000 |
98 | #define BIOS_END 0x00100000 |
99 | |
100 | #define HIGH_MEMORY 0x00100000 |
101 | |
102 | #define BIOS_ROM_BASE 0xffe00000 |
103 | #define BIOS_ROM_END 0xffffffff |
104 | |
105 | #endif /* _ASM_E820_TYPES_H */ |
106 | |