Module Name: src
Committed By: matt
Date: Thu Jan 19 08:05:24 UTC 2012
Modified Files:
src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_cpu.c rmixl_cpuvar.h
rmixl_fmn.c rmixl_intr.c
Log Message:
Change struct rmixl_cpu_softc to cpu_softc and remove casts.
Fix IPIs.
More FMN cleanup.
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.23 -r1.1.2.24 src/sys/arch/mips/rmi/rmixl_cpu.c
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/arch/mips/rmi/rmixl_cpuvar.h
cvs rdiff -u -r1.1.2.9 -r1.1.2.10 src/sys/arch/mips/rmi/rmixl_fmn.c
cvs rdiff -u -r1.1.2.34 -r1.1.2.35 src/sys/arch/mips/rmi/rmixl_intr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/rmi/rmixl_cpu.c
diff -u src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.23 src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.24
--- src/sys/arch/mips/rmi/rmixl_cpu.c:1.1.2.23 Wed Jan 4 16:17:53 2012
+++ src/sys/arch/mips/rmi/rmixl_cpu.c Thu Jan 19 08:05:24 2012
@@ -71,7 +71,7 @@ __KERNEL_RCSID(0, "rmixl_cpu.c,v 1.1.2.2
static int cpu_rmixl_match(device_t, cfdata_t, void *);
static void cpu_rmixl_attach(device_t, device_t, void *);
-static void cpu_rmixl_attach_primary(struct rmixl_cpu_softc * const);
+static void cpu_rmixl_attach_primary(struct cpu_softc * const);
#ifdef NOTYET
static int cpu_fmn_intr(void *, rmixl_fmn_rxmsg_t *);
#endif
@@ -92,7 +92,7 @@ struct cpu_info *
rmixl_cpuinfo_print(u_int);
#endif /* DEBUG */
-CFATTACH_DECL_NEW(cpu_rmixl, sizeof(struct rmixl_cpu_softc),
+CFATTACH_DECL_NEW(cpu_rmixl, sizeof(struct cpu_softc),
cpu_rmixl_match, cpu_rmixl_attach, NULL, NULL);
#ifdef MULTIPROCESSOR
@@ -177,7 +177,7 @@ cpu_rmixl_match(device_t parent, cfdata_
static void
cpu_rmixl_attach(device_t parent, device_t self, void *aux)
{
- struct rmixl_cpu_softc * const sc = device_private(self);
+ struct cpu_softc * const sc = device_private(self);
struct cpu_info *ci = NULL;
static bool once = false;
extern void rmixl_spl_init_cpu(void);
@@ -252,7 +252,7 @@ cpu_rmixl_attach(device_t parent, device
* attach the primary processor
*/
static void
-cpu_rmixl_attach_primary(struct rmixl_cpu_softc * const sc)
+cpu_rmixl_attach_primary(struct cpu_softc * const sc)
{
struct cpu_info *ci = sc->sc_ci;
uint32_t ebase;
@@ -286,8 +286,8 @@ cpu_rmixl_attach_primary(struct rmixl_cp
void
cpu_rmixl_run(struct cpu_info *ci)
{
- struct rmixl_cpu_softc * const sc = (void *)ci->ci_softc;
- rmixl_fmn_init_thead();
+ struct cpu_softc * const sc = ci->ci_softc;
+ rmixl_fmn_init_thread();
cpucore_rmixl_run(device_parent(sc->sc_dev));
}
@@ -299,7 +299,7 @@ cpu_rmixl_run(struct cpu_info *ci)
void
cpu_rmixl_hatch(struct cpu_info *ci)
{
- struct rmixl_cpu_softc * const sc = (void *)ci->ci_softc;
+ struct cpu_softc * const sc = ci->ci_softc;
extern void rmixl_spl_init_cpu(void);
rmixl_spl_init_cpu(); /* spl initialization for this CPU */
@@ -395,7 +395,6 @@ cpu_setup_trampoline_callback(struct cpu
}
#endif /* MULTIPROCESSOR */
-
#ifdef DEBUG
void
rmixl_cpu_data_print(struct cpu_data *dp)
Index: src/sys/arch/mips/rmi/rmixl_cpuvar.h
diff -u src/sys/arch/mips/rmi/rmixl_cpuvar.h:1.1.2.4 src/sys/arch/mips/rmi/rmixl_cpuvar.h:1.1.2.5
--- src/sys/arch/mips/rmi/rmixl_cpuvar.h:1.1.2.4 Sat Dec 24 01:57:54 2011
+++ src/sys/arch/mips/rmi/rmixl_cpuvar.h Thu Jan 19 08:05:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_cpuvar.h,v 1.1.2.4 2011/12/24 01:57:54 matt Exp $ */
+/* $NetBSD: rmixl_cpuvar.h,v 1.1.2.5 2012/01/19 08:05:24 matt Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -31,17 +31,24 @@
#ifndef _ARCH_MIPS_RMI_RMIXL_CPUVAR_H_
#define _ARCH_MIPS_RMI_RMIXL_CPUVAR_H_
+#include <mips/rmi/rmixl_fmnvar.h>
+
struct rmixl_cpu_trampoline_args {
uint64_t ta_sp;
uint64_t ta_lwp;
uint64_t ta_cpuinfo;
};
-struct rmixl_cpu_softc {
+struct cpu_softc {
device_t sc_dev;
struct cpu_info *sc_ci;
+
+ void *sc_fmn_si; /* fast messaging network softint */
+
struct evcnt sc_vec_evcnts[64];
struct evcnt sc_irt_evcnts[160];
+ struct evcnt sc_fmn_stid_evcnts[RMIXL_FMN_NSTID];
+ struct evcnt sc_fmn_cpu_evcnts[8];
};
#endif /* _ARCH_MIPS_RMI_RMIXL_CPUVAR_H_ */
Index: src/sys/arch/mips/rmi/rmixl_fmn.c
diff -u src/sys/arch/mips/rmi/rmixl_fmn.c:1.1.2.9 src/sys/arch/mips/rmi/rmixl_fmn.c:1.1.2.10
--- src/sys/arch/mips/rmi/rmixl_fmn.c:1.1.2.9 Wed Jan 4 16:17:53 2012
+++ src/sys/arch/mips/rmi/rmixl_fmn.c Thu Jan 19 08:05:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_fmn.c,v 1.1.2.9 2012/01/04 16:17:53 matt Exp $ */
+/* $NetBSD: rmixl_fmn.c,v 1.1.2.10 2012/01/19 08:05:24 matt Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -35,8 +35,8 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/cpu.h>
-#include <sys/percpu.h>
#include <sys/atomic.h>
+#include <sys/intr.h>
#include <dev/pci/pcidevs.h>
@@ -212,9 +212,10 @@ typedef struct fmn_intrhand {
typedef struct fmn_info {
const fmn_queue_id_t * fmn_qidtab;
const fmn_station_info_t * fmn_stinfo;
- percpu_t * fmn_ev_percpu;
+ const char (*fmn_bucket_names)[12];
size_t fmn_intr_vec;
- uint32_t fmn_nstid;
+ uint8_t fmn_nstid;
+ uint8_t fmn_nbucket; // or vc (XLP)
volatile uint32_t fmn_coremask;
volatile uint32_t fmn_nthread;
@@ -224,7 +225,6 @@ typedef struct fmn_info {
volatile fmn_intrhand_t fmn_intrhand[RMIXL_FMN_NSTID];
} fmn_info_t;
-
static fmn_info_t fmn_info = {
.fmn_intrhand = {
[0 ... RMIXL_FMN_NSTID-1] = {
@@ -234,6 +234,14 @@ static fmn_info_t fmn_info = {
},
};
+static char fmn_stid_ev_names[RMIXL_FMN_NSTID][32];
+
+#if (MIPS64_XLR + MIPS64_XLS) > 0
+static const char xlrxls_bucket_names[8][12] = {
+ "bucket 0", "bucket 1", "bucket 2", "bucket 3",
+ "bucket 4", "bucket 5", "bucket 6", "bucket 7",
+};
+#endif /* (MIPS64_XLR + MIPS64_XLS) > 0 */
#ifdef MIPS64_XLP
static const struct xlp_stid_map {
@@ -293,6 +301,10 @@ static fmn_station_info_t xlp_xxx_stinfo
[RMIXLP_FMN_STID_SRIO] = { "srio" },
};
+static const char xlp_bucket_names[4][12] = {
+ "vc 0", "vc 1", "vc 2", "vc 3",
+};
+
static void
fmn_init_xlp_claim_qids(const fmn_station_info_t * const si, size_t stid)
{
@@ -306,6 +318,8 @@ fmn_init_xlp_claim_qids(const fmn_statio
static void
fmn_init_xlp(fmn_info_t *fmn)
{
+ fmn->fmn_nbucket = 4; // 4 VCs per thread
+ fmn->fmn_bucket_names = xlp_bucket_names;
fmn->fmn_nstid = RMIXLP_FMN_NSTID;
fmn->fmn_qidtab = xlp_xxx_qidtab;
fmn->fmn_stinfo = xlp_xxx_stinfo;
@@ -516,6 +530,8 @@ fmn_init_xls(fmn_info_t *fmn)
for (size_t i = 0; i < __arraycount(xls_stid_map); i++) {
const struct xls_stid_map * const map = &xls_stid_map[i];
if (map->map_impl == impl) {
+ fmn->fmn_nbucket = 8; // 4 buckets per core
+ fmn->fmn_bucket_names = xlrxls_bucket_names;
fmn->fmn_nstid = RMIXLS_FMN_NSTID;
fmn->fmn_qidtab = map->map_qidtab;
fmn->fmn_stinfo = map->map_stinfo;
@@ -554,7 +570,7 @@ static const fmn_queue_id_t xlr_xxx_qidt
* caution:
* - the XGMII/SPI4 stations si_regbase are 'special'
* - the RGMII station si_regbase is 'special'
- */
+ */
static const fmn_station_info_t xlr_xxx_stinfo[RMIXLR_FMN_NSTID] = {
[RMIXLR_FMN_STID_CORE0] = { "core0", 0, 7, 8, 32, 4, 0 },
[RMIXLR_FMN_STID_CORE1] = { "core1", 8, 15, 8, 32, 4, 0 },
@@ -579,6 +595,8 @@ static const fmn_station_info_t xlr_xxx_
static void
fmn_init_xlr(fmn_info_t *fmn)
{
+ fmn->fmn_nbucket = 8; // 4 buckets per core
+ fmn->fmn_bucket_names = xlrxls_bucket_names;
fmn->fmn_nstid = RMIXLR_FMN_NSTID;
fmn->fmn_qidtab = xlr_xxx_qidtab;
fmn->fmn_stinfo = xlr_xxx_stinfo;
@@ -614,7 +632,7 @@ fmn_init_noncore_xlrxls(fmn_info_t *fmn)
/*
* fmn_init_thread_xlrxls
*
- * - configure FMN
+ * - configure FMN
* - initialize bucket sizes and (minimum) credits for a core
*/
static void
@@ -702,7 +720,7 @@ fmn_init_thread_xlrxls(fmn_info_t *fmn)
FMN_COP2_8SEL_WRITE(RMIXL_COP_2_CREDITS+12, 0);
FMN_COP2_8SEL_WRITE(RMIXL_COP_2_CREDITS+13, 0);
FMN_COP2_8SEL_WRITE(RMIXL_COP_2_CREDITS+14, 0);
- FMN_COP2_8SEL_WRITE(RMIXL_COP_2_CREDITS+15, 0);
+ FMN_COP2_8SEL_WRITE(RMIXL_COP_2_CREDITS+15, 0);
sts1 = mips_mfc2(RMIXL_COP_2_MSG_STS, 1);
KASSERT((sts1 & RMIXL_MSG_STS1_ERRS) == 0);
@@ -711,26 +729,11 @@ fmn_init_thread_xlrxls(fmn_info_t *fmn)
}
#endif /* (MIPS64_XLR + MIPS64_XLS) > 0 */
-static inline struct evcnt *
-fmn_ev_getref(void)
-{
- struct evcnt * const ev = percpu_getref(fmn_info.fmn_ev_percpu);
- KASSERT(ev != NULL);
-
- return ev;
-}
-
-static inline void
-fmn_ev_putref(struct evcnt *ev)
-{
- percpu_putref(fmn_info.fmn_ev_percpu);
-}
-
-
#if (MIPS64_XLP) > 0
static void fmn_init_thread_xlp(fmn_info_t *);
#endif
-static int fmn_intr_dispatch(void *);
+static int fmn_intr(void *);
+static void fmn_softint(void *);
#ifdef FMN_DEBUG
void rmixl_fmn_cp2_dump(void);
@@ -743,7 +746,7 @@ void rmixl_fmn_cc_dump(void);
void
rmixl_fmn_init(void)
{
- fmn_info_t * const fmn = &fmn_info;
+ fmn_info_t * const fmn = &fmn_info;
/*
* do chip-dependent FMN initialization
@@ -768,40 +771,49 @@ rmixl_fmn_init(void)
panic("%s: RMI chip type %#x unknown", __func__,
cpu_rmixl_chip_type(mips_options.mips_cpu));
}
-
- fmn->fmn_ev_percpu = percpu_alloc(fmn->fmn_nstid*sizeof(struct evcnt));
- KASSERT(fmn->fmn_ev_percpu != NULL);
}
-/*
- * This must be done in the context of the thread itself.
- */
void
-rmixl_fmn_init_thread(void)
+rmixl_fmn_cpu_attach(struct cpu_info *ci)
{
fmn_info_t * const fmn = &fmn_info;
- struct cpu_info * const ci = curcpu();
- struct rmixl_cpu_softc * const sc = (void *)ci->ci_softc;
+ struct cpu_softc * const sc = ci->ci_softc;
+
+ KASSERT(sc->sc_fmn_si == NULL);
+ sc->sc_fmn_si = softint_establish(SOFTINT_NET, fmn_softint, sc);
KASSERT(sc->sc_dev != NULL);
const char * const xname = device_xname(sc->sc_dev);
KASSERT(xname != NULL);
- struct evcnt * const ev = fmn_ev_getref();
- KASSERT(ev != NULL);
+ for (size_t i = 1; i < fmn_info.fmn_nstid; i++) {
+ evcnt_attach_dynamic(&sc->sc_fmn_stid_evcnts[i],
+ EVCNT_TYPE_MISC, NULL, xname, fmn_stid_ev_names[i]);
+ }
+
+ for (size_t i = 0; i < fmn_info.fmn_nbucket; i++) {
+ evcnt_attach_dynamic(&sc->sc_fmn_cpu_evcnts[i],
+ EVCNT_TYPE_MISC, NULL, xname, fmn->fmn_bucket_names[i]);
+ }
+}
+
+/*
+ * This must be done in the context of the thread itself.
+ */
+void
+rmixl_fmn_init_thread(void)
+{
+ fmn_info_t * const fmn = &fmn_info;
+ struct cpu_info * const ci = curcpu();
KASSERT(fmn->fmn_stinfo[0].si_name == NULL);
for (size_t i = 1; i < fmn_info.fmn_nstid; i++) {
KASSERT(fmn->fmn_stinfo[i].si_name != NULL);
-#if 0
- evcnt_attach_dynamic(&ev[i], EVCNT_TYPE_INTR, NULL,
- xname, fmn->fmn_stinfo[i].si_name);
-#endif
+ snprintf(fmn_stid_ev_names[i], sizeof(fmn_stid_ev_names[i]),
+ "fmn %s rx msgs", fmn->fmn_stinfo[i].si_name);
}
- fmn_ev_putref(ev);
-
if (CPU_IS_PRIMARY(ci)) {
KASSERT(rmixl_intr_lock != NULL);
/*
@@ -810,7 +822,7 @@ rmixl_fmn_init_thread(void)
mutex_enter(rmixl_intr_lock);
fmn->fmn_intr_vec = rmixl_intr_get_vec(IPL_VM);
void * const ih = rmixl_vec_establish(fmn->fmn_intr_vec, NULL,
- IPL_VM, fmn_intr_dispatch, NULL, true);
+ IPL_VM, fmn_intr, NULL, true);
if (ih == NULL)
panic("%s: rmixl_vec_establish failed", __func__);
mutex_exit(rmixl_intr_lock);
@@ -905,33 +917,74 @@ rmixl_fmn_intr_poll(u_int bucket, rmixl_
rmixl_cp2_restore(cp0_status);
}
+size_t
+rmixl_fmn_qid_to_stid(size_t qid)
+{
+ return fmn_info.fmn_qidtab[qid];
+}
+
+const char *
+rmixl_fmn_stid_name(size_t stid)
+{
+ KASSERT(stid != 0);
+ KASSERT(stid < fmn_info.fmn_nstid);
+ return fmn_info.fmn_stinfo[stid].si_name;
+}
+
static int
-fmn_intr_dispatch(void *arg)
+fmn_intr(void *arg)
+{
+ const bool is_xlp_p = cpu_rmixlp(mips_options.mips_cpu);
+ struct cpu_softc * const sc = curcpu()->ci_softc;
+
+ softint_schedule(sc->sc_fmn_si);
+ if (!is_xlp_p) {
+ /*
+ * On the XLR and XLS, we can only stop interrupts on a per
+ * core basis but then there are no per-thread resources so
+ * it doesn't really hurt.
+ */
+ const uint32_t cp0_status = rmixl_cp2_enable();
+ uint32_t msg_cfg = mips_mfc2(RMIXL_COP_2_MSG_CFG, 0);
+ msg_cfg &= ~(RMIXL_MSG_CFG0_EIE|RMIXL_MSG_CFG0_WIE);
+ mips_mtc2(RMIXL_COP_2_MSG_CFG, 0, msg_cfg);
+ rmixl_cp2_restore(cp0_status);
+ }
+ return 1;
+}
+
+static void
+fmn_softint(void *arg)
{
const bool is_xlp_p = cpu_rmixlp(mips_options.mips_cpu);
fmn_info_t * const fmn = &fmn_info;
- uint32_t mask;
- int rv = 0;
+ struct cpu_softc * const sc = curcpu()->ci_softc;
+ uint32_t mask = 0;
+ uint32_t processed = 0;
const uint32_t cp0_status = rmixl_cp2_enable();
- if (is_xlp_p) {
- uint32_t msg_rx_sts = mips_mfc2(RMIXLP_COP_2_MSG_RX_STS, 0);
- mask = __SHIFTOUT(~msg_rx_sts, RMIXLP_MSG_RX_STS_RXQVCE);
- } else {
- uint32_t msg_sts = mips_mfc2(RMIXL_COP_2_MSG_STS, 0);
- mask = __SHIFTOUT(~msg_sts, RMIXL_MSG_STS0_RFBE);
- }
+ for (;;) {
+ if (mask == 0) {
+ if (is_xlp_p) {
+ mask = __SHIFTOUT(
+ ~mips_mfc2(RMIXLP_COP_2_MSG_RX_STS,0),
+ RMIXLP_MSG_RX_STS_RXQVCE);
+ } else {
+ mask = __SHIFTOUT(
+ ~mips_mfc2(RMIXL_COP_2_MSG_STS,0),
+ RMIXL_MSG_STS0_RFBE);
+ }
+ if (mask == 0)
+ break;
+ }
- if (mask != 0) {
DPRINTF(("%s: non-empty q-mask %#x\n", __func__, mask));
- }
- struct evcnt * const ev = fmn_ev_getref(); // acquire per-cpu counters
+ const u_int rxq = ffs(mask) - 1;
+ processed = (1 << rxq);
- for (u_int rxq=0; mask != 0; rxq++, mask >>= 1) {
- if ((mask & 1) == 0)
- continue;
+ sc->sc_fmn_cpu_evcnts[rxq].ev_count++;
rmixl_fmn_rxmsg_t rxmsg;
if (!rmixl_fmn_msg_recv(rxq, &rxmsg))
@@ -939,20 +992,29 @@ fmn_intr_dispatch(void *arg)
const size_t txstid = fmn->fmn_qidtab[rxmsg.rxsid];
volatile fmn_intrhand_t * const ih = &fmn->fmn_intrhand[txstid];
+
membar_consumer(); // make sure arg is loaded before func
void * const ih_arg = ih->ih_arg;
+
membar_consumer(); // make sure arg is loaded before func
rmixl_fmn_intr_handler_t ih_func = ih->ih_func;
+
if ((*ih_func)(ih_arg, &rxmsg) != 0)
- ev[txstid].ev_count++;
- rv = 1;
+ sc->sc_fmn_stid_evcnts[txstid].ev_count++;
}
- fmn_ev_putref(ev); // release per-cpu counters
+ if (is_xlp_p) {
+ /*
+ * We need to set VC_PEND again so interrupts can get posted
+ * for the VCs we processed. This register is global for all
+ * threads on a core so only ACK the VCs we processed.
+ */
+ uint32_t msg_sts1 = mips_mfc2(RMIXLP_COP_2_MSG_STS1, 0);
+ msg_sts1 |= __SHIFTOUT(processed, RMIXLP_MSG_STS1_VC_PEND);
+ mips_mtc2(RMIXLP_COP_2_MSG_STS1, 0, msg_sts1);
+ }
rmixl_cp2_restore(cp0_status);
-
- return rv;
}
static bool
@@ -977,7 +1039,7 @@ rmixl_fmn_msg_send(u_int size, u_int cod
{
const bool is_xlp_p = cpu_rmixlp(mips_options.mips_cpu);
bool rv = false; /* assume failure */
-
+
KASSERT(1 <= size && size <= 4);
KASSERT(code < 0x100);
KASSERT(dest_id < (is_xlp_p ? 0x1000 : 0x80));
@@ -1107,7 +1169,7 @@ fmn_msgld_rmixl(u_int rxq, rmixl_fmn_rxm
/*
* rmixl_fmn_msg_recv
*
- * - assume cp2 access is already enabled
+ * - assume cp2 access is already enabled
*/
bool
rmixl_fmn_msg_recv(u_int rxq, rmixl_fmn_rxmsg_t *rxmsg)
Index: src/sys/arch/mips/rmi/rmixl_intr.c
diff -u src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.34 src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.35
--- src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.34 Wed Jan 4 16:17:53 2012
+++ src/sys/arch/mips/rmi/rmixl_intr.c Thu Jan 19 08:05:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_intr.c,v 1.1.2.34 2012/01/04 16:17:53 matt Exp $ */
+/* $NetBSD: rmixl_intr.c,v 1.1.2.35 2012/01/19 08:05:24 matt Exp $ */
/*-
* Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.34 2012/01/04 16:17:53 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.35 2012/01/19 08:05:24 matt Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -724,6 +724,7 @@ rmixl_intrvec_t rmixl_intrvec[NINTRVECS]
[0 ... NINTRVECS-1] = {
.iv_intrhand = {
.ih_func = rmixl_stray_intr,
+ .ih_arg = rmixl_stray_intr,
},
},
};
@@ -731,6 +732,7 @@ rmixl_intrvec_t rmixl_intrvec[NINTRVECS]
rmixl_intrhand_t rmixl_irt_intrhands[RMIXL_NIRTS] = {
[0 ... RMIXL_NIRTS-1] = {
.ih_func = rmixl_stray_intr,
+ .ih_arg = rmixl_stray_intr,
},
};
static u_int rmixl_nirts;
@@ -944,7 +946,7 @@ rmixl_intr_init_ipi(void)
void
rmixl_intr_init_cpu(struct cpu_info *ci)
{
- struct rmixl_cpu_softc * const sc = (void *)ci->ci_softc;
+ struct cpu_softc * const sc = ci->ci_softc;
const char * xname = device_xname(sc->sc_dev);
KASSERT(sc != NULL);
@@ -1304,6 +1306,7 @@ rmixl_vec_disestablish(void *cookie)
KASSERT(mutex_owned(rmixl_intr_lock));
KASSERT(vec < NINTRVECS);
KASSERT(ih->ih_func != rmixl_stray_intr);
+ KASSERT(ih->ih_arg != rmixl_stray_intr);
KASSERT(IPL_VM <= iv->iv_ipl && iv->iv_ipl <= IPL_HIGH);
LIST_REMOVE(ih, ih_link);
@@ -1318,7 +1321,7 @@ rmixl_vec_disestablish(void *cookie)
ih->ih_vec = 0;
ih->ih_mpsafe = false;
- ih->ih_arg = NULL;
+ ih->ih_arg = rmixl_stray_intr;
/*
* If this vector isn't servicing any interrupts, then check to
@@ -1370,7 +1373,7 @@ rmixl_intr_disestablish(void *cookie)
void
evbmips_iointr(int ipl, vaddr_t pc, uint32_t pending)
{
- struct rmixl_cpu_softc * const sc = (void *)curcpu()->ci_softc;
+ struct cpu_softc * const sc = curcpu()->ci_softc;
const bool is_xlp_p = cpu_rmixlp(mips_options.mips_cpu);
DPRINTF(("%s: cpu%u: ipl %d, pc %#"PRIxVADDR", pending %#x\n",
@@ -1462,13 +1465,13 @@ rmixl_send_ipi(struct cpu_info *ci, int
KASSERT(tag >= 0 && tag < NIPIS);
if (is_xlp_p) {
- r = RMXLP_PIC_IPI_CTRL_MAKE(0, __BIT(cpuid & 15),
- RMIXL_INTERVEC_IPI + tag);
+ r = RMIXLP_PIC_IPI_CTRL_MAKE(0, __BIT(cpuid & 15),
+ RMIXL_INTRVEC_IPI + tag);
} else {
const uint32_t core = (uint32_t)(cpuid >> 2);
const uint32_t thread = (uint32_t)(cpuid & __BITS(1,0));
- r = RMXLP_PIC_IPI_CTRL_MAKE(0, core, thread,
- RMIXL_INTERVEC_IPI + tag);
+ r = RMIXL_PIC_IPIBASE_MAKE(0, core, thread,
+ RMIXL_INTRVEC_IPI + tag);
}
mutex_enter(rmixl_ipi_lock);