Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI fixes from Ingo Molnar:
"This tree reverts a GICv3 commit (which was broken) and fixes it in
another way, by adding a memblock build-time entries quirk for ARM64"

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
efi/arm: Revert "Defer persistent reservations until after paging_init()"
arm64, mm, efi: Account for GICv3 LPI tables in static memblock reserve table

Changed files
+20 -20
arch
arm64
include
asm
kernel
drivers
firmware
efi
libstub
include
mm
+11
arch/arm64/include/asm/memory.h
··· 332 332 #define virt_addr_valid(kaddr) \ 333 333 (_virt_addr_is_linear(kaddr) && _virt_addr_valid(kaddr)) 334 334 335 + /* 336 + * Given that the GIC architecture permits ITS implementations that can only be 337 + * configured with a LPI table address once, GICv3 systems with many CPUs may 338 + * end up reserving a lot of different regions after a kexec for their LPI 339 + * tables (one per CPU), as we are forced to reuse the same memory after kexec 340 + * (and thus reserve it persistently with EFI beforehand) 341 + */ 342 + #if defined(CONFIG_EFI) && defined(CONFIG_ARM_GIC_V3_ITS) 343 + # define INIT_MEMBLOCK_RESERVED_REGIONS (INIT_MEMBLOCK_REGIONS + NR_CPUS + 1) 344 + #endif 345 + 335 346 #include <asm-generic/memory_model.h> 336 347 337 348 #endif
-1
arch/arm64/kernel/setup.c
··· 313 313 arm64_memblock_init(); 314 314 315 315 paging_init(); 316 - efi_apply_persistent_mem_reservations(); 317 316 318 317 acpi_table_upgrade(); 319 318
-4
drivers/firmware/efi/efi.c
··· 592 592 593 593 early_memunmap(tbl, sizeof(*tbl)); 594 594 } 595 - return 0; 596 - } 597 595 598 - int __init efi_apply_persistent_mem_reservations(void) 599 - { 600 596 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) { 601 597 unsigned long prsv = efi.mem_reserve; 602 598
-3
drivers/firmware/efi/libstub/arm-stub.c
··· 75 75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID; 76 76 efi_status_t status; 77 77 78 - if (IS_ENABLED(CONFIG_ARM)) 79 - return; 80 - 81 78 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv), 82 79 (void **)&rsv); 83 80 if (status != EFI_SUCCESS) {
-7
include/linux/efi.h
··· 1198 1198 extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 1199 1199 1200 1200 extern bool efi_is_table_address(unsigned long phys_addr); 1201 - 1202 - extern int efi_apply_persistent_mem_reservations(void); 1203 1201 #else 1204 1202 static inline bool efi_enabled(int feature) 1205 1203 { ··· 1215 1217 static inline bool efi_is_table_address(unsigned long phys_addr) 1216 1218 { 1217 1219 return false; 1218 - } 1219 - 1220 - static inline int efi_apply_persistent_mem_reservations(void) 1221 - { 1222 - return 0; 1223 1220 } 1224 1221 #endif 1225 1222
-3
include/linux/memblock.h
··· 29 29 */ 30 30 extern unsigned long long max_possible_pfn; 31 31 32 - #define INIT_MEMBLOCK_REGIONS 128 33 - #define INIT_PHYSMEM_REGIONS 4 34 - 35 32 /** 36 33 * enum memblock_flags - definition of memory region attributes 37 34 * @MEMBLOCK_NONE: no special request
+9 -2
mm/memblock.c
··· 26 26 27 27 #include "internal.h" 28 28 29 + #define INIT_MEMBLOCK_REGIONS 128 30 + #define INIT_PHYSMEM_REGIONS 4 31 + 32 + #ifndef INIT_MEMBLOCK_RESERVED_REGIONS 33 + # define INIT_MEMBLOCK_RESERVED_REGIONS INIT_MEMBLOCK_REGIONS 34 + #endif 35 + 29 36 /** 30 37 * DOC: memblock overview 31 38 * ··· 99 92 unsigned long long max_possible_pfn; 100 93 101 94 static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock; 102 - static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock; 95 + static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS] __initdata_memblock; 103 96 #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP 104 97 static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS] __initdata_memblock; 105 98 #endif ··· 112 105 113 106 .reserved.regions = memblock_reserved_init_regions, 114 107 .reserved.cnt = 1, /* empty dummy entry */ 115 - .reserved.max = INIT_MEMBLOCK_REGIONS, 108 + .reserved.max = INIT_MEMBLOCK_RESERVED_REGIONS, 116 109 .reserved.name = "reserved", 117 110 118 111 #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP