PERFORCE change 126183 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Sat Sep 8 09:09:22 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126183
Change 126183 by gonzo at gonzo_jeeves on 2007/09/08 16:08:25
o Mask/unmask interrupts in ICU IMASKN registers
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips32/idt/idtreg.h#4 edit
.. //depot/projects/mips2/src/sys/mips/mips32/idt/obio.c#3 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips32/idt/idtreg.h#4 (text+ko) ====
@@ -47,6 +47,14 @@
#define ICU_IMASK6 0x38
#define ICU_NMIPS 0x3c
+#define IDT_BASE_GPIO 0x18050000
+#define GPIO_FUNC 0x00
+#define GPIO_CFG 0x04
+#define GPIO_DATA 0x08
+#define GPIO_ILEVEL 0x0C
+#define GPIO_ISTAT 0x10
+#define GPIO_NMIEN 0x14
+
/* PCI controller */
#define IDT_BASE_PCI 0x18080000
#define IDT_PCI_CNTL 0x00
@@ -120,6 +128,16 @@
#define IP_IRQ(IPbit, offset) ((IPbit - 2) * 32 + (offset) + IRQ_BASE)
/* The last one available IRQ */
#define IRQ_END IP_IRQ(6, 31)
+#define ICU_GROUP_REG_OFFSET 0x0C
+
+#define ICU_IP(irq) (((irq) - IRQ_BASE) & 0x1f)
+#define ICU_IP_BIT(irq) (1 << ICU_IP(irq))
+#define ICU_GROUP(irq) (((irq) - IRQ_BASE) >> 5)
+
+#define ICU_GROUP_MASK_REG(irq) \
+ (ICU_IMASK2 + ((((irq) - IRQ_BASE) >> 5) * ICU_GROUP_REG_OFFSET))
+#define ICU_GROUP_PEND_REG(irq) \
+ (ICU_IPEND2 + ((((irq) - IRQ_BASE) >> 5) * ICU_GROUP_REG_OFFSET))
#define PCI_IRQ_BASE IP_IRQ(6, 4)
#define PCI_IRQ_END IP_IRQ(6, 7)
==== //depot/projects/mips2/src/sys/mips/mips32/idt/obio.c#3 (text+ko) ====
@@ -47,8 +47,13 @@
#include <mips/mips32/idt/idtreg.h>
#include <mips/mips32/idt/obiovar.h>
-#define REG_READ(o) *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1(IDT_BASE_ICU + (o)))
-#define REG_WRITE(o,v) (REG_READ(o)) = (v)
+#define ICU_REG_READ(o) \
+ *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1(IDT_BASE_ICU + (o)))
+#define ICU_REG_WRITE(o,v) (ICU_REG_READ(o)) = (v)
+
+#define GPIO_REG_READ(o) \
+ *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1(IDT_BASE_GPIO + (o)))
+#define GPIO_REG_WRITE(o,v) (GPIO_REG_READ(o)) = (v)
static int obio_activate_resource(device_t, device_t, int, int,
struct resource *);
@@ -114,12 +119,6 @@
}
}
- /* disable all interrupts, IMASK4 is reserved, do not tuch it */
- REG_WRITE(ICU_IMASK2, 0xffffffff);
- REG_WRITE(ICU_IMASK3, 0xffffffff);
- REG_WRITE(ICU_IMASK5, 0xffffffff);
- REG_WRITE(ICU_IMASK6, 0xffffffff);
-
bus_generic_probe(dev);
bus_enumerate_hinted_children(dev);
bus_generic_attach(dev);
@@ -250,7 +249,7 @@
{
struct obio_softc *sc = device_get_softc(dev);
struct intr_event *event;
- int irq, error;
+ int irq, ip_bit, error, mask, mask_register;
irq = rman_get_start(ires);
@@ -270,8 +269,13 @@
intr_event_add_handler(event, device_get_nameunit(child), filt,
handler, arg, intr_priority(flags), flags, cookiep);
- /* enable */
- /* TODO: enable corespondent IRQ line here */
+ /* unmask IRQ */
+ mask_register = ICU_GROUP_MASK_REG(irq);
+ ip_bit = ICU_IP_BIT(irq);
+
+ mask = ICU_REG_READ(mask_register);
+ ICU_REG_WRITE(mask_register, mask & ~ip_bit);
+
return (0);
}
@@ -281,6 +285,7 @@
{
struct obio_softc *sc = device_get_softc(dev);
int irq, result;
+ uint32_t mask_register, mask, ip_bit;
irq = rman_get_start(ires);
if (irq >= NIRQS)
@@ -289,7 +294,12 @@
if (sc->sc_eventstab[irq] == NULL)
panic("Trying to teardown unoccupied IRQ");
- /* TODO: mask corespondent IRQ line here */
+ /* mask IRQ */
+ mask_register = ICU_GROUP_MASK_REG(irq);
+ ip_bit = ICU_IP_BIT(irq);
+
+ mask = ICU_REG_READ(mask_register);
+ ICU_REG_WRITE(mask_register, mask | ip_bit);
result = intr_event_remove_handler(cookie);
if (!result) {
@@ -305,13 +315,29 @@
struct obio_softc *sc = arg;
struct intr_event *event;
struct intr_handler *ih;
- uint32_t irqstat;
+ uint32_t irqstat, ipend;
int irq, thread = 0;
/* TODO: handle all IRQs */
irqstat = 0;
irq = 0;
+
+#if 0
+ ipend = ICU_REG_READ(ICU_IPEND2);
+ printf("ipend2 = %08x!\n", ipend);
+
+ ipend = ICU_REG_READ(ICU_IPEND3);
+ printf("ipend3 = %08x!\n", ipend);
+
+ ipend = ICU_REG_READ(ICU_IPEND4);
+ printf("ipend4 = %08x!\n", ipend);
+ ipend = ICU_REG_READ(ICU_IPEND5);
+ printf("ipend5 = %08x!\n", ipend);
+
+ ipend = ICU_REG_READ(ICU_IPEND6);
+ printf("ipend6 = %08x!\n", ipend);
+#endif
while (irqstat != 0) {
if ((irqstat & 1) == 1) {
event = sc->sc_eventstab[irq];
More information about the p4-projects
mailing list