2 ppcskel - a Free Software replacement for the Nintendo/BroadOn IOS.
5 Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
6 Copyright (C) 2008, 2009 Sven Peter <svenpeter@gmail.com>
7 Copyright (C) 2009 Andre Heider "dhewg" <dhewg@wiibrew.org>
9 # This code is licensed to you under the terms of the GNU GPL, version 2;
10 # see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
14 #include "hollywood.h"
16 #include "bootmii_ppc.h"
17 #include "usb/host/host.h"
19 void show_frame_no(void);
21 void irq_initialize(void)
23 // clear flipper-pic (processor interface)
24 write32(BW_PI_IRQMASK, 0);
25 write32(BW_PI_IRQFLAG, 0xffffffff);
27 // clear hollywood-pic
28 write32(HW_PPCIRQMASK, 0);
29 write32(HW_PPCIRQFLAG, 0xffffffff);
34 * write32(HW_ARMIRQMASK+0x04, 0);
35 * write32(HW_ARMIRQMASK+0x20, 0);
38 * may it's here following; on the other
39 * hand it's already done by mini...
41 * write32(HW_PPCIRQMASK+0x04+0x08, 0);
42 * write32(HW_PPCIRQMASK+0x20+0x08, 0);
48 void irq_shutdown(void)
50 write32(HW_PPCIRQMASK, 0);
51 write32(HW_PPCIRQFLAG, 0xffffffff);
55 void irq_handler(void)
57 u32 enabled = read32(BW_PI_IRQMASK);
58 u32 flags = read32(BW_PI_IRQFLAG);
60 flags = flags & enabled;
62 if (flags & (1<<BW_PI_IRQ_RESET)) {
63 write32(BW_PI_IRQFLAG, 1<<BW_PI_IRQ_RESET);
65 printf("IRQ-BW RESET\n");
67 if (flags & (1<<BW_PI_IRQ_HW)) { //HW-PIC IRQ
68 u32 hw_enabled = read32(HW_PPCIRQMASK);
69 u32 hw_flags = read32(HW_PPCIRQFLAG);
71 //printf("In IRQ handler: 0x%08x 0x%08x 0x%08x\n", hw_enabled, hw_flags, hw_flags & hw_enabled);
73 hw_flags = hw_flags & hw_enabled;
75 if(hw_flags & IRQF_TIMER) {
76 write32(HW_PPCIRQFLAG, IRQF_TIMER);
78 if(hw_flags & IRQF_NAND) {
79 // printf("IRQ: NAND\n");
80 // hmmm... should be done by mini?
81 write32(NAND_CMD, 0x7fffffff); // shut it up
82 write32(HW_PPCIRQFLAG, IRQF_NAND);
85 if(hw_flags & IRQF_GPIO1B) {
86 // printf("IRQ: GPIO1B\n");
87 // hmmm... should be done by mini?
88 write32(HW_GPIO1BINTFLAG, 0xFFFFFF); // shut it up
89 write32(HW_PPCIRQFLAG, IRQF_GPIO1B);
91 if(hw_flags & IRQF_GPIO1) {
92 // printf("IRQ: GPIO1\n");
93 // hmmm... should be done by mini?
94 write32(HW_GPIO1INTFLAG, 0xFFFFFF); // shut it up
95 write32(HW_PPCIRQFLAG, IRQF_GPIO1);
97 if(hw_flags & IRQF_RESET) {
98 // printf("IRQ: RESET\n");
99 write32(HW_PPCIRQFLAG, IRQF_RESET);
101 if(hw_flags & IRQF_IPC) {
102 //printf("IRQ: IPC\n");
103 //not necessary here?
105 write32(HW_PPCIRQFLAG, IRQF_IPC);
107 if(hw_flags & IRQF_AES) {
108 // printf("IRQ: AES\n");
109 write32(HW_PPCIRQFLAG, IRQF_AES);
111 if (hw_flags & IRQF_SDHC) {
112 // printf("IRQ: SDHC\n");
113 write32(HW_PPCIRQFLAG, IRQF_SDHC);
116 if (hw_flags & IRQF_OHCI0) {
117 hcdi_irq(OHCI0_REG_BASE);
118 write32(HW_PPCIRQFLAG, IRQF_OHCI0);
120 if (hw_flags & IRQF_OHCI1) {
121 hcdi_irq(OHCI1_REG_BASE);
122 write32(HW_PPCIRQFLAG, IRQF_OHCI1);
125 hw_flags &= ~IRQF_ALL;
127 printf("IRQ: unknown 0x%08x\n", hw_flags);
128 write32(HW_PPCIRQFLAG, hw_flags);
131 // not necessary here, but "cleaner"?
132 write32(BW_PI_IRQFLAG, 1<<BW_PI_IRQ_HW);
136 void irq_bw_enable(u32 irq)
138 set32(BW_PI_IRQMASK, 1<<irq);
141 void irq_bw_disable(u32 irq) {
142 clear32(BW_PI_IRQMASK, 1<<irq);
145 void irq_hw_enable(u32 irq)
147 set32(HW_PPCIRQMASK, 1<<irq);
150 void irq_hw_disable(u32 irq)
152 clear32(HW_PPCIRQMASK, 1<<irq);
157 _CPU_ISR_Disable(cookie);
161 void irq_restore(u32 cookie) {
162 _CPU_ISR_Restore(cookie);
163 _CPU_ISR_Enable(); //wtf :/