From: Murali Karicheri <m-karicheri2-l0cyMroinI0@public.gmane.org>
To: Bjorn Helgaas <bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Grant Likely
<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v4 4/6] of/pci: add of_pci_dma_configure() update dma configuration
Date: Mon, 26 Jan 2015 18:25:39 -0500 [thread overview]
Message-ID: <54C6CCF3.7080308@ti.com> (raw)
In-Reply-To: <20150123234124.GW29776-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
On 01/23/2015 06:41 PM, Bjorn Helgaas wrote:
> On Fri, Jan 23, 2015 at 05:32:37PM -0500, 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.
>>
>> Cc: Joerg Roedel<joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
>> Cc: Grant Likely<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
>> Cc: Rob Herring<robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
>> Cc: Bjorn Helgaas<bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
>> Cc: Will Deacon<will.deacon-5wv7dgnIgG8@public.gmane.org>
>> Cc: Russell King<linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>
>> Cc: Arnd Bergmann<arnd-r2nGTMty4D4@public.gmane.org>
>> Cc: Suravee Suthikulpanit<Suravee.Suthikulpanit-5C7GfCeVMHo@public.gmane.org>
>>
>> Signed-off-by: Murali Karicheri<m-karicheri2-l0cyMroinI0@public.gmane.org>
>> ---
>> 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)
>
> I'm not an OF person, but this interface seems like it might be too
> special-purpose. Maybe it would be enough to add
> "of_get_pci_root_bridge()", and the caller could do this:
>
> struct device *bridge = of_get_pci_root_bridge(dev);
> struct device_node *parent_np = bridge->parent->of_node;
>
> Also, the name "of_get_..." suggests that it increments a refcount, as
> of_get_parent() does. But you aren't doing anything with the refcount.
>
> But I guess an "of_get_pci_root_bridge()" isn't doing anything OF-related,
> so maybe we should just add a "pci_get_host_bridge(struct pci_dev *)"
> to PCI instead.
Bjorn,
Thanks for the comment.
I think adding pci_get_host_bridge() is a good idea. There is already
similar function in host-bridge.c. I have added this function re-using
existing function find_pci_root_bus(). See the incremental diff below
after this change. Does this look good?
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 34878c9..77b15b5 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -232,26 +232,6 @@ parse_failed:
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
*
@@ -261,10 +241,9 @@ EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent);
void of_pci_dma_configure(struct pci_dev *pci_dev)
{
struct device *dev = &pci_dev->dev;
- struct device_node *parent_np;
+ struct device *bridge = pci_get_host_bridge(pci_dev);
- parent_np = of_get_pci_root_bridge_parent(pci_dev);
- of_dma_configure(dev, parent_np);
+ of_dma_configure(dev, bridge->parent->of_node);
}
EXPORT_SYMBOL_GPL(of_pci_dma_configure);
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0e5f3c9..9803aa6 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,6 +23,13 @@ static struct pci_host_bridge
*find_pci_host_bridge(struct pci_bus *bus)
return to_pci_host_bridge(root_bus->bridge);
}
+struct device *pci_get_host_bridge(struct pci_dev *dev)
+{
+ struct pci_bus *root_bus = find_pci_root_bus(dev->bus);
+
+ return root_bus->bridge;
+}
+
void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
void (*release_fn)(struct
pci_host_bridge *),
void *release_data)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9603094..5bcdfa6 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -513,6 +513,8 @@ static inline struct pci_dev
*pci_upstream_bridge(struct pci_dev *dev)
return dev->bus->self;
}
+struct device *pci_get_host_bridge(struct pci_dev *dev);
+
#ifdef CONFIG_PCI_MSI
static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
{
@@ -1823,6 +1825,7 @@ int pci_vpd_find_tag(const u8 *buf, unsigned int
off, unsigned int len, u8 rdt);
int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
unsigned int len, const char *kw);
/* PCI <-> OF binding helpers */
#ifdef CONFIG_OF
struct device_node;
>
> Bjorn
>
>> +{
>> + 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)
>> --
>> 1.7.9.5
>>
--
Murali Karicheri
Linux Kernel, Texas Instruments
WARNING: multiple messages have this Message-ID (diff)
From: Murali Karicheri <m-karicheri2@ti.com>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: <linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>,
<devicetree@vger.kernel.org>, <iommu@lists.linux-foundation.org>,
Joerg Roedel <joro@8bytes.org>,
Grant Likely <grant.likely@linaro.org>,
Rob Herring <robh+dt@kernel.org>,
Will Deacon <will.deacon@arm.com>,
Russell King <linux@arm.linux.org.uk>,
Arnd Bergmann <arnd@arndb.de>,
Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Subject: Re: [PATCH v4 4/6] of/pci: add of_pci_dma_configure() update dma configuration
Date: Mon, 26 Jan 2015 18:25:39 -0500 [thread overview]
Message-ID: <54C6CCF3.7080308@ti.com> (raw)
In-Reply-To: <20150123234124.GW29776@google.com>
On 01/23/2015 06:41 PM, Bjorn Helgaas wrote:
> On Fri, Jan 23, 2015 at 05:32:37PM -0500, 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.
>>
>> Cc: Joerg Roedel<joro@8bytes.org>
>> Cc: Grant Likely<grant.likely@linaro.org>
>> Cc: Rob Herring<robh+dt@kernel.org>
>> Cc: Bjorn Helgaas<bhelgaas@google.com>
>> Cc: Will Deacon<will.deacon@arm.com>
>> Cc: Russell King<linux@arm.linux.org.uk>
>> Cc: Arnd Bergmann<arnd@arndb.de>
>> Cc: Suravee Suthikulpanit<Suravee.Suthikulpanit@amd.com>
>>
>> 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)
>
> I'm not an OF person, but this interface seems like it might be too
> special-purpose. Maybe it would be enough to add
> "of_get_pci_root_bridge()", and the caller could do this:
>
> struct device *bridge = of_get_pci_root_bridge(dev);
> struct device_node *parent_np = bridge->parent->of_node;
>
> Also, the name "of_get_..." suggests that it increments a refcount, as
> of_get_parent() does. But you aren't doing anything with the refcount.
>
> But I guess an "of_get_pci_root_bridge()" isn't doing anything OF-related,
> so maybe we should just add a "pci_get_host_bridge(struct pci_dev *)"
> to PCI instead.
Bjorn,
Thanks for the comment.
I think adding pci_get_host_bridge() is a good idea. There is already
similar function in host-bridge.c. I have added this function re-using
existing function find_pci_root_bus(). See the incremental diff below
after this change. Does this look good?
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 34878c9..77b15b5 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -232,26 +232,6 @@ parse_failed:
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
*
@@ -261,10 +241,9 @@ EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent);
void of_pci_dma_configure(struct pci_dev *pci_dev)
{
struct device *dev = &pci_dev->dev;
- struct device_node *parent_np;
+ struct device *bridge = pci_get_host_bridge(pci_dev);
- parent_np = of_get_pci_root_bridge_parent(pci_dev);
- of_dma_configure(dev, parent_np);
+ of_dma_configure(dev, bridge->parent->of_node);
}
EXPORT_SYMBOL_GPL(of_pci_dma_configure);
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0e5f3c9..9803aa6 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,6 +23,13 @@ static struct pci_host_bridge
*find_pci_host_bridge(struct pci_bus *bus)
return to_pci_host_bridge(root_bus->bridge);
}
+struct device *pci_get_host_bridge(struct pci_dev *dev)
+{
+ struct pci_bus *root_bus = find_pci_root_bus(dev->bus);
+
+ return root_bus->bridge;
+}
+
void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
void (*release_fn)(struct
pci_host_bridge *),
void *release_data)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9603094..5bcdfa6 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -513,6 +513,8 @@ static inline struct pci_dev
*pci_upstream_bridge(struct pci_dev *dev)
return dev->bus->self;
}
+struct device *pci_get_host_bridge(struct pci_dev *dev);
+
#ifdef CONFIG_PCI_MSI
static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
{
@@ -1823,6 +1825,7 @@ int pci_vpd_find_tag(const u8 *buf, unsigned int
off, unsigned int len, u8 rdt);
int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
unsigned int len, const char *kw);
/* PCI <-> OF binding helpers */
#ifdef CONFIG_OF
struct device_node;
>
> Bjorn
>
>> +{
>> + 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)
>> --
>> 1.7.9.5
>>
--
Murali Karicheri
Linux Kernel, Texas Instruments
WARNING: multiple messages have this Message-ID (diff)
From: m-karicheri2@ti.com (Murali Karicheri)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 4/6] of/pci: add of_pci_dma_configure() update dma configuration
Date: Mon, 26 Jan 2015 18:25:39 -0500 [thread overview]
Message-ID: <54C6CCF3.7080308@ti.com> (raw)
In-Reply-To: <20150123234124.GW29776@google.com>
On 01/23/2015 06:41 PM, Bjorn Helgaas wrote:
> On Fri, Jan 23, 2015 at 05:32:37PM -0500, 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.
>>
>> Cc: Joerg Roedel<joro@8bytes.org>
>> Cc: Grant Likely<grant.likely@linaro.org>
>> Cc: Rob Herring<robh+dt@kernel.org>
>> Cc: Bjorn Helgaas<bhelgaas@google.com>
>> Cc: Will Deacon<will.deacon@arm.com>
>> Cc: Russell King<linux@arm.linux.org.uk>
>> Cc: Arnd Bergmann<arnd@arndb.de>
>> Cc: Suravee Suthikulpanit<Suravee.Suthikulpanit@amd.com>
>>
>> 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)
>
> I'm not an OF person, but this interface seems like it might be too
> special-purpose. Maybe it would be enough to add
> "of_get_pci_root_bridge()", and the caller could do this:
>
> struct device *bridge = of_get_pci_root_bridge(dev);
> struct device_node *parent_np = bridge->parent->of_node;
>
> Also, the name "of_get_..." suggests that it increments a refcount, as
> of_get_parent() does. But you aren't doing anything with the refcount.
>
> But I guess an "of_get_pci_root_bridge()" isn't doing anything OF-related,
> so maybe we should just add a "pci_get_host_bridge(struct pci_dev *)"
> to PCI instead.
Bjorn,
Thanks for the comment.
I think adding pci_get_host_bridge() is a good idea. There is already
similar function in host-bridge.c. I have added this function re-using
existing function find_pci_root_bus(). See the incremental diff below
after this change. Does this look good?
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 34878c9..77b15b5 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -232,26 +232,6 @@ parse_failed:
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
*
@@ -261,10 +241,9 @@ EXPORT_SYMBOL_GPL(of_get_pci_root_bridge_parent);
void of_pci_dma_configure(struct pci_dev *pci_dev)
{
struct device *dev = &pci_dev->dev;
- struct device_node *parent_np;
+ struct device *bridge = pci_get_host_bridge(pci_dev);
- parent_np = of_get_pci_root_bridge_parent(pci_dev);
- of_dma_configure(dev, parent_np);
+ of_dma_configure(dev, bridge->parent->of_node);
}
EXPORT_SYMBOL_GPL(of_pci_dma_configure);
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0e5f3c9..9803aa6 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,6 +23,13 @@ static struct pci_host_bridge
*find_pci_host_bridge(struct pci_bus *bus)
return to_pci_host_bridge(root_bus->bridge);
}
+struct device *pci_get_host_bridge(struct pci_dev *dev)
+{
+ struct pci_bus *root_bus = find_pci_root_bus(dev->bus);
+
+ return root_bus->bridge;
+}
+
void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
void (*release_fn)(struct
pci_host_bridge *),
void *release_data)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9603094..5bcdfa6 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -513,6 +513,8 @@ static inline struct pci_dev
*pci_upstream_bridge(struct pci_dev *dev)
return dev->bus->self;
}
+struct device *pci_get_host_bridge(struct pci_dev *dev);
+
#ifdef CONFIG_PCI_MSI
static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
{
@@ -1823,6 +1825,7 @@ int pci_vpd_find_tag(const u8 *buf, unsigned int
off, unsigned int len, u8 rdt);
int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
unsigned int len, const char *kw);
/* PCI <-> OF binding helpers */
#ifdef CONFIG_OF
struct device_node;
>
> Bjorn
>
>> +{
>> + 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)
>> --
>> 1.7.9.5
>>
--
Murali Karicheri
Linux Kernel, Texas Instruments
next prev parent reply other threads:[~2015-01-26 23:25 UTC|newest]
Thread overview: 131+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-23 22:32 [PATCH v4 0/6] PCI: get DMA configuration from parent device Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
[not found] ` <1422052359-12384-1-git-send-email-m-karicheri2-l0cyMroinI0@public.gmane.org>
2015-01-23 22:32 ` [PATCH v4 1/6] of: iommu: add ptr to OF node arg to of_iommu_configure() Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
[not found] ` <1422052359-12384-2-git-send-email-m-karicheri2-l0cyMroinI0@public.gmane.org>
2015-01-25 13:32 ` Laurent Pinchart
2015-01-25 13:32 ` Laurent Pinchart
2015-01-25 13:32 ` Laurent Pinchart
2015-01-26 18:49 ` Murali Karicheri
2015-01-26 18:49 ` Murali Karicheri
2015-01-26 18:49 ` Murali Karicheri
[not found] ` <54C68C1D.5030605-l0cyMroinI0@public.gmane.org>
2015-01-28 11:33 ` Will Deacon
2015-01-28 11:33 ` Will Deacon
2015-01-28 11:33 ` Will Deacon
[not found] ` <20150128113300.GF1569-5wv7dgnIgG8@public.gmane.org>
2015-01-28 12:23 ` Laurent Pinchart
2015-01-28 12:23 ` Laurent Pinchart
2015-01-28 12:23 ` Laurent Pinchart
2015-01-28 12:29 ` Will Deacon
2015-01-28 12:29 ` Will Deacon
2015-01-28 12:29 ` Will Deacon
[not found] ` <20150128122941.GK1569-5wv7dgnIgG8@public.gmane.org>
2015-01-28 13:15 ` Laurent Pinchart
2015-01-28 13:15 ` Laurent Pinchart
2015-01-28 13:15 ` Laurent Pinchart
2015-01-28 13:32 ` Will Deacon
2015-01-28 13:32 ` Will Deacon
2015-01-28 13:32 ` Will Deacon
[not found] ` <20150128133219.GM1569-5wv7dgnIgG8@public.gmane.org>
2015-01-28 15:21 ` Murali Karicheri
2015-01-28 15:21 ` Murali Karicheri
2015-01-28 15:21 ` Murali Karicheri
2015-01-28 23:32 ` Laurent Pinchart
2015-01-28 23:32 ` Laurent Pinchart
2015-01-28 23:32 ` Laurent Pinchart
2015-01-29 14:59 ` Murali Karicheri
2015-01-29 14:59 ` Murali Karicheri
2015-01-29 14:59 ` Murali Karicheri
2015-01-29 16:49 ` Rob Herring
2015-01-29 16:49 ` Rob Herring
2015-01-29 16:49 ` Rob Herring
[not found] ` <CAL_Jsq+rzwk0Rw5RRKf9oLqXNFFgnJb4UQ_AzpJLxN1Z0rJWMQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-30 0:24 ` Laurent Pinchart
2015-01-30 0:24 ` Laurent Pinchart
2015-01-30 0:24 ` Laurent Pinchart
2015-01-30 15:23 ` Murali Karicheri
2015-01-30 15:23 ` Murali Karicheri
2015-01-30 15:23 ` Murali Karicheri
2015-01-23 22:32 ` [PATCH v4 2/6] of: move of_dma_configure() to device.c to help re-use Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` [PATCH v4 4/6] of/pci: add of_pci_dma_configure() update dma configuration Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
[not found] ` <1422052359-12384-5-git-send-email-m-karicheri2-l0cyMroinI0@public.gmane.org>
2015-01-23 23:41 ` Bjorn Helgaas
2015-01-23 23:41 ` Bjorn Helgaas
2015-01-23 23:41 ` Bjorn Helgaas
[not found] ` <20150123234124.GW29776-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2015-01-26 23:25 ` Murali Karicheri [this message]
2015-01-26 23:25 ` Murali Karicheri
2015-01-26 23:25 ` Murali Karicheri
[not found] ` <54C6CCF3.7080308-l0cyMroinI0@public.gmane.org>
2015-01-26 23:59 ` Bjorn Helgaas
2015-01-26 23:59 ` Bjorn Helgaas
2015-01-26 23:59 ` Bjorn Helgaas
[not found] ` <CAErSpo4w0zVCmXk2D2Qk5W3kceS9Wk+=jqHBDwk6HUXWwXdq_Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-27 18:14 ` Murali Karicheri
2015-01-27 18:14 ` Murali Karicheri
2015-01-27 18:14 ` Murali Karicheri
[not found] ` <54C7D576.6030502-l0cyMroinI0@public.gmane.org>
2015-01-27 18:42 ` Bjorn Helgaas
2015-01-27 18:42 ` Bjorn Helgaas
2015-01-27 18:42 ` Bjorn Helgaas
[not found] ` <CAErSpo4Awgqu0ZtoMm0XSZzhnYtXh3xxH2OJMkyth5YDR9GUiA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-27 18:45 ` Murali Karicheri
2015-01-27 18:45 ` Murali Karicheri
2015-01-27 18:45 ` Murali Karicheri
2015-01-23 22:32 ` [PATCH v4 5/6] PCI: update dma configuration from DT Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
[not found] ` <1422052359-12384-6-git-send-email-m-karicheri2-l0cyMroinI0@public.gmane.org>
2015-01-23 23:27 ` Bjorn Helgaas
2015-01-23 23:27 ` Bjorn Helgaas
2015-01-23 23:27 ` Bjorn Helgaas
[not found] ` <20150123232725.GV29776-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2015-01-26 23:28 ` Murali Karicheri
2015-01-26 23:28 ` Murali Karicheri
2015-01-26 23:28 ` Murali Karicheri
2015-01-23 22:32 ` [PATCH v4 3/6] of: fix size when dma-range is not used Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-27 11:27 ` Robin Murphy
2015-01-27 11:27 ` Robin Murphy
2015-01-27 15:44 ` Murali Karicheri
2015-01-27 15:44 ` Murali Karicheri
[not found] ` <54C77616.80301-5wv7dgnIgG8@public.gmane.org>
2015-01-27 18:55 ` Murali Karicheri
2015-01-27 18:55 ` Murali Karicheri
2015-01-27 18:55 ` Murali Karicheri
[not found] ` <54C7DF13.20402-l0cyMroinI0@public.gmane.org>
2015-01-28 11:05 ` Catalin Marinas
2015-01-28 11:05 ` Catalin Marinas
2015-01-28 11:05 ` Catalin Marinas
[not found] ` <20150128110523.GC6646-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2015-01-28 15:45 ` Rob Herring
2015-01-28 15:45 ` Rob Herring
2015-01-28 15:45 ` Rob Herring
[not found] ` <CAL_JsqJiCKW0ny=_ueq=A7RH3octpEhN+KZuLZhbNEHusyjcig-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-28 17:23 ` Catalin Marinas
2015-01-28 17:23 ` Catalin Marinas
2015-01-28 17:23 ` Catalin Marinas
2015-01-28 17:34 ` Murali Karicheri
2015-01-28 17:34 ` Murali Karicheri
2015-01-28 17:34 ` Murali Karicheri
2015-01-28 15:55 ` Robin Murphy
2015-01-28 15:55 ` Robin Murphy
2015-01-28 15:55 ` Robin Murphy
[not found] ` <54C9068D.8050701-5wv7dgnIgG8@public.gmane.org>
2015-01-28 17:30 ` Catalin Marinas
2015-01-28 17:30 ` Catalin Marinas
2015-01-28 17:30 ` Catalin Marinas
2015-01-30 18:06 ` Murali Karicheri
2015-01-30 18:06 ` Murali Karicheri
[not found] ` <54CBC823.3020905-l0cyMroinI0@public.gmane.org>
2015-02-02 12:18 ` Catalin Marinas
2015-02-02 12:18 ` Catalin Marinas
2015-02-02 12:18 ` Catalin Marinas
[not found] ` <20150202121843.GD22661-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2015-02-02 16:10 ` Murali Karicheri
2015-02-02 16:10 ` Murali Karicheri
2015-02-02 16:10 ` Murali Karicheri
2015-02-05 21:42 ` Murali Karicheri
2015-02-05 21:42 ` Murali Karicheri
[not found] ` <54D3E3C3.1040104-l0cyMroinI0@public.gmane.org>
2015-02-05 22:44 ` Catalin Marinas
2015-02-05 22:44 ` Catalin Marinas
2015-02-05 22:44 ` Catalin Marinas
2015-01-23 22:32 ` [PATCH v4 6/6] arm: dma-mapping: updates to limit dma_mask and iommu mapping size Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
2015-01-23 22:32 ` Murali Karicheri
[not found] ` <1422052359-12384-7-git-send-email-m-karicheri2-l0cyMroinI0@public.gmane.org>
2015-01-27 11:12 ` Robin Murphy
2015-01-27 11:12 ` Robin Murphy
2015-01-27 11:12 ` Robin Murphy
[not found] ` <54C772A0.2000203-5wv7dgnIgG8@public.gmane.org>
2015-01-27 11:34 ` Catalin Marinas
2015-01-27 11:34 ` Catalin Marinas
2015-01-27 11:34 ` Catalin Marinas
[not found] ` <20150127113416.GB3226-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2015-01-27 15:19 ` Murali Karicheri
2015-01-27 15:19 ` Murali Karicheri
2015-01-27 15:19 ` Murali Karicheri
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54C6CCF3.7080308@ti.com \
--to=m-karicheri2-l0cymroini0@public.gmane.org \
--cc=arnd-r2nGTMty4D4@public.gmane.org \
--cc=bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.