int dpaa2_io_service_enqueue_fq(struct dpaa2_io *d,u32 fqid,const struct dpaa2_fd *fd) { struct qbman_eq_desc ed; d = service_select(d); if (!d) return -ENODEV; qbman_eq_desc_clear(&ed); qbman_eq_desc_set_no_orp(&ed, 0); qbman_eq_desc_set_fq(&ed, fqid); return qbman_swp_enqueue(d->swp, &ed, fd); }
Using this API always triggers an error interrupt with RERR_ISR[IESI] bit is set. Is it because NO-ORP is set?
The dpio service component provides queuing, notification and buffers management services to DPAA2 drivers. A system will typically allocate 1 DPIO object per CPU to allow queuing operations to happen simultaneously across all CPUs.
Please refer to API dpaa2_io_service_enqueue_fq usage in function dpaa2_caam_enqueue in Linux Kernel source.
int dpaa2_caam_enqueue(struct device *dev, struct caam_request *req)
{
struct dpaa2_fd fd;
struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);
struct dpaa2_caam_priv_per_cpu *ppriv;
......
memset(&fd, 0, sizeof(fd));
dpaa2_fd_set_format(&fd, dpaa2_fd_list);
dpaa2_fd_set_addr(&fd, req->fd_flt_dma);
dpaa2_fd_set_len(&fd, dpaa2_fl_get_len(&req->fd_flt[1]));
dpaa2_fd_set_flc(&fd, req->flc_dma);
ppriv = this_cpu_ptr(priv->ppriv);
for (i = 0; i < (priv->dpseci_attr.num_tx_queues << 1); i++) {
err = dpaa2_io_service_enqueue_fq(ppriv->dpio, ppriv->req_fqid,
&fd);
if (err != -EBUSY)
break;
cpu_relax();
}
Thanks,
Yiping
Thanks for your reply.
My case is to copy memory to memory through QDMA.
The data can be copied to destination address from source, but with this RERR_ISR[IESI] interrupt triggered. I don't know why it's an error interrupt.
The error is IESI means that either the FQ or the ORP was not initialized when the enqueue was attempted.