svn commit: r259704 - user/nwhitehorn/mips_pic_if/mips/atheros

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Dec 22 00:22:58 UTC 2013


Author: nwhitehorn
Date: Sun Dec 22 00:22:57 2013
New Revision: 259704
URL: http://svnweb.freebsd.org/changeset/base/259704

Log:
  Speculative conversion of AR71XX to pic_if. Compile-tested only.

Modified:
  user/nwhitehorn/mips_pic_if/mips/atheros/apb.c
  user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h
  user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c

Modified: user/nwhitehorn/mips_pic_if/mips/atheros/apb.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/atheros/apb.c	Sun Dec 22 00:08:20 2013	(r259703)
+++ user/nwhitehorn/mips_pic_if/mips/atheros/apb.c	Sun Dec 22 00:22:57 2013	(r259704)
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
 #include <mips/atheros/ar71xxreg.h>
 #include <mips/atheros/ar71xx_setup.h>
 
+#include "pic_if.h"
+
 #define	APB_INTR_PMC	5
 
 #undef APB_DEBUG
@@ -73,15 +75,10 @@ static int	apb_filter(void *);
 static int	apb_probe(device_t);
 static int	apb_release_resource(device_t, device_t, int, int,
 		    struct resource *);
-static int	apb_setup_intr(device_t, device_t, struct resource *, int,
-		    driver_filter_t *, driver_intr_t *, void *, void **);
-static int	apb_teardown_intr(device_t, device_t, struct resource *,
-		    void *);
 
 static void 
-apb_mask_irq(void *source)
+apb_mask_irq(device_t dev, u_int irq)
 {
-	unsigned int irq = (unsigned int)source;
 	uint32_t reg;
 
 	reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK);
@@ -90,10 +87,9 @@ apb_mask_irq(void *source)
 }
 
 static void 
-apb_unmask_irq(void *source)
+apb_unmask_irq(device_t dev, u_int irq)
 {
 	uint32_t reg;
-	unsigned int irq = (unsigned int)source;
 
 	reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK);
 	ATH_WRITE_REG(AR71XX_MISC_INTR_MASK, reg | (1 << irq));
@@ -144,6 +140,9 @@ apb_attach(device_t dev)
 		return (ENXIO);
 	}
 
+	/* Register this interrupt domain */
+	mips_register_pic(dev, APB_PIC_ID, APB_NIRQS, 0);
+
 	bus_generic_probe(dev);
 	bus_enumerate_hinted_children(dev);
 	bus_generic_attach(dev);
@@ -151,8 +150,7 @@ apb_attach(device_t dev)
 	/*
 	 * Unmask performance counter IRQ
 	 */
-	apb_unmask_irq((void*)APB_INTR_PMC);
-	sc->sc_intr_counter[APB_INTR_PMC] = mips_intrcnt_create("apb irq5: pmc");
+	apb_unmask_irq(dev, APB_INTR_PMC);
 
 	return (0);
 }
@@ -278,73 +276,24 @@ apb_release_resource(device_t dev, devic
 	return (0);
 }
 
-static int
-apb_setup_intr(device_t bus, device_t child, struct resource *ires,
-		int flags, driver_filter_t *filt, driver_intr_t *handler,
-		void *arg, void **cookiep)
+static void
+apb_enable_irq(device_t bus, u_int irq, u_int vector)
 {
 	struct apb_softc *sc = device_get_softc(bus);
-	struct intr_event *event;
-	int irq, error;
-
-	irq = rman_get_start(ires);
 
 	if (irq > APB_IRQ_END)
 		panic("%s: bad irq %d", __func__, irq);
 
-	event = sc->sc_eventstab[irq];
-	if (event == NULL) {
-		error = intr_event_create(&event, (void *)irq, 0, irq, 
-		    apb_mask_irq, apb_unmask_irq,
-		    NULL, NULL,
-		    "apb intr%d:", irq);
-
-		if (error == 0) {
-			sc->sc_eventstab[irq] = event;
-			sc->sc_intr_counter[irq] =
-			    mips_intrcnt_create(event->ie_name);
-		}
-		else
-			return (error);
-	}
+	sc->sc_eventstab[irq] = vector;
 
-	intr_event_add_handler(event, device_get_nameunit(child), filt,
-	    handler, arg, intr_priority(flags), flags, cookiep);
-	mips_intrcnt_setname(sc->sc_intr_counter[irq], event->ie_fullname);
-
-	apb_unmask_irq((void*)irq);
-
-	return (0);
-}
-
-static int
-apb_teardown_intr(device_t dev, device_t child, struct resource *ires,
-    void *cookie)
-{
-	struct apb_softc *sc = device_get_softc(dev);
-	int irq, result;
-
-	irq = rman_get_start(ires);
-	if (irq > APB_IRQ_END)
-		panic("%s: bad irq %d", __func__, irq);
-
-	if (sc->sc_eventstab[irq] == NULL)
-		panic("Trying to teardown unoccupied IRQ");
-
-	apb_mask_irq((void*)irq);
-
-	result = intr_event_remove_handler(cookie);
-	if (!result)
-		sc->sc_eventstab[irq] = NULL;
-
-	return (result);
+	apb_unmask_irq(bus, irq);
 }
 
 static int
 apb_filter(void *arg)
 {
 	struct apb_softc *sc = arg;
-	struct intr_event *event;
+	u_int vector;
 	uint32_t reg, irq;
 	struct thread *td;
 	struct trapframe *tf;
@@ -371,27 +320,18 @@ apb_filter(void *arg)
 				break;
 			}
 
