Author: jhb
Date: Mon Aug  1 22:39:51 2016
New Revision: 303647
URL: https://svnweb.freebsd.org/changeset/base/303647

Log:
  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

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/iw_cxgbe/cq.c
  head/sys/dev/cxgbe/iw_cxgbe/qp.c
  head/sys/dev/cxgbe/t4_main.c
  head/sys/dev/cxgbe/t4_netmap.c
  head/sys/dev/cxgbe/t4_sge.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Mon Aug  1 22:22:11 2016        
(r303646)
+++ head/sys/dev/cxgbe/adapter.h        Mon Aug  1 22:39:51 2016        
(r303647)
@@ -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 */
 

Modified: head/sys/dev/cxgbe/iw_cxgbe/cq.c
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/cq.c    Mon Aug  1 22:22:11 2016        
(r303646)
+++ head/sys/dev/cxgbe/iw_cxgbe/cq.c    Mon Aug  1 22:39:51 2016        
(r303647)
@@ -172,7 +172,7 @@ create_cq(struct c4iw_rdev *rdev, struct
 
        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) {

Modified: head/sys/dev/cxgbe/iw_cxgbe/qp.c
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/qp.c    Mon Aug  1 22:22:11 2016        
(r303646)
+++ head/sys/dev/cxgbe/iw_cxgbe/qp.c    Mon Aug  1 22:39:51 2016        
(r303647)
@@ -182,9 +182,9 @@ static int create_qp(struct c4iw_rdev *r
        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));

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Mon Aug  1 22:22:11 2016        
(r303646)
+++ head/sys/dev/cxgbe/t4_main.c        Mon Aug  1 22:39:51 2016        
(r303647)
@@ -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",

Modified: head/sys/dev/cxgbe/t4_netmap.c
==============================================================================
--- head/sys/dev/cxgbe/t4_netmap.c      Mon Aug  1 22:22:11 2016        
(r303646)
+++ head/sys/dev/cxgbe/t4_netmap.c      Mon Aug  1 22:39:51 2016        
(r303647)
@@ -204,7 +204,7 @@ alloc_nm_rxq_hwq(struct vi_info *vi, str
                }
        }
 
-       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, stru
                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, struc
                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 
                        }
                        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 
 
                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)));
 }

Modified: head/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- head/sys/dev/cxgbe/t4_sge.c Mon Aug  1 22:22:11 2016        (r303646)
+++ head/sys/dev/cxgbe/t4_sge.c Mon Aug  1 22:39:51 2016        (r303647)
@@ -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 s
 
        /* 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 sg
        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 sg
                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;
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to