diff options
author | Vakul Garg <vakul@freescale.com> | 2014-03-11 09:46:35 (GMT) |
---|---|---|
committer | Jose Rivera <German.Rivera@freescale.com> | 2014-03-26 00:58:42 (GMT) |
commit | 27df142b9bd2957c897529abd2fd7bc86b0671f8 (patch) | |
tree | c4d9aedfb44fdc0ead072eecc4ac9937749fb727 /drivers/staging/fsl_qbman/qman_low.h | |
parent | 18083beb1af06a825df880ea61c7431f91eb65d2 (diff) | |
download | linux-fsl-qoriq-27df142b9bd2957c897529abd2fd7bc86b0671f8.tar.xz |
qbman: Added DQRR cleanup when portal is not in cdc mode
To acknowledge a DQRR entry, the portal should be preserved in same mode
as it was when the DQRR entry was created. Function qm_dqrr_init() is
invoked when a raw portal is released back. The raw portal could be
either in one of cci or cci or cdc modes. So while cleaning up a portal
using qm_dqrr_init(), the dqrr consumption mode should be read and
accordingly approriate DQRR consumption routine should be invoked.
Signed-off-by: Vakul Garg <vakul@freescale.com>
Change-Id: I07b412915cd483060147a845cfe935d0bd7f2024
Reviewed-on: http://git.am.freescale.net:8181/9634
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Roy Pledge <roy.pledge@freescale.com>
Reviewed-by: Geoff Thorpe <Geoff.Thorpe@freescale.com>
Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/staging/fsl_qbman/qman_low.h')
-rw-r--r-- | drivers/staging/fsl_qbman/qman_low.h | 70 |
1 files changed, 47 insertions, 23 deletions
diff --git a/drivers/staging/fsl_qbman/qman_low.h b/drivers/staging/fsl_qbman/qman_low.h index b624f67..5d3e820 100644 --- a/drivers/staging/fsl_qbman/qman_low.h +++ b/drivers/staging/fsl_qbman/qman_low.h @@ -536,6 +536,30 @@ static inline void qm_dqrr_set_maxfill(struct qm_portal *portal, u8 mf) ((mf & (QM_DQRR_SIZE - 1)) << 20)); } +static inline void qm_dqrr_cci_consume(struct qm_portal *portal, u8 num) +{ + register struct qm_dqrr *dqrr = &portal->dqrr; + DPA_ASSERT(dqrr->cmode == qm_dqrr_cci); + dqrr->ci = (dqrr->ci + num) & (QM_DQRR_SIZE - 1); + qm_out(DQRR_CI_CINH, dqrr->ci); +} + +static inline void qm_dqrr_cce_consume(struct qm_portal *portal, u8 num) +{ + register struct qm_dqrr *dqrr = &portal->dqrr; + DPA_ASSERT(dqrr->cmode == qm_dqrr_cce); + dqrr->ci = (dqrr->ci + num) & (QM_DQRR_SIZE - 1); + qm_cl_out(DQRR_CI, dqrr->ci); +} + +static inline void qm_dqrr_cdc_consume_n(struct qm_portal *portal, u16 bitmask) +{ + __maybe_unused register struct qm_dqrr *dqrr = &portal->dqrr; + DPA_ASSERT(dqrr->cmode == qm_dqrr_cdc); + qm_out(DQRR_DCAP, (1 << 8) | /* DQRR_DCAP::S */ + ((u32)bitmask << 16)); /* DQRR_DCAP::DCAP_CI */ +} + static inline int qm_dqrr_init(struct qm_portal *portal, const struct qm_portal_config *config, enum qm_dqrr_dmode dmode, @@ -557,6 +581,29 @@ static inline int qm_dqrr_init(struct qm_portal *portal, dqrr->vbit = (qm_in(DQRR_PI_CINH) & QM_DQRR_SIZE) ? QM_DQRR_VERB_VBIT : 0; dqrr->ithresh = qm_in(DQRR_ITR); + + /* Free up pending DQRR entries if any as per current DCM */ + if (dqrr->fill) { + enum qm_dqrr_cmode dcm = (qm_in(CFG) >> 16) & 3; + +#ifdef CONFIG_FSL_DPA_CHECKING + dqrr->cmode = dcm; +#endif + switch (dcm) { + case qm_dqrr_cci: + qm_dqrr_cci_consume(portal, dqrr->fill); + break; + case qm_dqrr_cce: + qm_dqrr_cce_consume(portal, dqrr->fill); + break; + case qm_dqrr_cdc: + qm_dqrr_cdc_consume_n(portal, (QM_DQRR_SIZE - 1)); + break; + default: + DPA_ASSERT(0); + } + } + #ifdef CONFIG_FSL_DPA_CHECKING dqrr->dmode = dmode; dqrr->pmode = pmode; @@ -655,13 +702,6 @@ static inline void qm_dqrr_pvb_update(struct qm_portal *portal) } } -static inline void qm_dqrr_cci_consume(struct qm_portal *portal, u8 num) -{ - register struct qm_dqrr *dqrr = &portal->dqrr; - DPA_ASSERT(dqrr->cmode == qm_dqrr_cci); - dqrr->ci = (dqrr->ci + num) & (QM_DQRR_SIZE - 1); - qm_out(DQRR_CI_CINH, dqrr->ci); -} static inline void qm_dqrr_cci_consume_to_current(struct qm_portal *portal) { @@ -679,14 +719,6 @@ static inline void qm_dqrr_cce_prefetch(struct qm_portal *portal) qm_cl_touch_rw(DQRR_CI); } -static inline void qm_dqrr_cce_consume(struct qm_portal *portal, u8 num) -{ - register struct qm_dqrr *dqrr = &portal->dqrr; - DPA_ASSERT(dqrr->cmode == qm_dqrr_cce); - dqrr->ci = (dqrr->ci + num) & (QM_DQRR_SIZE - 1); - qm_cl_out(DQRR_CI, dqrr->ci); -} - static inline void qm_dqrr_cce_consume_to_current(struct qm_portal *portal) { register struct qm_dqrr *dqrr = &portal->dqrr; @@ -720,14 +752,6 @@ static inline void qm_dqrr_cdc_consume_1ptr(struct qm_portal *portal, idx); /* DQRR_DCAP::DCAP_CI */ } -static inline void qm_dqrr_cdc_consume_n(struct qm_portal *portal, u16 bitmask) -{ - __maybe_unused register struct qm_dqrr *dqrr = &portal->dqrr; - DPA_ASSERT(dqrr->cmode == qm_dqrr_cdc); - qm_out(DQRR_DCAP, (1 << 8) | /* DQRR_DCAP::S */ - ((u32)bitmask << 16)); /* DQRR_DCAP::DCAP_CI */ -} - static inline u8 qm_dqrr_cdc_cci(struct qm_portal *portal) { __maybe_unused register struct qm_dqrr *dqrr = &portal->dqrr; |