-			event = sc->sc_eventstab[irq];
-			if (!event || TAILQ_EMPTY(&event->ie_handlers)) {
-				if (irq == APB_INTR_PMC) {
-					td = PCPU_GET(curthread);
-					tf = td->td_intr_frame;
-
-					if (pmc_intr)
-						(*pmc_intr)(PCPU_GET(cpuid), tf);
-
-					mips_intrcnt_inc(sc->sc_intr_counter[irq]);
-
-					continue;
-				}
-				/* Ignore timer interrupts */
-				if (irq != 0)
-					printf("Stray APB IRQ %d\n", irq);
+			vector = sc->sc_eventstab[irq];
+			if (irq == APB_INTR_PMC) {
+				td = PCPU_GET(curthread);
+				tf = td->td_intr_frame;
+
+				if (pmc_intr)
+					(*pmc_intr)(PCPU_GET(cpuid), tf);
+
 				continue;
 			}
 
-			intr_event_handle(event, PCPU_GET(curthread)->td_intr_frame);
-			mips_intrcnt_inc(sc->sc_intr_counter[irq]);
+			mips_dispatch_intr(vector, NULL);
 		}
 	}
 
@@ -433,7 +373,8 @@ apb_hinted_child(device_t bus, const cha
 	}
 
 	if (resource_int_value(dname, dunit, "irq", &irq) == 0) {
-		result = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1);
+		result = bus_set_resource(child, SYS_RES_IRQ, 0,
+		    mips_get_irq(APB_PIC_ID, irq), 1);
 		if (result != 0)
 			device_printf(bus,
 			    "warning: bus_set_resource() failed\n");
@@ -485,13 +426,18 @@ static device_method_t apb_methods[] = {
 	DEVMETHOD(bus_get_resource_list,	apb_get_resource_list),
 	DEVMETHOD(bus_hinted_child,		apb_hinted_child),
 	DEVMETHOD(bus_release_resource,		apb_release_resource),
-	DEVMETHOD(bus_setup_intr,		apb_setup_intr),
-	DEVMETHOD(bus_teardown_intr,		apb_teardown_intr),
 	DEVMETHOD(device_attach,		apb_attach),
 	DEVMETHOD(device_probe,			apb_probe),
+	DEVMETHOD(bus_setup_intr,		bus_generic_setup_intr),
+	DEVMETHOD(bus_teardown_intr,		bus_generic_teardown_intr),
 	DEVMETHOD(bus_get_resource,		bus_generic_rl_get_resource),
 	DEVMETHOD(bus_set_resource,		bus_generic_rl_set_resource),
 
+	/* PIC interface */
+        DEVMETHOD(pic_enable,			apb_enable_irq),
+        DEVMETHOD(pic_mask,			apb_mask_irq),
+        DEVMETHOD(pic_unmask,			apb_unmask_irq),
+
 	DEVMETHOD_END
 };
 

Modified: user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h	Sun Dec 22 00:08:20 2013	(r259703)
+++ user/nwhitehorn/mips_pic_if/mips/atheros/apbvar.h	Sun Dec 22 00:22:57 2013	(r259704)
@@ -31,16 +31,15 @@
 #define	APB_IRQ_BASE		0
 #define	APB_IRQ_END		7
 #define	APB_NIRQS		8
