Message ID | 20170615054845.8428-3-aik@ozlabs.ru (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Alexey Kardashevskiy <aik@ozlabs.ru> writes: > From: Yongji Xie <elohimes@gmail.com> > > Any IODA host bridge have the capability of IRQ remapping. > So we set PCI_BUS_FLAGS_MSI_REMAP when this kind of host birdge > is detected. Where's the code that actually enforces this property? It would be good to have a comment in pnv_pci_ioda_root_bridge_prepare() (probably), pointing to that code, so that we can remember the relationship between the two. cheers
On Thu, 2017-06-15 at 19:25 +1000, Michael Ellerman wrote: > Alexey Kardashevskiy <aik@ozlabs.ru> writes: > > > From: Yongji Xie <elohimes@gmail.com> > > > > Any IODA host bridge have the capability of IRQ remapping. > > So we set PCI_BUS_FLAGS_MSI_REMAP when this kind of host birdge > > is detected. > > Where's the code that actually enforces this property? > > It would be good to have a comment in pnv_pci_ioda_root_bridge_prepare() > (probably), pointing to that code, so that we can remember the > relationship between the two. Actually it's not so much remapping as: - The bridge can enforce that the interrupt is allowed for a given partition - Because the interrupts are handled via the hypervisor, the latter can do the remapping. But the effect is the same, so yes we want the flag. On P9 with XIVE exploitation we also have HW remapping on top. Cheers, Ben.
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 283caf1070c9..b6bda1918273 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -3177,6 +3177,12 @@ static void pnv_pci_ioda_fixup(void) #endif } +int pnv_pci_ioda_root_bridge_prepare(struct pci_host_bridge *bridge) +{ + bridge->bus->bus_flags |= PCI_BUS_FLAGS_MSI_REMAP; + return 0; +} + /* * Returns the alignment for I/O or memory windows for P2P * bridges. That actually depends on how PEs are segmented. @@ -3861,6 +3867,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, */ ppc_md.pcibios_fixup = pnv_pci_ioda_fixup; + ppc_md.pcibios_root_bridge_prepare = pnv_pci_ioda_root_bridge_prepare; + if (phb->type == PNV_PHB_NPU) { hose->controller_ops = pnv_npu_ioda_controller_ops; } else {