soc/qman: Fix accesses to fqid, cleanup
Preventively mask every access to the 'fqid' h/w field, since it is defined as a 24-bit field, for every h/w descriptor. Add generic accessors for this field to ensure correct access. Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> Signed-off-by: Scott Wood <oss@buserror.net>
This commit is contained in:
Родитель
7ff07da015
Коммит
d6753c7e65
|
@ -471,7 +471,7 @@ static inline void eqcr_commit_checks(struct qm_eqcr *eqcr)
|
|||
{
|
||||
DPAA_ASSERT(eqcr->busy);
|
||||
DPAA_ASSERT(eqcr->cursor->orp == (eqcr->cursor->orp & 0x00ffffff));
|
||||
DPAA_ASSERT(eqcr->cursor->fqid == (eqcr->cursor->fqid & 0x00ffffff));
|
||||
DPAA_ASSERT(!(eqcr->cursor->fqid & ~QM_FQID_MASK));
|
||||
DPAA_ASSERT(eqcr->available >= 1);
|
||||
}
|
||||
|
||||
|
@ -1387,7 +1387,7 @@ static void qm_mr_process_task(struct work_struct *work)
|
|||
case QM_MR_VERB_FQRN:
|
||||
case QM_MR_VERB_FQRL:
|
||||
/* Lookup in the retirement table */
|
||||
fq = fqid_to_fq(msg->fq.fqid);
|
||||
fq = fqid_to_fq(qm_fqid_get(&msg->fq));
|
||||
if (WARN_ON(!fq))
|
||||
break;
|
||||
fq_state_change(p, fq, msg, verb);
|
||||
|
@ -1755,7 +1755,7 @@ int qman_init_fq(struct qman_fq *fq, u32 flags, struct qm_mcc_initfq *opts)
|
|||
mcc = qm_mc_start(&p->p);
|
||||
if (opts)
|
||||
mcc->initfq = *opts;
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
mcc->initfq.count = 0;
|
||||
/*
|
||||
* If the FQ does *not* have the TO_DCPORTAL flag, contextB is set as a
|
||||
|
@ -1851,7 +1851,7 @@ int qman_schedule_fq(struct qman_fq *fq)
|
|||
goto out;
|
||||
}
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_SCHED);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
dev_err(p->config->dev, "ALTER_SCHED timeout\n");
|
||||
|
@ -1894,7 +1894,7 @@ int qman_retire_fq(struct qman_fq *fq, u32 *flags)
|
|||
goto out;
|
||||
}
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_RETIRE);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
dev_crit(p->config->dev, "ALTER_RETIRE timeout\n");
|
||||
|
@ -1937,7 +1937,7 @@ int qman_retire_fq(struct qman_fq *fq, u32 *flags)
|
|||
|
||||
msg.verb = QM_MR_VERB_FQRNI;
|
||||
msg.fq.fqs = mcr->alterfq.fqs;
|
||||
msg.fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&msg.fq, fq->fqid);
|
||||
msg.fq.contextB = fq_to_tag(fq);
|
||||
fq->cb.fqs(p, fq, &msg);
|
||||
}
|
||||
|
@ -1973,7 +1973,7 @@ int qman_oos_fq(struct qman_fq *fq)
|
|||
goto out;
|
||||
}
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_OOS);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
ret = -ETIMEDOUT;
|
||||
|
@ -1999,7 +1999,7 @@ int qman_query_fq(struct qman_fq *fq, struct qm_fqd *fqd)
|
|||
int ret = 0;
|
||||
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_QUERYFQ);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
ret = -ETIMEDOUT;
|
||||
|
@ -2025,7 +2025,7 @@ static int qman_query_fq_np(struct qman_fq *fq,
|
|||
int ret = 0;
|
||||
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fq->fqid;
|
||||
qm_fqid_set(&mcc->fq, fq->fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_QUERYFQ_NP);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
ret = -ETIMEDOUT;
|
||||
|
@ -2206,7 +2206,7 @@ int qman_enqueue(struct qman_fq *fq, const struct qm_fd *fd)
|
|||
if (unlikely(!eq))
|
||||
goto out;
|
||||
|
||||
eq->fqid = fq->fqid;
|
||||
qm_fqid_set(eq, fq->fqid);
|
||||
eq->tag = fq_to_tag(fq);
|
||||
eq->fd = *fd;
|
||||
|
||||
|
@ -2468,7 +2468,7 @@ static int _qm_dqrr_consume_and_match(struct qm_portal *p, u32 fqid, int s,
|
|||
} while (wait && !dqrr);
|
||||
|
||||
while (dqrr) {
|
||||
if (dqrr->fqid == fqid && (dqrr->stat & s))
|
||||
if (qm_fqid_get(dqrr) == fqid && (dqrr->stat & s))
|
||||
found = 1;
|
||||
qm_dqrr_cdc_consume_1ptr(p, dqrr, 0);
|
||||
qm_dqrr_pvb_update(p);
|
||||
|
@ -2504,7 +2504,7 @@ static int qman_shutdown_fq(u32 fqid)
|
|||
dev = p->config->dev;
|
||||
/* Determine the state of the FQID */
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fqid;
|
||||
qm_fqid_set(&mcc->fq, fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_QUERYFQ_NP);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
dev_err(dev, "QUERYFQ_NP timeout\n");
|
||||
|
@ -2519,7 +2519,7 @@ static int qman_shutdown_fq(u32 fqid)
|
|||
|
||||
/* Query which channel the FQ is using */
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fqid;
|
||||
qm_fqid_set(&mcc->fq, fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_QUERYFQ);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
dev_err(dev, "QUERYFQ timeout\n");
|
||||
|
@ -2539,7 +2539,7 @@ static int qman_shutdown_fq(u32 fqid)
|
|||
case QM_MCR_NP_STATE_PARKED:
|
||||
orl_empty = 0;
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fqid;
|
||||
qm_fqid_set(&mcc->fq, fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_RETIRE);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
dev_err(dev, "QUERYFQ_NP timeout\n");
|
||||
|
@ -2634,7 +2634,7 @@ static int qman_shutdown_fq(u32 fqid)
|
|||
cpu_relax();
|
||||
}
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fqid;
|
||||
qm_fqid_set(&mcc->fq, fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_OOS);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
ret = -ETIMEDOUT;
|
||||
|
@ -2654,7 +2654,7 @@ static int qman_shutdown_fq(u32 fqid)
|
|||
case QM_MCR_NP_STATE_RETIRED:
|
||||
/* Send OOS Command */
|
||||
mcc = qm_mc_start(&p->p);
|
||||
mcc->fq.fqid = fqid;
|
||||
qm_fqid_set(&mcc->fq, fqid);
|
||||
qm_mc_commit(&p->p, QM_MCC_VERB_ALTER_OOS);
|
||||
if (!qm_mc_result_timeout(&p->p, &mcr)) {
|
||||
ret = -ETIMEDOUT;
|
||||
|
|
|
@ -262,6 +262,11 @@ struct qm_dqrr_entry {
|
|||
#define QM_DQRR_STAT_UNSCHEDULED 0x02 /* Unscheduled dequeue */
|
||||
#define QM_DQRR_STAT_DQCR_EXPIRED 0x01 /* VDQCR or PDQCR expired*/
|
||||
|
||||
/* 'fqid' is a 24-bit field in every h/w descriptor */
|
||||
#define QM_FQID_MASK GENMASK(23, 0)
|
||||
#define qm_fqid_set(p, v) ((p)->fqid = ((v) & QM_FQID_MASK))
|
||||
#define qm_fqid_get(p) ((p)->fqid & QM_FQID_MASK)
|
||||
|
||||
/* "ERN Message Response" */
|
||||
/* "FQ State Change Notification" */
|
||||
union qm_mr_entry {
|
||||
|
|
Загрузка…
Ссылка в новой задаче