|
@@ -314,6 +314,66 @@ void ppc40x_irq_init (CPUState *env)
|
|
|
env, PPC40x_INPUT_NB);
|
|
|
}
|
|
|
|
|
|
+/* PowerPC E500 internal IRQ controller */
|
|
|
+static void ppce500_set_irq (void *opaque, int pin, int level)
|
|
|
+{
|
|
|
+ CPUState *env = opaque;
|
|
|
+ int cur_level;
|
|
|
+
|
|
|
+ LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
|
|
|
+ env, pin, level);
|
|
|
+ cur_level = (env->irq_input_state >> pin) & 1;
|
|
|
+ /* Don't generate spurious events */
|
|
|
+ if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) {
|
|
|
+ switch (pin) {
|
|
|
+ case PPCE500_INPUT_MCK:
|
|
|
+ if (level) {
|
|
|
+ LOG_IRQ("%s: reset the PowerPC system\n",
|
|
|
+ __func__);
|
|
|
+ qemu_system_reset_request();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case PPCE500_INPUT_RESET_CORE:
|
|
|
+ if (level) {
|
|
|
+ LOG_IRQ("%s: reset the PowerPC core\n", __func__);
|
|
|
+ ppc_set_irq(env, PPC_INTERRUPT_MCK, level);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case PPCE500_INPUT_CINT:
|
|
|
+ /* Level sensitive - active high */
|
|
|
+ LOG_IRQ("%s: set the critical IRQ state to %d\n",
|
|
|
+ __func__, level);
|
|
|
+ ppc_set_irq(env, PPC_INTERRUPT_CEXT, level);
|
|
|
+ break;
|
|
|
+ case PPCE500_INPUT_INT:
|
|
|
+ /* Level sensitive - active high */
|
|
|
+ LOG_IRQ("%s: set the core IRQ state to %d\n",
|
|
|
+ __func__, level);
|
|
|
+ ppc_set_irq(env, PPC_INTERRUPT_EXT, level);
|
|
|
+ break;
|
|
|
+ case PPCE500_INPUT_DEBUG:
|
|
|
+ /* Level sensitive - active high */
|
|
|
+ LOG_IRQ("%s: set the debug pin state to %d\n",
|
|
|
+ __func__, level);
|
|
|
+ ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* Unknown pin - do nothing */
|
|
|
+ LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (level)
|
|
|
+ env->irq_input_state |= 1 << pin;
|
|
|
+ else
|
|
|
+ env->irq_input_state &= ~(1 << pin);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void ppce500_irq_init (CPUState *env)
|
|
|
+{
|
|
|
+ env->irq_inputs = (void **)qemu_allocate_irqs(&ppce500_set_irq,
|
|
|
+ env, PPCE500_INPUT_NB);
|
|
|
+}
|
|
|
/*****************************************************************************/
|
|
|
/* PowerPC time base and decrementer emulation */
|
|
|
struct ppc_tb_t {
|