+#define	APB_PIC_ID		0x100 /* FDT-ize? */
 
 struct apb_softc {
 	struct rman		apb_irq_rman;
 	struct rman		apb_mem_rman;
-	/* IRQ events structs for child devices */
-	struct intr_event	*sc_eventstab[APB_NIRQS];	
-	mips_intrcnt_t		sc_intr_counter[APB_NIRQS];	
 	/* Resources and cookies for MIPS CPU INTs */
 	struct resource		*sc_misc_irq;
 	void			*sc_misc_ih;
+	u_int			sc_eventstab[APB_NIRQS];
 };
 
 struct apb_ivar {

Modified: user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c	Sun Dec 22 00:08:20 2013	(r259703)
+++ user/nwhitehorn/mips_pic_if/mips/atheros/ar71xx_pci.c	Sun Dec 22 00:22:57 2013	(r259704)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/pci/pcib_private.h>
 #include "pcib_if.h"
+#include "pic_if.h"
 
 #include <mips/atheros/ar71xxreg.h>
 #include <mips/atheros/ar71xx_pci_bus_space.h>
@@ -77,6 +78,8 @@ struct mtx ar71xx_pci_mtx;
 MTX_SYSINIT(ar71xx_pci_mtx, &ar71xx_pci_mtx, "ar71xx PCI space mutex",
     MTX_SPIN);
 
+#define AR71XX_PCI_PIC_ID	0x200
+
 struct ar71xx_pci_softc {
 	device_t		sc_dev;
 
@@ -85,23 +88,17 @@ struct ar71xx_pci_softc {
 	struct rman		sc_mem_rman;
 	struct rman		sc_irq_rman;
 
-	struct intr_event	*sc_eventstab[AR71XX_PCI_NIRQS];	
-	mips_intrcnt_t		sc_intr_counter[AR71XX_PCI_NIRQS];	
+	u_int			sc_eventstab[AR71XX_PCI_NIRQS];	
 	struct resource		*sc_irq;
 	void			*sc_ih;
 };
 
-static int ar71xx_pci_setup_intr(device_t, device_t, struct resource *, int, 
-		    driver_filter_t *, driver_intr_t *, void *, void **);
-static int ar71xx_pci_teardown_intr(device_t, device_t, struct resource *,
-		    void *);
 static int ar71xx_pci_intr(void *);
 
 static void
-ar71xx_pci_mask_irq(void *source)
+ar71xx_pci_mask_irq(device_t dev, u_int irq)
 {
 	uint32_t reg;
-	unsigned int irq = (unsigned int)source;
 
 	/* XXX is the PCI lock required here? */
 	reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK);
@@ -111,10 +108,9 @@ ar71xx_pci_mask_irq(void *source)
 }
 
 static void
-ar71xx_pci_unmask_irq(void *source)
+ar71xx_pci_unmask_irq(device_t dev, u_int irq)
 {
 	uint32_t reg;
-	unsigned int irq = (unsigned int)source;
 
 	/* XXX is the PCI lock required here? */
 	reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK);
@@ -463,6 +459,9 @@ ar71xx_pci_attach(device_t dev)
 #endif	/* AR71XX_ATH_EEPROM */
 
 	device_add_child(dev, "pci", busno);
+
+	mips_register_pic(dev, AR71XX_PCI_PIC_ID, AR71XX_PCI_NIRQS, 0);
+
 	return (bus_generic_attach(dev));
 }
 
@@ -553,72 +552,23 @@ ar71xx_pci_activate_resource(device_t bu
 	return (res);
 }
 
