Store the offset of the KDOORBELL and GTS registers in the softc.
VF devices use a different register layout than PF devices. Storing the offset in a value in the softc allows code to be shared between the PF and VF drivers. Reviewed by: np Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D7389
This commit is contained in:
parent
c7299da72a
commit
dbc3216678
@ -781,6 +781,8 @@ struct adapter {
|
||||
struct sge_rxq *rxq;
|
||||
struct sge_nm_rxq *nm_rxq;
|
||||
} __aligned(CACHE_LINE_SIZE) *irq;
|
||||
int sge_gts_reg;
|
||||
int sge_kdoorbell_reg;
|
||||
|
||||
bus_dma_tag_t dmat; /* Parent DMA tag */
|
||||
|
||||
|
@ -172,7 +172,7 @@ create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
|
||||
|
||||
cq->gen = 1;
|
||||
cq->gts = (void *)((unsigned long)rman_get_virtual(sc->regs_res) +
|
||||
MYPF_REG(SGE_PF_GTS));
|
||||
sc->sge_gts_reg);
|
||||
cq->rdev = rdev;
|
||||
|
||||
if (user) {
|
||||
|
@ -182,9 +182,9 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
|
||||
pci_unmap_addr_set(&wq->rq, mapping, wq->rq.dma_addr);
|
||||
|
||||
wq->db = (void *)((unsigned long)rman_get_virtual(sc->regs_res) +
|
||||
MYPF_REG(SGE_PF_KDOORBELL));
|
||||
sc->sge_kdoorbell_reg);
|
||||
wq->gts = (void *)((unsigned long)rman_get_virtual(rdev->adap->regs_res)
|
||||
+ MYPF_REG(SGE_PF_GTS));
|
||||
+ sc->sge_gts_reg);
|
||||
if (user) {
|
||||
wq->sq.udb = (u64)((char*)rman_get_virtual(rdev->adap->udbs_res) +
|
||||
(wq->sq.qid << rdev->qpshift));
|
||||
|
@ -697,6 +697,8 @@ t4_attach(device_t dev)
|
||||
sc->params.pci.mps = 128 << ((v & PCIEM_CTL_MAX_PAYLOAD) >> 5);
|
||||
}
|
||||
|
||||
sc->sge_gts_reg = MYPF_REG(A_SGE_PF_GTS);
|
||||
sc->sge_kdoorbell_reg = MYPF_REG(A_SGE_PF_KDOORBELL);
|
||||
sc->traceq = -1;
|
||||
mtx_init(&sc->ifp_lock, sc->ifp_lockname, 0, MTX_DEF);
|
||||
snprintf(sc->ifp_lockname, sizeof(sc->ifp_lockname), "%s tracer",
|
||||
|
@ -204,7 +204,7 @@ alloc_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq *nm_rxq, int cong)
|
||||
}
|
||||
}
|
||||
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
|
||||
t4_write_reg(sc, sc->sge_gts_reg,
|
||||
V_INGRESSQID(nm_rxq->iq_cntxt_id) |
|
||||
V_SEINTARM(V_QINTR_TIMER_IDX(holdoff_tmr_idx)));
|
||||
|
||||
@ -364,7 +364,7 @@ cxgbe_netmap_on(struct adapter *sc, struct vi_info *vi, struct ifnet *ifp,
|
||||
MPASS((j & 7) == 0);
|
||||
j /= 8; /* driver pidx to hardware pidx */
|
||||
wmb();
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
nm_rxq->fl_db_val | V_PIDX(j));
|
||||
|
||||
atomic_cmpset_int(&irq->nm_state, NM_OFF, NM_ON);
|
||||
@ -537,7 +537,7 @@ ring_nm_txq_db(struct adapter *sc, struct sge_nm_txq *nm_txq)
|
||||
break;
|
||||
|
||||
case DOORBELL_KDB:
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
V_QID(nm_txq->cntxt_id) | V_PIDX(n));
|
||||
break;
|
||||
}
|
||||
@ -818,7 +818,7 @@ cxgbe_netmap_rxsync(struct netmap_kring *kring, int flags)
|
||||
}
|
||||
if (++dbinc == 8 && n >= 32) {
|
||||
wmb();
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
nm_rxq->fl_db_val | V_PIDX(dbinc));
|
||||
dbinc = 0;
|
||||
}
|
||||
@ -827,7 +827,7 @@ cxgbe_netmap_rxsync(struct netmap_kring *kring, int flags)
|
||||
|
||||
if (dbinc > 0) {
|
||||
wmb();
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
nm_rxq->fl_db_val | V_PIDX(dbinc));
|
||||
}
|
||||
}
|
||||
@ -981,14 +981,14 @@ t4_nm_intr(void *arg)
|
||||
fl_credits /= 8;
|
||||
IDXINCR(nm_rxq->fl_pidx, fl_credits * 8,
|
||||
nm_rxq->fl_sidx);
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
nm_rxq->fl_db_val | V_PIDX(fl_credits));
|
||||
fl_credits = fl_cidx & 7;
|
||||
} else if (!black_hole) {
|
||||
netmap_rx_irq(ifp, nm_rxq->nid, &work);
|
||||
MPASS(work != 0);
|
||||
}
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
|
||||
t4_write_reg(sc, sc->sge_gts_reg,
|
||||
V_CIDXINC(n) | V_INGRESSQID(nm_rxq->iq_cntxt_id) |
|
||||
V_SEINTARM(V_QINTR_TIMER_IDX(X_TIMERREG_UPDATE_CIDX)));
|
||||
n = 0;
|
||||
@ -999,12 +999,12 @@ t4_nm_intr(void *arg)
|
||||
if (black_hole) {
|
||||
fl_credits /= 8;
|
||||
IDXINCR(nm_rxq->fl_pidx, fl_credits * 8, nm_rxq->fl_sidx);
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
nm_rxq->fl_db_val | V_PIDX(fl_credits));
|
||||
} else
|
||||
netmap_rx_irq(ifp, nm_rxq->nid, &work);
|
||||
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(n) |
|
||||
t4_write_reg(sc, sc->sge_gts_reg, V_CIDXINC(n) |
|
||||
V_INGRESSQID((u32)nm_rxq->iq_cntxt_id) |
|
||||
V_SEINTARM(V_QINTR_TIMER_IDX(holdoff_tmr_idx)));
|
||||
}
|
||||
|
@ -1474,7 +1474,7 @@ service_iq(struct sge_iq *iq, int budget)
|
||||
d = &iq->desc[0];
|
||||
}
|
||||
if (__predict_false(++ndescs == limit)) {
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
|
||||
t4_write_reg(sc, sc->sge_gts_reg,
|
||||
V_CIDXINC(ndescs) |
|
||||
V_INGRESSQID(iq->cntxt_id) |
|
||||
V_SEINTARM(V_QINTR_TIMER_IDX(X_TIMERREG_UPDATE_CIDX)));
|
||||
@ -1529,7 +1529,7 @@ process_iql:
|
||||
}
|
||||
#endif
|
||||
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(ndescs) |
|
||||
t4_write_reg(sc, sc->sge_gts_reg, V_CIDXINC(ndescs) |
|
||||
V_INGRESSQID((u32)iq->cntxt_id) | V_SEINTARM(iq->intr_params));
|
||||
|
||||
if (iq->flags & IQ_HAS_FL) {
|
||||
@ -2793,7 +2793,7 @@ alloc_iq_fl(struct vi_info *vi, struct sge_iq *iq, struct sge_fl *fl,
|
||||
|
||||
/* Enable IQ interrupts */
|
||||
atomic_store_rel_int(&iq->state, IQS_IDLE);
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_SEINTARM(iq->intr_params) |
|
||||
t4_write_reg(sc, sc->sge_gts_reg, V_SEINTARM(iq->intr_params) |
|
||||
V_INGRESSQID(iq->cntxt_id));
|
||||
|
||||
return (0);
|
||||
@ -3676,7 +3676,7 @@ ring_fl_db(struct adapter *sc, struct sge_fl *fl)
|
||||
if (fl->udb)
|
||||
*fl->udb = htole32(v);
|
||||
else
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL), v);
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg, v);
|
||||
IDXINCR(fl->dbidx, n, fl->sidx);
|
||||
}
|
||||
|
||||
@ -4409,7 +4409,7 @@ ring_eq_db(struct adapter *sc, struct sge_eq *eq, u_int n)
|
||||
break;
|
||||
|
||||
case DOORBELL_KDB:
|
||||
t4_write_reg(sc, MYPF_REG(A_SGE_PF_KDOORBELL),
|
||||
t4_write_reg(sc, sc->sge_kdoorbell_reg,
|
||||
V_QID(eq->cntxt_id) | V_PIDX(n));
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user