Hi Andre,
On 07/04/17 18:32, Andre Przywara wrote:
Create a new file to hold the emulation code for the ITS widget.
This just holds the data structure and a init and free function for now.
Signed-off-by: Andre Przywara <andre.przyw...@arm.com>
Acked-by: Julien Grall <julien.gr...@arm.com>
Cheers,
---
xen/arch/arm/Makefile | 1 +
xen/arch/arm/vgic-v3-its.c | 86 ++++++++++++++++++++++++++++++++++++++++
xen/arch/arm/vgic-v3.c | 8 +++-
xen/include/asm-arm/gic_v3_its.h | 13 ++++++
4 files changed, 107 insertions(+), 1 deletion(-)
create mode 100644 xen/arch/arm/vgic-v3-its.c
diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
index 6be85ab..49e1fb2 100644
--- a/xen/arch/arm/Makefile
+++ b/xen/arch/arm/Makefile
@@ -47,6 +47,7 @@ obj-y += traps.o
obj-y += vgic.o
obj-y += vgic-v2.o
obj-$(CONFIG_HAS_GICV3) += vgic-v3.o
+obj-$(CONFIG_HAS_ITS) += vgic-v3-its.o
obj-y += vm_event.o
obj-y += vtimer.o
obj-y += vpsci.o
diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c
new file mode 100644
index 0000000..2f1a255
--- /dev/null
+++ b/xen/arch/arm/vgic-v3-its.c
@@ -0,0 +1,86 @@
+/*
+ * xen/arch/arm/vgic-v3-its.c
+ *
+ * ARM Interrupt Translation Service (ITS) emulation
+ *
+ * Andre Przywara <andre.przyw...@arm.com>
+ * Copyright (c) 2016,2017 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; under version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <xen/bitops.h>
+#include <xen/config.h>
+#include <xen/domain_page.h>
+#include <xen/lib.h>
+#include <xen/init.h>
+#include <xen/softirq.h>
+#include <xen/irq.h>
+#include <xen/sched.h>
+#include <xen/sizes.h>
+#include <asm/current.h>
+#include <asm/mmio.h>
+#include <asm/gic_v3_defs.h>
+#include <asm/gic_v3_its.h>
+#include <asm/vgic.h>
+#include <asm/vgic-emul.h>
+
+/*
+ * Data structure to describe a virtual ITS.
+ * If both the vcmd_lock and the its_lock are required, the vcmd_lock must
+ * be taken first.
+ */
+struct virt_its {
+ struct domain *d;
+ unsigned int devid_bits;
+ unsigned int intid_bits;
+ spinlock_t vcmd_lock; /* Protects the virtual command buffer, which
*/
+ uint64_t cwriter; /* consists of CWRITER and CREADR and those
*/
+ uint64_t creadr; /* shadow variables cwriter and creadr. */
+ /* Protects the rest of this structure, including the ITS tables. */
+ spinlock_t its_lock;
+ uint64_t cbaser;
+ uint64_t baser_dev, baser_coll; /* BASER0 and BASER1 for the guest */
+ unsigned int max_collections;
+ unsigned int max_devices;
+ bool enabled;
+};
+
+/*
+ * An Interrupt Translation Table Entry: this is indexed by a
+ * DeviceID/EventID pair and is located in guest memory.
+ */
+struct vits_itte
+{
+ uint32_t vlpi;
+ uint16_t collection;
+ uint16_t pad;
+};
+
+int vgic_v3_its_init_domain(struct domain *d)
+{
+ return 0;
+}
+
+void vgic_v3_its_free_domain(struct domain *d)
+{
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c
index 1e9890b..d10757a 100644
--- a/xen/arch/arm/vgic-v3.c
+++ b/xen/arch/arm/vgic-v3.c
@@ -28,6 +28,7 @@
#include <asm/current.h>
#include <asm/mmio.h>
#include <asm/gic_v3_defs.h>
+#include <asm/gic_v3_its.h>
#include <asm/vgic.h>
#include <asm/vgic-emul.h>
#include <asm/vreg.h>
@@ -1438,7 +1439,7 @@ static inline unsigned int vgic_v3_rdist_count(struct
domain *d)
static int vgic_v3_domain_init(struct domain *d)
{
struct vgic_rdist_region *rdist_regions;
- int rdist_count, i;
+ int rdist_count, i, ret;
/* Allocate memory for Re-distributor regions */
rdist_count = vgic_v3_rdist_count(d);
@@ -1498,6 +1499,10 @@ static int vgic_v3_domain_init(struct domain *d)
d->arch.vgic.rdist_regions[0].first_cpu = 0;
}
+ ret = vgic_v3_its_init_domain(d);
+ if ( ret )
+ return ret;
+
/* Register mmio handle for the Distributor */
register_mmio_handler(d, &vgic_distr_mmio_handler, d->arch.vgic.dbase,
SZ_64K, NULL);
@@ -1522,6 +1527,7 @@ static int vgic_v3_domain_init(struct domain *d)
static void vgic_v3_domain_free(struct domain *d)
{
+ vgic_v3_its_free_domain(d);
xfree(d->arch.vgic.rdist_regions);
}
diff --git a/xen/include/asm-arm/gic_v3_its.h b/xen/include/asm-arm/gic_v3_its.h
index a96c9dc..84d1692 100644
--- a/xen/include/asm-arm/gic_v3_its.h
+++ b/xen/include/asm-arm/gic_v3_its.h
@@ -144,6 +144,10 @@ uint64_t gicv3_get_redist_address(unsigned int cpu, bool
use_pta);
/* Map a collection for this host CPU to each host ITS. */
int gicv3_its_setup_collection(unsigned int cpu);
+/* Initialize and destroy the per-domain parts of the virtual ITS support. */
+int vgic_v3_its_init_domain(struct domain *d);
+void vgic_v3_its_free_domain(struct domain *d);
+
int gicv3_allocate_host_lpi_block(struct domain *d, uint32_t *first_lpi);
void gicv3_free_host_lpi_block(uint32_t first_lpi);
@@ -184,6 +188,15 @@ static inline int gicv3_its_setup_collection(unsigned int
cpu)
BUG();
}
+static inline int vgic_v3_its_init_domain(struct domain *d)
+{
+ return 0;
+}
+
+static inline void vgic_v3_its_free_domain(struct domain *d)
+{
+}
+
#endif /* CONFIG_HAS_ITS */
#endif
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel