From b8929a549f3e97b6cc2dfd22ba83612a1bb625ec Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sun, 16 Oct 2011 02:56:03 +0400 Subject: [PATCH] target-xtensa: implement external interrupt mapping Xtensa cores may have different mapping of external interrupt pins to internal IRQ numers. Implement API to acquire core IRQ by its external interrupt number. Signed-off-by: Max Filippov Signed-off-by: Blue Swirl --- hw/xtensa_pic.c | 12 ++++++++++++ target-xtensa/cpu.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/hw/xtensa_pic.c b/hw/xtensa_pic.c index e5085ea9e7..93e28fd04b 100644 --- a/hw/xtensa_pic.c +++ b/hw/xtensa_pic.c @@ -157,3 +157,15 @@ void xtensa_irq_init(CPUState *env) qemu_new_timer_ns(vm_clock, &xtensa_ccompare_cb, env); } } + +void *xtensa_get_extint(CPUState *env, unsigned extint) +{ + if (extint < env->config->nextint) { + unsigned irq = env->config->extint[extint]; + return env->irq_inputs[irq]; + } else { + qemu_log("%s: trying to acquire invalid external interrupt %d\n", + __func__, extint); + return NULL; + } +} diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index df168d5790..9d36c1bad5 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -277,6 +277,8 @@ typedef struct XtensaConfig { } interrupt[MAX_NINTERRUPT]; unsigned nccompare; uint32_t timerint[MAX_NCCOMPARE]; + unsigned nextint; + unsigned extint[MAX_NINTERRUPT]; uint32_t clock_freq_khz; xtensa_tlb itlb; @@ -318,6 +320,7 @@ int cpu_xtensa_exec(CPUXtensaState *s); void do_interrupt(CPUXtensaState *s); void check_interrupts(CPUXtensaState *s); void xtensa_irq_init(CPUState *env); +void *xtensa_get_extint(CPUState *env, unsigned extint); void xtensa_advance_ccount(CPUState *env, uint32_t d); void xtensa_timer_irq(CPUState *env, uint32_t id, uint32_t active); void xtensa_rearm_ccompare_timer(CPUState *env);