diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/pci/mmconfig-shared.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 332fabdeff43..ffe72b9d6869 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
@@ -544,8 +544,6 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
544 | } | 544 | } |
545 | } | 545 | } |
546 | 546 | ||
547 | static int __initdata known_bridge; | ||
548 | |||
549 | static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg, | 547 | static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg, |
550 | struct acpi_mcfg_allocation *cfg) | 548 | struct acpi_mcfg_allocation *cfg) |
551 | { | 549 | { |
@@ -617,28 +615,7 @@ static int __init pci_parse_mcfg(struct acpi_table_header *header) | |||
617 | 615 | ||
618 | static void __init __pci_mmcfg_init(int early) | 616 | static void __init __pci_mmcfg_init(int early) |
619 | { | 617 | { |
620 | /* MMCONFIG disabled */ | ||
621 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) | ||
622 | return; | ||
623 | |||
624 | /* MMCONFIG already enabled */ | ||
625 | if (!early && !(pci_probe & PCI_PROBE_MASK & ~PCI_PROBE_MMCONF)) | ||
626 | return; | ||
627 | |||
628 | /* for late to exit */ | ||
629 | if (known_bridge) | ||
630 | return; | ||
631 | |||
632 | if (early) { | ||
633 | if (pci_mmcfg_check_hostbridge()) | ||
634 | known_bridge = 1; | ||
635 | } | ||
636 | |||
637 | if (!known_bridge) | ||
638 | acpi_sfi_table_parse(ACPI_SIG_MCFG, pci_parse_mcfg); | ||
639 | |||
640 | pci_mmcfg_reject_broken(early); | 618 | pci_mmcfg_reject_broken(early); |
641 | |||
642 | if (list_empty(&pci_mmcfg_list)) | 619 | if (list_empty(&pci_mmcfg_list)) |
643 | return; | 620 | return; |
644 | 621 | ||
@@ -660,14 +637,33 @@ static void __init __pci_mmcfg_init(int early) | |||
660 | } | 637 | } |
661 | } | 638 | } |
662 | 639 | ||
640 | static int __initdata known_bridge; | ||
641 | |||
663 | void __init pci_mmcfg_early_init(void) | 642 | void __init pci_mmcfg_early_init(void) |
664 | { | 643 | { |
665 | __pci_mmcfg_init(1); | 644 | if (pci_probe & PCI_PROBE_MMCONF) { |
645 | if (pci_mmcfg_check_hostbridge()) | ||
646 | known_bridge = 1; | ||
647 | else | ||
648 | acpi_sfi_table_parse(ACPI_SIG_MCFG, pci_parse_mcfg); | ||
649 | __pci_mmcfg_init(1); | ||
650 | } | ||
666 | } | 651 | } |
667 | 652 | ||
668 | void __init pci_mmcfg_late_init(void) | 653 | void __init pci_mmcfg_late_init(void) |
669 | { | 654 | { |
670 | __pci_mmcfg_init(0); | 655 | /* MMCONFIG disabled */ |
656 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) | ||
657 | return; | ||
658 | |||
659 | if (known_bridge) | ||
660 | return; | ||
661 | |||
662 | /* MMCONFIG hasn't been enabled yet, try again */ | ||
663 | if (pci_probe & PCI_PROBE_MASK & ~PCI_PROBE_MMCONF) { | ||
664 | acpi_sfi_table_parse(ACPI_SIG_MCFG, pci_parse_mcfg); | ||
665 | __pci_mmcfg_init(0); | ||
666 | } | ||
671 | } | 667 | } |
672 | 668 | ||
673 | static int __init pci_mmcfg_late_insert_resources(void) | 669 | static int __init pci_mmcfg_late_insert_resources(void) |