Commit 92ae0353 authored by Daniel Axtens's avatar Daniel Axtens Committed by Michael Ellerman

powerpc/powernv: Specialise pci_controller_ops for each controller type

Remove powernv generic PCI controller operations. Replace it with
controller ops for each of the two supported PHBs.

As an added bonus, make the two new structs const, which will help
guard against bugs such as the one introduced in 65ebf4b6
("powerpc/powernv: Move controller ops from ppc_md to controller_ops")
Signed-off-by: default avatarDaniel Axtens <dja@axtens.net>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1f88d586
...@@ -2648,6 +2648,17 @@ static void pnv_pci_ioda_shutdown(struct pnv_phb *phb) ...@@ -2648,6 +2648,17 @@ static void pnv_pci_ioda_shutdown(struct pnv_phb *phb)
OPAL_ASSERT_RESET); OPAL_ASSERT_RESET);
} }
static const struct pci_controller_ops pnv_pci_ioda_controller_ops = {
.dma_dev_setup = pnv_pci_dma_dev_setup,
#ifdef CONFIG_PCI_MSI
.setup_msi_irqs = pnv_setup_msi_irqs,
.teardown_msi_irqs = pnv_teardown_msi_irqs,
#endif
.enable_device_hook = pnv_pci_enable_device_hook,
.window_alignment = pnv_pci_window_alignment,
.reset_secondary_bus = pnv_pci_reset_secondary_bus,
};
static void __init pnv_pci_init_ioda_phb(struct device_node *np, static void __init pnv_pci_init_ioda_phb(struct device_node *np,
u64 hub_id, int ioda_type) u64 hub_id, int ioda_type)
{ {
...@@ -2808,10 +2819,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, ...@@ -2808,10 +2819,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
* the child P2P bridges) can form individual PE. * the child P2P bridges) can form individual PE.
*/ */
ppc_md.pcibios_fixup = pnv_pci_ioda_fixup; ppc_md.pcibios_fixup = pnv_pci_ioda_fixup;
pnv_pci_controller_ops.enable_device_hook = pnv_pci_enable_device_hook; hose->controller_ops = pnv_pci_ioda_controller_ops;
pnv_pci_controller_ops.window_alignment = pnv_pci_window_alignment;
pnv_pci_controller_ops.reset_secondary_bus = pnv_pci_reset_secondary_bus;
hose->controller_ops = pnv_pci_controller_ops;
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources; ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources;
......
...@@ -95,6 +95,14 @@ static void pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb, ...@@ -95,6 +95,14 @@ static void pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb,
set_iommu_table_base_and_group(&pdev->dev, &phb->p5ioc2.iommu_table); set_iommu_table_base_and_group(&pdev->dev, &phb->p5ioc2.iommu_table);
} }
static const struct pci_controller_ops pnv_pci_p5ioc2_controller_ops = {
.dma_dev_setup = pnv_pci_dma_dev_setup,
#ifdef CONFIG_PCI_MSI
.setup_msi_irqs = pnv_setup_msi_irqs,
.teardown_msi_irqs = pnv_teardown_msi_irqs,
#endif
};
static void __init pnv_pci_init_p5ioc2_phb(struct device_node *np, u64 hub_id, static void __init pnv_pci_init_p5ioc2_phb(struct device_node *np, u64 hub_id,
void *tce_mem, u64 tce_size) void *tce_mem, u64 tce_size)
{ {
...@@ -133,7 +141,7 @@ static void __init pnv_pci_init_p5ioc2_phb(struct device_node *np, u64 hub_id, ...@@ -133,7 +141,7 @@ static void __init pnv_pci_init_p5ioc2_phb(struct device_node *np, u64 hub_id,
phb->hose->first_busno = 0; phb->hose->first_busno = 0;
phb->hose->last_busno = 0xff; phb->hose->last_busno = 0xff;
phb->hose->private_data = phb; phb->hose->private_data = phb;
phb->hose->controller_ops = pnv_pci_controller_ops; phb->hose->controller_ops = pnv_pci_p5ioc2_controller_ops;
phb->hub_id = hub_id; phb->hub_id = hub_id;
phb->opal_id = phb_id; phb->opal_id = phb_id;
phb->type = PNV_PHB_P5IOC2; phb->type = PNV_PHB_P5IOC2;
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
//#define cfg_dbg(fmt...) printk(fmt) //#define cfg_dbg(fmt...) printk(fmt)
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
{ {
struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pci_controller *hose = pci_bus_to_host(pdev->bus);
struct pnv_phb *phb = hose->private_data; struct pnv_phb *phb = hose->private_data;
...@@ -94,7 +94,7 @@ static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) ...@@ -94,7 +94,7 @@ static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
return 0; return 0;
} }
static void pnv_teardown_msi_irqs(struct pci_dev *pdev) void pnv_teardown_msi_irqs(struct pci_dev *pdev)
{ {
struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pci_controller *hose = pci_bus_to_host(pdev->bus);
struct pnv_phb *phb = hose->private_data; struct pnv_phb *phb = hose->private_data;
...@@ -662,7 +662,7 @@ void pnv_pci_setup_iommu_table(struct iommu_table *tbl, ...@@ -662,7 +662,7 @@ void pnv_pci_setup_iommu_table(struct iommu_table *tbl,
tbl->it_type = TCE_PCI; tbl->it_type = TCE_PCI;
} }
static void pnv_pci_dma_dev_setup(struct pci_dev *pdev) void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
{ {
struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pci_controller *hose = pci_bus_to_host(pdev->bus);
struct pnv_phb *phb = hose->private_data; struct pnv_phb *phb = hose->private_data;
...@@ -771,11 +771,3 @@ void __init pnv_pci_init(void) ...@@ -771,11 +771,3 @@ void __init pnv_pci_init(void)
} }
machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init); machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init);
struct pci_controller_ops pnv_pci_controller_ops = {
.dma_dev_setup = pnv_pci_dma_dev_setup,
#ifdef CONFIG_PCI_MSI
.setup_msi_irqs = pnv_setup_msi_irqs,
.teardown_msi_irqs = pnv_teardown_msi_irqs,
#endif
};
...@@ -218,4 +218,8 @@ extern void pnv_pci_ioda_tce_invalidate(struct iommu_table *tbl, ...@@ -218,4 +218,8 @@ extern void pnv_pci_ioda_tce_invalidate(struct iommu_table *tbl,
extern void pnv_pci_reset_secondary_bus(struct pci_dev *dev); extern void pnv_pci_reset_secondary_bus(struct pci_dev *dev);
extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option); extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option);
extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev);
extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type);
extern void pnv_teardown_msi_irqs(struct pci_dev *pdev);
#endif /* __POWERNV_PCI_H */ #endif /* __POWERNV_PCI_H */
...@@ -29,8 +29,6 @@ static inline u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev) ...@@ -29,8 +29,6 @@ static inline u64 pnv_pci_dma_get_required_mask(struct pci_dev *pdev)
} }
#endif #endif
extern struct pci_controller_ops pnv_pci_controller_ops;
extern u32 pnv_get_supported_cpuidle_states(void); extern u32 pnv_get_supported_cpuidle_states(void);
extern void pnv_lpc_init(void); extern void pnv_lpc_init(void);
......
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