|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XEN PATCH v2 11/25] arm: new VGIC: Add alternative redist region storage
Guests DT creation requires redist regions to be stored in the specific
variables in struct vgic_dist. But in new VGIC a linked list is used for
that. To not clutter the DT creation code with ifdefs, add alternative
storage for redist regions in struct vgic_dist.
Signed-off-by: Mykyta Poturai <mykyta_poturai@xxxxxxxx>
---
xen/arch/arm/include/asm/new_vgic.h | 5 +++++
xen/arch/arm/vgic/vgic-v3.c | 8 ++++++++
2 files changed, 13 insertions(+)
diff --git a/xen/arch/arm/include/asm/new_vgic.h
b/xen/arch/arm/include/asm/new_vgic.h
index 11d8f71851..9eafab45ff 100644
--- a/xen/arch/arm/include/asm/new_vgic.h
+++ b/xen/arch/arm/include/asm/new_vgic.h
@@ -21,6 +21,7 @@
#include <xen/list.h>
#include <xen/mm.h>
#include <xen/spinlock.h>
+#include <asm/gic_v3_defs.h>
#define VGIC_V3_MAX_CPUS 255
#define VGIC_V2_MAX_CPUS 8
@@ -136,6 +137,10 @@ struct vgic_dist {
paddr_t csize; /* CPU interface size */
paddr_t vbase; /* virtual CPU interface base address */
+ /* for compatibility with guests DT creation*/
+ uint32_t nr_regions;
+ struct rdist_region *rdist_regions;
+
/* distributor enabled */
bool enabled;
diff --git a/xen/arch/arm/vgic/vgic-v3.c b/xen/arch/arm/vgic/vgic-v3.c
index 682d57b476..8b700609f0 100644
--- a/xen/arch/arm/vgic/vgic-v3.c
+++ b/xen/arch/arm/vgic/vgic-v3.c
@@ -257,6 +257,10 @@ int vgic_v3_map_resources(struct domain *d)
/* Allocate memory for Re-distributor regions */
rdist_count = vgic_v3_max_rdist_count(d);
+ /*For compatibility with hwdom dt node creation*/
+ d->arch.vgic.nr_regions = rdist_count;
+ d->arch.vgic.rdist_regions = xzalloc_array(struct rdist_region,
rdist_count);
+
/*
* For domain using the host memory layout, it gets the hardware
* address.
@@ -268,6 +272,8 @@ int vgic_v3_map_resources(struct domain *d)
for ( i = 0; i < vgic_v3_hw_data.nr_rdist_regions; i++ )
{
+ d->arch.vgic.rdist_regions[i].base =
vgic_v3_hw_data.regions[i].base;
+ d->arch.vgic.rdist_regions[i].size =
vgic_v3_hw_data.regions[i].size;
vgic_v3_set_redist_base(d, i, vgic_v3_hw_data.regions[i].base,
vgic_v3_hw_data.regions[i].size /
GICV3_GICR_SIZE);
@@ -276,6 +282,8 @@ int vgic_v3_map_resources(struct domain *d)
else
{
d->arch.vgic.dbase = GUEST_GICV3_GICD_BASE;
+ d->arch.vgic.rdist_regions[0].base = GUEST_GICV3_GICR0_BASE;
+ d->arch.vgic.rdist_regions[0].size = GUEST_GICV3_GICR0_SIZE;
/* A single Re-distributor region is mapped for the guest. */
BUILD_BUG_ON(GUEST_GICV3_RDIST_REGIONS != 1);
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |