Commit 718d249a authored by Oliver O'Halloran's avatar Oliver O'Halloran Committed by Michael Ellerman

powerpc/powernv/pci: Reserve the root bus PE during init

Doing it once during boot rather than doing it on the fly and drop the janky
populated logic.
Signed-off-by: default avatarOliver O'Halloran <oohall@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200417073508.30356-4-oohall@gmail.com
parent dc3d8f85
...@@ -1145,8 +1145,7 @@ static struct pnv_ioda_pe *pnv_ioda_setup_bus_PE(struct pci_bus *bus, bool all) ...@@ -1145,8 +1145,7 @@ static struct pnv_ioda_pe *pnv_ioda_setup_bus_PE(struct pci_bus *bus, bool all)
} }
/* PE number for root bus should have been reserved */ /* PE number for root bus should have been reserved */
if (pci_is_root_bus(bus) && if (pci_is_root_bus(bus))
phb->ioda.root_pe_idx != IODA_INVALID_PE)
pe = &phb->ioda.pe_array[phb->ioda.root_pe_idx]; pe = &phb->ioda.pe_array[phb->ioda.root_pe_idx];
/* Check if PE is determined by M64 */ /* Check if PE is determined by M64 */
...@@ -3199,15 +3198,6 @@ static void pnv_pci_configure_bus(struct pci_bus *bus) ...@@ -3199,15 +3198,6 @@ static void pnv_pci_configure_bus(struct pci_bus *bus)
dev_info(&bus->dev, "Configuring PE for bus\n"); dev_info(&bus->dev, "Configuring PE for bus\n");
/* The PE for root bus should be realized before any one else */
if (!phb->ioda.root_pe_populated) {
pe = pnv_ioda_setup_bus_PE(phb->hose->bus, false);
if (pe) {
phb->ioda.root_pe_idx = pe->pe_number;
phb->ioda.root_pe_populated = true;
}
}
/* Don't assign PE to PCI bus, which doesn't have subordinate devices */ /* Don't assign PE to PCI bus, which doesn't have subordinate devices */
if (list_empty(&bus->devices)) if (list_empty(&bus->devices))
return; return;
...@@ -3490,11 +3480,10 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe) ...@@ -3490,11 +3480,10 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe)
* that it can be populated again in PCI hot add path. The PE * that it can be populated again in PCI hot add path. The PE
* shouldn't be destroyed as it's the global reserved resource. * shouldn't be destroyed as it's the global reserved resource.
*/ */
if (phb->ioda.root_pe_populated && if (phb->ioda.root_pe_idx == pe->pe_number)
phb->ioda.root_pe_idx == pe->pe_number) return;
phb->ioda.root_pe_populated = false;
else pnv_ioda_free_pe(pe);
pnv_ioda_free_pe(pe);
} }
static void pnv_pci_release_device(struct pci_dev *pdev) static void pnv_pci_release_device(struct pci_dev *pdev)
...@@ -3602,6 +3591,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, ...@@ -3602,6 +3591,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
struct pnv_phb *phb; struct pnv_phb *phb;
unsigned long size, m64map_off, m32map_off, pemap_off; unsigned long size, m64map_off, m32map_off, pemap_off;
unsigned long iomap_off = 0, dma32map_off = 0; unsigned long iomap_off = 0, dma32map_off = 0;
struct pnv_ioda_pe *root_pe;
struct resource r; struct resource r;
const __be64 *prop64; const __be64 *prop64;
const __be32 *prop32; const __be32 *prop32;
...@@ -3769,7 +3759,9 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, ...@@ -3769,7 +3759,9 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
phb->ioda.root_pe_idx = phb->ioda.reserved_pe_idx - 1; phb->ioda.root_pe_idx = phb->ioda.reserved_pe_idx - 1;
pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx); pnv_ioda_reserve_pe(phb, phb->ioda.root_pe_idx);
} else { } else {
phb->ioda.root_pe_idx = IODA_INVALID_PE; /* otherwise just allocate one */
root_pe = pnv_ioda_alloc_pe(phb);
phb->ioda.root_pe_idx = root_pe->pe_number;
} }
INIT_LIST_HEAD(&phb->ioda.pe_list); INIT_LIST_HEAD(&phb->ioda.pe_list);
......
...@@ -136,7 +136,6 @@ struct pnv_phb { ...@@ -136,7 +136,6 @@ struct pnv_phb {
unsigned int total_pe_num; unsigned int total_pe_num;
unsigned int reserved_pe_idx; unsigned int reserved_pe_idx;
unsigned int root_pe_idx; unsigned int root_pe_idx;
bool root_pe_populated;
/* 32-bit MMIO window */ /* 32-bit MMIO window */
unsigned int m32_size; unsigned int m32_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment