diff options
author | Dan Williams <dan.j.williams@intel.com> | 2015-04-03 12:05:28 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2015-05-27 21:46:05 -0400 |
commit | ad5fb870c486d932a1749d7853dd70f436a7e03f (patch) | |
tree | 68998840d8d8219e959e966c11c78f73327f7adf | |
parent | f3b6ced236259a87829b829e8e542ff53bfb9a4f (diff) |
e820, efi: add ACPI 6.0 persistent memory types
ACPI 6.0 formalizes e820-type-7 and efi-type-14 as persistent memory.
Mark it "reserved" and allow it to be claimed by a persistent memory
device driver.
This definition is in addition to the Linux kernel's existing type-12
definition that was recently added in support of shipping platforms with
NVDIMM support that predate ACPI 6.0 (which now classifies type-12 as
OEM reserved).
Note, /proc/iomem can be consulted for differentiating legacy
"Persistent Memory (legacy)" E820_PRAM vs standard "Persistent Memory"
E820_PMEM.
Cc: Boaz Harrosh <boaz@plexistor.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jens Axboe <axboe@fb.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthew Wilcox <willy@linux.intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Jeff Moyer <jmoyer@redhat.com>
Acked-by: Andy Lutomirski <luto@amacapital.net>
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Tested-by: Toshi Kani <toshi.kani@hp.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | arch/arm64/kernel/efi.c | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/efi.c | 4 | ||||
-rw-r--r-- | arch/x86/boot/compressed/eboot.c | 4 | ||||
-rw-r--r-- | arch/x86/include/uapi/asm/e820.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/e820.c | 28 | ||||
-rw-r--r-- | arch/x86/platform/efi/efi.c | 3 | ||||
-rw-r--r-- | include/linux/efi.h | 3 |
7 files changed, 39 insertions, 5 deletions
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c index ab21e0d58278..9d4aa18f2a82 100644 --- a/arch/arm64/kernel/efi.c +++ b/arch/arm64/kernel/efi.c | |||
@@ -158,6 +158,7 @@ static __init int is_reserve_region(efi_memory_desc_t *md) | |||
158 | case EFI_BOOT_SERVICES_CODE: | 158 | case EFI_BOOT_SERVICES_CODE: |
159 | case EFI_BOOT_SERVICES_DATA: | 159 | case EFI_BOOT_SERVICES_DATA: |
160 | case EFI_CONVENTIONAL_MEMORY: | 160 | case EFI_CONVENTIONAL_MEMORY: |
161 | case EFI_PERSISTENT_MEMORY: | ||
161 | return 0; | 162 | return 0; |
162 | default: | 163 | default: |
163 | break; | 164 | break; |
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index c52d7540dc05..5f6be9dd6968 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -1223,6 +1223,10 @@ efi_initialize_iomem_resources(struct resource *code_resource, | |||
1223 | flags |= IORESOURCE_DISABLED; | 1223 | flags |= IORESOURCE_DISABLED; |
1224 | break; | 1224 | break; |
1225 | 1225 | ||
1226 | case EFI_PERSISTENT_MEMORY: | ||
1227 | name = "Persistent Memory"; | ||
1228 | break; | ||
1229 | |||
1226 | case EFI_RESERVED_TYPE: | 1230 | case EFI_RESERVED_TYPE: |
1227 | case EFI_RUNTIME_SERVICES_CODE: | 1231 | case EFI_RUNTIME_SERVICES_CODE: |
1228 | case EFI_RUNTIME_SERVICES_DATA: | 1232 | case EFI_RUNTIME_SERVICES_DATA: |
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index 48304b89b601..2c82bd150d43 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -1224,6 +1224,10 @@ static efi_status_t setup_e820(struct boot_params *params, | |||
1224 | e820_type = E820_NVS; | 1224 | e820_type = E820_NVS; |
1225 | break; | 1225 | break; |
1226 | 1226 | ||
1227 | case EFI_PERSISTENT_MEMORY: | ||
1228 | e820_type = E820_PMEM; | ||
1229 | break; | ||
1230 | |||
1227 | default: | 1231 | default: |
1228 | continue; | 1232 | continue; |
1229 | } | 1233 | } |
diff --git a/arch/x86/include/uapi/asm/e820.h b/arch/x86/include/uapi/asm/e820.h index 960a8a9dc4ab..0f457e6eab18 100644 --- a/arch/x86/include/uapi/asm/e820.h +++ b/arch/x86/include/uapi/asm/e820.h | |||
@@ -32,6 +32,7 @@ | |||
32 | #define E820_ACPI 3 | 32 | #define E820_ACPI 3 |
33 | #define E820_NVS 4 | 33 | #define E820_NVS 4 |
34 | #define E820_UNUSABLE 5 | 34 | #define E820_UNUSABLE 5 |
35 | #define E820_PMEM 7 | ||
35 | 36 | ||
36 | /* | 37 | /* |
37 | * This is a non-standardized way to represent ADR or NVDIMM regions that | 38 | * This is a non-standardized way to represent ADR or NVDIMM regions that |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index e2ce85db2283..c857d53269dd 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -149,6 +149,7 @@ static void __init e820_print_type(u32 type) | |||
149 | case E820_UNUSABLE: | 149 | case E820_UNUSABLE: |
150 | printk(KERN_CONT "unusable"); | 150 | printk(KERN_CONT "unusable"); |
151 | break; | 151 | break; |
152 | case E820_PMEM: | ||
152 | case E820_PRAM: | 153 | case E820_PRAM: |
153 | printk(KERN_CONT "persistent (type %u)", type); | 154 | printk(KERN_CONT "persistent (type %u)", type); |
154 | break; | 155 | break; |
@@ -918,11 +919,32 @@ static inline const char *e820_type_to_string(int e820_type) | |||
918 | case E820_ACPI: return "ACPI Tables"; | 919 | case E820_ACPI: return "ACPI Tables"; |
919 | case E820_NVS: return "ACPI Non-volatile Storage"; | 920 | case E820_NVS: return "ACPI Non-volatile Storage"; |
920 | case E820_UNUSABLE: return "Unusable memory"; | 921 | case E820_UNUSABLE: return "Unusable memory"; |
921 | case E820_PRAM: return "Persistent RAM"; | 922 | case E820_PRAM: return "Persistent Memory (legacy)"; |
923 | case E820_PMEM: return "Persistent Memory"; | ||
922 | default: return "reserved"; | 924 | default: return "reserved"; |
923 | } | 925 | } |
924 | } | 926 | } |
925 | 927 | ||
928 | static bool do_mark_busy(u32 type, struct resource *res) | ||
929 | { | ||
930 | /* this is the legacy bios/dos rom-shadow + mmio region */ | ||
931 | if (res->start < (1ULL<<20)) | ||
932 | return true; | ||
933 | |||
934 | /* | ||
935 | * Treat persistent memory like device memory, i.e. reserve it | ||
936 | * for exclusive use of a driver | ||
937 | */ | ||
938 | switch (type) { | ||
939 | case E820_RESERVED: | ||
940 | case E820_PRAM: | ||
941 | case E820_PMEM: | ||
942 | return false; | ||
943 | default: | ||
944 | return true; | ||
945 | } | ||
946 | } | ||
947 | |||
926 | /* | 948 | /* |
927 | * Mark e820 reserved areas as busy for the resource manager. | 949 | * Mark e820 reserved areas as busy for the resource manager. |
928 | */ | 950 | */ |
@@ -952,9 +974,7 @@ void __init e820_reserve_resources(void) | |||
952 | * pci device BAR resource and insert them later in | 974 | * pci device BAR resource and insert them later in |
953 | * pcibios_resource_survey() | 975 | * pcibios_resource_survey() |
954 | */ | 976 | */ |
955 | if (((e820.map[i].type != E820_RESERVED) && | 977 | if (do_mark_busy(e820.map[i].type, res)) { |
956 | (e820.map[i].type != E820_PRAM)) || | ||
957 | res->start < (1ULL<<20)) { | ||
958 | res->flags |= IORESOURCE_BUSY; | 978 | res->flags |= IORESOURCE_BUSY; |
959 | insert_resource(&iomem_resource, res); | 979 | insert_resource(&iomem_resource, res); |
960 | } | 980 | } |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 02744df576d5..fe01ae37a2a4 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -153,6 +153,9 @@ static void __init do_add_efi_memmap(void) | |||
153 | case EFI_UNUSABLE_MEMORY: | 153 | case EFI_UNUSABLE_MEMORY: |
154 | e820_type = E820_UNUSABLE; | 154 | e820_type = E820_UNUSABLE; |
155 | break; | 155 | break; |
156 | case EFI_PERSISTENT_MEMORY: | ||
157 | e820_type = E820_PMEM; | ||
158 | break; | ||
156 | default: | 159 | default: |
157 | /* | 160 | /* |
158 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE | 161 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE |
diff --git a/include/linux/efi.h b/include/linux/efi.h index af5be0368dec..825b6e3d69cb 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -85,7 +85,8 @@ typedef struct { | |||
85 | #define EFI_MEMORY_MAPPED_IO 11 | 85 | #define EFI_MEMORY_MAPPED_IO 11 |
86 | #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 | 86 | #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 |
87 | #define EFI_PAL_CODE 13 | 87 | #define EFI_PAL_CODE 13 |
88 | #define EFI_MAX_MEMORY_TYPE 14 | 88 | #define EFI_PERSISTENT_MEMORY 14 |
89 | #define EFI_MAX_MEMORY_TYPE 15 | ||
89 | 90 | ||
90 | /* Attribute values: */ | 91 | /* Attribute values: */ |
91 | #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ | 92 | #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */ |