Message ID | 20240828-pci-qcom-hotplug-v4-5-263a385fbbcb@linaro.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | PCI: qcom: Enumerate endpoints based on Link up event in 'global_irq' interrupt | expand |
On Wed, Aug 28, 2024 at 09:16:15PM +0530, Manivannan Sadhasivam wrote: > Right now, PCI endpoint subsystem doesn't assign PCI domain number for the > PCI endpoint controllers. But this domain number could be useful to the EPC > drivers to uniquely identify each controller based on the hardware instance > when there are multiple ones present in an SoC (even multiple RC/EP). > > So let's make use of the existing pci_bus_find_domain_nr() API to allocate > domain numbers based on either Devicetree (linux,pci-domain) property or > dynamic domain number allocation scheme. > > It should be noted that the domain number allocated by this API will be > based on both RC and EP controllers in a SoC. If the 'linux,pci-domain' DT > property is present, then the domain number represents the actual hardware > instance of the PCI endpoint controller. If not, then the domain number > will be allocated based on the PCI EP/RC controller probe order. > > If the architecture doesn't support CONFIG_PCI_DOMAINS_GENERIC (rare), then > currently a warning is thrown to indicate that the architecture specific > implementation is needed. > Reviewed-by: Frank Li <Frank.Li@nxp.com> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> > --- > drivers/pci/endpoint/pci-epc-core.c | 14 ++++++++++++++ > include/linux/pci-epc.h | 2 ++ > 2 files changed, 16 insertions(+) > > diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c > index 84309dfe0c68..085a2de8b923 100644 > --- a/drivers/pci/endpoint/pci-epc-core.c > +++ b/drivers/pci/endpoint/pci-epc-core.c > @@ -838,6 +838,10 @@ void pci_epc_destroy(struct pci_epc *epc) > { > pci_ep_cfs_remove_epc_group(epc->group); > device_unregister(&epc->dev); > + > +#ifdef CONFIG_PCI_DOMAINS_GENERIC > + pci_bus_release_domain_nr(NULL, &epc->dev); > +#endif > } > EXPORT_SYMBOL_GPL(pci_epc_destroy); > > @@ -900,6 +904,16 @@ __pci_epc_create(struct device *dev, const struct pci_epc_ops *ops, > epc->dev.release = pci_epc_release; > epc->ops = ops; > > +#ifdef CONFIG_PCI_DOMAINS_GENERIC > + epc->domain_nr = pci_bus_find_domain_nr(NULL, dev); > +#else > + /* > + * TODO: If the architecture doesn't support generic PCI > + * domains, then a custom implementation has to be used. > + */ > + WARN_ONCE(1, "This architecture doesn't support generic PCI domains\n"); > +#endif > + > ret = dev_set_name(&epc->dev, "%s", dev_name(dev)); > if (ret) > goto put_dev; > diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h > index 85bdf2adb760..8e3dcac55dcd 100644 > --- a/include/linux/pci-epc.h > +++ b/include/linux/pci-epc.h > @@ -128,6 +128,7 @@ struct pci_epc_mem { > * @group: configfs group representing the PCI EPC device > * @lock: mutex to protect pci_epc ops > * @function_num_map: bitmap to manage physical function number > + * @domain_nr: PCI domain number of the endpoint controller > * @init_complete: flag to indicate whether the EPC initialization is complete > * or not > */ > @@ -145,6 +146,7 @@ struct pci_epc { > /* mutex to protect against concurrent access of EP controller */ > struct mutex lock; > unsigned long function_num_map; > + int domain_nr; > bool init_complete; > }; > > > -- > 2.25.1 >
diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c index 84309dfe0c68..085a2de8b923 100644 --- a/drivers/pci/endpoint/pci-epc-core.c +++ b/drivers/pci/endpoint/pci-epc-core.c @@ -838,6 +838,10 @@ void pci_epc_destroy(struct pci_epc *epc) { pci_ep_cfs_remove_epc_group(epc->group); device_unregister(&epc->dev); + +#ifdef CONFIG_PCI_DOMAINS_GENERIC + pci_bus_release_domain_nr(NULL, &epc->dev); +#endif } EXPORT_SYMBOL_GPL(pci_epc_destroy); @@ -900,6 +904,16 @@ __pci_epc_create(struct device *dev, const struct pci_epc_ops *ops, epc->dev.release = pci_epc_release; epc->ops = ops; +#ifdef CONFIG_PCI_DOMAINS_GENERIC + epc->domain_nr = pci_bus_find_domain_nr(NULL, dev); +#else + /* + * TODO: If the architecture doesn't support generic PCI + * domains, then a custom implementation has to be used. + */ + WARN_ONCE(1, "This architecture doesn't support generic PCI domains\n"); +#endif + ret = dev_set_name(&epc->dev, "%s", dev_name(dev)); if (ret) goto put_dev; diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h index 85bdf2adb760..8e3dcac55dcd 100644 --- a/include/linux/pci-epc.h +++ b/include/linux/pci-epc.h @@ -128,6 +128,7 @@ struct pci_epc_mem { * @group: configfs group representing the PCI EPC device * @lock: mutex to protect pci_epc ops * @function_num_map: bitmap to manage physical function number + * @domain_nr: PCI domain number of the endpoint controller * @init_complete: flag to indicate whether the EPC initialization is complete * or not */ @@ -145,6 +146,7 @@ struct pci_epc { /* mutex to protect against concurrent access of EP controller */ struct mutex lock; unsigned long function_num_map; + int domain_nr; bool init_complete; };