|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v2] xen/arm: Add support for GICv3 for domU
On Mon, 6 Oct 2014, vijay.kilari@xxxxxxxxx wrote:
> From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx>
>
> With this patch gic version can be specified in cfg file.
> If no gic version is specified, xl tool queries host
> supported gic version and generate gic dt node accordingly.
> Ex: If gic_version is 3, gic dt node for GICv3 is generated.
>
> Specify gic version in cfg as 'gic_version = <version>'
>
> This patch is based on Julien's non-pci passthrough patch
> series.
>
> Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx>
The patch looks all right.
> v2: - Used domainconfigure domctl to fetch gic version
> - domainconfigure return error if gic version is not compatible
> - Remove register data parameters in make_intc_node() and
> add pass gic version as parameter
> ---
> tools/libxc/include/xenctrl.h | 2 +-
> tools/libxc/xc_domain.c | 10 +++++--
> tools/libxl/libxl_arm.c | 60
> ++++++++++++++++++++++++++++++-----------
> tools/libxl/libxl_types.idl | 1 +
> tools/libxl/xl_cmdimpl.c | 3 +++
> xen/arch/arm/domctl.c | 33 +++++++++++++++++++++--
> xen/arch/arm/gic-v3.c | 13 ++++++---
> xen/include/public/arch-arm.h | 8 ++++++
> xen/include/public/domctl.h | 2 ++
> 9 files changed, 108 insertions(+), 24 deletions(-)
>
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index 51cba70..56fe74c 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -484,7 +484,7 @@ int xc_domain_create(xc_interface *xch,
>
> #if defined(__arm__) || defined(__aarch64__)
> int xc_domain_configure(xc_interface *xch, uint32_t domid,
> - uint32_t nr_spis);
> + uint32_t nr_spis, uint32_t *gic_version);
> #endif
>
> /* Functions to produce a dump of a given domain
> diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
> index a55b5a8..b96c178 100644
> --- a/tools/libxc/xc_domain.c
> +++ b/tools/libxc/xc_domain.c
> @@ -50,13 +50,19 @@ int xc_domain_create(xc_interface *xch,
>
> #if defined(__arm__) || defined(__arch64__)
> int xc_domain_configure(xc_interface *xch, uint32_t domid,
> - uint32_t nr_spis)
> + uint32_t nr_spis, uint32_t *version)
> {
> + int err;
> DECLARE_DOMCTL;
> +
> domctl.cmd = XEN_DOMCTL_configure_domain;
> domctl.domain = (domid_t)domid;
> domctl.u.configuredomain.nr_spis = nr_spis;
> - return do_domctl(xch, &domctl);
> + domctl.u.configuredomain.gic_version = *version;
> + if ( (err = do_domctl(xch, &domctl)) != 0 )
> + return err;
> + *version = domctl.u.configuredomain.gic_version;
> + return 0;
> }
> #endif
>
> diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
> index 9605953..8475d1e 100644
> --- a/tools/libxl/libxl_arm.c
> +++ b/tools/libxl/libxl_arm.c
> @@ -29,6 +29,7 @@ int libxl__arch_domain_create_pre(libxl__gc *gc,
> libxl_domain_config *d_config,
> {
> int dev_index;
> uint32_t nr_spis = 0;
> + uint32_t gic_version = d_config->b_info.gic_version;
>
> for (dev_index = 0; dev_index < d_config->num_dtdevs; dev_index++)
> nr_spis += state->dtdevs_info[dev_index].num_irqs;
> @@ -37,10 +38,14 @@ int libxl__arch_domain_create_pre(libxl__gc *gc,
> libxl_domain_config *d_config,
>
> LOG(DEBUG, "Allocate %u SPIs\n", nr_spis);
>
> - if (xc_domain_configure(CTX->xch, domid, nr_spis) != 0) {
> + if (xc_domain_configure(CTX->xch, domid, nr_spis, &gic_version) != 0) {
> LOG(ERROR, "Couldn't configure the domain");
> return ERROR_FAIL;
> }
> + LOG(DEBUG, "Specified GIC version %d GIC version supported %d\n",
> + d_config->b_info.gic_version, gic_version);
> +
> + d_config->b_info.gic_version = gic_version;
>
> return 0;
> }
> @@ -382,19 +387,26 @@ static int make_memory_nodes(libxl__gc *gc, void *fdt,
> return 0;
> }
>
> -static int make_intc_node(libxl__gc *gc, void *fdt,
> - uint64_t gicd_base, uint64_t gicd_size,
> - uint64_t gicc_base, uint64_t gicc_size)
> +static int make_intc_node(libxl__gc *gc, void *fdt, int version)
> {
> int res;
> - const char *name = GCSPRINTF("interrupt-controller@%"PRIx64, gicd_base);
> + const char *name;
> +
> + if (version == 3)
> + name = GCSPRINTF("interrupt-controller@%"PRIx64,
> (uint64_t)GUEST_GICV3_GICD_BASE);
> + else
> + name = GCSPRINTF("interrupt-controller@%"PRIx64,
> (uint64_t)GUEST_GICD_BASE);
>
> res = fdt_begin_node(fdt, name);
> if (res) return res;
>
> - res = fdt_property_compat(gc, fdt, 2,
> - "arm,cortex-a15-gic",
> - "arm,cortex-a9-gic");
> + if (version == 3)
> + res = fdt_property_compat(gc, fdt, 1,
> + "arm,gic-v3");
> + else
> + res = fdt_property_compat(gc, fdt, 2,
> + "arm,cortex-a15-gic",
> + "arm,cortex-a9-gic");
> if (res) return res;
>
>
> @@ -407,11 +419,29 @@ static int make_intc_node(libxl__gc *gc, void *fdt,
> res = fdt_property(fdt, "interrupt-controller", NULL, 0);
> if (res) return res;
>
> - res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
> - 2,
> - gicd_base, gicd_size,
> - gicc_base, gicc_size);
> - if (res) return res;
> + if (version == 3) {
> + res = fdt_property_cell(fdt, "redistributor-stride",
> + GUEST_GICV3_RDIST_STRIDE);
> + if (res) return res;
> +
> + res = fdt_property_cell(fdt, "#redistributor-regions",
> + GUEST_GICV3_RDIST_REGIONS);
> + if (res) return res;
> +
> + res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
> + 2,
> + GUEST_GICV3_GICD_BASE, GUEST_GICV3_GICD_SIZE,
> + GUEST_GICV3_GICR_BASE,
> GUEST_GICV3_GICR_SIZE);
> + if (res) return res;
> + }
> + else
> + {
> + res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
> + 2,
> + GUEST_GICD_BASE, GUEST_GICD_SIZE,
> + GUEST_GICC_BASE, GUEST_GICD_SIZE);
> + if (res) return res;
> + }
>
> res = fdt_property_cell(fdt, "linux,phandle", PHANDLE_GIC);
> if (res) return res;
> @@ -662,10 +692,8 @@ next_resize:
> FDT( make_psci_node(gc, fdt) );
>
> FDT( make_memory_nodes(gc, fdt, dom) );
> - FDT( make_intc_node(gc, fdt,
> - GUEST_GICD_BASE, GUEST_GICD_SIZE,
> - GUEST_GICC_BASE, GUEST_GICD_SIZE) );
>
> + FDT( make_intc_node(gc, fdt, info->gic_version) );
> FDT( make_timer_node(gc, fdt, ainfo) );
> FDT( make_hypervisor_node(gc, fdt, vers) );
>
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 7d9eec2..8f3f074 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -349,6 +349,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> ("disable_migrate", libxl_defbool),
> ("cpuid", libxl_cpuid_policy_list),
> ("blkdev_start", string),
> + ("gic_version", uint32),
>
> ("device_model_version", libxl_device_model_version),
> ("device_model_stubdomain", libxl_defbool),
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index 2ec17ca..5fcb396 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -1523,6 +1523,9 @@ skip_vfb:
> if (!xlu_cfg_get_long (config, "pci_seize", &l, 0))
> pci_seize = l;
>
> + if (!xlu_cfg_get_long (config, "gic_version", &l, 0))
> + b_info->gic_version = l;
> +
> /* To be reworked (automatically enabled) once the auto ballooning
> * after guest starts is done (with PCI devices passed in). */
> if (c_info->type == LIBXL_DOMAIN_TYPE_PV) {
We really need to start having a concept of arch-specific options for
xl. For example we don't want to parse "viridian" on ARM and we don't
want to parse "gic_version" on x86. However we don't have this concept
at the moment and this patch is targeting 4.5, so let's leave it as is
for now.
> diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c
> index 370dd99..1bea026 100644
> --- a/xen/arch/arm/domctl.c
> +++ b/xen/arch/arm/domctl.c
> @@ -10,6 +10,8 @@
> #include <xen/errno.h>
> #include <xen/sched.h>
> #include <xen/hypercall.h>
> +#include <asm/gic.h>
> +#include <xen/guest_access.h>
> #include <public/domctl.h>
>
> long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
> @@ -39,9 +41,36 @@ long arch_do_domctl(struct xen_domctl *domctl, struct
> domain *d,
> if ( domctl->u.configuredomain.nr_spis > (gic_number_lines() - 32) )
> return -EINVAL;
>
> - return domain_configure_vgic(d, domctl->u.configuredomain.nr_spis);
> - }
> + if ( domain_configure_vgic(d, domctl->u.configuredomain.nr_spis) )
> + return -EINVAL;
>
> + switch ( gic_hw_version() )
> + {
> +#ifdef CONFIG_ARM_64
> + case GIC_V3:
> + if ( domctl->u.configuredomain.gic_version == 0 )
> + {
> + domctl->u.configuredomain.gic_version = 3;
> + return __copy_to_guest(u_domctl, domctl, 1);
> + }
> + /* XXX: Support only v3 gic emulation */
It is worth printing out this warning I think
> + if ( domctl->u.configuredomain.gic_version != 3 )
> + return -EINVAL;
> + break;
> +#endif
> + case GIC_V2:
> + if ( domctl->u.configuredomain.gic_version == 0 )
> + {
> + domctl->u.configuredomain.gic_version = 2;
> + return __copy_to_guest(u_domctl, domctl, 1);
> + }
> + if ( domctl->u.configuredomain.gic_version != 2 )
> + return -EINVAL;
> + break;
> + default:
> + return -EINVAL;
> + }
> + }
> default:
> {
> int rc;
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 9bdda32..059b60e 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -907,9 +907,16 @@ static int gicv_v3_init(struct domain *d)
> d->arch.vgic.rdist_count = gicv3.rdist_count;
> }
> else
> - d->arch.vgic.dbase = GUEST_GICD_BASE;
> + {
> + d->arch.vgic.dbase = GUEST_GICV3_GICD_BASE;
> + d->arch.vgic.dbase_size = GUEST_GICV3_GICD_SIZE;
> +
> + /* XXX: Only one Re-distributor region mapped for guest */
> + d->arch.vgic.rdist_count = 1;
> + d->arch.vgic.rbase[0] = GUEST_GICV3_GICR_BASE;
> + d->arch.vgic.rbase_size[0] = GUEST_GICV3_GICR_SIZE;
> + d->arch.vgic.rdist_stride = GUEST_GICV3_RDIST_STRIDE;
> + }
>
> return 0;
> }
> diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
> index cebb349..6f80c99 100644
> --- a/xen/include/public/arch-arm.h
> +++ b/xen/include/public/arch-arm.h
> @@ -363,6 +363,14 @@ typedef uint64_t xen_callback_t;
> * should instead use the FDT.
> */
>
> +/* GICv3 address space */
> +#define GUEST_GICV3_GICD_BASE 0x03001000ULL
> +#define GUEST_GICV3_GICD_SIZE 0x10000ULL
> +#define GUEST_GICV3_GICR_BASE 0x03020000ULL
> +#define GUEST_GICV3_GICR_SIZE 0x200000ULL
> +#define GUEST_GICV3_RDIST_STRIDE 0x20000ULL
> +#define GUEST_GICV3_RDIST_REGIONS 0x1ULL
> +
> /* Physical Address Space */
> #define GUEST_GICD_BASE 0x03001000ULL
> #define GUEST_GICD_SIZE 0x00001000ULL
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index 8adb8e2..502cfb6 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -73,6 +73,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
> struct xen_domctl_configuredomain {
> /* IN parameters */
> uint32_t nr_spis;
> + /* IN/OUT parameter */
> + uint32_t gic_version;
> };
> typedef struct xen_domctl_configuredomain xen_domctl_configuredomain_t;
> DEFINE_XEN_GUEST_HANDLE(xen_domctl_configuredomain_t);
> --
> 1.7.9.5
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |