Skip to contentSkip to conversation

tools: libxl: fixup PCI BDF interface

PATCH Applied Ian Campbell 2 participants 4 messages Mar 21, 2011 – Mar 31, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 tools: libxl: fixup PCI BDF interface

The libxl interface for PCI devices includes a couple of fields which are not useful in this context, remove them.

libxl exposes the PCI BDF as individual numbers and takes care of encoding it internally, this change was not propagated to the ocaml bindings at the time so do it now.

#1 lore raw

PATCH 1/1 libxl: remove "reg" and "enable" fields from PCI device

# HG changeset patch
# User Ian Campbell <[email protected]>
# Date 1300721950 0
# Node ID 3c0d44a0d9a3f8adcc2e43a6610fc0fe5b012b3a # Parent 0e6e8b0d4dc1020ee9757121c83cb05da55f3cca
libxl: remove "reg" and "enable" fields from PCI device.

These are defined as part of the PCI config_address register (I/O port 0xCF8) which allows I/O mapped access to PCI configuration space but have no meaning in the context of PCI passthrough configuration.

tools/libxl/libxl.idl +0 -2
diff -r 0e6e8b0d4dc1 -r 3c0d44a0d9a3 tools/libxl/libxl.idl
@@ -243,11 +243,9 @@ libxl_device_net2 = Struct("device_net2"
     ])
 
 libxl_device_pci = Struct("device_pci", [
-    ("reg",       uint8),
     ("func",      uint8),
     ("dev",       uint8),
     ("bus",       uint8),
-    ("enable",    bool),
     ("domain", unsigned_integer),
     ("vdevfn", unsigned_integer),
     ("vfunc_mask", unsigned_integer),
tools/libxl/libxl_pci.c +9 -22
diff -r 0e6e8b0d4dc1 -r 3c0d44a0d9a3 tools/libxl/libxl_pci.c
@@ -41,29 +41,16 @@
 #define PCI_BDF_SHORT          "%02x:%02x.%01x"
 #define PCI_BDF_VDEVFN         "%04x:%02x:%02x.%01x@%02x"
 
-static unsigned int pcidev_value(libxl_device_pci *pcidev)
+static unsigned int pcidev_encode_bdf(libxl_device_pci *pcidev)
 {
-    union {
-        unsigned int value;
-        struct {
-            unsigned int reserved1:2;
-            unsigned int reg:6;
-            unsigned int func:3;
-            unsigned int dev:5;
-            unsigned int bus:8;
-            unsigned int reserved2:7;
-            unsigned int enable:1;
-        }fields;
-    }u;
+    unsigned int value;
 
-    u.value = 0;
-    u.fields.reg = pcidev->reg;
-    u.fields.func = pcidev->func;
-    u.fields.dev = pcidev->dev;
-    u.fields.bus = pcidev->bus;
-    u.fields.enable = pcidev->enable;
+    value = 0;
+    value |= (pcidev->bus & 0xff) << 16;
+    value |= (pcidev->dev & 0x1f) << (8+3);
+    value |= (pcidev->func & 0x3) << (8+0);
 
-    return u.value;
+    return value;
 }
 
 static int pcidev_init(libxl_device_pci *pcidev, unsigned int domain,
@@ -711,7 +698,7 @@ static int do_pci_add(libxl__gc *gc, uin
     }
 out:
     if (!libxl_is_stubdom(ctx, domid, NULL)) {
-        rc = xc_assign_device(ctx->xch, domid, pcidev_value(pcidev));
+        rc = xc_assign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev));
         if (rc < 0 && (hvm || errno != ENOSYS)) {
             LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_assign_device failed");
             return ERROR_FAIL;
@@ -938,7 +925,7 @@ out:
     }
 
     if (!libxl_is_stubdom(ctx, domid, NULL)) {
-        rc = xc_deassign_device(ctx->xch, domid, pcidev_value(pcidev));
+        rc = xc_deassign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev));
         if (rc < 0 && (hvm || errno != ENOSYS))
             LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_deassign_device failed");
     }
