[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 07/13] pseries: Fix XICS reset
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PATCH 07/13] pseries: Fix XICS reset |
Date: |
Thu, 13 Sep 2012 12:57:15 +1000 |
The XICS interrupt controller used on the pseries machine currently has no
reset handler. We can get away with this under some circumstances, but
it's not correct, and can cause failures if the XICS happens to be in the
wrong state at the time of reset.
This patch adds a hook to properly reset the XICS state.
Signed-off-by: David Gibson <address@hidden>
---
hw/xics.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/hw/xics.c b/hw/xics.c
index b674771..a8a08ce 100644
--- a/hw/xics.c
+++ b/hw/xics.c
@@ -489,11 +489,36 @@ static void rtas_int_on(sPAPREnvironment *spapr, uint32_t
token,
rtas_st(rets, 0, 0); /* Success */
}
+static void xics_reset(void *opaque)
+{
+ struct icp_state *icp = (struct icp_state *)opaque;
+ struct ics_state *ics = icp->ics;
+ int i;
+
+ for (i = 0; i < icp->nr_servers; i++) {
+ icp->ss[i].xirr = 0;
+ icp->ss[i].pending_priority = 0;
+ icp->ss[i].mfrr = 0xff;
+ /* Make all outputs are deasserted */
+ qemu_set_irq(icp->ss[i].output, 0);
+ }
+
+ for (i = 0; i < ics->nr_irqs; i++) {
+ /* Reset everything *except* the type */
+ ics->irqs[i].server = 0;
+ ics->irqs[i].asserted = 0;
+ ics->irqs[i].sent = 0;
+ ics->irqs[i].rejected = 0;
+ ics->irqs[i].masked_pending = 0;
+ ics->irqs[i].priority = 0xff;
+ ics->irqs[i].saved_priority = 0xff;
+ }
+}
+
struct icp_state *xics_system_init(int nr_irqs)
{
CPUPPCState *env;
int max_server_num;
- int i;
struct icp_state *icp;
struct ics_state *ics;
@@ -508,10 +533,6 @@ struct icp_state *xics_system_init(int nr_irqs)
icp->nr_servers = max_server_num + 1;
icp->ss = g_malloc0(icp->nr_servers*sizeof(struct icp_server_state));
- for (i = 0; i < icp->nr_servers; i++) {
- icp->ss[i].mfrr = 0xff;
- }
-
for (env = first_cpu; env != NULL; env = env->next_cpu) {
struct icp_server_state *ss = &icp->ss[env->cpu_index];
@@ -539,11 +560,6 @@ struct icp_state *xics_system_init(int nr_irqs)
icp->ics = ics;
ics->icp = icp;
- for (i = 0; i < nr_irqs; i++) {
- ics->irqs[i].priority = 0xff;
- ics->irqs[i].saved_priority = 0xff;
- }
-
ics->qirqs = qemu_allocate_irqs(ics_set_irq, ics, nr_irqs);
spapr_register_hypercall(H_CPPR, h_cppr);
@@ -556,5 +572,7 @@ struct icp_state *xics_system_init(int nr_irqs)
spapr_rtas_register("ibm,int-off", rtas_int_off);
spapr_rtas_register("ibm,int-on", rtas_int_on);
+ qemu_register_reset(xics_reset, icp);
+
return icp;
}
--
1.7.10.4
- [Qemu-ppc] [0/13] pseries patch queue, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 09/13] pseries: Remove C bitfields from xics code, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 02/13] pseries: Fix and cleanup CPU initialization and reset, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 10/13] pseries: Remove XICS irq type enum type, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 07/13] pseries: Fix XICS reset,
David Gibson <=
- [Qemu-ppc] [PATCH 03/13] pseries: Use new method to correct reset sequence, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 06/13] pseries: Reset emulated PCI TCE tables on system reset, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 05/13] pseries: Clear TCE and signal state when resetting PAPR VIO devices, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 11/13] pseries: Remove never used flags field from spapr vio devices, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 08/13] pseries: Small cleanup to H_CEDE implementation, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 01/13] ppc: Make kvm_arch_put_registers() put *all* the registers, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 12/13] pseries: Rework implementation of TCE bypass, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 04/13] pseries: Add support for new KVM hash table control call, David Gibson, 2012/09/12
- [Qemu-ppc] [PATCH 13/13] pseries: Fix semantics of RTAS int-on, int-off and set-xive functions, David Gibson, 2012/09/12