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