mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
libxl: Add support for Device Tree passthrough
On ARM, every non-PCI device are described in the device tree. Each of
them can be found via a path.
This patch introduces a very basic support, only the IOMMU will be set
up correctly. The user will have to:
- Describe the device in the partial device tree
- Map manually MMIO/IRQ
This is a first approach, that will allow to have a basic Device Tree
passthrough support in Xen. This could be improved later.
Furthermore add LIBXL_HAVE_DEVICETREE_PASSTHROUGH to indicate we
support Device Tree passthrough and partial device tree (introduced by a
previous patch).
Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
c3ba52a84d
commit
2017224d3d
4 files changed
+49
No files matched your search
@@ -192,6 +192,13 @@
|
||||
* is not present, instead of ERROR_INVAL.
|
||||
*/
|
||||
#define LIBXL_HAVE_ERROR_DOMAIN_NOTFOUND 1
|
||||
|
||||
/*
|
||||
* libxl_domain_build_info has device_tree and libxl_device_dtdev
|
||||
* exists. This mean Device Tree passthrough is supported for ARM
|
||||
*/
|
||||
#define LIBXL_HAVE_DEVICETREE_PASSTHROUGH 1
|
||||
|
||||
/*
|
||||
* libxl ABI compatibility
|
||||
*
|
||||
|
||||
@@ -764,6 +764,8 @@ static void domcreate_attach_vtpms(libxl__egc *egc, libxl__multidev *multidev,
|
||||
int ret);
|
||||
static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *aodevs,
|
||||
int ret);
|
||||
static void domcreate_attach_dtdev(libxl__egc *egc,
|
||||
libxl__domain_create_state *dcs);
|
||||
|
||||
static void domcreate_console_available(libxl__egc *egc,
|
||||
libxl__domain_create_state *dcs);
|
||||
@@ -1457,6 +1459,36 @@ static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev,
|
||||
}
|
||||
}
|
||||
|
||||
domcreate_attach_dtdev(egc, dcs);
|
||||
return;
|
||||
|
||||
error_out:
|
||||
assert(ret);
|
||||
domcreate_complete(egc, dcs, ret);
|
||||
}
|
||||
|
||||
static void domcreate_attach_dtdev(libxl__egc *egc,
|
||||
libxl__domain_create_state *dcs)
|
||||
{
|
||||
STATE_AO_GC(dcs->ao);
|
||||
int i;
|
||||
int ret;
|
||||
int domid = dcs->guest_domid;
|
||||
|
||||
/* convenience aliases */
|
||||
libxl_domain_config *const d_config = dcs->guest_config;
|
||||
|
||||
for (i = 0; i < d_config->num_dtdevs; i++) {
|
||||
const libxl_device_dtdev *dtdev = &d_config->dtdevs[i];
|
||||
|
||||
LOG(DEBUG, "Assign device \"%s\" to dom%u", dtdev->path, domid);
|
||||
ret = xc_assign_dt_device(CTX->xch, domid, dtdev->path);
|
||||
if (ret < 0) {
|
||||
LOG(ERROR, "xc_assign_dtdevice failed: %d\n", ret);
|
||||
goto error_out;
|
||||
}
|
||||
}
|
||||
|
||||
domcreate_console_available(egc, dcs);
|
||||
|
||||
domcreate_complete(egc, dcs, 0);
|
||||
|
||||
@@ -1208,6 +1208,11 @@ _hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_pci *pcidev, int num);
|
||||
_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid);
|
||||
|
||||
/* from libxl_dtdev */
|
||||
|
||||
_hidden int libxl__device_dt_add(libxl__gc *gc, uint32_t domid,
|
||||
const libxl_device_dtdev *dtdev);
|
||||
|
||||
/*----- xswait: wait for a xenstore node to be suitable -----*/
|
||||
|
||||
typedef struct libxl__xswait_state libxl__xswait_state;
|
||||
|
||||
@@ -541,6 +541,10 @@ libxl_device_pci = Struct("device_pci", [
|
||||
("seize", bool),
|
||||
])
|
||||
|
||||
libxl_device_dtdev = Struct("device_dtdev", [
|
||||
("path", string),
|
||||
])
|
||||
|
||||
libxl_device_vtpm = Struct("device_vtpm", [
|
||||
("backend_domid", libxl_domid),
|
||||
("backend_domname", string),
|
||||
@@ -567,6 +571,7 @@ libxl_domain_config = Struct("domain_config", [
|
||||
("disks", Array(libxl_device_disk, "num_disks")),
|
||||
("nics", Array(libxl_device_nic, "num_nics")),
|
||||
("pcidevs", Array(libxl_device_pci, "num_pcidevs")),
|
||||
("dtdevs", Array(libxl_device_dtdev, "num_dtdevs")),
|
||||
("vfbs", Array(libxl_device_vfb, "num_vfbs")),
|
||||
("vkbs", Array(libxl_device_vkb, "num_vkbs")),
|
||||
("vtpms", Array(libxl_device_vtpm, "num_vtpms")),
|
||||
|
||||