Lines Matching +full:co +full:- +full:located

1 // SPDX-License-Identifier: GPL-2.0
8 * Copyright (C) 1999-2002 Hewlett-Packard Co.
9 * David Mosberger-Tang <[email protected]>
11 * Copyright (C) 2005-2008 Intel Co.
17 * Borislav Petkov <[email protected]> - runtime services VA mapping
20 * 32/64 support code. --ying 2007-10-26
24 * in a future version. --drummond 1999-07-20
26 * Implemented EFI runtime services and virtual mode calls. --davidm
29 * Skip non-WB memory and ignore empty memory ranges.
37 #include <linux/efi-bgrt.h>
123 unsigned long long start = md->phys_addr; in do_add_efi_memmap()
124 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; in do_add_efi_memmap()
127 switch (md->type) { in do_add_efi_memmap()
134 && (md->attribute & EFI_MEMORY_SP)) in do_add_efi_memmap()
136 else if (md->attribute & EFI_MEMORY_WB) in do_add_efi_memmap()
170 * e820 mechanism for soft-reserved memory, import the full EFI memory
186 if (md->type == EFI_CONVENTIONAL_MEMORY && in do_efi_soft_reserve()
187 (md->attribute & EFI_MEMORY_SP)) in do_efi_soft_reserve()
203 if (IS_ENABLED(CONFIG_X86_32) && e->efi_memmap_hi > 0) { in efi_memblock_x86_reserve_range()
205 return -EINVAL; in efi_memblock_x86_reserve_range()
207 pmap = (phys_addr_t)(e->efi_memmap | ((u64)e->efi_memmap_hi << 32)); in efi_memblock_x86_reserve_range()
210 data.size = e->efi_memmap_size; in efi_memblock_x86_reserve_range()
211 data.desc_size = e->efi_memdesc_size; in efi_memblock_x86_reserve_range()
212 data.desc_version = e->efi_memdesc_version; in efi_memblock_x86_reserve_range()
233 #define OVERFLOW_ADDR_SHIFT (64 - EFI_PAGE_SHIFT)
239 u64 end = (md->num_pages << EFI_PAGE_SHIFT) + md->phys_addr - 1; in efi_memmap_entry_valid()
243 if (md->num_pages == 0) { in efi_memmap_entry_valid()
245 } else if (md->num_pages > EFI_PAGES_MAX || in efi_memmap_entry_valid()
246 EFI_PAGES_MAX - md->num_pages < in efi_memmap_entry_valid()
247 (md->phys_addr >> EFI_PAGE_SHIFT)) { in efi_memmap_entry_valid()
248 end_hi = (md->num_pages & OVERFLOW_ADDR_MASK) in efi_memmap_entry_valid()
251 if ((md->phys_addr & U64_HIGH_BIT) && !(end & U64_HIGH_BIT)) in efi_memmap_entry_valid()
260 pr_warn("mem%02u: %s range=[0x%016llx-0x%llx%016llx] (invalid)\n", in efi_memmap_entry_valid()
262 md->phys_addr, end_hi, end); in efi_memmap_entry_valid()
264 pr_warn("mem%02u: %s range=[0x%016llx-0x%016llx] (invalid)\n", in efi_memmap_entry_valid()
266 md->phys_addr, end); in efi_memmap_entry_valid()
294 .size = efi.memmap.desc_size * (efi.memmap.nr_map - n_removal), in efi_clean_memmap()
313 * hot-added devices.
319 * describe non-window space that's included in host bridge _CRS. If we
329 if (md->type == EFI_MEMORY_MAPPED_IO) { in efi_remove_e820_mmio()
330 size = md->num_pages << EFI_PAGE_SHIFT; in efi_remove_e820_mmio()
331 start = md->phys_addr; in efi_remove_e820_mmio()
332 end = start + size - 1; in efi_remove_e820_mmio()
334 pr_info("Remove mem%02u: MMIO range=[0x%08llx-0x%08llx] (%lluMB) from e820 map\n", in efi_remove_e820_mmio()
339 pr_info("Not removing mem%02u: MMIO range=[0x%08llx-0x%08llx] (%lluKB) from e820 map\n", in efi_remove_e820_mmio()
355 pr_info("mem%02u: %s range=[0x%016llx-0x%016llx] (%lluMB)\n", in efi_print_memmap()
357 md->phys_addr, in efi_print_memmap()
358 md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1, in efi_print_memmap()
359 (md->num_pages >> (20 - EFI_PAGE_SHIFT))); in efi_print_memmap()
375 return -ENOMEM; in efi_systab_init()
387 efi_runtime = systab64->runtime; in efi_systab_init()
388 over4g = systab64->runtime > U32_MAX; in efi_systab_init()
396 return -ENOMEM; in efi_systab_init()
399 efi_fw_vendor = (unsigned long)data->fw_vendor; in efi_systab_init()
400 efi_config_table = (unsigned long)data->tables; in efi_systab_init()
402 over4g |= data->fw_vendor > U32_MAX || in efi_systab_init()
403 data->tables > U32_MAX; in efi_systab_init()
407 efi_fw_vendor = systab64->fw_vendor; in efi_systab_init()
408 efi_config_table = systab64->tables; in efi_systab_init()
410 over4g |= systab64->fw_vendor > U32_MAX || in efi_systab_init()
411 systab64->tables > U32_MAX; in efi_systab_init()
413 efi_nr_tables = systab64->nr_tables; in efi_systab_init()
417 efi_fw_vendor = systab32->fw_vendor; in efi_systab_init()
418 efi_runtime = systab32->runtime; in efi_systab_init()
419 efi_config_table = systab32->tables; in efi_systab_init()
420 efi_nr_tables = systab32->nr_tables; in efi_systab_init()
423 efi.runtime_version = hdr->revision; in efi_systab_init()
429 pr_err("EFI data located above 4GB, disabling EFI.\n"); in efi_systab_init()
430 return -EINVAL; in efi_systab_init()
455 return -ENOMEM; in efi_config_init()
470 pr_info("Table located above 4GB, disabling EFI.\n"); in efi_init()
488 * that doesn't match the kernel 32/64-bit mode. in efi_init()
492 pr_err("No EFI runtime due to 32/64-bit mismatch with kernel\n"); in efi_init()
521 if (prev_md->type != md->type || in efi_merge_regions()
522 prev_md->attribute != md->attribute) { in efi_merge_regions()
527 prev_size = prev_md->num_pages << EFI_PAGE_SHIFT; in efi_merge_regions()
529 if (md->phys_addr == (prev_md->phys_addr + prev_size)) { in efi_merge_regions()
530 prev_md->num_pages += md->num_pages; in efi_merge_regions()
531 md->type = EFI_RESERVED_TYPE; in efi_merge_regions()
532 md->attribute = 0; in efi_merge_regions()
548 * A first-time allocation doesn't have anything to copy. in realloc_pages()
562 * will be mapped top-down. The end result is the same as if we had
570 return efi.memmap.map_end - efi.memmap.desc_size; in efi_map_next_entry_reverse()
572 entry -= efi.memmap.desc_size; in efi_map_next_entry_reverse()
580 * efi_map_next_entry - Return the next EFI memory map descriptor
602 * out-of-order leads to the firmware accessing in efi_map_next_entry()
608 * scheme by default for 64-bit. in efi_map_next_entry()
629 if (md->attribute & EFI_MEMORY_RUNTIME) in should_map_region()
633 * 32-bit EFI doesn't suffer from the bug that requires us to in should_map_region()
635 * doesn't exist for 32-bit kernels. in should_map_region()
644 if (md->type == EFI_CONVENTIONAL_MEMORY && in should_map_region()
646 (md->attribute & EFI_MEMORY_SP)) in should_map_region()
654 if (md->type == EFI_CONVENTIONAL_MEMORY || in should_map_region()
655 md->type == EFI_LOADER_DATA || in should_map_region()
656 md->type == EFI_LOADER_CODE) in should_map_region()
666 if (md->type == EFI_BOOT_SERVICES_CODE || in should_map_region()
667 md->type == EFI_BOOT_SERVICES_DATA) in should_map_region()
706 left -= desc_size; in efi_map_regions()
721 * non-native EFI. in kexec_enter_virtual_mode()
775 * The new method does a pagetable switch in a preemption-safe manner
800 pr_err("Error reallocating memory, EFI runtime non-functional!\n"); in __efi_enter_virtual_mode()
921 return attr->mode; in efi_attr_is_visible()