-static int
-ar71xx_pci_setup_intr(device_t bus, device_t child, struct resource *ires,
-	    int flags, driver_filter_t *filt, driver_intr_t *handler,
-	    void *arg, void **cookiep)
+static void
+ar71xx_pci_enable_intr(device_t bus, u_int irq, u_int vector)
 {
 	struct ar71xx_pci_softc *sc = device_get_softc(bus);
-	struct intr_event *event;
-	int irq, error;
-
-	irq = rman_get_start(ires);
-
-	if (irq > AR71XX_PCI_IRQ_END)
-		panic("%s: bad irq %d", __func__, irq);
-
-	event = sc->sc_eventstab[irq];
-	if (event == NULL) {
-		error = intr_event_create(&event, (void *)irq, 0, irq, 
-		    ar71xx_pci_mask_irq, ar71xx_pci_unmask_irq, NULL, NULL,
-		    "pci intr%d:", irq);
-
-		if (error == 0) {
-			sc->sc_eventstab[irq] = event;
-			sc->sc_intr_counter[irq] =
-			    mips_intrcnt_create(event->ie_name);
-		}
-		else
-			return (error);
-	}
 
-	intr_event_add_handler(event, device_get_nameunit(child), filt,
-	    handler, arg, intr_priority(flags), flags, cookiep);
-	mips_intrcnt_setname(sc->sc_intr_counter[irq], event->ie_fullname);
-
-	ar71xx_pci_unmask_irq((void*)irq);
-
-	return (0);
-}
-
-static int
-ar71xx_pci_teardown_intr(device_t dev, device_t child, struct resource *ires,
-    void *cookie)
-{
-	struct ar71xx_pci_softc *sc = device_get_softc(dev);
-	int irq, result;
-
-	irq = rman_get_start(ires);
 	if (irq > AR71XX_PCI_IRQ_END)
 		panic("%s: bad irq %d", __func__, irq);
 
-	if (sc->sc_eventstab[irq] == NULL)
-		panic("Trying to teardown unoccupied IRQ");
-
-	ar71xx_pci_mask_irq((void*)irq);
+	sc->sc_eventstab[irq] = vector;
 
-	result = intr_event_remove_handler(cookie);
-	if (!result)
-		sc->sc_eventstab[irq] = NULL;
-
-	return (result);
+	ar71xx_pci_unmask_irq(bus, irq);
 }
 
 static int
 ar71xx_pci_intr(void *arg)
 {
 	struct ar71xx_pci_softc *sc = arg;
-	struct intr_event *event;
 	uint32_t reg, irq, mask;
 
 	reg = ATH_READ_REG(AR71XX_PCI_INTR_STATUS);
@@ -629,20 +579,11 @@ ar71xx_pci_intr(void *arg)
 	reg &= mask;
 	for (irq = AR71XX_PCI_IRQ_START; irq <= AR71XX_PCI_IRQ_END; irq++) {
 		if (reg & (1 << irq)) {
-			event = sc->sc_eventstab[irq];
-			if (!event || TAILQ_EMPTY(&event->ie_handlers)) {
-				/* Ignore timer interrupts */
-				if (irq != 0)
-					printf("Stray IRQ %d\n", irq);
-				continue;
-			}
-
 			/* Flush DDR FIFO for IP2 */
 			ar71xx_device_ddr_flush_ip2();
 
 			/* TODO: frame instead of NULL? */
-			intr_event_handle(event, NULL);
-			mips_intrcnt_inc(sc->sc_intr_counter[irq]);
+			mips_dispatch_intr(sc->sc_eventstab[irq], NULL);
 		}
 	}
 
@@ -665,7 +606,8 @@ ar71xx_pci_route_interrupt(device_t pcib
 		panic("%s: PCI slot %d is less then AR71XX_PCI_BASE_SLOT",
 		    __func__, pci_get_slot(device));
 
-	return (pci_get_slot(device) - sc->sc_baseslot);
+	return (mips_get_irq(AR71XX_PCI_PIC_ID, pci_get_slot(device) -
+	    sc->sc_baseslot));
 }
 
 static device_method_t ar71xx_pci_methods[] = {
@@ -683,8 +625,8 @@ static device_method_t ar71xx_pci_method
 	DEVMETHOD(bus_release_resource,	bus_generic_release_resource),
 	DEVMETHOD(bus_activate_resource, ar71xx_pci_activate_resource),
 	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
-	DEVMETHOD(bus_setup_intr,	ar71xx_pci_setup_intr),
-	DEVMETHOD(bus_teardown_intr,	ar71xx_pci_teardown_intr),
+	DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),
+	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
 
 	/* pcib interface */
 	DEVMETHOD(pcib_maxslots,	ar71xx_pci_maxslots),
@@ -692,6 +634,11 @@ static device_method_t ar71xx_pci_method
 	DEVMETHOD(pcib_write_config,	ar71xx_pci_write_config),
 	DEVMETHOD(pcib_route_interrupt,	ar71xx_pci_route_interrupt),
 
+	/* PIC interface */
+	DEVMETHOD(pic_enable,		ar71xx_pci_enable_intr),
+	DEVMETHOD(pic_mask,		ar71xx_pci_mask_irq),
+	DEVMETHOD(pic_unmask,		ar71xx_pci_unmask_irq),
+
 	DEVMETHOD_END
 };
 


More information about the svn-src-user mailing list