On Fri, Jun 15, 2012 at 4:50 AM, Jiang Liu <jiang.liu@xxxxxxxxxx> wrote: > Hi Yinghai, > A formal patch to fix "here cache cfg too early. should do > that after pci_mmcfg_reject_broken()". This patch also improves > readability and fixes two condition compilation issues reported by > Fengguang. If you are ok with it, I will fold it into > "[PATCH v7 08/10] PCI, x86: add MMCFG information on demand". > Thanks! > Gerry > > --- > diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h > index 7eae174..5eb2ac9 100644 > --- a/arch/x86/include/asm/pci_x86.h > +++ b/arch/x86/include/asm/pci_x86.h > @@ -142,7 +142,7 @@ extern int __devinit pci_mmconfig_insert(struct device *dev, > u16 seg, u8 start, u8 end, > phys_addr_t addr); > extern int pci_mmconfig_delete(u16 seg, u8 start, u8 end); > -#ifdef CONFIG_ACPI > +#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_MMCONFIG) > extern void pci_mmconfig_probe(u8 start); > #else > static inline void pci_mmconfig_probe(u8 start) { } > diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c > index 20ab4f5..636de35 100644 > --- a/arch/x86/pci/mmconfig-shared.c > +++ b/arch/x86/pci/mmconfig-shared.c > @@ -636,13 +636,6 @@ static int __init pci_parse_mcfg(struct acpi_table_header *header) > } > } > > - i = entries * sizeof(*cfg_table); > - pci_acpi_mcfg_array = kmalloc(i, GFP_KERNEL); > - if (pci_acpi_mcfg_array) { > - memcpy(pci_acpi_mcfg_array, cfg_table, i); > - pci_acpi_mcfg_entries = entries; > - } > - > return 0; > } > > @@ -699,8 +692,11 @@ out: > * Free all MCFG entries if ACPI is enabled. MCFG information will > * be added back on demand by the pci_root driver later. > */ > - if (!early && !acpi_disabled && !known_bridge && pci_acpi_mcfg_array) > - free_all_mmcfg(); > + if (!early && !acpi_disabled && !known_bridge && > + !pci_mmcfg_arch_init_failed) { > + if (!acpi_pci_cache_mcfg()) > + free_all_mmcfg(); > + } > } > > void __init pci_mmcfg_early_init(void) > diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c > index f5d2157..93e0f91 100644 > --- a/drivers/pci/pci-acpi.c > +++ b/drivers/pci/pci-acpi.c > @@ -163,8 +163,34 @@ acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev) > } > > /* acpi_table_parse() is marked as __init, so cache MCFG info at boot time */ > -int pci_acpi_mcfg_entries; > -struct acpi_mcfg_allocation *pci_acpi_mcfg_array; > +static int pci_acpi_mcfg_entries; > +static struct acpi_mcfg_allocation *pci_acpi_mcfg_array; > + > +static int __init pci_cache_mcfg(struct acpi_table_header *header) > +{ > + u32 sz; > + void *ptr; > + > + if (!header || (header->length <= sizeof(struct acpi_table_mcfg))) > + return -EINVAL; > + > + sz = (header->length - sizeof(struct acpi_table_mcfg)); > + pci_acpi_mcfg_array = kmalloc(sz, GFP_KERNEL); > + if (!pci_acpi_mcfg_array) > + return -ENOMEM; > + > + ptr = (void *)header + sizeof(struct acpi_table_mcfg); > + memcpy(pci_acpi_mcfg_array, ptr, sz); > + pci_acpi_mcfg_entries = sz / sizeof (struct acpi_mcfg_allocation); > + > + return 0; > +} > + > +int __init acpi_pci_cache_mcfg(void) > +{ > + acpi_table_parse(ACPI_SIG_MCFG, pci_cache_mcfg); > + return pci_acpi_mcfg_array ? 0 : -EINVAL; > +} still have some problem: pci_mmcfg_check_reserved==>is_mmconf_reserved will update cfg->end_bus. Thanks Yinghai -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html