static inline void ipsec_encap_decap(struct ipsec_context_t *ipsec_ctxt, const struct qm_dqrr_entry *dqrr) { struct annotations_t *notes; void *data; struct qm_sg_entry *sg; const struct qm_fd *fd; switch (dqrr->fd.format) { case qm_fd_contig: notes = __dma_mem_ptov(qm_fd_addr(&dqrr->fd)); data = (void *)notes + dqrr->fd.offset; break; case qm_fd_compound: sg = __dma_mem_ptov(qm_fd_addr(&dqrr->fd)); notes = __dma_mem_ptov(qm_sg_entry_get64(sg)); data = (void *)notes + sg->offset; break; case qm_fd_sg: sg = __dma_mem_ptov(qm_fd_addr(&dqrr->fd) + dqrr->fd.offset); data = __dma_mem_ptov(qm_sg_entry_get64(sg) + sg->offset); break; default: fprintf(stderr, "error: %s: Unsupported format packet came\n", __func__); return; } fd = &dqrr->fd; ipsec_ctxt->ipsec_handler(ipsec_ctxt, fd, data); }
static void caam_fq_ern_cb(struct qman_portal *qm, struct qman_fq *fq, const union qm_mr_entry *msg) { const struct qm_fd *fd; struct caam_drv_req *drv_req; struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev); fd = &msg->ern.fd; if (qm_fd_get_format(fd) != qm_fd_compound) { dev_err(qidev, "Non-compound FD from CAAM\n"); return; } drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd)); if (!drv_req) { dev_err(qidev, "Can't find original request for CAAM response\n"); return; } dma_unmap_single(drv_req->drv_ctx->qidev, qm_fd_addr(fd), sizeof(drv_req->fd_sgt), DMA_BIDIRECTIONAL); drv_req->cbk(drv_req, -EIO); }
static void set_enc_buf_cb(struct qm_fd *fd, uint8_t *buf, struct test_param *crypto_info) { struct qm_sg_entry *sgentry; struct protocol_info *proto = crypto_info->proto; struct mbms_ref_vector_s *ref_test_vector = proto->proto_vector; dma_addr_t addr, out_buf, in_buf; addr = qm_fd_addr(fd); /* set output buffer and length */ sgentry = __dma_mem_ptov(addr); out_buf = addr + sizeof(struct sg_entry_priv_t); /* * Set offset to point after the FMAN-like data */ sgentry++; sgentry->offset = MBMS_BUFFER_OFFSET; sgentry->length -= MBMS_BUFFER_OFFSET; in_buf = out_buf + crypto_info->rt.output_buf_size; buf = __dma_mem_ptov(in_buf); /* * Copy FMAN-like data before the buffer data */ memcpy(buf, mbms_prebuffer_data, sizeof(mbms_prebuffer_data)); memcpy(buf + sgentry->offset, ref_test_vector->plaintext, crypto_info->buf_size); }
/* Drop a frame (releases buffers to Bman) */ static inline void drop_frame(const struct qm_fd *fd) { struct bm_buffer buf; int ret; BUG_ON(fd->format != qm_fd_contig); bm_buffer_set64(&buf, qm_fd_addr(fd)); retry: ret = bman_release(pool[fd->bpid], &buf, 1, 0); if (ret) { cpu_spin(CPU_SPIN_BACKOFF_CYCLES); goto retry; } }
static enum qman_cb_dqrr_result caam_rsp_fq_dqrr_cb(struct qman_portal *p, struct qman_fq *rsp_fq, const struct qm_dqrr_entry *dqrr) { struct caam_napi *caam_napi = raw_cpu_ptr(&pcpu_qipriv.caam_napi); struct caam_drv_req *drv_req; const struct qm_fd *fd; struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev); u32 status; if (caam_qi_napi_schedule(p, caam_napi)) return qman_cb_dqrr_stop; fd = &dqrr->fd; status = be32_to_cpu(fd->status); if (unlikely(status)) { u32 ssrc = status & JRSTA_SSRC_MASK; u8 err_id = status & JRSTA_CCBERR_ERRID_MASK; if (ssrc != JRSTA_SSRC_CCB_ERROR || err_id != JRSTA_CCBERR_ERRID_ICVCHK) dev_err(qidev, "Error: %#x in CAAM response FD\n", status); } if (unlikely(qm_fd_get_format(fd) != qm_fd_compound)) { dev_err(qidev, "Non-compound FD from CAAM\n"); return qman_cb_dqrr_consume; } drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd)); if (unlikely(!drv_req)) { dev_err(qidev, "Can't find original request for caam response\n"); return qman_cb_dqrr_consume; } dma_unmap_single(drv_req->drv_ctx->qidev, qm_fd_addr(fd), sizeof(drv_req->fd_sgt), DMA_BIDIRECTIONAL); drv_req->cbk(drv_req, status); return qman_cb_dqrr_consume; }