PERFORCE change 140747 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun Apr 27 18:46:53 UTC 2008


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

Change 140747 by marcel at marcel_xcllnt on 2008/04/27 18:46:24

	Improve support for ISA interrupts and devices as found
	on the MPC85xxCDS systems. This is a WIP.

Affected files ...

.. //depot/projects/e500/sys/powerpc/conf/MPC85XX#8 edit
.. //depot/projects/e500/sys/powerpc/include/intr_machdep.h#6 edit
.. //depot/projects/e500/sys/powerpc/mpc85xx/atpic.c#1 add
.. //depot/projects/e500/sys/powerpc/mpc85xx/isa.c#1 add
.. //depot/projects/e500/sys/powerpc/mpc85xx/pci_ocp.c#9 edit
.. //depot/projects/e500/sys/powerpc/powerpc/autoconf.c#5 edit
.. //depot/projects/e500/sys/powerpc/powerpc/intr_machdep.c#9 edit

Differences ...

==== //depot/projects/e500/sys/powerpc/conf/MPC85XX#8 (text+ko) ====

@@ -54,6 +54,7 @@
 device		em
 device		ether
 device		fxp
+#device		isa
 device		loop
 device		md
 device		miibus

==== //depot/projects/e500/sys/powerpc/include/intr_machdep.h#6 (text+ko) ====

@@ -37,6 +37,7 @@
 driver_filter_t powerpc_ipi_handler;
 
 void	powerpc_register_pic(device_t, u_int);
+void	powerpc_register_8259(device_t);
 
 void	powerpc_dispatch_intr(u_int, struct trapframe *);
 int	powerpc_enable_intr(void);

==== //depot/projects/e500/sys/powerpc/mpc85xx/pci_ocp.c#9 (text+ko) ====

@@ -427,9 +427,15 @@
 	 * Default interrupt routing.
 	 */
 	if (intpin != 0) {
-		intline = intpin - 1;
-		intline += (bus != sc->sc_busnr) ? slot : 0;
-		intline = PIC_IRQ_EXT(intline & 3);
+		if (bus == 1 && slot == 4 && func == 2)
+			intline = 11;
+		else if (bus == 1 && slot == 4 && func == 3)
+			intline = 10;
+		else  {
+			intline = intpin - 1;
+			intline += (bus != sc->sc_busnr) ? slot : 0;
+			intline = PIC_IRQ_EXT(intline & 3);
+		}
 	} else
 		intline = 0xff;
 
@@ -490,17 +496,11 @@
 				}
 			}
 			if (vendor == 0x1106 && device == 0x0571) {
+				/* Enable pri & sec channels. */
+				cr8 = pci_ocp_read_config(sc->sc_dev, bus,
+				    slot, func, 0x40, 1);
 				pci_ocp_write_config(sc->sc_dev, bus, slot,
-				    func, 0xc4, 0x00, 1);
-				/* Set legacy mode. */
-				pci_ocp_write_config(sc->sc_dev, bus, slot,
-				    func, 0x40, 0x08, 1);
-				pci_ocp_write_config(sc->sc_dev, bus, slot,
-				    func, PCIR_PROGIF, 0x00, 1);
-				pci_ocp_write_config(sc->sc_dev, bus, slot,
-				    func, 0x42, 0x09, 1);
-				pci_ocp_write_config(sc->sc_dev, bus, slot,
-				    func, 0x40, 0x0b, 1);
+				    func, 0x40, cr8 | 3, 1);
 			}
 
 			/* Program the base address registers. */

==== //depot/projects/e500/sys/powerpc/powerpc/autoconf.c#5 (text+ko) ====

@@ -24,6 +24,8 @@
  * SUCH DAMAGE.
  */
 
+#include "opt_isa.h"
+
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/sys/powerpc/powerpc/autoconf.c,v 1.17 2008/03/03 17:17:00 raj Exp $");
 
@@ -35,6 +37,12 @@
 
 #include <machine/intr_machdep.h>
 
+#ifdef DEV_ISA
+extern void isa_probe_children(device_t dev);
+
+device_t isa_bus_device;
+#endif
+
 static device_t nexusdev;
 
 static void	configure_first(void *);
@@ -62,6 +70,10 @@
 {
 
 	root_bus_configure();
+#ifdef DEV_ISA
+	if (isa_bus_device)
+		isa_probe_children(isa_bus_device);
+#endif
 }
 
 static void

==== //depot/projects/e500/sys/powerpc/powerpc/intr_machdep.c#9 (text+ko) ====

@@ -100,6 +100,10 @@
 static u_int stray_count;
 
 device_t pic;
+device_t pic8259;
+
+#define	ISA_IRQ(x)	(pic8259 != NULL && (x) < 16)
+#define	PIC(x)		(ISA_IRQ(x) ? pic8259 : pic)
 
 static void
 intrcnt_setname(const char *name, int index)
@@ -166,7 +170,7 @@
 {
 	u_int irq = (uintptr_t)arg;
 
-	PIC_EOI(pic, irq);
+	PIC_EOI(PIC(irq), irq);
 }
 
 static void
@@ -174,7 +178,7 @@
 {
 	u_int irq = (uintptr_t)arg;
 
-	PIC_MASK(pic, irq);
+	PIC_MASK(PIC(irq), irq);
 }
 
 static void
@@ -182,7 +186,7 @@
 {
 	u_int irq = (uintptr_t)arg;
 
-	PIC_UNMASK(pic, irq);
+	PIC_UNMASK(PIC(irq), irq);
 }
 
 void
@@ -192,6 +196,13 @@
 	pic = dev;
 }
 
+void
+powerpc_register_8259(device_t dev)
+{
+
+	pic8259 = dev;
+}
+
 int
 powerpc_enable_intr(void)
 {
@@ -205,10 +216,10 @@
 
 		if (i->trig != INTR_TRIGGER_CONFORM ||
 		    i->pol != INTR_POLARITY_CONFORM)
-			PIC_CONFIG(pic, i->irq, i->trig, i->pol);
+			PIC_CONFIG(PIC(i->irq), i->irq, i->trig, i->pol);
 
 		if (i->event != NULL)
-			PIC_ENABLE(pic, i->irq, vector);
+			PIC_ENABLE(PIC(i->irq), i->irq, vector);
 	}
 
 	return (0);
@@ -235,7 +246,7 @@
 		i->cntp = &intrcnt[i->vector];
 
 		if (!cold)
-			PIC_ENABLE(pic, i->irq, i->vector);
+			PIC_ENABLE(PIC(irq), irq, i->vector);
 	}
 
 	error = intr_event_add_handler(i->event, name, filter, handler, arg,
@@ -256,9 +267,6 @@
 {
 	struct powerpc_intr *i;
 
-	if (trig == INTR_TRIGGER_CONFORM && pol == INTR_POLARITY_CONFORM)
-		return (0);
-
 	i = intr_lookup(irq);
 	if (i == NULL)
 		return (ENOMEM);
@@ -267,7 +275,7 @@
 	i->pol = pol;
 
 	if (!cold)
-		PIC_CONFIG(pic, irq, trig, pol);
+		PIC_CONFIG(PIC(irq), irq, trig, pol);
 
 	return (0);
 }
@@ -302,5 +310,5 @@
 		}
 	}
 	if (i != NULL)
-		PIC_MASK(pic, i->irq);
+		PIC_MASK(PIC(i->irq), i->irq);
 }


More information about the p4-projects mailing list