Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad5fb870 authored by Dan Williams's avatar Dan Williams
Browse files

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: default avatarJeff Moyer <jmoyer@redhat.com>
Acked-by: default avatarAndy Lutomirski <luto@amacapital.net>
Reviewed-by: default avatarRoss Zwisler <ross.zwisler@linux.intel.com>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarToshi Kani <toshi.kani@hp.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent f3b6ced2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -158,6 +158,7 @@ static __init int is_reserve_region(efi_memory_desc_t *md)
	case EFI_BOOT_SERVICES_CODE:
	case EFI_BOOT_SERVICES_DATA:
	case EFI_CONVENTIONAL_MEMORY:
	case EFI_PERSISTENT_MEMORY:
		return 0;
	default:
		break;
+4 −0
Original line number Diff line number Diff line
@@ -1223,6 +1223,10 @@ efi_initialize_iomem_resources(struct resource *code_resource,
				flags |= IORESOURCE_DISABLED;
				break;

			case EFI_PERSISTENT_MEMORY:
				name = "Persistent Memory";
				break;

			case EFI_RESERVED_TYPE:
			case EFI_RUNTIME_SERVICES_CODE:
			case EFI_RUNTIME_SERVICES_DATA:
+4 −0
Original line number Diff line number Diff line
@@ -1224,6 +1224,10 @@ static efi_status_t setup_e820(struct boot_params *params,
			e820_type = E820_NVS;
			break;

		case EFI_PERSISTENT_MEMORY:
			e820_type = E820_PMEM;
			break;

		default:
			continue;
		}
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#define E820_ACPI	3
#define E820_NVS	4
#define E820_UNUSABLE	5
#define E820_PMEM	7

/*
 * This is a non-standardized way to represent ADR or NVDIMM regions that
+24 −4
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ static void __init e820_print_type(u32 type)
	case E820_UNUSABLE:
		printk(KERN_CONT "unusable");
		break;
	case E820_PMEM:
	case E820_PRAM:
		printk(KERN_CONT "persistent (type %u)", type);
		break;
@@ -918,11 +919,32 @@ static inline const char *e820_type_to_string(int e820_type)
	case E820_ACPI:	return "ACPI Tables";
	case E820_NVS:	return "ACPI Non-volatile Storage";
	case E820_UNUSABLE:	return "Unusable memory";
	case E820_PRAM: return "Persistent RAM";
	case E820_PRAM: return "Persistent Memory (legacy)";
	case E820_PMEM: return "Persistent Memory";
	default:	return "reserved";
	}
}

static bool do_mark_busy(u32 type, struct resource *res)
{
	/* this is the legacy bios/dos rom-shadow + mmio region */
	if (res->start < (1ULL<<20))
		return true;

	/*
	 * Treat persistent memory like device memory, i.e. reserve it
	 * for exclusive use of a driver
	 */
	switch (type) {
	case E820_RESERVED:
	case E820_PRAM:
	case E820_PMEM:
		return false;
	default:
		return true;
	}
}

/*
 * Mark e820 reserved areas as busy for the resource manager.
 */
@@ -952,9 +974,7 @@ void __init e820_reserve_resources(void)
		 * pci device BAR resource and insert them later in
		 * pcibios_resource_survey()
		 */
		if (((e820.map[i].type != E820_RESERVED) &&
		     (e820.map[i].type != E820_PRAM)) ||
		     res->start < (1ULL<<20)) {
		if (do_mark_busy(e820.map[i].type, res)) {
			res->flags |= IORESOURCE_BUSY;
			insert_resource(&iomem_resource, res);
		}
Loading