PERFORCE change 71410 for review

John-Mark Gurney jmg at FreeBSD.org
Sun Feb 20 13:03:39 PST 2005


http://perforce.freebsd.org/chv.cgi?CH=71410

Change 71410 by jmg at jmg_carbon on 2005/02/20 21:03:16

	change the irq interface slightly...  remove arm_get_irqnb, and
	       replace with arm_get_next_irq that returns the next unmask irq
	       that is pending..     
	
	       we no longer mask/unmask/enable interrupts in executing/dispatching
	the interrupt handlers...
	
	       change the interface for arm_(un)?mask_irq to take a number 
	       instead of a mask to support >32 irq systems...
	
	also fix probing of the ep93xx devices, make the child device
	eparm, and probe/attach the devices...
	
	Submitted by:	cognet (the probing/attaching)

Affected files ...

.. //depot/projects/arm/src/sys/arm/arm/intr.c#2 edit
.. //depot/projects/arm/src/sys/arm/ep93xx/ep93xx.c#3 edit
.. //depot/projects/arm/src/sys/arm/include/intr.h#2 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/arm/intr.c#2 (text+ko) ====

@@ -67,7 +67,7 @@
 	struct arm_intr *intr = (struct arm_intr *)arg;
 
 	intr->handler(intr->arg);
-	arm_unmask_irqs(1 << intr->irq);
+	arm_unmask_irqs(intr->irq);
 }
 
 void	arm_handler_execute(void *, int);
@@ -127,14 +127,8 @@
 	struct thread *td = curthread;
 
 	td->td_intr_nesting_level++;
-	if (irqnb == 0)
-		irqnb = arm_get_irqnb(frame);
-	arm_mask_irqs(irqnb);
-	enable_interrupts(I32_bit|F32_bit);
-	while (irqnb != 0) {
-		i = ffs(irqnb) - 1;
+	while ((i = arm_get_next_irq()) != -1) {
 		intrcnt[intrcnt_tab[i]]++;
-		irqnb &= ~(1U << i);
 		ithd = ithreads[i];
 		if (!ithd)
 			continue;
@@ -148,7 +142,6 @@
 			arm_unmask_irqs(1 << i);
 		} else if (ih)
 			ithread_schedule(ithd);
-		irqnb |= arm_get_irqnb(frame);
 	}
 	td->td_intr_nesting_level--;
 }

==== //depot/projects/arm/src/sys/arm/ep93xx/ep93xx.c#3 (text+ko) ====

@@ -80,45 +80,47 @@
 
 
 void
-arm_unmask_irqs(int irqmask)
+arm_unmask_irqs(int irq)
 {
-	int irq;
+	KASSERT(irq < VIC_NIRQ * 2, ("irq %d is greater than max", irq));
 
-	while ((irq = ffs(irqmask) - 1)) {
-		if (irq < VIC_NIRQ) {
-			vic1_intr_enabled |= (1U << irq);
-			VIC1REG(EP93XX_VIC_IntEnable) = (1U << irq);
-		} else {
-			vic2_intr_enabled |= (1U << (irq - VIC_NIRQ));
-			VIC2REG(EP93XX_VIC_IntEnable) = 
-			    (1U << (irq - VIC_NIRQ));
-		}
+	if (irq < VIC_NIRQ) {
+		vic1_intr_enabled |= (1U << irq);
+		VIC1REG(EP93XX_VIC_IntEnable) = (1U << irq);
+	} else {
+		vic2_intr_enabled |= (1U << (irq - VIC_NIRQ));
+		VIC2REG(EP93XX_VIC_IntEnable) = 
+		    (1U << (irq - VIC_NIRQ));
 	}
 }
 
 void
-arm_mask_irqs(int irqmask)
+arm_mask_irqs(int irq)
 {
-	int irq;
+	KASSERT(irq < VIC_NIRQ * 2, ("irq %d is greater than max", irq));
 
-	while ((irq = ffs(irqmask) - 1)) {
-		if (irq < VIC_NIRQ) {
-			vic1_intr_enabled &= ~(1U << irq);
-			VIC1REG(EP93XX_VIC_IntEnClear) = (1U << irq);
-		} else {
-			vic2_intr_enabled &= ~(1U << (irq - VIC_NIRQ));
-			VIC2REG(EP93XX_VIC_IntEnClear) = 
-			    (1U << (irq - VIC_NIRQ));
-		}
+	if (irq < VIC_NIRQ) {
+		vic1_intr_enabled &= ~(1U << irq);
+		VIC1REG(EP93XX_VIC_IntEnClear) = (1U << irq);
+	} else {
+		vic2_intr_enabled &= ~(1U << (irq - VIC_NIRQ));
+		VIC2REG(EP93XX_VIC_IntEnClear) = 
+		    (1U << (irq - VIC_NIRQ));
 	}
 }
 
 int
-arm_get_irqnb(void *unused)
+arm_get_next_irq()
 {
-	
-	return (VIC1REG(EP93XX_VIC_IRQStatus) |
-	    VIC2REG(EP93XX_VIC_IRQStatus));
+	int reg;
+
+	if ((reg = VIC1REG(EP93XX_VIC_IRQStatus) & vic1_intr_enabled)) {
+		return ffs(reg) - 1;
+	} else if ((reg = VIC2REG(EP93XX_VIC_IRQStatus) & vic2_intr_enabled)) {
+		return ffs(reg) - 1 + 32;
+	}
+
+	return -1;
 }
 
 static void
@@ -152,7 +154,7 @@
 ep93xx_identify(driver_t *driver, device_t parent)
 {
 	
-	BUS_ADD_CHILD(parent, 0, "ep", 0);
+	BUS_ADD_CHILD(parent, 0, "eparm", 0);
 }
 
 struct arm32_dma_range *
@@ -176,6 +178,11 @@
 	ep93xx_intr_init();
 	device_add_child(dev, "uart", 0);
 	device_add_child(dev, "epclk", 0);
+
+	/* kick these off */
+	bus_generic_probe(dev);
+	bus_generic_attach(dev);
+
 	return (0);
 }
 
@@ -224,9 +231,10 @@
     struct resource *ires, int flags, driver_intr_t *intr, void *arg,
     void **cookiep)
 {
+
 	BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg,
 	    cookiep);
-	arm_unmask_irqs(1 << ires->r_start);
+	arm_unmask_irqs(ires->r_start);
 	
 	return (0);
 }

==== //depot/projects/arm/src/sys/arm/include/intr.h#2 (text+ko) ====

@@ -47,10 +47,11 @@
 
 #include <machine/psl.h>
 
-int arm_get_irqnb(void *);
+int arm_get_next_irq(void);
 void arm_mask_irqs(int);
 void arm_unmask_irqs(int);
 void set_splmasks(void);
 void arm_setup_irqhandler(const char *, void (*)(void*), void *, int, int,
     void **);
+
 #endif	/* _MACHINE_INTR_H */


More information about the p4-projects mailing list