tools/ocaml/libs/xl/xl_stubs.c +0 -2
diff -r 0e6e8b0d4dc1 -r 3c0d44a0d9a3 tools/ocaml/libs/xl/xl_stubs.c
@@ -288,11 +288,9 @@ static int device_pci_val(caml_gc *gc, l
 
 	/* FIXME: propagate API change to ocaml */
 	u.value = Int_val(Field(v, 0));
-	c_val->reg = u.fields.reg;
 	c_val->func = u.fields.func;
 	c_val->dev = u.fields.dev;
 	c_val->bus = u.fields.bus;
-	c_val->enable = u.fields.enable;
 
 	c_val->domain = Int_val(Field(v, 1));
 	c_val->vdevfn = Int_val(Field(v, 2));
#2 lore raw

PATCH 1/1 tools: ocaml: xl: propagate simplfied libxl interface to PCI BDFs to bindings

In reply to Ian Campbell

# HG changeset patch
# User Ian Campbell <[email protected]>
# Date 1300724005 0
# Node ID d6423527e5b8785a3b8425ea8d360e3e465115e7
# Parent 3c0d44a0d9a3f8adcc2e43a6610fc0fe5b012b3a
tools: ocaml: xl: propagate simplfied libxl interface to PCI BDFs to bindings.

22166:251694a87f1d changed the libxl interface to remove the need for users to understand BDF encoding but did not propagate the change to the ocaml bindings. Do that now.

tools/ocaml/libs/xl/xl.ml +3 -1
diff -r 3c0d44a0d9a3 -r d6423527e5b8 tools/ocaml/libs/xl/xl.ml
@@ -145,7 +145,9 @@ type vfb_info =
 
 type pci_info =
 {
-	v : int; (* domain * bus * dev * func multiplexed *)
+	func : int;
+	dev : int;
+	bus : int;
 	domain : int;
 	vdevfn : int;
 	msitranslate : bool;
tools/ocaml/libs/xl/xl.mli +3 -1
diff -r 3c0d44a0d9a3 -r d6423527e5b8 tools/ocaml/libs/xl/xl.mli
@@ -145,7 +145,9 @@ type vfb_info =
 
 type pci_info =
 {
-	v : int; (* domain * bus * dev * func multiplexed *)
+	func : int;
+	dev : int;
+	bus : int;
 	domain : int;
 	vdevfn : int;
 	msitranslate : bool;
tools/ocaml/libs/xl/xl_stubs.c +7 -21
diff -r 3c0d44a0d9a3 -r d6423527e5b8 tools/ocaml/libs/xl/xl_stubs.c
@@ -272,30 +272,16 @@ static int device_vfb_val(caml_gc *gc, l
 
 static int device_pci_val(caml_gc *gc, libxl_device_pci *c_val, value v)
 {
-	union {
-		unsigned int value;
-		struct {
-			unsigned int reserved1:2;
-			unsigned int reg:6;
-			unsigned int func:3;
-			unsigned int dev:5;
-			unsigned int bus:8;
-			unsigned int reserved2:7;
-			unsigned int enable:1;
-		}fields;
-	}u;
 	CAMLparam1(v);
 
-	/* FIXME: propagate API change to ocaml */
-	u.value = Int_val(Field(v, 0));
-	c_val->func = u.fields.func;
-	c_val->dev = u.fields.dev;
-	c_val->bus = u.fields.bus;
+	c_val->func = Int_val(Field(v, 0));
+	c_val->dev = Int_val(Field(v, 1));
+	c_val->bus = Int_val(Field(v, 2));
 
-	c_val->domain = Int_val(Field(v, 1));
-	c_val->vdevfn = Int_val(Field(v, 2));
-	c_val->msitranslate = Bool_val(Field(v, 3));
-	c_val->power_mgmt = Bool_val(Field(v, 4));
+	c_val->domain = Int_val(Field(v, 3));
+	c_val->vdevfn = Int_val(Field(v, 4));
+	c_val->msitranslate = Bool_val(Field(v, 5));
+	c_val->power_mgmt = Bool_val(Field(v, 6));
 
 	CAMLreturn(0);
 }
Applied
#3 lore raw
In reply to Ian Campbell

Ian Campbell writes ("[Xen-devel] [PATCH 0 of 2] tools: libxl: fixup PCI BDF interface"):

Quoted 2 lines

The libxl interface for PCI devices includes a couple of fields which are not useful in this context, remove them.

Applied both, thanks.

Ian.