[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V2 1/25] DOMCTL: Introduce new DOMCTL commands for vIOMMU support
This patch is to introduce create, destroy and query capabilities command for vIOMMU. vIOMMU layer will deal with requests and call arch vIOMMU ops. Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx> --- xen/common/domctl.c | 3 +++ xen/common/viommu.c | 43 +++++++++++++++++++++++++++++++++++++ xen/include/public/domctl.h | 52 +++++++++++++++++++++++++++++++++++++++++++++ xen/include/xen/viommu.h | 6 ++++++ 4 files changed, 104 insertions(+) diff --git a/xen/common/domctl.c b/xen/common/domctl.c index d80488b..01c3024 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -1144,6 +1144,9 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) if ( !ret ) copyback = 1; break; + case XEN_DOMCTL_viommu_op: + ret = viommu_domctl(d, &op->u.viommu_op, ©back); + break; default: ret = arch_do_domctl(op, d, u_domctl); diff --git a/xen/common/viommu.c b/xen/common/viommu.c index 6874d9f..a4d004d 100644 --- a/xen/common/viommu.c +++ b/xen/common/viommu.c @@ -148,6 +148,49 @@ static u64 viommu_query_caps(struct domain *d, u64 type) return viommu_type->ops->query_caps(d); } +int viommu_domctl(struct domain *d, struct xen_domctl_viommu_op *op, + bool *need_copy) +{ + int rc = -EINVAL, ret; + + if ( !viommu_enabled() ) + return rc; + + switch ( op->cmd ) + { + case XEN_DOMCTL_create_viommu: + ret = viommu_create(d, op->u.create_viommu.viommu_type, + op->u.create_viommu.base_address, + op->u.create_viommu.length, + op->u.create_viommu.capabilities); + if ( ret >= 0 ) { + op->u.create_viommu.viommu_id = ret; + *need_copy = true; + rc = 0; /* return 0 if success */ + } + break; + + case XEN_DOMCTL_destroy_viommu: + rc = viommu_destroy(d, op->u.destroy_viommu.viommu_id); + break; + + case XEN_DOMCTL_query_viommu_caps: + ret = viommu_query_caps(d, op->u.query_caps.viommu_type); + if ( ret >= 0 ) + { + op->u.query_caps.capabilities = ret; + rc = 0; + } + *need_copy = true; + break; + + default: + break; + } + + return rc; +} + int __init viommu_setup(void) { INIT_LIST_HEAD(&type_list); diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index ff39762..4b10f26 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -1149,6 +1149,56 @@ struct xen_domctl_psr_cat_op { typedef struct xen_domctl_psr_cat_op xen_domctl_psr_cat_op_t; DEFINE_XEN_GUEST_HANDLE(xen_domctl_psr_cat_op_t); +/* vIOMMU helper + * + * vIOMMU interface can be used to create/destroy vIOMMU and + * query vIOMMU capabilities. + */ + +/* vIOMMU type - specify vendor vIOMMU device model */ +#define VIOMMU_TYPE_INTEL_VTD (1u << 0) + +/* vIOMMU capabilities */ +#define VIOMMU_CAP_IRQ_REMAPPING (1u << 0) + +struct xen_domctl_viommu_op { + uint32_t cmd; +#define XEN_DOMCTL_create_viommu 0 +#define XEN_DOMCTL_destroy_viommu 1 +#define XEN_DOMCTL_query_viommu_caps 2 + union { + struct { + /* IN - vIOMMU type */ + uint64_t viommu_type; + /* + * IN - MMIO base address of vIOMMU. vIOMMU device models + * are in charge of to check base_address and length. + */ + uint64_t base_address; + /* IN - Length of MMIO region */ + uint64_t length; + /* IN - Capabilities with which we want to create */ + uint64_t capabilities; + /* OUT - vIOMMU identity */ + uint32_t viommu_id; + } create_viommu; + + struct { + /* IN - vIOMMU identity */ + uint32_t viommu_id; + } destroy_viommu; + + struct { + /* IN - vIOMMU type */ + uint64_t viommu_type; + /* OUT - vIOMMU Capabilities */ + uint64_t capabilities; + } query_caps; + } u; +}; +typedef struct xen_domctl_viommu_op xen_domctl_viommu_op; +DEFINE_XEN_GUEST_HANDLE(xen_domctl_viommu_op); + struct xen_domctl { uint32_t cmd; #define XEN_DOMCTL_createdomain 1 @@ -1226,6 +1276,7 @@ struct xen_domctl { #define XEN_DOMCTL_monitor_op 77 #define XEN_DOMCTL_psr_cat_op 78 #define XEN_DOMCTL_soft_reset 79 +#define XEN_DOMCTL_viommu_op 80 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -1288,6 +1339,7 @@ struct xen_domctl { struct xen_domctl_psr_cmt_op psr_cmt_op; struct xen_domctl_monitor_op monitor_op; struct xen_domctl_psr_cat_op psr_cat_op; + struct xen_domctl_viommu_op viommu_op; uint8_t pad[128]; } u; }; diff --git a/xen/include/xen/viommu.h b/xen/include/xen/viommu.h index 506ea54..527afb1 100644 --- a/xen/include/xen/viommu.h +++ b/xen/include/xen/viommu.h @@ -49,6 +49,8 @@ extern bool_t opt_viommu; static inline bool viommu_enabled(void) { return opt_viommu; } int viommu_init_domain(struct domain *d); int viommu_register_type(u64 type, struct viommu_ops * ops); +int viommu_domctl(struct domain *d, struct xen_domctl_viommu_op *op, + bool_t *need_copy); int viommu_setup(void); #else static inline int viommu_init_domain(struct domain *d) { return 0; } @@ -56,6 +58,10 @@ static inline int viommu_register_type(u64 type, struct viommu_ops * ops) { return 0; } static inline int __init viommu_setup(void) { return 0; } static inline bool viommu_enabled(void) { return false; } +static inline int viommu_domctl(struct domain *d, + struct xen_domctl_viommu_op *op, + bool *need_copy) +{ return -ENODEV }; #endif #endif /* __XEN_VIOMMU_H__ */ -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |