From: shlomopongratz@gmail.com
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, Shlomo Pongratz <shlomo.pongratz@huawei.com>
Subject: [Qemu-devel] [PATCH RFC V2 3/4] GICv3 support
Date: Wed, 6 May 2015 17:04:41 +0300 [thread overview]
Message-ID: <1430921082-16779-4-git-send-email-shlomopongratz@gmail.com> (raw)
In-Reply-To: <1430921082-16779-1-git-send-email-shlomopongratz@gmail.com>
From: Shlomo Pongratz <shlomo.pongratz@huawei.com>
Add system instructions used by the Linux (kernel) GICv3
device driver
Signed-off-by: Shlomo Pongratz <shlomo.pongratz@huawei.com>
---
target-arm/cpu.h | 8 ++++++
target-arm/cpu64.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 92 insertions(+)
diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index d4a5899..de53e9a 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -1008,6 +1008,14 @@ void armv7m_nvic_set_pending(void *opaque, int irq);
int armv7m_nvic_acknowledge_irq(void *opaque);
void armv7m_nvic_complete_irq(void *opaque, int irq);
+void armv8_gicv3_set_sgi(void *opaque, int cpuindex, uint64_t value);
+uint64_t armv8_gicv3_acknowledge_irq(void *opaque, int cpuindex);
+void armv8_gicv3_complete_irq(void *opaque, int cpuindex, int irq);
+uint64_t armv8_gicv3_get_priority_mask(void *opaque, int cpuindex);
+void armv8_gicv3_set_priority_mask(void *opaque, int cpuindex, uint32_t mask);
+uint64_t armv8_gicv3_get_sre(void *opaque);
+void armv8_gicv3_set_sre(void *opaque, uint64_t sre);
+
/* Interface for defining coprocessor registers.
* Registers are defined in tables of arm_cp_reginfo structs
* which are passed to define_arm_cp_regs().
diff --git a/target-arm/cpu64.c b/target-arm/cpu64.c
index 270bc2f..f3cb13f 100644
--- a/target-arm/cpu64.c
+++ b/target-arm/cpu64.c
@@ -45,6 +45,54 @@ static uint64_t a57_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
}
#endif
+#ifndef CONFIG_USER_ONLY
+static void sgi_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
+{
+ CPUState *cpu = ENV_GET_CPU(env);
+ armv8_gicv3_set_sgi(env->nvic, cpu->cpu_index, value);
+}
+
+static uint64_t iar_read(CPUARMState *env, const ARMCPRegInfo *ri)
+{
+ uint64_t value;
+ CPUState *cpu = ENV_GET_CPU(env);
+ value = armv8_gicv3_acknowledge_irq(env->nvic, cpu->cpu_index);
+ return value;
+}
+
+static void sre_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
+{
+ armv8_gicv3_set_sre(env->nvic, value);
+}
+
+static uint64_t sre_read(CPUARMState *env, const ARMCPRegInfo *ri)
+{
+ uint64_t value;
+ value = armv8_gicv3_get_sre(env->nvic);
+ return value;
+}
+
+static void eoir_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
+{
+ CPUState *cpu = ENV_GET_CPU(env);
+ armv8_gicv3_complete_irq(env->nvic, cpu->cpu_index, value);
+}
+
+static uint64_t pmr_read(CPUARMState *env, const ARMCPRegInfo *ri)
+{
+ uint64_t value;
+ CPUState *cpu = ENV_GET_CPU(env);
+ value = armv8_gicv3_get_priority_mask(env->nvic, cpu->cpu_index);
+ return value;
+}
+
+static void pmr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
+{
+ CPUState *cpu = ENV_GET_CPU(env);
+ armv8_gicv3_set_priority_mask(env->nvic, cpu->cpu_index, value);
+}
+#endif
+
static const ARMCPRegInfo cortexa57_cp_reginfo[] = {
#ifndef CONFIG_USER_ONLY
{ .name = "L2CTLR_EL1", .state = ARM_CP_STATE_AA64,
@@ -89,6 +137,42 @@ static const ARMCPRegInfo cortexa57_cp_reginfo[] = {
{ .name = "L2MERRSR",
.cp = 15, .opc1 = 3, .crm = 15,
.access = PL1_RW, .type = ARM_CP_CONST | ARM_CP_64BIT, .resetvalue = 0 },
+ { .name = "EIOR1_EL1", .state = ARM_CP_STATE_AA64,
+#ifndef CONFIG_USER_ONLY
+ .writefn = eoir_write,
+#endif
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 12, .opc2 = 1,
+ .access = PL1_W, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "IAR1_EL1", .state = ARM_CP_STATE_AA64,
+#ifndef CONFIG_USER_ONLY
+ .readfn = iar_read,
+#endif
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 12, .opc2 = 0,
+ .access = PL1_R, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "SGI1R_EL1", .state = ARM_CP_STATE_AA64,
+#ifndef CONFIG_USER_ONLY
+ .writefn = sgi_write,
+#endif
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 11, .opc2 = 5,
+ .access = PL1_RW, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "PMR_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 4, .crm = 6, .opc2 = 0,
+#ifndef CONFIG_USER_ONLY
+ .readfn = pmr_read, .writefn = pmr_write,
+#endif
+ .access = PL1_RW, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "CTLR_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 12, .opc2 = 4,
+ .access = PL1_RW, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "SRE_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 12, .opc2 = 5, .resetvalue = 0,
+#ifndef CONFIG_USER_ONLY
+ .readfn = sre_read, .writefn = sre_write,
+#endif
+ .access = PL1_RW, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
+ { .name = "IGRPEN1_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 12, .opc2 = 7,
+ .access = PL1_RW, .type = ARM_CP_SPECIAL, .resetvalue = 0 },
REGINFO_SENTINEL
};
--
1.9.1
next prev parent reply other threads:[~2015-05-06 14:04 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-06 14:04 [Qemu-devel] [PATCH RFC V2 0/4] Implement GIC-500 from GICv3 family for arm64 shlomopongratz
2015-05-06 14:04 ` [Qemu-devel] [PATCH RFC V2 1/4] Use Aff1 with mpidr shlomopongratz
2015-05-21 15:54 ` Pavel Fedin
2015-05-21 16:20 ` Shlomo Pongratz
2015-05-22 6:49 ` Pavel Fedin
2015-05-23 9:22 ` Shlomo Pongratz
2015-05-27 16:12 ` Igor Mammedov
2015-05-27 18:03 ` Pavel Fedin
2015-05-28 0:53 ` Shannon Zhao
2015-05-28 6:34 ` Pavel Fedin
2015-05-28 7:23 ` Shlomo Pongratz
2015-05-28 9:30 ` Igor Mammedov
2015-05-28 12:02 ` Shlomo Pongratz
2015-05-28 14:10 ` Pavel Fedin
2015-06-02 15:44 ` Igor Mammedov
2015-06-03 10:51 ` Pavel Fedin
2015-06-01 10:59 ` Shlomo Pongratz
2015-06-02 15:51 ` Igor Mammedov
2015-05-06 14:04 ` [Qemu-devel] [PATCH RFC V2 2/4] Implment GIC-500 shlomopongratz
2015-05-22 13:01 ` Eric Auger
2015-05-22 14:52 ` Pavel Fedin
2015-05-23 9:30 ` Shlomo Pongratz
2015-05-23 9:28 ` Shlomo Pongratz
2015-05-25 15:26 ` Pavel Fedin
2015-05-26 8:19 ` Shlomo Pongratz
2015-05-06 14:04 ` shlomopongratz [this message]
2015-05-06 14:04 ` [Qemu-devel] [PATCH RFC V2 4/4] Add virtv2 machine that uses GIC-500 shlomopongratz
2015-05-07 6:40 ` Pavel Fedin
2015-05-07 7:37 ` Shlomo Pongratz
2015-05-07 8:11 ` Pavel Fedin
2015-05-07 8:56 ` Shlomo Pongratz
2015-05-07 12:46 ` Pavel Fedin
2015-05-07 13:12 ` Pavel Fedin
2015-05-07 13:44 ` Shlomo Pongratz
2015-05-19 14:39 ` Eric Auger
2015-05-19 15:07 ` Shlomo Pongratz
2015-05-25 7:42 ` Pavel Fedin
2015-05-25 11:07 ` Pavel Fedin
2015-05-25 11:47 ` Pavel Fedin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1430921082-16779-4-git-send-email-shlomopongratz@gmail.com \
--to=shlomopongratz@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=shlomo.pongratz@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).