port-work; won't compile or even work
[ppcskel.git] / irq.c
diff --git a/irq.c b/irq.c
index 9ab1559505b5a14be4b6619389a1a7db569a9683..1217ee2adecf7ec606e1bdd16ea595e2fd09c918 100644 (file)
--- a/irq.c
+++ b/irq.c
@@ -2,9 +2,8 @@
        ppcskel - a Free Software replacement for the Nintendo/BroadOn IOS.
        IRQ support
 
-Copyright (C) 2008, 2009       Hector Martin "marcan" <marcan@marcansoft.com>
-Copyright (C) 2008, 2009       Sven Peter <svenpeter@gmail.com>
-Copyright (C) 2009                     Andre Heider "dhewg" <dhewg@wiibrew.org>
+Copyright (C) 2009             Bernhard Urban <lewurm@gmx.net>
+Copyright (C) 2009             Sebastian Falbesoner <sebastian.falbesoner@gmail.com>
 
 # This code is licensed to you under the terms of the GNU GPL, version 2;
 # see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
@@ -14,24 +13,34 @@ Copyright (C) 2009                  Andre Heider "dhewg" <dhewg@wiibrew.org>
 #include "hollywood.h"
 #include "ipc.h"
 #include "bootmii_ppc.h"
-//debug only
-#include "printf.h"
+#include "usb/host/host.h"
+#include "mini_ipc.h"
+
+void show_frame_no(void);
 
 void irq_initialize(void)
 {
-       // enable OHCI0 interrupt on hollywood-pic
+       // clear flipper-pic (processor interface)
+       write32(BW_PI_IRQMASK, 0);
+       write32(BW_PI_IRQFLAG, 0xffffffff);
+
+       // clear hollywood-pic
        write32(HW_PPCIRQMASK, 0);
        write32(HW_PPCIRQFLAG, 0xffffffff);
 
-       // enable RESET and PIC (#14) interrupts on processor interface
-       write32(BW_PI_IRQFLAG, 0xffffffff);
-#define BW_PI_IRQ_RESET        1
-#define BW_PI_IRQ_HW           14
-       write32(BW_PI_IRQMASK, (1<<BW_PI_IRQ_RESET) | (1<<BW_PI_IRQ_HW));
-
-       //??? -- needed?!
-       write32(HW_PPCIRQMASK+0x04, 0);
-       write32(HW_PPCIRQMASK+0x20, 0);
+       /* ??? -- needed?!
+        * in mini they do
+        *
+        * write32(HW_ARMIRQMASK+0x04, 0);
+        * write32(HW_ARMIRQMASK+0x20, 0);
+        *
+        *
+        * may it's here following; on the other 
+        * hand it's already done by mini...
+        *
+        * write32(HW_PPCIRQMASK+0x04+0x08, 0);
+        * write32(HW_PPCIRQMASK+0x20+0x08, 0);
+        */
 
        _CPU_ISR_Enable()
 }
