Example #1
0
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);
}
Example #3
0
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);
}
Example #4
0
/* 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;
	}
}
Example #5
0
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;
}