bus/fslmc: add dynamic config for memback portal mode
[dpdk.git] / drivers / bus / fslmc / qbman / qbman_portal.c
index 2f572a0..08bfdc9 100644 (file)
@@ -194,7 +194,8 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
        p->sdq |= qbman_sdqcr_dct_prio_ics << QB_SDQCR_DCT_SHIFT;
        p->sdq |= qbman_sdqcr_fc_up_to_3 << QB_SDQCR_FC_SHIFT;
        p->sdq |= QMAN_SDQCR_TOKEN << QB_SDQCR_TOK_SHIFT;
-       if ((d->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000)
+       if ((d->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+                       && (d->cena_access_mode == qman_cena_fastest_access))
                p->mr.valid_bit = QB_VALID_BIT;
 
        atomic_set(&p->vdq.busy, 1);
@@ -233,7 +234,8 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
        qbman_cinh_write(&p->sys, QBMAN_CINH_SWP_SDQCR, 0);
 
        p->eqcr.pi_ring_size = 8;
-       if ((qman_version & 0xFFFF0000) >= QMAN_REV_5000) {
+       if ((qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+                       && (d->cena_access_mode == qman_cena_fastest_access)) {
                p->eqcr.pi_ring_size = 32;
                qbman_swp_enqueue_array_mode_ptr =
                                qbman_swp_enqueue_array_mode_mem_back;
@@ -253,7 +255,8 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
        eqcr_pi = qbman_cinh_read(&p->sys, QBMAN_CINH_SWP_EQCR_PI);
        p->eqcr.pi = eqcr_pi & p->eqcr.pi_mask;
        p->eqcr.pi_vb = eqcr_pi & QB_VALID_BIT;
-       if ((p->desc.qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
+       if ((p->desc.qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+                       && (d->cena_access_mode == qman_cena_fastest_access))
                p->eqcr.ci = qbman_cinh_read(&p->sys,
                                QBMAN_CINH_SWP_EQCR_CI) & p->eqcr.pi_mask;
        else
@@ -362,10 +365,11 @@ void *qbman_swp_mc_start(struct qbman_swp *p)
 #ifdef QBMAN_CHECKING
        QBMAN_BUG_ON(p->mc.check != swp_mc_can_start);
 #endif
-       if ((p->desc.qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
-               ret = qbman_cena_write_start(&p->sys, QBMAN_CENA_SWP_CR);
-       else
+       if ((p->desc.qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+                   && (p->desc.cena_access_mode == qman_cena_fastest_access))
                ret = qbman_cena_write_start(&p->sys, QBMAN_CENA_SWP_CR_MEM);
+       else
+               ret = qbman_cena_write_start(&p->sys, QBMAN_CENA_SWP_CR);
 #ifdef QBMAN_CHECKING
        if (!ret)
                p->mc.check = swp_mc_can_submit;
@@ -385,16 +389,17 @@ void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, uint8_t cmd_verb)
         * caller wants to OR but has forgotten to do so.
         */
        QBMAN_BUG_ON((*v & cmd_verb) != *v);
-       if ((p->desc.qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
-               dma_wmb();
-               *v = cmd_verb | p->mc.valid_bit;
-               qbman_cena_write_complete(&p->sys, QBMAN_CENA_SWP_CR, cmd);
-               clean(cmd);
-       } else {
+       if ((p->desc.qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+                   && (p->desc.cena_access_mode == qman_cena_fastest_access)) {
                *v = cmd_verb | p->mr.valid_bit;
                qbman_cena_write_complete(&p->sys, QBMAN_CENA_SWP_CR_MEM, cmd);
                dma_wmb();
                qbman_cinh_write(&p->sys, QBMAN_CINH_SWP_CR_RT, QMAN_RT_MODE);
+       } else {
+               dma_wmb();
+               *v = cmd_verb | p->mc.valid_bit;
+               qbman_cena_write_complete(&p->sys, QBMAN_CENA_SWP_CR, cmd);
+               clean(cmd);
        }
 #ifdef QBMAN_CHECKING
        p->mc.check = swp_mc_can_poll;
@@ -407,30 +412,31 @@ void *qbman_swp_mc_result(struct qbman_swp *p)
 #ifdef QBMAN_CHECKING
        QBMAN_BUG_ON(p->mc.check != swp_mc_can_poll);
 #endif
-       if ((p->desc.qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
-               qbman_cena_invalidate_prefetch(&p->sys,
-                               QBMAN_CENA_SWP_RR(p->mc.valid_bit));
-               ret = qbman_cena_read(&p->sys,
-                               QBMAN_CENA_SWP_RR(p->mc.valid_bit));
+       if ((p->desc.qman_version & QMAN_REV_MASK) >= QMAN_REV_5000
+               && (p->desc.cena_access_mode == qman_cena_fastest_access)) {
+               ret = qbman_cena_read(&p->sys, QBMAN_CENA_SWP_RR_MEM);
+               /* Command completed if the valid bit is toggled */
+               if (p->mr.valid_bit != (ret[0] & QB_VALID_BIT))
+                       return NULL;
                /* Remove the valid-bit -
                 * command completed iff the rest is non-zero
                 */
                verb = ret[0] & ~QB_VALID_BIT;
                if (!verb)
                        return NULL;
-               p->mc.valid_bit ^= QB_VALID_BIT;
+               p->mr.valid_bit ^= QB_VALID_BIT;
        } else {
-               ret = qbman_cena_read(&p->sys, QBMAN_CENA_SWP_RR_MEM);
-               /* Command completed if the valid bit is toggled */
-               if (p->mr.valid_bit != (ret[0] & QB_VALID_BIT))
-                       return NULL;
+               qbman_cena_invalidate_prefetch(&p->sys,
+                       QBMAN_CENA_SWP_RR(p->mc.valid_bit));
+               ret = qbman_cena_read(&p->sys,
+                                     QBMAN_CENA_SWP_RR(p->mc.valid_bit));
                /* Remove the valid-bit -
                 * command completed iff the rest is non-zero
                 */
                verb = ret[0] & ~QB_VALID_BIT;
                if (!verb)
                        return NULL;
-               p->mr.valid_bit ^= QB_VALID_BIT;
+               p->mc.valid_bit ^= QB_VALID_BIT;
        }
 #ifdef QBMAN_CHECKING
        p->mc.check = swp_mc_can_start;