[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-arm] [kvm-unit-tests RFC 11/15] arm/arm64: ITS: create device
From: |
Eric Auger |
Subject: |
[Qemu-arm] [kvm-unit-tests RFC 11/15] arm/arm64: ITS: create device |
Date: |
Mon, 5 Dec 2016 22:46:42 +0100 |
Introduce an helper function that registers a new device candidate to
send MSIs on the ITS. The device is characterized by its device id,
the number of event ids. This dimensions the associated interrupt
translation table (ITT), allocated by this function.
Signed-off-by: Eric Auger <address@hidden>
---
lib/arm/asm/gic-v3-its.h | 11 +++++++++++
lib/arm/gic-v3-its.c | 28 ++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/lib/arm/asm/gic-v3-its.h b/lib/arm/asm/gic-v3-its.h
index b73736c..31589d6 100644
--- a/lib/arm/asm/gic-v3-its.h
+++ b/lib/arm/asm/gic-v3-its.h
@@ -124,6 +124,8 @@
#define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0)
+#define GITS_MAX_DEVICES 8
+
struct its_baser {
unsigned int index;
int type;
@@ -154,6 +156,12 @@ struct its_typer {
bool virt_lpi;
};
+struct its_device {
+ u32 device_id;
+ u32 nr_ites;
+ void *itt;
+};
+
struct its_collection {
u64 target_address;
u16 col_id;
@@ -164,9 +172,11 @@ struct its_data {
struct its_cmd_block *cmd_base;
struct its_cmd_block *cmd_write;
struct its_cmd_block *cmd_readr;
+ struct its_device devices[GITS_MAX_DEVICES];
struct its_baser baser[GITS_BASER_NR_REGS];
struct its_typer typer;
struct its_collection *collections;
+ u32 nb_devices;
u64 flags;
};
@@ -179,6 +189,7 @@ extern int its_parse_baser(int i, struct its_baser *baser);
extern void its_setup_baser(int i, struct its_baser *baser);
extern void enable_lpi(u32 redist);
extern void its_enable_defaults(void);
+extern struct its_device *its_create_device(u32 dev_id, int nvecs);
#endif /* !__ASSEMBLY__ */
diff --git a/lib/arm/gic-v3-its.c b/lib/arm/gic-v3-its.c
index ecb8f98..c230959 100644
--- a/lib/arm/gic-v3-its.c
+++ b/lib/arm/gic-v3-its.c
@@ -80,6 +80,19 @@ int its_parse_baser(int i, struct its_baser *baser)
return 0;
}
+static struct its_baser *its_lookup_baser(int type)
+{
+ int i;
+
+ for (i = 0; i < GITS_BASER_NR_REGS; i++) {
+ struct its_baser *baser = &its_data.baser[i];
+
+ if (baser->type == type)
+ return baser;
+ }
+ return NULL;
+}
+
void its_setup_baser(int i, struct its_baser *baser)
{
void *reg_addr = gicv3_its_base() + GITS_BASER + i * 8;
@@ -258,3 +271,18 @@ void its_enable_defaults(void)
writel(GITS_CTLR_ENABLE, its_data.base + GITS_CTLR);
}
+
+struct its_device *its_create_device(u32 device_id, int nvecs)
+{
+ struct its_device *new = &its_data.devices[its_data.nb_devices];
+ struct its_baser *baser = its_lookup_baser(GITS_BASER_TYPE_DEVICE);
+
+ if (!baser)
+ return NULL;
+
+ new->device_id = device_id;
+ new->nr_ites = nvecs;
+ new->itt = (void *)phys_zalloc(new->nr_ites * baser->esz);
+ its_data.nb_devices++;
+ return new;
+}
--
2.5.5
- [Qemu-arm] [kvm-unit-tests RFC 04/15] arm/arm64: ITS: BASER parsing and setup, (continued)
- [Qemu-arm] [kvm-unit-tests RFC 06/15] arm/arm64: ITS: Set the LPI config and pending tables, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 07/15] arm/arm64: ITS: Init the command queue, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 08/15] arm/arm64: ITS: enable LPIs at re-distributor level, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 09/15] arm/arm64: ITS: Parse the typer register, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 10/15] arm/arm64: ITS: its_enable_defaults, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 11/15] arm/arm64: ITS: create device,
Eric Auger <=
- [Qemu-arm] [kvm-unit-tests RFC 12/15] arm/arm64: ITS: create collection, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 13/15] arm/arm64: ITS: commands, Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 14/15] arm/arm64: gic: Generalize ipi_enable(), Eric Auger, 2016/12/05
- [Qemu-arm] [kvm-unit-tests RFC 15/15] arm/arm64: ITS test, Eric Auger, 2016/12/05
- Re: [Qemu-arm] [Qemu-devel] [kvm-unit-tests RFC 00/15] arm/arm64: add ITS framework, Andrew Jones, 2016/12/06