Patchwork [06/10] pseries: Export find_phb() utility function for PCI code

login
register
mail settings
Submitter David Gibson
Date Aug. 8, 2012, 2:10 a.m.
Message ID <1344391839-2006-7-git-send-email-david@gibson.dropbear.id.au>
Download mbox | patch
Permalink /patch/175851/
State New
Headers show

Comments

David Gibson - Aug. 8, 2012, 2:10 a.m.
From: Alexey Kardashevskiy <aik@ozlabs.ru>

The pseries PCI code makes use of an internal find_dev() function which
locates a PCIDevice * given a (platform specific) bus ID and device
address.  Internally this needs to first locate the host bridge on which
the device resides based on the bus ID.  This patch exposes that host
bridge lookup as a separate function, which we will need later in the MSI
and VFIO code.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/spapr_pci.c |   32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
Alexander Graf - Aug. 14, 2012, 11:45 a.m.
On 08/08/2012 04:10 AM, David Gibson wrote:
> From: Alexey Kardashevskiy <aik@ozlabs.ru>
>
> The pseries PCI code makes use of an internal find_dev() function which
> locates a PCIDevice * given a (platform specific) bus ID and device
> address.  Internally this needs to first locate the host bridge on which
> the device resides based on the bus ID.  This patch exposes that host
> bridge lookup as a separate function, which we will need later in the MSI
> and VFIO code.
>
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>   hw/spapr_pci.c |   32 ++++++++++++++++++++++----------
>   1 file changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c
> index fcc358e..842068f 100644
> --- a/hw/spapr_pci.c
> +++ b/hw/spapr_pci.c
> @@ -29,27 +29,39 @@
>   #include "hw/spapr_pci.h"
>   #include "exec-memory.h"
>   #include <libfdt.h>
> +#include "trace.h"

trace.h?


Alex

>   
>   #include "hw/pci_internals.h"
>   
> -static PCIDevice *find_dev(sPAPREnvironment *spapr,
> -                           uint64_t buid, uint32_t config_addr)
> +static sPAPRPHBState *find_phb(sPAPREnvironment *spapr, uint64_t buid)
>   {
> -    int devfn = (config_addr >> 8) & 0xFF;
>       sPAPRPHBState *phb;
>   
>       QLIST_FOREACH(phb, &spapr->phbs, list) {
> -        BusChild *kid;
> -
>           if (phb->buid != buid) {
>               continue;
>           }
> +        return phb;
> +    }
> +
> +    return NULL;
> +}
> +
> +static PCIDevice *find_dev(sPAPREnvironment *spapr, uint64_t buid,
> +                           uint32_t config_addr)
> +{
> +    sPAPRPHBState *phb = find_phb(spapr, buid);
> +    BusChild *kid;
> +    int devfn = (config_addr >> 8) & 0xFF;
> +
> +    if (!phb) {
> +        return NULL;
> +    }
>   
> -        QTAILQ_FOREACH(kid, &phb->host_state.bus->qbus.children, sibling) {
> -            PCIDevice *dev = (PCIDevice *)kid->child;
> -            if (dev->devfn == devfn) {
> -                return dev;
> -            }
> +    QTAILQ_FOREACH(kid, &phb->host_state.bus->qbus.children, sibling) {
> +        PCIDevice *dev = (PCIDevice *)kid->child;
> +        if (dev->devfn == devfn) {
> +            return dev;
>           }
>       }
>
David Gibson - Aug. 15, 2012, 1:03 a.m.
On Tue, Aug 14, 2012 at 01:45:53PM +0200, Alexander Graf wrote:
> On 08/08/2012 04:10 AM, David Gibson wrote:
> >From: Alexey Kardashevskiy <aik@ozlabs.ru>
> >
> >The pseries PCI code makes use of an internal find_dev() function which
> >locates a PCIDevice * given a (platform specific) bus ID and device
> >address.  Internally this needs to first locate the host bridge on which
> >the device resides based on the bus ID.  This patch exposes that host
> >bridge lookup as a separate function, which we will need later in the MSI
> >and VFIO code.
> >
> >Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> >Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> >---
> >  hw/spapr_pci.c |   32 ++++++++++++++++++++++----------
> >  1 file changed, 22 insertions(+), 10 deletions(-)
> >
> >diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c
> >index fcc358e..842068f 100644
> >--- a/hw/spapr_pci.c
> >+++ b/hw/spapr_pci.c
> >@@ -29,27 +29,39 @@
> >  #include "hw/spapr_pci.h"
> >  #include "exec-memory.h"
> >  #include <libfdt.h>
> >+#include "trace.h"
> 
> trace.h?

Sorry, probably leaked in from an earlier version or related patch
which did actually add some trace point calls.

Patch

diff --git a/hw/spapr_pci.c b/hw/spapr_pci.c
index fcc358e..842068f 100644
--- a/hw/spapr_pci.c
+++ b/hw/spapr_pci.c
@@ -29,27 +29,39 @@ 
 #include "hw/spapr_pci.h"
 #include "exec-memory.h"
 #include <libfdt.h>
+#include "trace.h"
 
 #include "hw/pci_internals.h"
 
-static PCIDevice *find_dev(sPAPREnvironment *spapr,
-                           uint64_t buid, uint32_t config_addr)
+static sPAPRPHBState *find_phb(sPAPREnvironment *spapr, uint64_t buid)
 {
-    int devfn = (config_addr >> 8) & 0xFF;
     sPAPRPHBState *phb;
 
     QLIST_FOREACH(phb, &spapr->phbs, list) {
-        BusChild *kid;
-
         if (phb->buid != buid) {
             continue;
         }
+        return phb;
+    }
+
+    return NULL;
+}
+
+static PCIDevice *find_dev(sPAPREnvironment *spapr, uint64_t buid,
+                           uint32_t config_addr)
+{
+    sPAPRPHBState *phb = find_phb(spapr, buid);
+    BusChild *kid;
+    int devfn = (config_addr >> 8) & 0xFF;
+
+    if (!phb) {
+        return NULL;
+    }
 
-        QTAILQ_FOREACH(kid, &phb->host_state.bus->qbus.children, sibling) {
-            PCIDevice *dev = (PCIDevice *)kid->child;
-            if (dev->devfn == devfn) {
-                return dev;
-            }
+    QTAILQ_FOREACH(kid, &phb->host_state.bus->qbus.children, sibling) {
+        PCIDevice *dev = (PCIDevice *)kid->child;
+        if (dev->devfn == devfn) {
+            return dev;
         }
     }