riscv: Register System RAM as iomem resources
authorZong Li <zong.li@sifive.com>
Tue, 16 Jun 2020 07:45:46 +0000 (15:45 +0800)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Thu, 9 Jul 2020 19:42:02 +0000 (12:42 -0700)
Add System RAM to /proc/iomem, various tools expect it such as kdump.
It is also needed for page_is_ram API which checks the specified address
whether registered as System RAM in iomem_resource list.

Signed-off-by: Zong Li <zong.li@sifive.com>
[Palmer: check MEMBLOCK_NOMAP]
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
arch/riscv/mm/init.c

index f4adb36..9200295 100644 (file)
@@ -517,6 +517,32 @@ void mark_rodata_ro(void)
 }
 #endif
 
+void __init resource_init(void)
+{
+       struct memblock_region *region;
+
+       for_each_memblock(memory, region) {
+               struct resource *res;
+
+               res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES);
+               if (!res)
+                       panic("%s: Failed to allocate %zu bytes\n", __func__,
+                             sizeof(struct resource));
+
+               if (memblock_is_nomap(region)) {
+                       res->name = "reserved";
+                       res->flags = IORESOURCE_MEM;
+               } else {
+                       res->name = "System RAM";
+                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
+               }
+               res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
+               res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
+
+               request_resource(&iomem_resource, res);
+       }
+}
+
 void __init paging_init(void)
 {
        setup_vm_final();
@@ -524,6 +550,7 @@ void __init paging_init(void)
        sparse_init();
        setup_zero_page();
        zone_sizes_init();
+       resource_init();
 }
 
 #ifdef CONFIG_SPARSEMEM_VMEMMAP