18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Generic ARM Programmable Interrupt Controller support.
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2006 CodeSourcery.
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Written by Paul Brook
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This code is licenced under the LGPL
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
102ec695af7284adbedcdbc08a22d818b6bdd8990cDavid 'Digit' Turner#include "hw/hw.h"
112ec695af7284adbedcdbc08a22d818b6bdd8990cDavid 'Digit' Turner#include "hw/i386/pc.h"
1262fba4882dbb1bea4f69e0b543cb90acee84742fDavid 'Digit' Turner#include "hw/arm/arm.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Stub functions for hardware that doesn't exist.  */
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid pic_info(Monitor *mon)
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid irq_info(Monitor *mon)
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Input 0 is IRQ and input 1 is FIQ.  */
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void arm_pic_cpu_handler(void *opaque, int irq, int level)
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
27e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turner    CPUOldState *env = (CPUOldState *)opaque;
28bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    CPUState *cpu = ENV_GET_CPU(env);
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (irq) {
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case ARM_PIC_CPU_IRQ:
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (level)
32bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner            cpu_interrupt(cpu, CPU_INTERRUPT_HARD);
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
34bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner            cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case ARM_PIC_CPU_FIQ:
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (level)
38bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner            cpu_interrupt(cpu, CPU_INTERRUPT_FIQ);
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
40bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner            cpu_reset_interrupt(cpu, CPU_INTERRUPT_FIQ);
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        break;
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        hw_error("arm_pic_cpu_handler: Bad interrput line %d\n", irq);
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
47e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turnerqemu_irq *arm_pic_init_cpu(CPUOldState *env)
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return qemu_allocate_irqs(arm_pic_cpu_handler, env, 2);
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
51