Patchwork [03/15] pci: Implement BusInfo.get_dev_path()

login
register
mail settings
Submitter Alex Williamson
Date June 24, 2010, 4:41 a.m.
Message ID <20100624044112.16168.70618.stgit@localhost.localdomain>
Download mbox | patch
Permalink /patch/56746/
State New
Headers show

Comments

Alex Williamson - June 24, 2010, 4:41 a.m.
This works great for PCI since a <segment>:<bus>:<dev>.<fn> uniquely
describes a global address.  No need to traverse up the qdev tree.
PCI segment support is a placeholder for compatibility once we
support multiple segments.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---

 hw/pci.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
Isaku Yamahata - June 24, 2010, 7:39 a.m.
On Wed, Jun 23, 2010 at 10:41:13PM -0600, Alex Williamson wrote:
> This works great for PCI since a <segment>:<bus>:<dev>.<fn> uniquely
> describes a global address.  No need to traverse up the qdev tree.
> PCI segment support is a placeholder for compatibility once we
> support multiple segments.
> 
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> ---
> 
>  hw/pci.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 7787005..5c9d6b4 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -58,11 +58,13 @@ struct PCIBus {
>  };
>  
>  static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
> +static char *pcibus_get_dev_path(DeviceState *dev);
>  
>  static struct BusInfo pci_bus_info = {
>      .name       = "PCI",
>      .size       = sizeof(PCIBus),
>      .print_dev  = pcibus_dev_print,
> +    .get_dev_path = pcibus_get_dev_path,
>      .props      = (Property[]) {
>          DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
>          DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
> @@ -1853,6 +1855,18 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
>      }
>  }
>  
> +static char *pcibus_get_dev_path(DeviceState *dev)
> +{
> +    PCIDevice *d = (PCIDevice *)dev;
> +    char path[16];
> +
> +    snprintf(path, sizeof(path), "%04x:%02x:%02x.%x",
> +             0 /* FIXME for segment support */, d->config[PCI_SECONDARY_BUS],

pci_find_domain(d->bus)


> +             PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
> +
> +    return strdup(path);
> +}
> +
>  static PCIDeviceInfo bridge_info = {
>      .qdev.name    = "pci-bridge",
>      .qdev.size    = sizeof(PCIBridge),
> 
>
Alex Williamson - June 24, 2010, 3:05 p.m.
On Thu, 2010-06-24 at 16:39 +0900, Isaku Yamahata wrote:
> On Wed, Jun 23, 2010 at 10:41:13PM -0600, Alex Williamson wrote:
> > This works great for PCI since a <segment>:<bus>:<dev>.<fn> uniquely
> > describes a global address.  No need to traverse up the qdev tree.
> > PCI segment support is a placeholder for compatibility once we
> > support multiple segments.
> > 
> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> > ---
> > 
> >  hw/pci.c |   14 ++++++++++++++
> >  1 files changed, 14 insertions(+), 0 deletions(-)
> > 
> > diff --git a/hw/pci.c b/hw/pci.c
> > index 7787005..5c9d6b4 100644
> > --- a/hw/pci.c
> > +++ b/hw/pci.c
> > @@ -58,11 +58,13 @@ struct PCIBus {
> >  };
> >  
> >  static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
> > +static char *pcibus_get_dev_path(DeviceState *dev);
> >  
> >  static struct BusInfo pci_bus_info = {
> >      .name       = "PCI",
> >      .size       = sizeof(PCIBus),
> >      .print_dev  = pcibus_dev_print,
> > +    .get_dev_path = pcibus_get_dev_path,
> >      .props      = (Property[]) {
> >          DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
> >          DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
> > @@ -1853,6 +1855,18 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
> >      }
> >  }
> >  
> > +static char *pcibus_get_dev_path(DeviceState *dev)
> > +{
> > +    PCIDevice *d = (PCIDevice *)dev;
> > +    char path[16];
> > +
> > +    snprintf(path, sizeof(path), "%04x:%02x:%02x.%x",
> > +             0 /* FIXME for segment support */, d->config[PCI_SECONDARY_BUS],
> 
> pci_find_domain(d->bus)

Thank you Isaku, I'll make the change.

Alex

Patch

diff --git a/hw/pci.c b/hw/pci.c
index 7787005..5c9d6b4 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -58,11 +58,13 @@  struct PCIBus {
 };
 
 static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
+static char *pcibus_get_dev_path(DeviceState *dev);
 
 static struct BusInfo pci_bus_info = {
     .name       = "PCI",
     .size       = sizeof(PCIBus),
     .print_dev  = pcibus_dev_print,
+    .get_dev_path = pcibus_get_dev_path,
     .props      = (Property[]) {
         DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
         DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
@@ -1853,6 +1855,18 @@  static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
     }
 }
 
+static char *pcibus_get_dev_path(DeviceState *dev)
+{
+    PCIDevice *d = (PCIDevice *)dev;
+    char path[16];
+
+    snprintf(path, sizeof(path), "%04x:%02x:%02x.%x",
+             0 /* FIXME for segment support */, d->config[PCI_SECONDARY_BUS],
+             PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
+
+    return strdup(path);
+}
+
 static PCIDeviceInfo bridge_info = {
     .qdev.name    = "pci-bridge",
     .qdev.size    = sizeof(PCIBridge),