[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [rfc 2/4] ioemu: Do slot parsing inside of next_bdf



Currently only hotplug provides vslot information from xend.
A subsequent patch will have xend provide this information
for boot-time inserted pass-through devices too.

With this in mind, this patch makes some infrastructure
to parse bdf + slot information.

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

--- 

* Sat, 21 Mar 2009 09:24:37 +1100
  Initial Public Release

* Mon, 23 Mar 2009 20:38:40 +1100
  Remove a bogus second assignment of *vslot* inside next_bdf().
  Unfortunately this crept into the version I posted while
  my testing was against a versino without it.

Index: ioemu-remote/hw/pass-through.c
===================================================================
--- ioemu-remote.orig/hw/pass-through.c 2009-03-23 20:32:31.000000000 +1100
+++ ioemu-remote/hw/pass-through.c      2009-03-23 20:37:17.000000000 +1100
@@ -770,9 +770,10 @@ static int token_value(char *token)
     return strtol(token, NULL, 16);
 }
 
-static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func, char 
**opt)
+static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func,
+                    char **opt, int *vslot)
 {
-    char *token;
+    char *token, *endptr;
     const char *delim = ":.-";
 
     if ( !(*str) ||
@@ -789,7 +790,20 @@ static int next_bdf(char **str, int *seg
     *dev  = token_value(token);
 
     token  = strsep(str, delim);
-    *opt = strchr(token, ',');
+
+    *opt = strchr(token, '@');
+    if (*opt)
+    {
+        *(*opt)++ = '\0';
+        *vslot = token_value(*opt);
+    }
+    else
+    {
+        *vslot = AUTO_PHP_SLOT;
+        *opt = token;
+    }
+
+    *opt = strchr(*opt, ',');
     if (*opt)
         *(*opt)++ = '\0';
 
@@ -862,14 +876,9 @@ found:
 int insert_to_pci_slot(char *bdf_slt)
 {
     int seg, bus, dev, func, slot;
-    char *bdf_str, *slt_str, *opt, *endptr;
-    const char *delim="@";
-
-    bdf_str = strsep(&bdf_slt, delim);
-    slt_str = bdf_slt;
-    slot = token_value(slt_str);
+    char *opt;
 
-    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func, &opt))
+    if ( !next_bdf(&bdf_slt, &seg, &bus, &dev, &func, &opt, &slot) )
     {
         return -1;
     }
@@ -897,10 +906,10 @@ int test_pci_slot(int slot)
 /* find the pci slot for pass-through dev with specified BDF */
 int bdf_to_slot(char *bdf_str)
 {
-    int seg, bus, dev, func, i;
+    int seg, bus, dev, func, slot, i;
     char *opt;
 
-    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func, &opt))
+    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func, &opt, &slot))
     {
         return -1;
     }
@@ -3619,7 +3628,7 @@ struct pt_dev * register_real_device(PCI
         return NULL;
     }
 
-    dpci_infos.php_devs[PCI_SLOT(e_devfn, 0)].pt_dev = assigned_device;
+    dpci_infos.php_devs[PCI_SLOT(e_devfn)].pt_dev = assigned_device;
 
     assigned_device->pci_dev = pci_dev;
     assigned_device->msi_trans_cap = msi_translate;
@@ -3801,7 +3810,7 @@ int power_off_php_slot(int slot)
 
 int pt_init(PCIBus *e_bus, const char *direct_pci)
 {
-    int seg, b, d, f, status = -1;
+    int seg, b, d, f, s, status = -1;
     struct pt_dev *pt_dev;
     struct pci_access *pci_access;
     char *vslots;
@@ -3837,7 +3846,7 @@ int pt_init(PCIBus *e_bus, const char *d
     vslots = qemu_mallocz ( strlen(direct_pci) / 3 );
 
     /* Assign given devices to guest */
-    while ( next_bdf(&direct_pci_p, &seg, &b, &d, &f, &opt) )
+    while ( next_bdf(&direct_pci_p, &seg, &b, &d, &f, &opt, &s) )
     {
         /* Register real device with the emulated bus */
         pt_dev = register_real_device(e_bus, "DIRECT PCI", PT_VIRT_DEVFN_AUTO,

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.