Commit 158e969e authored by Hongchen Zhang's avatar Hongchen Zhang
Browse files

LoongArch: fix efi map page table error

LoongArch inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9QMTK



------------------------------------------

we should map all efi used memory, not the kernel usable memory.

Fixes: 221e2e8b ("LoongArch: add kernel setvirtmap for runtime")
Signed-off-by: default avatarYun Liu <liuyun@loongson.cn>
Signed-off-by: default avatarHongchen Zhang <zhanghongchen@loongson.cn>
parent 3fbfba55
Loading
Loading
Loading
Loading
+31 −8
Original line number Diff line number Diff line
@@ -69,8 +69,10 @@ static int __init efimap_populate_hugepages(
		if (pud_none(*pud)) {
			void *p = memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);

			if (!p)
			if (!p) {
				pr_err("can not alloc efimap huge pages!\n");
				return -1;
			}
			pmd_init(p);
			pud_populate(&init_mm, pud, p);
		}
@@ -88,7 +90,8 @@ static void __init efi_map_pgt(void)
{
	unsigned long node;
	unsigned long start, end;
	unsigned long start_pfn, end_pfn;
	efi_memory_desc_t *md;
	u32 mem_type;

	pgd_efi = memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);
	if (!pgd_efi) {
@@ -105,13 +108,33 @@ static void __init efi_map_pgt(void)
		/* MMIO Registers, Uncached */
		efimap_populate_hugepages(SZ_256M | (node << 44),
				SZ_512M | (node << 44), PAGE_KERNEL_SUC);
	}

		get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
		start = ALIGN_DOWN(start_pfn << PAGE_SHIFT, PMD_SIZE);
		end = ALIGN(end_pfn << PAGE_SHIFT, PMD_SIZE);

		/* System memory, Cached */
	/* Parse memory information */
	for_each_efi_memory_desc(md) {
		mem_type = md->type;
		start = ALIGN_DOWN(md->phys_addr, PMD_SIZE);
		end = ALIGN(start + (md->num_pages << EFI_PAGE_SHIFT), PMD_SIZE);
		node = start >> 44;

		switch (mem_type) {
		case EFI_LOADER_CODE:
		case EFI_LOADER_DATA:
		case EFI_BOOT_SERVICES_CODE:
		case EFI_BOOT_SERVICES_DATA:
		case EFI_PAL_CODE:
		case EFI_UNUSABLE_MEMORY:
		case EFI_ACPI_RECLAIM_MEMORY:
		case EFI_RESERVED_TYPE:
		case EFI_RUNTIME_SERVICES_CODE:
		case EFI_RUNTIME_SERVICES_DATA:
			efimap_populate_hugepages(node ? start : SZ_512M, end, PAGE_KERNEL);
			break;
		case EFI_MEMORY_MAPPED_IO:
		case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
			efimap_populate_hugepages(node ? start : SZ_512M, end, PAGE_KERNEL_SUC);
			break;
		}
	}
}