mips: Add reserve-nomap memory type support
authorSerge Semin <fancer.lancer@gmail.com>
Tue, 23 Apr 2019 22:47:43 +0000 (01:47 +0300)
committerPaul Burton <paul.burton@mips.com>
Thu, 2 May 2019 18:27:11 +0000 (11:27 -0700)
It might be necessary to prevent the virtual mapping creation for a
requested memory region. For instance there is a "no-map" property
indicating exactly this feature. In this case we need to not only
reserve the specified region by pretending it doesn't exist in the
memory space, but completely remove the range from system just by
removing it from memblock. The same way it's done in default
early_init_dt_reserve_memory_arch() method.

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Paul Burton <paul.burton@mips.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: James Hogan <jhogan@kernel.org>
Cc: Matt Redfearn <matt.redfearn@mips.com>
Cc: Mike Rapoport <rppt@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Cc: Huacai Chen <chenhc@lemote.com>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: linux-mips@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
arch/mips/include/asm/bootinfo.h
arch/mips/kernel/prom.c
arch/mips/kernel/setup.c

index a301a8f4bc6683b502165f5236fe6bd3dbdd7980..235bc2f52113e157f38167bdb7b8e157fc6c6742 100644 (file)
@@ -92,6 +92,7 @@ extern unsigned long mips_machtype;
 #define BOOT_MEM_ROM_DATA      2
 #define BOOT_MEM_RESERVED      3
 #define BOOT_MEM_INIT_RAM      4
+#define BOOT_MEM_NOMAP         5
 
 /*
  * A memory map that's built upon what was determined
index 93b8e0b4332f7d50e6882a7b1adbf77f917b7999..437a174e3ef9a2491e643c0c2f6ae9173bc66dbc 100644 (file)
@@ -47,7 +47,9 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 int __init early_init_dt_reserve_memory_arch(phys_addr_t base,
                                        phys_addr_t size, bool nomap)
 {
-       add_memory_region(base, size, BOOT_MEM_RESERVED);
+       add_memory_region(base, size,
+                         nomap ? BOOT_MEM_NOMAP : BOOT_MEM_RESERVED);
+
        return 0;
 }
 
index 3a5140943f541b7466e2121563980efe4f60523c..2a1b2e7a1bc9cc20d72f9f56eddea5f7938df30e 100644 (file)
@@ -178,6 +178,7 @@ static bool __init __maybe_unused memory_region_available(phys_addr_t start,
                                in_ram = true;
                        break;
                case BOOT_MEM_RESERVED:
+               case BOOT_MEM_NOMAP:
                        if ((start >= start_ && start < end_) ||
                            (start < start_ && start + size >= start_))
                                free = false;
@@ -213,6 +214,9 @@ static void __init print_memory_map(void)
                case BOOT_MEM_RESERVED:
                        printk(KERN_CONT "(reserved)\n");
                        break;
+               case BOOT_MEM_NOMAP:
+                       printk(KERN_CONT "(nomap)\n");
+                       break;
                default:
                        printk(KERN_CONT "type %lu\n", boot_mem_map.map[i].type);
                        break;
@@ -487,6 +491,9 @@ static void __init bootmem_init(void)
                switch (boot_mem_map.map[i].type) {
                case BOOT_MEM_RAM:
                        break;
+               case BOOT_MEM_NOMAP: /* Discard the range from the system. */
+                       memblock_remove(PFN_PHYS(start), PFN_PHYS(end - start));
+                       continue;
                default: /* Reserve the rest of the memory types at boot time */
                        memblock_reserve(PFN_PHYS(start), PFN_PHYS(end - start));
                        break;
@@ -861,6 +868,7 @@ static void __init resource_init(void)
                        res->flags |= IORESOURCE_SYSRAM;
                        break;
                case BOOT_MEM_RESERVED:
+               case BOOT_MEM_NOMAP:
                default:
                        res->name = "reserved";
                }