18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#include <linux/efi.h> 68c2ecf20Sopenharmony_ci#include <linux/initrd.h> 78c2ecf20Sopenharmony_ci#include <linux/memblock.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <asm/bootinfo.h> 108c2ecf20Sopenharmony_ci#include <asm/sections.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <loongson.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_civoid __init memblock_init(void) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci u32 mem_type; 178c2ecf20Sopenharmony_ci u64 mem_start, mem_end, mem_size; 188c2ecf20Sopenharmony_ci efi_memory_desc_t *md; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci /* Parse memory information */ 218c2ecf20Sopenharmony_ci for_each_efi_memory_desc(md) { 228c2ecf20Sopenharmony_ci mem_type = md->type; 238c2ecf20Sopenharmony_ci mem_start = md->phys_addr; 248c2ecf20Sopenharmony_ci mem_size = md->num_pages << EFI_PAGE_SHIFT; 258c2ecf20Sopenharmony_ci mem_end = mem_start + mem_size; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci switch (mem_type) { 288c2ecf20Sopenharmony_ci case EFI_LOADER_CODE: 298c2ecf20Sopenharmony_ci case EFI_LOADER_DATA: 308c2ecf20Sopenharmony_ci case EFI_BOOT_SERVICES_CODE: 318c2ecf20Sopenharmony_ci case EFI_BOOT_SERVICES_DATA: 328c2ecf20Sopenharmony_ci case EFI_PERSISTENT_MEMORY: 338c2ecf20Sopenharmony_ci case EFI_CONVENTIONAL_MEMORY: 348c2ecf20Sopenharmony_ci memblock_add(mem_start, mem_size); 358c2ecf20Sopenharmony_ci if (max_low_pfn < (mem_end >> PAGE_SHIFT)) 368c2ecf20Sopenharmony_ci max_low_pfn = mem_end >> PAGE_SHIFT; 378c2ecf20Sopenharmony_ci break; 388c2ecf20Sopenharmony_ci case EFI_PAL_CODE: 398c2ecf20Sopenharmony_ci case EFI_UNUSABLE_MEMORY: 408c2ecf20Sopenharmony_ci case EFI_ACPI_RECLAIM_MEMORY: 418c2ecf20Sopenharmony_ci memblock_add(mem_start, mem_size); 428c2ecf20Sopenharmony_ci fallthrough; 438c2ecf20Sopenharmony_ci case EFI_RESERVED_TYPE: 448c2ecf20Sopenharmony_ci case EFI_RUNTIME_SERVICES_CODE: 458c2ecf20Sopenharmony_ci case EFI_RUNTIME_SERVICES_DATA: 468c2ecf20Sopenharmony_ci case EFI_MEMORY_MAPPED_IO: 478c2ecf20Sopenharmony_ci case EFI_MEMORY_MAPPED_IO_PORT_SPACE: 488c2ecf20Sopenharmony_ci memblock_reserve(mem_start, mem_size); 498c2ecf20Sopenharmony_ci break; 508c2ecf20Sopenharmony_ci } 518c2ecf20Sopenharmony_ci } 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci memblock_set_current_limit(PFN_PHYS(max_low_pfn)); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci /* Reserve the first 2MB */ 568c2ecf20Sopenharmony_ci memblock_reserve(PHYS_OFFSET, 0x200000); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci /* Reserve the kernel text/data/bss */ 598c2ecf20Sopenharmony_ci memblock_reserve(__pa_symbol(&_text), 608c2ecf20Sopenharmony_ci __pa_symbol(&_end) - __pa_symbol(&_text)); 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0); 638c2ecf20Sopenharmony_ci memblock_set_node(0, PHYS_ADDR_MAX, &memblock.reserved, 0); 648c2ecf20Sopenharmony_ci} 65