Message ID | 1420656594-8908-4-git-send-email-m-karicheri2@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jan 07, 2015 at 06:49:53PM +0000, Murali Karicheri wrote: > Add of_pci_dma_configure() to allow updating the dma configuration > of the pci device using the configuration from DT of the parent of > the root bridge device. > > Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> > --- > drivers/of/of_pci.c | 39 +++++++++++++++++++++++++++++++++++++++ > include/linux/of_pci.h | 12 ++++++++++++ > 2 files changed, 51 insertions(+) > > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c > index 88471d3..34878c9 100644 > --- a/drivers/of/of_pci.c > +++ b/drivers/of/of_pci.c > @@ -2,6 +2,7 @@ > #include <linux/export.h> > #include <linux/of.h> > #include <linux/of_address.h> > +#include <linux/of_device.h> > #include <linux/of_pci.h> > #include <linux/slab.h> > > @@ -229,6 +230,44 @@ parse_failed: > return err; > } > EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); > + > +/** > + * of_get_pci_root_bridge_parent - get the OF node of the root bridge's parent > + * @dev: ptr to pci_dev struct of the pci device > + * > + * This function will traverse the bus up to the root bus starting with > + * the child and return the OF node ptr to root bridge device's parent device. > + */ > +struct device_node *of_get_pci_root_bridge_parent(struct pci_dev *dev) > +{ > + struct pci_bus *bus = dev->bus; > + struct device *bridge; > + > + while (!pci_is_root_bus(bus)) > + bus = bus->parent; > + bridge = bus->bridge; > + > + return bridge->parent->of_node; > +} > +EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent); > + > +/** > + * of_pci_dma_configure - Setup DMA configuration > + * @dev: ptr to pci_dev struct of the pci device > + * > + * Function to update PCI devices's DMA configuration using the same > + * info from the OF node of root host bridge's parent. > + */ > +void of_pci_dma_configure(struct pci_dev *pci_dev) > +{ > + struct device *dev = &pci_dev->dev; > + struct device_node *parent_np; > + > + parent_np = of_get_pci_root_bridge_parent(pci_dev); > + of_dma_configure(dev, parent_np); > +} > +EXPORT_SYMBOL_GPL(of_pci_dma_configure); Whilst I think this is the right overall structure, I think this function should determine the set of DMA aliases for the device and pass that through to the IOMMU (as mentioned in my reply to the cover letter). Then we just need to work out what we're doing for groups. Will
On 01/08/2015 11:06 AM, Will Deacon wrote: > On Wed, Jan 07, 2015 at 06:49:53PM +0000, Murali Karicheri wrote: >> Add of_pci_dma_configure() to allow updating the dma configuration >> of the pci device using the configuration from DT of the parent of >> the root bridge device. >> >> Signed-off-by: Murali Karicheri<m-karicheri2@ti.com> >> --- >> drivers/of/of_pci.c | 39 +++++++++++++++++++++++++++++++++++++++ >> include/linux/of_pci.h | 12 ++++++++++++ >> 2 files changed, 51 insertions(+) >> >> diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c >> index 88471d3..34878c9 100644 >> --- a/drivers/of/of_pci.c >> +++ b/drivers/of/of_pci.c >> @@ -2,6 +2,7 @@ >> #include<linux/export.h> >> #include<linux/of.h> >> #include<linux/of_address.h> >> +#include<linux/of_device.h> >> #include<linux/of_pci.h> >> #include<linux/slab.h> >> >> @@ -229,6 +230,44 @@ parse_failed: >> return err; >> } >> EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); >> + >> +/** >> + * of_get_pci_root_bridge_parent - get the OF node of the root bridge's parent >> + * @dev: ptr to pci_dev struct of the pci device >> + * >> + * This function will traverse the bus up to the root bus starting with >> + * the child and return the OF node ptr to root bridge device's parent device. >> + */ >> +struct device_node *of_get_pci_root_bridge_parent(struct pci_dev *dev) >> +{ >> + struct pci_bus *bus = dev->bus; >> + struct device *bridge; >> + >> + while (!pci_is_root_bus(bus)) >> + bus = bus->parent; >> + bridge = bus->bridge; >> + >> + return bridge->parent->of_node; >> +} >> +EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent); >> + >> +/** >> + * of_pci_dma_configure - Setup DMA configuration >> + * @dev: ptr to pci_dev struct of the pci device >> + * >> + * Function to update PCI devices's DMA configuration using the same >> + * info from the OF node of root host bridge's parent. >> + */ >> +void of_pci_dma_configure(struct pci_dev *pci_dev) >> +{ >> + struct device *dev =&pci_dev->dev; >> + struct device_node *parent_np; >> + >> + parent_np = of_get_pci_root_bridge_parent(pci_dev); >> + of_dma_configure(dev, parent_np); >> +} >> +EXPORT_SYMBOL_GPL(of_pci_dma_configure); > > Whilst I think this is the right overall structure, I think this function > should determine the set of DMA aliases for the device and pass that through > to the IOMMU (as mentioned in my reply to the cover letter). Then we just > need to work out what we're doing for groups. > > Will Will, Could you add this as as a follow up patch as I don't have a platformm that support IOMMU and as such my understanding of the IOMMU is limited? I can help test the change to make sure it has no side effect on Keystone that doesn't support IOMMU. Thanks.
On Thursday 08 January 2015 14:52:13 Murali Karicheri wrote: > > Could you add this as as a follow up patch as I don't have a platformm > that support IOMMU and as such my understanding of the IOMMU is limited? > > I can help test the change to make sure it has no side effect on > Keystone that doesn't support IOMMU. I think that's fine. Let's get your series done first and add the DMA aliases for iommus on top once we have worked out what to do. Arnd
On 01/08/2015 05:25 PM, Arnd Bergmann wrote: > On Thursday 08 January 2015 14:52:13 Murali Karicheri wrote: >> >> Could you add this as as a follow up patch as I don't have a platformm >> that support IOMMU and as such my understanding of the IOMMU is limited? >> >> I can help test the change to make sure it has no side effect on >> Keystone that doesn't support IOMMU. > > I think that's fine. Let's get your series done first and add the > DMA aliases for iommus on top once we have worked out what to do. > > Arnd Ok.
On Thu, Jan 08, 2015 at 10:25:15PM +0000, Arnd Bergmann wrote: > On Thursday 08 January 2015 14:52:13 Murali Karicheri wrote: > > > > Could you add this as as a follow up patch as I don't have a platformm > > that support IOMMU and as such my understanding of the IOMMU is limited? > > > > I can help test the change to make sure it has no side effect on > > Keystone that doesn't support IOMMU. > > I think that's fine. Let's get your series done first and add the > DMA aliases for iommus on top once we have worked out what to do. Yeah, I'm fine with that too. I think we're going to be working on this for a while, so doing it bit-by-bit makes a lot of sense. Will
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c index 88471d3..34878c9 100644 --- a/drivers/of/of_pci.c +++ b/drivers/of/of_pci.c @@ -2,6 +2,7 @@ #include <linux/export.h> #include <linux/of.h> #include <linux/of_address.h> +#include <linux/of_device.h> #include <linux/of_pci.h> #include <linux/slab.h> @@ -229,6 +230,44 @@ parse_failed: return err; } EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); + +/** + * of_get_pci_root_bridge_parent - get the OF node of the root bridge's parent + * @dev: ptr to pci_dev struct of the pci device + * + * This function will traverse the bus up to the root bus starting with + * the child and return the OF node ptr to root bridge device's parent device. + */ +struct device_node *of_get_pci_root_bridge_parent(struct pci_dev *dev) +{ + struct pci_bus *bus = dev->bus; + struct device *bridge; + + while (!pci_is_root_bus(bus)) + bus = bus->parent; + bridge = bus->bridge; + + return bridge->parent->of_node; +} +EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent); + +/** + * of_pci_dma_configure - Setup DMA configuration + * @dev: ptr to pci_dev struct of the pci device + * + * Function to update PCI devices's DMA configuration using the same + * info from the OF node of root host bridge's parent. + */ +void of_pci_dma_configure(struct pci_dev *pci_dev) +{ + struct device *dev = &pci_dev->dev; + struct device_node *parent_np; + + parent_np = of_get_pci_root_bridge_parent(pci_dev); + of_dma_configure(dev, parent_np); +} +EXPORT_SYMBOL_GPL(of_pci_dma_configure); + #endif /* CONFIG_OF_ADDRESS */ #ifdef CONFIG_PCI_MSI diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h index ce0e5ab..0465a2a 100644 --- a/include/linux/of_pci.h +++ b/include/linux/of_pci.h @@ -16,6 +16,8 @@ int of_pci_get_devfn(struct device_node *np); int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin); int of_pci_parse_bus_range(struct device_node *node, struct resource *res); int of_get_pci_domain_nr(struct device_node *node); +struct device_node *of_get_pci_root_bridge_parent(struct pci_dev *dev); +void of_pci_dma_configure(struct pci_dev *pci_dev); #else static inline int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq) { @@ -50,6 +52,16 @@ of_get_pci_domain_nr(struct device_node *node) { return -1; } + +static inline struct device_node +*of_get_pci_root_bridge_parent(struct pci_dev *dev) +{ + return NULL; +} + +static inline void of_pci_dma_configure(struct pci_dev *pci_dev) +{ +} #endif #if defined(CONFIG_OF_ADDRESS)
Add of_pci_dma_configure() to allow updating the dma configuration of the pci device using the configuration from DT of the parent of the root bridge device. Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> --- drivers/of/of_pci.c | 39 +++++++++++++++++++++++++++++++++++++++ include/linux/of_pci.h | 12 ++++++++++++ 2 files changed, 51 insertions(+)