s390/boot: Consider DCSS segments on memory layout setup
authorAlexander Gordeev <agordeev@linux.ibm.com>
Fri, 1 Mar 2024 06:03:49 +0000 (07:03 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 17 Apr 2024 11:37:59 +0000 (13:37 +0200)
The maximum mappable physical address (as returned by
arch_get_mappable_range() callback) is limited by the
value of (1UL << MAX_PHYSMEM_BITS).

The maximum physical address available to a DCSS segment
is 512GB.

In case the available online or offline memory size is less
than the DCSS limit arch_get_mappable_range() would include
never used [512GB..(1UL << MAX_PHYSMEM_BITS)] range.

Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/boot/startup.c
arch/s390/include/asm/extmem.h

index bb5d26f..eee742b 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/elf.h>
 #include <asm/page-states.h>
 #include <asm/boot_data.h>
+#include <asm/extmem.h>
 #include <asm/sections.h>
 #include <asm/maccess.h>
 #include <asm/cpu_mf.h>
@@ -313,14 +314,16 @@ static unsigned long setup_kernel_memory_layout(void)
        pages = SECTION_ALIGN_UP(pages);
        /* keep vmemmap_start aligned to a top level region table entry */
        vmemmap_start = round_down(VMALLOC_START - pages * sizeof(struct page), rte_size);
-       /* maximum address for which linear mapping could be created (DCSS, memory) */
-       max_mappable = min(vmemmap_start, 1UL << MAX_PHYSMEM_BITS);
        /* make sure identity map doesn't overlay with vmemmap */
        ident_map_size = min(ident_map_size, vmemmap_start);
        vmemmap_size = SECTION_ALIGN_UP(ident_map_size / PAGE_SIZE) * sizeof(struct page);
        /* make sure vmemmap doesn't overlay with vmalloc area */
        VMALLOC_START = max(vmemmap_start + vmemmap_size, VMALLOC_START);
        vmemmap = (struct page *)vmemmap_start;
+       /* maximum address for which linear mapping could be created (DCSS, memory) */
+       BUILD_BUG_ON(MAX_DCSS_ADDR > (1UL << MAX_PHYSMEM_BITS));
+       max_mappable = max(ident_map_size, MAX_DCSS_ADDR);
+       max_mappable = min(max_mappable, vmemmap_start);
 
        return asce_limit;
 }
index 568fd81..e0a0606 100644 (file)
@@ -8,6 +8,13 @@
 #define _ASM_S390X_DCSS_H
 #ifndef __ASSEMBLY__
 
+/*
+ * DCSS segment is defined as a contiguous range of pages using DEFSEG command.
+ * The range start and end is a page number with a value less than or equal to
+ * 0x7ffffff (see CP Commands and Utilities Reference).
+ */
+#define MAX_DCSS_ADDR  (512UL * SZ_1G)
+
 /* possible values for segment type as returned by segment_info */
 #define SEG_TYPE_SW 0
 #define SEG_TYPE_EW 1