Jonathan Zhang has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/52585 )
Change subject: lib: set up special purpose memory as LB_MEM_SOFT_RESERVED ......................................................................
lib: set up special purpose memory as LB_MEM_SOFT_RESERVED
CXL memory is provided through CXL device which is connected through CXL/PCIe link, while regular system memory is provided through DIMMs plugged into DIMM slots which are connected to memory controllers of processor.
With CXL memory, the server's memory capacity is increased. CXL memory is in its own NUMA domain, with longer latency and higher bandwidth, comparing to system memory.
Host firmware presents CXL memory to OS as specific purpose memory. Linux kernel dax driver provides direct access to differntiated memory. In particular, hmem dax driver provides direct access to specific purpose memory.
Specific purpoose memory needs to be represented in C820 table as soft reserved, as described in [1].
Add IORESOURCE_SOFT_RESERVE resource property to indicate (memory) resource that needs to be soft reserved.
Add soft_reserved_ram_resource macro to allow soc/mb code to add memory resource as soft reserved.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v...
Change-Id: Ie70795bcb8c97e9dd5fb772adc060e1606f9bab0 --- M src/commonlib/include/commonlib/coreboot_tables.h M src/include/bootmem.h M src/include/device/device.h M src/include/device/resource.h M src/lib/bootmem.c 5 files changed, 13 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/85/52585/1
diff --git a/src/commonlib/include/commonlib/coreboot_tables.h b/src/commonlib/include/commonlib/coreboot_tables.h index 3627996..b90dcdb 100644 --- a/src/commonlib/include/commonlib/coreboot_tables.h +++ b/src/commonlib/include/commonlib/coreboot_tables.h @@ -151,6 +151,7 @@ #define LB_MEM_UNUSABLE 5 /* Unusable address space */ #define LB_MEM_VENDOR_RSVD 6 /* Vendor Reserved */ #define LB_MEM_TABLE 16 /* Ram configuration tables are kept in */ +#define LB_MEM_SOFT_RESERVED 0xefffffff /* Special-purpose memory */ };
struct lb_memory { diff --git a/src/include/bootmem.h b/src/include/bootmem.h index 0625bbb..8623a0a 100644 --- a/src/include/bootmem.h +++ b/src/include/bootmem.h @@ -27,6 +27,7 @@ BM_MEM_OPENSBI, /* Risc-V OpenSBI */ BM_MEM_BL31, /* Arm64 BL31 executable */ BM_MEM_TABLE, /* Ram configuration tables are kept in */ + BM_MEM_SOFT_RESERVED, /* Special-purpose memory */ /* Tags below this point are ignored for the OS table. */ BM_MEM_OS_CUTOFF = BM_MEM_TABLE, BM_MEM_RAMSTAGE, diff --git a/src/include/device/device.h b/src/include/device/device.h index 082dcbb..5bbb97f 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -282,6 +282,10 @@ fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_CACHEABLE \ | IORESOURCE_RESERVE)
+#define soft_reserved_ram_resource(dev, idx, basek, sizek) \ + fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_CACHEABLE \ + | IORESOURCE_SOFT_RESERVE ) + #define bad_ram_resource(dev, idx, basek, sizek) \ reserved_ram_resource((dev), (idx), (basek), (sizek))
diff --git a/src/include/device/resource.h b/src/include/device/resource.h index 42c7e6a..fde7789 100644 --- a/src/include/device/resource.h +++ b/src/include/device/resource.h @@ -26,6 +26,8 @@ #define IORESOURCE_BRIDGE 0x00080000 /* This is a request to allocate resource about 4G boundary. */ #define IORESOURCE_ABOVE_4G 0x00100000 +/* The resource needs to be soft reserved in the coreboot table */ +#define IORESOURCE_SOFT_RESERVE 0x01000000 /* The resource needs to be reserved in the coreboot table */ #define IORESOURCE_RESERVE 0x10000000 /* The IO resource assignment has been stored in the device */ diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c index fa1f8bc..197f225 100644 --- a/src/lib/bootmem.c +++ b/src/lib/bootmem.c @@ -50,6 +50,8 @@ return LB_MEM_RESERVED; case BM_MEM_TABLE: return LB_MEM_TABLE; + case BM_MEM_SOFT_RESERVED: + return LB_MEM_SOFT_RESERVED; default: printk(BIOS_ERR, "ERROR: Unsupported tag %u\n", tag); return LB_MEM_RESERVED; @@ -60,6 +62,7 @@ { const unsigned long cacheable = IORESOURCE_CACHEABLE; const unsigned long reserved = IORESOURCE_RESERVE; + const unsigned long soft_reserved = IORESOURCE_SOFT_RESERVE; struct memranges *bm = &bootmem;
initialized = 1; @@ -71,6 +74,7 @@ */ memranges_init(bm, cacheable, cacheable, BM_MEM_RAM); memranges_add_resources(bm, reserved, reserved, BM_MEM_RESERVED); + memranges_add_resources(bm, soft_reserved, soft_reserved, BM_MEM_SOFT_RESERVED); memranges_clone(&bootmem_os, bm);
/* Add memory used by CBMEM. */ @@ -136,6 +140,7 @@ { BM_MEM_BL31, "BL31" }, { BM_MEM_OPENSBI, "OPENSBI" }, { BM_MEM_TABLE, "CONFIGURATION TABLES" }, + { BM_MEM_SOFT_RESERVED, "SOFT RESERVED" }, { BM_MEM_RAMSTAGE, "RAMSTAGE" }, { BM_MEM_PAYLOAD, "PAYLOAD" }, };