diff options
Diffstat (limited to 'sys/arch/octeon/dev/cn30xxpow.c')
-rw-r--r-- | sys/arch/octeon/dev/cn30xxpow.c | 134 |
1 files changed, 1 insertions, 133 deletions
diff --git a/sys/arch/octeon/dev/cn30xxpow.c b/sys/arch/octeon/dev/cn30xxpow.c index 89aadd9c2d6..923397e8c62 100644 --- a/sys/arch/octeon/dev/cn30xxpow.c +++ b/sys/arch/octeon/dev/cn30xxpow.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cn30xxpow.c,v 1.15 2017/11/18 11:27:37 visa Exp $ */ +/* $OpenBSD: cn30xxpow.c,v 1.16 2017/12/05 15:26:47 visa Exp $ */ /* * Copyright (c) 2007 Internet Initiative Japan, Inc. @@ -28,61 +28,23 @@ #include <sys/param.h> #include <sys/systm.h> -#include <sys/kernel.h> /* hz */ -#include <sys/malloc.h> #include <machine/bus.h> #include <machine/octeonvar.h> #include <octeon/dev/iobusvar.h> -#include <octeon/dev/cn30xxciureg.h> /* XXX */ #include <octeon/dev/cn30xxpowreg.h> #include <octeon/dev/cn30xxpowvar.h> -struct cn30xxpow_intr_handle { - void *pi_ih; - struct cn30xxpow_softc *pi_sc; - int pi_group; - void (*pi_cb)(void *, uint64_t *); - void *pi_data; -}; - void cn30xxpow_bootstrap(struct octeon_config *); void cn30xxpow_init(struct cn30xxpow_softc *); void cn30xxpow_init_regs(struct cn30xxpow_softc *); -void cn30xxpow_config_int_pc(struct cn30xxpow_softc *, int); void cn30xxpow_config_int(struct cn30xxpow_softc *, int, uint64_t, uint64_t, uint64_t); -void cn30xxpow_intr_work(struct cn30xxpow_softc *, - struct cn30xxpow_intr_handle *, int); -int cn30xxpow_intr(void *); -/* XXX */ struct cn30xxpow_softc cn30xxpow_softc; -/* - * XXX: parameter tuning is needed: see files.octeon - */ -#ifndef OCTEON_ETH_RING_MAX -#define OCTEON_ETH_RING_MAX 512 -#endif -#ifndef OCTEON_ETH_RING_MIN -#define OCTEON_ETH_RING_MIN 1 -#endif - -#ifdef OCTEON_ETH_INTR_FEEDBACK_RING -int max_recv_cnt = OCTEON_ETH_RING_MAX; -int min_recv_cnt = OCTEON_ETH_RING_MIN; -int recv_cnt = OCTEON_ETH_RING_MIN; -int int_rate = 1; -#else -/* infinity */ -int max_recv_cnt = 0; -int min_recv_cnt = 0; -int recv_cnt = 0; -#endif - /* -------------------------------------------------------------------------- */ /* ---- operation primitive functions */ @@ -168,34 +130,6 @@ cn30xxpow_config(struct cn30xxpow_softc *sc, int group) 0x00); /* IQ */ } -void * -cn30xxpow_intr_establish(int group, int level, - void (*cb)(void *, uint64_t *), void (*fcb)(int*, int *, uint64_t, void *), - void *data, char *what) -{ - struct cn30xxpow_intr_handle *pow_ih; - - KASSERT(group >= 0); - KASSERT(group < 16); - - pow_ih = malloc(sizeof(*pow_ih), M_DEVBUF, M_NOWAIT); - if (pow_ih == NULL) - return NULL; - - pow_ih->pi_ih = octeon_intr_establish( - ffs64(CIU_INTX_SUM0_WORKQ_0) - 1 + group, - level, - cn30xxpow_intr, pow_ih, what); - KASSERT(pow_ih->pi_ih != NULL); - - pow_ih->pi_sc = &cn30xxpow_softc; - pow_ih->pi_group = group; - pow_ih->pi_cb = cb; - pow_ih->pi_data = data; - - return pow_ih; -} - void cn30xxpow_init(struct cn30xxpow_softc *sc) { @@ -215,69 +149,3 @@ cn30xxpow_init_regs(struct cn30xxpow_softc *sc) if (status != 0) panic("can't map %s space", "pow register"); } - -/* -------------------------------------------------------------------------- */ - -/* ---- interrupt handling */ - -/* - * Interrupt handling by fixed count. - * - * XXX the fixed count (MAX_RX_CNT) could be changed dynamically? - * - * XXX this does not utilize "tag switch" very well - */ -/* - * usually all packet recieve - */ -#define MAX_RX_CNT 0x7fffffff - -void -cn30xxpow_intr_work(struct cn30xxpow_softc *sc, - struct cn30xxpow_intr_handle *pow_ih, int max_recv_cnt) -{ - uint64_t *work; - uint64_t count = 0; - uint32_t coreid = octeon_get_coreid(); - int recv_cnt = MAX_RX_CNT; - - _POW_WR8(sc, POW_PP_GRP_MSK_OFFSET(coreid), 1ULL << pow_ih->pi_group); - - if (max_recv_cnt > 0) - recv_cnt = max_recv_cnt - 1; - - cn30xxpow_tag_sw_wait(); - cn30xxpow_work_request_async(OCTEON_CVMSEG_OFFSET(csm_pow_intr), - POW_NO_WAIT); - - for (count = 0; count < recv_cnt; count++) { - work = (uint64_t *)cn30xxpow_work_response_async( - OCTEON_CVMSEG_OFFSET(csm_pow_intr)); - if (work == NULL) - return; - cn30xxpow_tag_sw_wait(); - cn30xxpow_work_request_async( - OCTEON_CVMSEG_OFFSET(csm_pow_intr), POW_NO_WAIT); - (*pow_ih->pi_cb)(pow_ih->pi_data, work); - } - - work = (uint64_t *)cn30xxpow_work_response_async( - OCTEON_CVMSEG_OFFSET(csm_pow_intr)); - if (work == NULL) - return; - - (*pow_ih->pi_cb)(pow_ih->pi_data, work); -} - -int -cn30xxpow_intr(void *data) -{ - struct cn30xxpow_intr_handle *pow_ih = data; - struct cn30xxpow_softc *sc = pow_ih->pi_sc; - uint64_t wq_int_mask = 0x1ULL << pow_ih->pi_group; - - cn30xxpow_intr_work(sc, pow_ih, recv_cnt); - - _POW_WR8(sc, POW_WQ_INT_OFFSET, wq_int_mask << POW_WQ_INT_WQ_INT_SHIFT); - return 1; -} |