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