|
15 | 15 | #include <linux/io.h>
|
16 | 16 | #include <asm/apic.h>
|
17 | 17 | #include <asm/desc.h>
|
| 18 | +#include <asm/e820/api.h> |
18 | 19 | #include <asm/sev.h>
|
19 | 20 | #include <asm/ibt.h>
|
20 | 21 | #include <asm/hypervisor.h>
|
@@ -286,15 +287,31 @@ static int hv_cpu_die(unsigned int cpu)
|
286 | 287 |
|
287 | 288 | static int __init hv_pci_init(void)
|
288 | 289 | {
|
289 |
| - int gen2vm = efi_enabled(EFI_BOOT); |
| 290 | + bool gen2vm = efi_enabled(EFI_BOOT); |
290 | 291 |
|
291 | 292 | /*
|
292 |
| - * For Generation-2 VM, we exit from pci_arch_init() by returning 0. |
293 |
| - * The purpose is to suppress the harmless warning: |
| 293 | + * A Generation-2 VM doesn't support legacy PCI/PCIe, so both |
| 294 | + * raw_pci_ops and raw_pci_ext_ops are NULL, and pci_subsys_init() -> |
| 295 | + * pcibios_init() doesn't call pcibios_resource_survey() -> |
| 296 | + * e820__reserve_resources_late(); as a result, any emulated persistent |
| 297 | + * memory of E820_TYPE_PRAM (12) via the kernel parameter |
| 298 | + * memmap=nn[KMG]!ss is not added into iomem_resource and hence can't be |
| 299 | + * detected by register_e820_pmem(). Fix this by directly calling |
| 300 | + * e820__reserve_resources_late() here: e820__reserve_resources_late() |
| 301 | + * depends on e820__reserve_resources(), which has been called earlier |
| 302 | + * from setup_arch(). Note: e820__reserve_resources_late() also adds |
| 303 | + * any memory of E820_TYPE_PMEM (7) into iomem_resource, and |
| 304 | + * acpi_nfit_register_region() -> acpi_nfit_insert_resource() -> |
| 305 | + * region_intersects() returns REGION_INTERSECTS, so the memory of |
| 306 | + * E820_TYPE_PMEM won't get added twice. |
| 307 | + * |
| 308 | + * We return 0 here so that pci_arch_init() won't print the warning: |
294 | 309 | * "PCI: Fatal: No config space access function found"
|
295 | 310 | */
|
296 |
| - if (gen2vm) |
| 311 | + if (gen2vm) { |
| 312 | + e820__reserve_resources_late(); |
297 | 313 | return 0;
|
| 314 | + } |
298 | 315 |
|
299 | 316 | /* For Generation-1 VM, we'll proceed in pci_arch_init(). */
|
300 | 317 | return 1;
|
|
0 commit comments