svn commit: r259725 - user/nwhitehorn/mips_pic_if/mips/nlm
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sun Dec 22 14:39:06 UTC 2013
Author: nwhitehorn
Date: Sun Dec 22 14:39:04 2013
New Revision: 259725
URL: http://svnweb.freebsd.org/changeset/base/259725
Log:
Convert to pic_if.
Added:
user/nwhitehorn/mips_pic_if/mips/nlm/nlm_ic.c
- copied, changed from r259687, user/nwhitehorn/mips_pic_if/mips/nlm/intr_machdep.c
Deleted:
user/nwhitehorn/mips_pic_if/mips/nlm/intr_machdep.c
Modified:
user/nwhitehorn/mips_pic_if/mips/nlm/cms.c
user/nwhitehorn/mips_pic_if/mips/nlm/files.xlp
user/nwhitehorn/mips_pic_if/mips/nlm/interrupt.h
user/nwhitehorn/mips_pic_if/mips/nlm/tick.c
user/nwhitehorn/mips_pic_if/mips/nlm/xlp_pci.c
Modified: user/nwhitehorn/mips_pic_if/mips/nlm/cms.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/cms.c Sun Dec 22 14:14:53 2013 (r259724)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/cms.c Sun Dec 22 14:39:04 2013 (r259725)
@@ -443,8 +443,8 @@ xlp_msgring_config(void *arg)
#endif
xlp_cms_credit_setup(CMS_DEFAULT_CREDIT);
create_msgring_thread(0);
- cpu_establish_hardintr("msgring", msgring_process_fast_intr, NULL,
- NULL, IRQ_MSGRING, INTR_TYPE_NET, &cookie);
+ mips_setup_intr("msgring", IRQ_MSGRING, msgring_process_fast_intr, NULL,
+ NULL, INTR_TYPE_NET, &cookie);
}
/*
Modified: user/nwhitehorn/mips_pic_if/mips/nlm/files.xlp
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/files.xlp Sun Dec 22 14:14:53 2013 (r259724)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/files.xlp Sun Dec 22 14:39:04 2013 (r259725)
@@ -2,7 +2,7 @@
mips/nlm/hal/nlm_hal.c standard
mips/nlm/hal/fmn.c standard
mips/nlm/xlp_machdep.c standard
-mips/nlm/intr_machdep.c standard
+mips/nlm/nlm_ic.c standard
mips/nlm/tick.c standard
mips/nlm/board.c standard
mips/nlm/cms.c standard
Modified: user/nwhitehorn/mips_pic_if/mips/nlm/interrupt.h
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/interrupt.h Sun Dec 22 14:14:53 2013 (r259724)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/interrupt.h Sun Dec 22 14:39:04 2013 (r259725)
@@ -42,9 +42,7 @@
* XLR needs custom pre and post handlers for PCI/PCI-e interrupts
* XXX: maybe follow i386 intsrc model
*/
-void xlp_establish_intr(const char *name, driver_filter_t filt,
- driver_intr_t handler, void *arg, int irq, int flags,
- void **cookiep, void (*busack)(int));
+void xlp_set_bus_ack(u_int irq, void (*busack)(int));
void xlp_enable_irq(int irq);
#endif /* _RMI_INTERRUPT_H_ */
Copied and modified: user/nwhitehorn/mips_pic_if/mips/nlm/nlm_ic.c (from r259687, user/nwhitehorn/mips_pic_if/mips/nlm/intr_machdep.c)
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/intr_machdep.c Sat Dec 21 17:24:31 2013 (r259687, copy source)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/nlm_ic.c Sun Dec 22 14:39:04 2013 (r259725)
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
+#include <sys/module.h>
#include <sys/interrupt.h>
#include <sys/kernel.h>
@@ -53,79 +54,69 @@ __FBSDID("$FreeBSD$");
#include <mips/nlm/hal/pic.h>
#include <mips/nlm/xlp.h>
+#include "pic_if.h"
+
+#define XLR_MAX_INTR 64
+
struct xlp_intrsrc {
void (*busack)(int); /* Additional ack */
- struct intr_event *ie; /* event corresponding to intr */
- int irq;
+ u_int vector; /* event corresponding to intr */
+ u_int irq;
};
static struct xlp_intrsrc xlp_interrupts[XLR_MAX_INTR];
-static mips_intrcnt_t mips_intr_counters[XLR_MAX_INTR];
-static int intrcnt_index;
-void
-xlp_enable_irq(int irq)
+static void
+xlp_ic_identify(driver_t *driver, device_t parent)
{
- uint64_t eimr;
- eimr = nlm_read_c0_eimr();
- nlm_write_c0_eimr(eimr | (1ULL << irq));
+ if (device_find_child(parent, "xlpic", -1) == NULL)
+ BUS_ADD_CHILD(parent, 0, "xlpic", 0);
}
-void
-cpu_establish_softintr(const char *name, driver_filter_t * filt,
- void (*handler) (void *), void *arg, int irq, int flags,
- void **cookiep)
+static int
+xlp_ic_probe(device_t dev)
{
- panic("Soft interrupts unsupported!\n");
+ /* XXX: use FDT? */
+ device_set_desc(dev, "XLP Root Interrupt Controller");
+ return (BUS_PROBE_NOWILDCARD);
}
-void
-cpu_establish_hardintr(const char *name, driver_filter_t * filt,
- void (*handler) (void *), void *arg, int irq, int flags,
- void **cookiep)
+static int
+xlp_ic_attach(device_t dev)
{
- xlp_establish_intr(name, filt, handler, arg, irq, flags,
- cookiep, NULL);
-}
+ mips_register_pic(dev, 0, XLR_MAX_INTR, 1);
+ root_pic = dev;
-static void
-xlp_post_filter(void *source)
-{
- struct xlp_intrsrc *src = source;
-
- if (src->busack)
- src->busack(src->irq);
- nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
+ return (0);
}
-static void
-xlp_pre_ithread(void *source)
+void
+xlp_enable_irq(int irq)
{
- struct xlp_intrsrc *src = source;
+ uint64_t eimr;
- if (src->busack)
- src->busack(src->irq);
+ eimr = nlm_read_c0_eimr();
+ nlm_write_c0_eimr(eimr | (1ULL << irq));
}
static void
-xlp_post_ithread(void *source)
+xlp_eoi(device_t dev, u_int irq)
{
- struct xlp_intrsrc *src = source;
+ struct xlp_intrsrc *src = &xlp_interrupts[irq];
+
+ if (src->busack)
+ src->busack(src->irq);
nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
}
-void
-xlp_establish_intr(const char *name, driver_filter_t filt,
- driver_intr_t handler, void *arg, int irq, int flags,
- void **cookiep, void (*busack)(int))
+static void
+xlp_enable(device_t dev, u_int irq, u_int vector)
{
- struct intr_event *ie; /* descriptor for the IRQ */
struct xlp_intrsrc *src = NULL;
- int errcode;
if (irq < 0 || irq > XLR_MAX_INTR)
panic("%s called for unknown hard intr %d", __func__, irq);
@@ -135,39 +126,27 @@ xlp_establish_intr(const char *name, dri
* startup from CPU0
*/
src = &xlp_interrupts[irq];
- ie = src->ie;
- if (ie == NULL) {
- /*
- * PIC based interrupts need ack in PIC, and some SoC
- * components need additional acks (e.g. PCI)
- */
- if (XLP_IRQ_IS_PICINTR(irq))
- errcode = intr_event_create(&ie, src, 0, irq,
- xlp_pre_ithread, xlp_post_ithread, xlp_post_filter,
- NULL, "hard intr%d:", irq);
- else {
- if (filt == NULL)
- panic("Unsupported non filter percpu intr %d", irq);
- errcode = intr_event_create(&ie, src, 0, irq,
- NULL, NULL, NULL, NULL, "hard intr%d:", irq);
- }
- if (errcode) {
- printf("Could not create event for intr %d\n", irq);
- return;
- }
- src->irq = irq;
- src->busack = busack;
- src->ie = ie;
- }
- intr_event_add_handler(ie, name, filt, handler, arg,
- intr_priority(flags), flags, cookiep);
+ /*
+ * PIC based interrupts need ack in PIC, and some SoC
+ * components need additional acks (e.g. PCI)
+ */
+
+ src->irq = irq;
+ src->vector = vector;
+
xlp_enable_irq(irq);
}
void
-cpu_intr(struct trapframe *tf)
+xlp_set_bus_ack(u_int irq, void (*busack)(int))
+{
+
+ xlp_interrupts[irq].busack = busack;
+}
+
+static void
+xlp_dispatch(device_t dev, struct trapframe *tf)
{
- struct intr_event *ie;
uint64_t eirr, eimr;
int i;
@@ -187,7 +166,7 @@ cpu_intr(struct trapframe *tf)
* compare which ACKs the interrupt.
*/
if (eirr & (1 << IRQ_TIMER)) {
- intr_event_handle(xlp_interrupts[IRQ_TIMER].ie, tf);
+ mips_dispatch_intr(xlp_interrupts[IRQ_TIMER].vector, tf);
critical_exit();
return;
}
@@ -197,57 +176,36 @@ cpu_intr(struct trapframe *tf)
if ((eirr & (1ULL << i)) == 0)
continue;
- ie = xlp_interrupts[i].ie;
- /* Don't account special IRQs */
- switch (i) {
- case IRQ_IPI:
- case IRQ_MSGRING:
- break;
- default:
- mips_intrcnt_inc(mips_intr_counters[i]);
- }
-
/* Ack the IRQ on the CPU */
nlm_write_c0_eirr(1ULL << i);
- if (intr_event_handle(ie, tf) != 0) {
- printf("stray interrupt %d\n", i);
- }
+
+ mips_dispatch_intr(xlp_interrupts[i].vector, tf);
}
critical_exit();
}
-void
-mips_intrcnt_setname(mips_intrcnt_t counter, const char *name)
-{
- int idx = counter - intrcnt;
-
- KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter"));
+static device_method_t xlp_ic_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_identify, xlp_ic_identify),
+ DEVMETHOD(device_probe, xlp_ic_probe),
+ DEVMETHOD(device_attach, xlp_ic_attach),
+
+ /* PIC interface */
+ DEVMETHOD(pic_dispatch, xlp_dispatch),
+ DEVMETHOD(pic_enable, xlp_enable),
+ DEVMETHOD(pic_eoi, xlp_eoi),
- snprintf(intrnames + (MAXCOMLEN + 1) * idx,
- MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name);
-}
-
-mips_intrcnt_t
-mips_intrcnt_create(const char* name)
-{
- mips_intrcnt_t counter = &intrcnt[intrcnt_index++];
-
- mips_intrcnt_setname(counter, name);
- return counter;
-}
+ DEVMETHOD_END,
+};
-void
-cpu_init_interrupts()
-{
- int i;
- char name[MAXCOMLEN + 1];
+static driver_t xlp_ic_driver = {
+ "xlpic",
+ xlp_ic_methods,
+ 0
+};
+
+static devclass_t xlp_ic_devclass;
+
+EARLY_DRIVER_MODULE(xlpic, nexus, xlp_ic_driver, xlp_ic_devclass, 0, 0,
+ BUS_PASS_INTERRUPT);
- /*
- * Initialize all available vectors so spare IRQ
- * would show up in systat output
- */
- for (i = 0; i < XLR_MAX_INTR; i++) {
- snprintf(name, MAXCOMLEN + 1, "int%d:", i);
- mips_intr_counters[i] = mips_intrcnt_create(name);
- }
-}
Modified: user/nwhitehorn/mips_pic_if/mips/nlm/tick.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/tick.c Sun Dec 22 14:14:53 2013 (r259724)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/tick.c Sun Dec 22 14:39:04 2013 (r259725)
@@ -334,8 +334,8 @@ clock_attach(device_t dev)
panic("can't attach more clocks");
softc = sc = device_get_softc(dev);
- cpu_establish_hardintr("compare", clock_intr, NULL,
- sc, IRQ_TIMER, INTR_TYPE_CLK, &sc->intr_handler);
+ mips_setup_intr("compare", IRQ_TIMER, clock_intr, NULL,
+ sc, INTR_TYPE_CLK, &sc->intr_handler);
sc->tc.tc_get_timecount = counter_get_timecount;
sc->tc.tc_counter_mask = 0xffffffff;
Modified: user/nwhitehorn/mips_pic_if/mips/nlm/xlp_pci.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/nlm/xlp_pci.c Sun Dec 22 14:14:53 2013 (r259724)
+++ user/nwhitehorn/mips_pic_if/mips/nlm/xlp_pci.c Sun Dec 22 14:39:04 2013 (r259725)
@@ -723,8 +723,7 @@ mips_platform_pcib_setup_intr(device_t d
extra_ack = NULL;
if (xlpirq >= PIC_PCIE_0_IRQ && xlpirq <= PIC_PCIE_3_IRQ)
extra_ack = bridge_pcie_ack;
- xlp_establish_intr(device_get_name(child), filt,
- intr, arg, xlpirq, flags, cookiep, extra_ack);
+ xlp_set_bus_ack(xlpirq, extra_ack);
return (0);
}
More information about the svn-src-user
mailing list