x86: MP table-detected ISA IRQs can be enabled
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 12 Mar 2014 04:00:44 +0000 (21:00 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 29 Mar 2014 01:16:10 +0000 (18:16 -0700)
This also removes the polling of the serial device, which was a hack for
Ron's AMD board.  If we still need that, even with the IOAPIC, then we
should use a ktask.  And I'll be annoyed.

kern/arch/x86/ioapic.c
kern/arch/x86/trap.c

index 4fafcf8..77a0d8e 100644 (file)
@@ -446,14 +446,13 @@ int ioapicintrenable(Vctl * v)
                         * Make a busno and devno using the
                         * ISA bus number and the irq.
                         */
-#if 0
                        extern int mpisabusno;
 
                        if (mpisabusno == -1)
                                panic("no ISA bus allocated");
                        busno = mpisabusno;
-#endif
-                       busno = 0;
+                       /* need to track the irq in devno in PCI interrupt assignment entry
+                        * format (see mp.c or MP spec D.3). */
                        devno = v->irq << 2;
                }
        } else if (BUSTYPE(v->tbdf) == BusPCI) {
index e5732e8..2221491 100644 (file)
@@ -479,16 +479,6 @@ void handle_irq(struct hw_trapframe *hw_tf)
                irq_h->isr(hw_tf, irq_h->data);
                irq_h = irq_h->next;
        }
-
-       //lapic_print_isr();
-       //printk("LAPIC LINT0: %p\n", read_mmreg32(LAPIC_LVT_LINT0));
-       //printk("COM1, IIR %p\n", inb(0x3f8 + 2));
-       irq_h = irq_handlers[4 + 32];
-       while (irq_h) {
-               irq_h->isr(hw_tf, irq_h->data);
-               irq_h = irq_h->next;
-       }
-
        // if we're a general purpose IPI function call, down the cpu_list
        extern handler_wrapper_t handler_wrappers[NUM_HANDLER_WRAPPERS];
        if ((I_SMP_CALL0 <= hw_tf->tf_trapno) &&
@@ -562,8 +552,6 @@ void unregister_raw_irq(unsigned int vector, isr_t handler, void *data)
  */
 int register_dev_irq(int irq, isr_t handler, void *irq_arg, uint32_t tbdf)
 {
-       /* TODO: remove this - need it to poll serial for now */
-       register_raw_irq(KERNEL_IRQ_OFFSET + irq, handler, irq_arg);
        /* TODO: whenever we sort out the ACPI/IOAPIC business, we'll probably want
         * a helper to reroute an irq? */
 #ifdef CONFIG_ENABLE_MPTABLES
@@ -573,8 +561,7 @@ int x =     intrenable(irq, handler, irq_arg, tbdf);
        if (x > 0)
                register_raw_irq(x, handler, irq_arg);
 #else
-       // only need the ghetto one up above
-       //register_raw_irq(KERNEL_IRQ_OFFSET + irq, handler, irq_arg);
+       register_raw_irq(KERNEL_IRQ_OFFSET + irq, handler, irq_arg);
        pic_unmask_irq(irq + PIC1_OFFSET);
 #endif
        return 0;