aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2015-04-03 12:05:28 -0400
committerDan Williams <dan.j.williams@intel.com>2015-05-27 21:46:05 -0400
commitad5fb870c486d932a1749d7853dd70f436a7e03f (patch)
tree68998840d8d8219e959e966c11c78f73327f7adf
parentf3b6ced236259a87829b829e8e542ff53bfb9a4f (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.c1
-rw-r--r--arch/ia64/kernel/efi.c4
-rw-r--r--arch/x86/boot/compressed/eboot.c4
-rw-r--r--arch/x86/include/uapi/asm/e820.h1
-rw-r--r--arch/x86/kernel/e820.c28
-rw-r--r--arch/x86/platform/efi/efi.c3
-rw-r--r--include/linux/efi.h3
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
928static 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 */