tools: libxl: fixup PCI BDF interface (REPOST)
PATCH 1/1 tools: libxl: fixup PCI BDF interface (REPOST)
Drop some unused fields from the libxl_device_pci, they are not relevant in the context of PCI passthrough.
Propagate interface change from 22166:251694a87f1d to the ocaml bindings, removing a FIXME.
PATCH 1/1 libxl: remove "reg" and "enable" fields from PCI device
# HG changeset patch
# User Ian Campbell <[email protected]>
# Date 1301569030 -3600
# Node ID cb7f41afe07f8734a515dd30454e6701df755ec1 # Parent 4dea5e15e3463475fbed120882cfd9261b0182ea
libxl: remove "reg" and "enable" fields from PCI device.
The structure of the BDF argument used with PCI passthrough related hypercalls was taken from the structure of the PCI config_address register (I/O port 0xCF8) which allows I/O mapped access to PCI configuration space but these fields have no meaning in the context of PCI passthrough configuration and hence do not need to be exposed via libxl.
tools/libxl/libxl.idl +0 -2
@@ -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
@@ -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
@@ -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 ));
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 1301569049 -3600
# Node ID 7b5c5a365f2a0a57e83479f69e5b56beb07752c1
# Parent cb7f41afe07f8734a515dd30454e6701df755ec1
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
@@ -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
@@ -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
@@ -272,30 +272,16 @@ static int device_vfb_val(caml_gc *gc, lstatic 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 ); }