1*628c3bb4SHuacai Chen // SPDX-License-Identifier: GPL-2.0-or-later 2*628c3bb4SHuacai Chen /* 3*628c3bb4SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4*628c3bb4SHuacai Chen */ 5*628c3bb4SHuacai Chen #include <linux/efi.h> 6*628c3bb4SHuacai Chen #include <linux/initrd.h> 7*628c3bb4SHuacai Chen #include <linux/memblock.h> 8*628c3bb4SHuacai Chen 9*628c3bb4SHuacai Chen #include <asm/bootinfo.h> 10*628c3bb4SHuacai Chen #include <asm/loongson.h> 11*628c3bb4SHuacai Chen #include <asm/sections.h> 12*628c3bb4SHuacai Chen 13*628c3bb4SHuacai Chen void __init memblock_init(void) 14*628c3bb4SHuacai Chen { 15*628c3bb4SHuacai Chen u32 mem_type; 16*628c3bb4SHuacai Chen u64 mem_start, mem_end, mem_size; 17*628c3bb4SHuacai Chen efi_memory_desc_t *md; 18*628c3bb4SHuacai Chen 19*628c3bb4SHuacai Chen /* Parse memory information */ 20*628c3bb4SHuacai Chen for_each_efi_memory_desc(md) { 21*628c3bb4SHuacai Chen mem_type = md->type; 22*628c3bb4SHuacai Chen mem_start = md->phys_addr; 23*628c3bb4SHuacai Chen mem_size = md->num_pages << EFI_PAGE_SHIFT; 24*628c3bb4SHuacai Chen mem_end = mem_start + mem_size; 25*628c3bb4SHuacai Chen 26*628c3bb4SHuacai Chen switch (mem_type) { 27*628c3bb4SHuacai Chen case EFI_LOADER_CODE: 28*628c3bb4SHuacai Chen case EFI_LOADER_DATA: 29*628c3bb4SHuacai Chen case EFI_BOOT_SERVICES_CODE: 30*628c3bb4SHuacai Chen case EFI_BOOT_SERVICES_DATA: 31*628c3bb4SHuacai Chen case EFI_PERSISTENT_MEMORY: 32*628c3bb4SHuacai Chen case EFI_CONVENTIONAL_MEMORY: 33*628c3bb4SHuacai Chen memblock_add(mem_start, mem_size); 34*628c3bb4SHuacai Chen if (max_low_pfn < (mem_end >> PAGE_SHIFT)) 35*628c3bb4SHuacai Chen max_low_pfn = mem_end >> PAGE_SHIFT; 36*628c3bb4SHuacai Chen break; 37*628c3bb4SHuacai Chen case EFI_PAL_CODE: 38*628c3bb4SHuacai Chen case EFI_UNUSABLE_MEMORY: 39*628c3bb4SHuacai Chen case EFI_ACPI_RECLAIM_MEMORY: 40*628c3bb4SHuacai Chen memblock_add(mem_start, mem_size); 41*628c3bb4SHuacai Chen fallthrough; 42*628c3bb4SHuacai Chen case EFI_RESERVED_TYPE: 43*628c3bb4SHuacai Chen case EFI_RUNTIME_SERVICES_CODE: 44*628c3bb4SHuacai Chen case EFI_RUNTIME_SERVICES_DATA: 45*628c3bb4SHuacai Chen case EFI_MEMORY_MAPPED_IO: 46*628c3bb4SHuacai Chen case EFI_MEMORY_MAPPED_IO_PORT_SPACE: 47*628c3bb4SHuacai Chen memblock_reserve(mem_start, mem_size); 48*628c3bb4SHuacai Chen break; 49*628c3bb4SHuacai Chen } 50*628c3bb4SHuacai Chen } 51*628c3bb4SHuacai Chen 52*628c3bb4SHuacai Chen memblock_set_current_limit(PFN_PHYS(max_low_pfn)); 53*628c3bb4SHuacai Chen memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0); 54*628c3bb4SHuacai Chen 55*628c3bb4SHuacai Chen /* Reserve the first 2MB */ 56*628c3bb4SHuacai Chen memblock_reserve(PHYS_OFFSET, 0x200000); 57*628c3bb4SHuacai Chen 58*628c3bb4SHuacai Chen /* Reserve the kernel text/data/bss */ 59*628c3bb4SHuacai Chen memblock_reserve(__pa_symbol(&_text), 60*628c3bb4SHuacai Chen __pa_symbol(&_end) - __pa_symbol(&_text)); 61*628c3bb4SHuacai Chen 62*628c3bb4SHuacai Chen /* Reserve the initrd */ 63*628c3bb4SHuacai Chen reserve_initrd_mem(); 64*628c3bb4SHuacai Chen } 65