@@ -40,102 +49,117 @@ void irq_shutdown(void)
 {
        write32(HW_PPCIRQMASK, 0);
        write32(HW_PPCIRQFLAG, 0xffffffff);
-       irq_kill();
+       (void) irq_kill();
 }
 
 void irq_handler(void)
 {
-       u32 enabled = read32(HW_PPCIRQMASK);
-       u32 flags = read32(HW_PPCIRQFLAG);
-       
-       printf("In IRQ handler: 0x%08x 0x%08x 0x%08x\n", enabled, flags, flags & enabled);
+       u32 enabled = read32(BW_PI_IRQMASK);
+       u32 flags = read32(BW_PI_IRQFLAG);
 
        flags = flags & enabled;
 
-       if(flags & IRQF_TIMER) {
-               // done by mini already? 
-               /*
-               if (_alarm_frequency) {
-                       // currently we use the alarm timer only for lame usbgecko polling
-                       gecko_timer();
-                       write32(HW_ALARM, read32(HW_TIMER) + _alarm_frequency);
-               }
-               */
-               write32(HW_PPCIRQFLAG, IRQF_TIMER);
-       }
-       if(flags & IRQF_NAND) {
-//             printf("IRQ: NAND\n");
-               // hmmm... should be done by mini?
-               write32(NAND_CMD, 0x7fffffff); // shut it up
-               write32(HW_PPCIRQFLAG, IRQF_NAND);
-               //nand_irq();
-       }
-       if(flags & IRQF_GPIO1B) {
-//             printf("IRQ: GPIO1B\n");
-               // hmmm... should be done by mini?
-               write32(HW_GPIO1BINTFLAG, 0xFFFFFF); // shut it up
-               write32(HW_PPCIRQFLAG, IRQF_GPIO1B);
-       }
-       if(flags & IRQF_GPIO1) {
-//             printf("IRQ: GPIO1\n");
-               // hmmm... should be done by mini?
-               write32(HW_GPIO1INTFLAG, 0xFFFFFF); // shut it up
-               write32(HW_PPCIRQFLAG, IRQF_GPIO1);
-       }
-       if(flags & IRQF_RESET) {
-//             printf("IRQ: RESET\n");
-               write32(HW_PPCIRQFLAG, IRQF_RESET);
+       if (flags & (1<<BW_PI_IRQ_RESET)) { 
+               write32(BW_PI_IRQFLAG, 1<<BW_PI_IRQ_RESET);
+               boot2_run(1,2); //sysmenu
        }
-       if(flags & IRQF_IPC) {
-               //printf("IRQ: IPC\n");
-               //not necessary here?
-               //ipc_irq();
-               write32(HW_PPCIRQFLAG, IRQF_IPC);
-       }
-       if(flags & IRQF_AES) {
-//             printf("IRQ: AES\n");
-               write32(HW_PPCIRQFLAG, IRQF_AES);
-       }
-       if (flags & IRQF_SDHC) {
-//             printf("IRQ: SDHC\n");
-               write32(HW_PPCIRQFLAG, IRQF_SDHC);
-               //sdhc_irq();
-       }
-       if (flags & IRQF_OHCI0) {
-               printf("IRQ: OHCI0\n");
-               write32(HW_PPCIRQFLAG, IRQF_OHCI0);
-               //TODO: ohci0_irq();
-       }
-       if (flags & IRQF_OHCI1) {
-               printf("IRQ: OHCI1\n");
-               write32(HW_PPCIRQFLAG, IRQF_OHCI1);
-               //TODO: ohci1_irq();
-       }
-       
-       flags &= ~IRQF_ALL;
-       if(flags) {
-               printf("IRQ: unknown 0x%08x\n", flags);
-               write32(HW_PPCIRQFLAG, flags);
+
+       if (flags & (1<<BW_PI_IRQ_HW)) { //HW-PIC IRQ
+               u32 hw_enabled = read32(HW_PPCIRQMASK);
+               u32 hw_flags = read32(HW_PPCIRQFLAG);
+
+               //printf("In IRQ handler: 0x%08x 0x%08x 0x%08x\n", hw_enabled, hw_flags, hw_flags & hw_enabled);
+
+               hw_flags = hw_flags & hw_enabled;
+
+               if(hw_flags & IRQF_TIMER) {
+                       write32(HW_PPCIRQFLAG, IRQF_TIMER);
+               }
+               if(hw_flags & IRQF_NAND) {
+                       //              printf("IRQ: NAND\n");
+                       // hmmm... should be done by mini?
+                       write32(NAND_CMD, 0x7fffffff); // shut it up
+                       write32(HW_PPCIRQFLAG, IRQF_NAND);
+                       //nand_irq();
+               }
+               if(hw_flags & IRQF_GPIO1B) {
+                       //              printf("IRQ: GPIO1B\n");
+                       // hmmm... should be done by mini?
+                       write32(HW_GPIO1BINTFLAG, 0xFFFFFF); // shut it up
+                       write32(HW_PPCIRQFLAG, IRQF_GPIO1B);
+               }
+               if(hw_flags & IRQF_GPIO1) {
+                       //              printf("IRQ: GPIO1\n");
+                       // hmmm... should be done by mini?
+                       write32(HW_GPIO1INTFLAG, 0xFFFFFF); // shut it up
+                       write32(HW_PPCIRQFLAG, IRQF_GPIO1);
+               }
+               if(hw_flags & IRQF_RESET) {
+                       //              printf("IRQ: RESET\n");
+                       write32(HW_PPCIRQFLAG, IRQF_RESET);
+               }
+               if(hw_flags & IRQF_IPC) {
+                       //printf("IRQ: IPC\n");
+                       //not necessary here?
+                       //ipc_irq();
+                       write32(HW_PPCIRQFLAG, IRQF_IPC);
+               }
+               if(hw_flags & IRQF_AES) {
+                       //              printf("IRQ: AES\n");
+                       write32(HW_PPCIRQFLAG, IRQF_AES);
+               }
+               if (hw_flags & IRQF_SDHC) {
+                       //              printf("IRQ: SDHC\n");
+                       write32(HW_PPCIRQFLAG, IRQF_SDHC);
+                       //sdhc_irq();
+               }
+               if (hw_flags & IRQF_OHCI0) {
+                       hcdi_irq(OHCI0_REG_BASE);
+                       write32(HW_PPCIRQFLAG, IRQF_OHCI0);
+               }
+               if (hw_flags & IRQF_OHCI1) {
+                       hcdi_irq(OHCI1_REG_BASE);
+                       write32(HW_PPCIRQFLAG, IRQF_OHCI1);
+               }
+
+               hw_flags &= ~IRQF_ALL;
+               if(hw_flags) {
+                       printf("IRQ: unknown 0x%08x\n", hw_flags);
+                       write32(HW_PPCIRQFLAG, hw_flags);
+               }
+
+               // not necessary here, but "cleaner"?
+               write32(BW_PI_IRQFLAG, 1<<BW_PI_IRQ_HW);
        }
 }
 
-void irq_enable(u32 irq)
+void irq_bw_enable(u32 irq)
+{
+       set32(BW_PI_IRQMASK, 1<<irq);
+}
+
+void irq_bw_disable(u32 irq) {
+       clear32(BW_PI_IRQMASK, 1<<irq);
+}
+
+void irq_hw_enable(u32 irq)
 {
        set32(HW_PPCIRQMASK, 1<<irq);
 }
 
-void irq_disable(u32 irq)
+void irq_hw_disable(u32 irq)
 {
        clear32(HW_PPCIRQMASK, 1<<irq);
 }
 
-inline u32 irq_kill() {
+u32 irq_kill() {
        u32 cookie;
        _CPU_ISR_Disable(cookie);
        return cookie;
 }
 
-inline void irq_restore(u32 cookie) {
+void irq_restore(u32 cookie) {
        _CPU_ISR_Restore(cookie);
+       _CPU_ISR_Enable(); //wtf :/
 }