int qbman_fq_query_state(struct qbman_swp *s, uint32_t fqid, struct qbman_fq_query_np_rslt *r) { struct qbman_fq_query_desc *p; p = (struct qbman_fq_query_desc *)qbman_swp_mc_start(s); if (!p) return -EBUSY; p->fqid = fqid; *r = *(struct qbman_fq_query_np_rslt *)qbman_swp_mc_complete(s, p, QBMAN_FQ_QUERY_NP); if (!r) { pr_err("qbman: Query FQID %d NP fields failed, no response\n", fqid); return -EIO; } /* Decode the outcome */ QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_FQ_QUERY_NP); /* Determine success or failure */ if (r->rslt != QBMAN_MC_RSLT_OK) { pr_err("Query NP fields of FQID 0x%x failed, code=0x%02x\n", fqid, r->rslt); return -EIO; } return 0; }
void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, uint8_t cmd_verb) { uint8_t *v = cmd; #ifdef QBMAN_CHECKING QBMAN_BUG_ON(!(p->mc.check != swp_mc_can_submit)); #endif /* TBD: "|=" is going to hurt performance. Need to move as many fields * out of word zero, and for those that remain, the "OR" needs to occur * at the caller side. This debug check helps to catch cases where the * caller wants to OR but has forgotten to do so. */ QBMAN_BUG_ON((*v & cmd_verb) != *v); *v = cmd_verb | p->mc.valid_bit; qbman_cena_write_complete(&p->sys, QBMAN_CENA_SWP_CR, cmd); #ifdef QBMAN_CHECKING p->mc.check = swp_mc_can_poll; #endif }
void qbman_swp_finish(struct qbman_swp *p) { #ifdef QBMAN_CHECKING QBMAN_BUG_ON(p->mc.check != swp_mc_can_start); #endif qbman_swp_sys_finish(&p->sys); portal_idx_map[p->desc.idx] = NULL; free(p); }
void *qbman_swp_mc_start(struct qbman_swp *p) { void *ret; #ifdef QBMAN_CHECKING QBMAN_BUG_ON(p->mc.check != swp_mc_can_start); #endif ret = qbman_cena_write_start(&p->sys, QBMAN_CENA_SWP_CR); #ifdef QBMAN_CHECKING if (!ret) p->mc.check = swp_mc_can_submit; #endif return ret; }
void *qbman_swp_mc_result(struct qbman_swp *p) { uint32_t *ret, verb; #ifdef QBMAN_CHECKING QBMAN_BUG_ON(p->mc.check != swp_mc_can_poll); #endif 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 if the rest is non-zero */ verb = ret[0] & ~QB_VALID_BIT; if (!verb) return NULL; #ifdef QBMAN_CHECKING p->mc.check = swp_mc_can_start; #endif p->mc.valid_bit ^= QB_VALID_BIT; return ret; }