WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [qemu-xen-unstable] passthrough: Add AUTO_PHP_DEVFN_MULT

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [qemu-xen-unstable] passthrough: Add AUTO_PHP_DEVFN_MULTI
From: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
Date: Mon, 29 Jun 2009 03:01:31 -0700
Delivery-date: Mon, 29 Jun 2009 03:01:48 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
commit d2ff5da4b888092a22189e91d25a507c1ce79a32
Author: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Date:   Thu Jun 25 18:32:01 2009 +0100

    passthrough: Add AUTO_PHP_DEVFN_MULTI
    
    Up until now there has been a signle magic value that xend can pass to
    qemu-xen to signify that qemu-xen should choose a devfn for a pass-through
    function.
    
    When supporting multi-function devices in guests, it is useful for xend to
    be able to sepcify if a function is to appear in a guest as a
    single-function deveice, or as part of a multi-function device.
    
    By adding AUTO_PHP_DEVFN_MULTI to suplement the existing AUTO_PHP_DEVFN,
    this patch achieves that goal.
    
    This patch does not break compatibility with xend as the value chosen for
    AUTO_PHP_DEVFN_MULTI could never validly be sent by xend up until now.
    However, there is a companion change to xend in order to make use of this
    feature.
    
    Cc: Dexuan Cui <dexuan.cui@xxxxxxxxx>
    Cc: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
    Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
    
    [5/8; cross-compatibility issues with xen-unstable.hg]
---
 hw/pass-through.c |   55 +++++++++++++++++++++++++++++++++++-----------------
 hw/pci.h          |    9 +++----
 2 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/hw/pass-through.c b/hw/pass-through.c
index 7aa4771..5062b31 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -859,7 +859,7 @@ static int parse_bdf(char **str, int *seg, int *bus, int 
*dev, int *func,
     }
     else
     {
-        *vdevfn = AUTO_PHP_DEVFN;
+        *vdevfn = AUTO_PHP_SLOT;
         *opt = token;
     }
 
@@ -902,8 +902,32 @@ static int pci_devfn_match(int bus, int dev, int func, int 
devfn)
     return 0;
 }
 
+static int find_free_vslot(void)
+{
+    PCIBus *e_bus = dpci_infos.e_bus;
+    int slot, func, devfn;
+
+    for ( slot = 0; slot < NR_PCI_DEV; slot++ )
+    {
+        for ( func = 0; func < NR_PCI_FUNC; func++ )
+        {
+            devfn = PCI_DEVFN(slot, func);
+            if ( test_pci_devfn(devfn) || pci_devfn_in_use(e_bus, devfn) )
+            {
+                break;
+            }
+        }
+        if (func == NR_PCI_FUNC)
+            return slot;
+    }
+
+    /* not found */
+    return -1;
+}
+
+
 /* Insert a new pass-through device into a specific pci devfn.
- * input  dom:bus:dev.func@devfn, chose free one if devfn == AUTO_PHP_DEVFN
+ * input  dom:bus:dev.func@devfn, chose free one if devfn & AUTO_PHP_SLOT
  * return -2: requested devfn not available
  *        -1: no free devfns
  *        >=0: the new hotplug devfn
@@ -912,28 +936,23 @@ static int __insert_to_pci_devfn(int bus, int dev, int 
func, int devfn,
                                  char *opt)
 {
     PCIBus *e_bus = dpci_infos.e_bus;
-    int slot;
+    int vslot;
 
-    /* preferred virt pci devfn */
-    if ( devfn != AUTO_PHP_DEVFN )
+    if ( devfn & AUTO_PHP_SLOT )
     {
-        if ( !test_pci_devfn(devfn) && !pci_devfn_in_use(e_bus, devfn) )
-            goto found;
-        return -2;
+        vslot = find_free_vslot();
+        if (vslot < 0)
+            return -1;
+        /* The vfunc is provided in the devfn paramter */
+        devfn = PCI_DEVFN(vslot, PCI_FUNC(devfn));
     }
-
-    /* pick a free slot */
-    for ( slot = 0; slot < NR_PCI_DEV; slot++ )
+    else
     {
-        devfn = PCI_DEVFN(slot, 0);
-        if ( !test_pci_devfn(devfn) && !pci_devfn_in_use(e_bus, devfn) )
-            goto found;
+        /* Prefered devfn */
+        if ( test_pci_devfn(devfn) || pci_devfn_in_use(e_bus, devfn) )
+            return -2;
     }
 
-    /* not found */
-    return -1;
-
-found:
     dpci_infos.php_devs[devfn].valid  = 1;
     dpci_infos.php_devs[devfn].r_bus  = bus;
     dpci_infos.php_devs[devfn].r_dev  = dev;
diff --git a/hw/pci.h b/hw/pci.h
index f9660dc..30bcb04 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -255,11 +255,10 @@ void pci_info(void);
 PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
                         pci_map_irq_fn map_irq, const char *name);
 
-#define NR_PCI_FUNC    8
-#define NR_PCI_DEV     32
-#define NR_PCI_DEVFN   (NR_PCI_FUNC * NR_PCI_DEV)
-#define AUTO_PHP_SLOT  NR_PCI_DEV
-#define AUTO_PHP_DEVFN NR_PCI_DEVFN
+#define NR_PCI_FUNC          8
+#define NR_PCI_DEV           32
+#define NR_PCI_DEVFN         (NR_PCI_FUNC * NR_PCI_DEV)
+#define AUTO_PHP_SLOT        0x100
 
 int insert_to_pci_devfn(char *bdf_devfn);
 int test_pci_devfn(int devfn);
--
generated by git-patchbot for /home/xen/git/qemu-xen-unstable.git

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [qemu-xen-unstable] passthrough: Add AUTO_PHP_DEVFN_MULTI, Ian Jackson <=