- 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);