summary refs log tree commit diff stats
path: root/hw/ppc
diff options
context:
space:
mode:
authorGlenn Miles <milesg@linux.ibm.com>2025-09-25 15:17:45 -0500
committerHarsh Prateek Bora <harshpb@linux.ibm.com>2025-09-28 23:39:19 +0530
commit7197f6f7baf29fd76486920e5603e43b25880d3b (patch)
tree8ce6959e404173f82af22121f1cbe6b1e8b67a83 /hw/ppc
parentf7ec91c23906ca364650e95f2a28e0ef6c411386 (diff)
downloadfocaccia-qemu-7197f6f7baf29fd76486920e5603e43b25880d3b.tar.gz
focaccia-qemu-7197f6f7baf29fd76486920e5603e43b25880d3b.zip
hw/ppc: Support for an IBM PPE42 CPU decrementer
The IBM PPE42 processors support a 32-bit decrementer
that can raise an external interrupt when DEC[0]
transitions from a 0 to a -1 (a non-negative value to a
negative value).  It also continues decrementing
even after this condition is met.

The BookE timer is slightly different in that it
raises an interrupt when the DEC value reaches 0
and stops decrementing at that point.

Support a PPE42 version of the BookE timer by
adding a new PPC_TIMER_PPE flag that has the timer
code look for the transition from a non-negative value
to a negative value and allows the value to
continue decrementing.

Signed-off-by: Glenn Miles <milesg@linux.ibm.com>
Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Link: https://lore.kernel.org/r/20250925201758.652077-8-milesg@linux.ibm.com
Message-ID: <20250925201758.652077-8-milesg@linux.ibm.com>
Diffstat (limited to 'hw/ppc')
-rw-r--r--hw/ppc/ppc_booke.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/hw/ppc/ppc_booke.c b/hw/ppc/ppc_booke.c
index 3872ae2822..13403a56b1 100644
--- a/hw/ppc/ppc_booke.c
+++ b/hw/ppc/ppc_booke.c
@@ -352,7 +352,12 @@ void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags)
     booke_timer = g_new0(booke_timer_t, 1);
 
     cpu->env.tb_env = tb_env;
-    tb_env->flags = flags | PPC_TIMER_BOOKE | PPC_DECR_ZERO_TRIGGERED;
+    if (flags & PPC_TIMER_PPE) {
+        /* PPE's use a modified version of the booke behavior */
+        tb_env->flags = flags | PPC_DECR_UNDERFLOW_TRIGGERED;
+    } else {
+        tb_env->flags = flags | PPC_TIMER_BOOKE | PPC_DECR_ZERO_TRIGGERED;
+    }
 
     tb_env->tb_freq    = freq;
     tb_env->decr_freq  = freq;