xref: /dpdk/drivers/compress/octeontx/otx_zip.c (revision 52048f8f89aff15b90d6dbf81ec665e5fc53d24d)
143e610bbSSunila Sahu /* SPDX-License-Identifier: BSD-3-Clause
243e610bbSSunila Sahu  * Copyright(c) 2018 Cavium, Inc
343e610bbSSunila Sahu  */
443e610bbSSunila Sahu 
543e610bbSSunila Sahu #include "otx_zip.h"
643e610bbSSunila Sahu 
743e610bbSSunila Sahu uint64_t
843e610bbSSunila Sahu zip_reg_read64(uint8_t *hw_addr, uint64_t offset)
943e610bbSSunila Sahu {
1043e610bbSSunila Sahu 	uint8_t *base = hw_addr;
1143e610bbSSunila Sahu 	return *(volatile uint64_t *)(base + offset);
1243e610bbSSunila Sahu }
1343e610bbSSunila Sahu 
1443e610bbSSunila Sahu void
1543e610bbSSunila Sahu zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val)
1643e610bbSSunila Sahu {
1743e610bbSSunila Sahu 	uint8_t *base = hw_addr;
1843e610bbSSunila Sahu 	*(uint64_t *)(base + offset) = val;
1943e610bbSSunila Sahu }
2043e610bbSSunila Sahu 
21c378f084SAshish Gupta static void
22c378f084SAshish Gupta zip_q_enable(struct zipvf_qp *qp)
23c378f084SAshish Gupta {
24c378f084SAshish Gupta 	zip_vqx_ena_t que_ena;
25c378f084SAshish Gupta 
26c378f084SAshish Gupta 	/*ZIP VFx command queue init*/
27c378f084SAshish Gupta 	que_ena.u = 0ull;
28c378f084SAshish Gupta 	que_ena.s.ena = 1;
29c378f084SAshish Gupta 
30c378f084SAshish Gupta 	zip_reg_write64(qp->vf->vbar0, ZIP_VQ_ENA, que_ena.u);
31c378f084SAshish Gupta 	rte_wmb();
32c378f084SAshish Gupta }
33c378f084SAshish Gupta 
34c378f084SAshish Gupta /* initialize given qp on zip device */
35c378f084SAshish Gupta int
36c378f084SAshish Gupta zipvf_q_init(struct zipvf_qp *qp)
37c378f084SAshish Gupta {
38c378f084SAshish Gupta 	zip_vqx_sbuf_addr_t que_sbuf_addr;
39c378f084SAshish Gupta 
40c378f084SAshish Gupta 	uint64_t size;
41c378f084SAshish Gupta 	void *cmdq_addr;
42c378f084SAshish Gupta 	uint64_t iova;
43c378f084SAshish Gupta 	struct zipvf_cmdq *cmdq = &qp->cmdq;
44c378f084SAshish Gupta 	struct zip_vf *vf = qp->vf;
45c378f084SAshish Gupta 
46c378f084SAshish Gupta 	/* allocate and setup instruction queue */
47c378f084SAshish Gupta 	size = ZIP_MAX_CMDQ_SIZE;
48c378f084SAshish Gupta 	size = ZIP_ALIGN_ROUNDUP(size, ZIP_CMDQ_ALIGN);
49c378f084SAshish Gupta 
50c378f084SAshish Gupta 	cmdq_addr = rte_zmalloc(qp->name, size, ZIP_CMDQ_ALIGN);
51c378f084SAshish Gupta 	if (cmdq_addr == NULL)
52c378f084SAshish Gupta 		return -1;
53c378f084SAshish Gupta 
54c378f084SAshish Gupta 	cmdq->sw_head = (uint64_t *)cmdq_addr;
55c378f084SAshish Gupta 	cmdq->va = (uint8_t *)cmdq_addr;
56c378f084SAshish Gupta 	iova = rte_mem_virt2iova(cmdq_addr);
57c378f084SAshish Gupta 
58c378f084SAshish Gupta 	cmdq->iova = iova;
59c378f084SAshish Gupta 
60c378f084SAshish Gupta 	que_sbuf_addr.u = 0ull;
61c378f084SAshish Gupta 	que_sbuf_addr.s.ptr = (cmdq->iova >> 7);
62c378f084SAshish Gupta 	zip_reg_write64(vf->vbar0, ZIP_VQ_SBUF_ADDR, que_sbuf_addr.u);
63c378f084SAshish Gupta 
64c378f084SAshish Gupta 	zip_q_enable(qp);
65c378f084SAshish Gupta 
66c378f084SAshish Gupta 	memset(cmdq->va, 0, ZIP_MAX_CMDQ_SIZE);
67c378f084SAshish Gupta 	rte_spinlock_init(&cmdq->qlock);
68c378f084SAshish Gupta 
69c378f084SAshish Gupta 	return 0;
70c378f084SAshish Gupta }
71c378f084SAshish Gupta 
72c378f084SAshish Gupta int
73c378f084SAshish Gupta zipvf_q_term(struct zipvf_qp *qp)
74c378f084SAshish Gupta {
75c378f084SAshish Gupta 	struct zipvf_cmdq *cmdq = &qp->cmdq;
76c378f084SAshish Gupta 	zip_vqx_ena_t que_ena;
77c378f084SAshish Gupta 	struct zip_vf *vf = qp->vf;
78c378f084SAshish Gupta 
79c378f084SAshish Gupta 	if (cmdq->va != NULL) {
80c378f084SAshish Gupta 		memset(cmdq->va, 0, ZIP_MAX_CMDQ_SIZE);
81c378f084SAshish Gupta 		rte_free(cmdq->va);
82c378f084SAshish Gupta 	}
83c378f084SAshish Gupta 
84c378f084SAshish Gupta 	/*Disabling the ZIP queue*/
85c378f084SAshish Gupta 	que_ena.u = 0ull;
86c378f084SAshish Gupta 	zip_reg_write64(vf->vbar0, ZIP_VQ_ENA, que_ena.u);
87c378f084SAshish Gupta 
88c378f084SAshish Gupta 	return 0;
89c378f084SAshish Gupta }
90c378f084SAshish Gupta 
91*52048f8fSAshish Gupta void
92*52048f8fSAshish Gupta zipvf_push_command(struct zipvf_qp *qp, union zip_inst_s *cmd)
93*52048f8fSAshish Gupta {
94*52048f8fSAshish Gupta 	zip_quex_doorbell_t dbell;
95*52048f8fSAshish Gupta 	union zip_nptr_s ncp;
96*52048f8fSAshish Gupta 	uint64_t *ncb_ptr;
97*52048f8fSAshish Gupta 	struct zipvf_cmdq *cmdq = &qp->cmdq;
98*52048f8fSAshish Gupta 	void *reg_base = qp->vf->vbar0;
99*52048f8fSAshish Gupta 
100*52048f8fSAshish Gupta 	/*Held queue lock*/
101*52048f8fSAshish Gupta 	rte_spinlock_lock(&(cmdq->qlock));
102*52048f8fSAshish Gupta 
103*52048f8fSAshish Gupta 	/* Check space availability in zip cmd queue */
104*52048f8fSAshish Gupta 	if ((((cmdq->sw_head - (uint64_t *)cmdq->va) * sizeof(uint64_t *)) +
105*52048f8fSAshish Gupta 		ZIP_CMD_SIZE) == (ZIP_MAX_CMDQ_SIZE - ZIP_MAX_NCBP_SIZE)) {
106*52048f8fSAshish Gupta 		/*Last buffer of the command queue*/
107*52048f8fSAshish Gupta 		memcpy((uint8_t *)cmdq->sw_head,
108*52048f8fSAshish Gupta 			(uint8_t *)cmd,
109*52048f8fSAshish Gupta 			sizeof(union zip_inst_s));
110*52048f8fSAshish Gupta 		/* move pointer to next loc in unit of 64-bit word */
111*52048f8fSAshish Gupta 		cmdq->sw_head += ZIP_CMD_SIZE_WORDS;
112*52048f8fSAshish Gupta 
113*52048f8fSAshish Gupta 		/* now, point the "Next-Chunk Buffer Ptr" to sw_head */
114*52048f8fSAshish Gupta 		ncb_ptr = cmdq->sw_head;
115*52048f8fSAshish Gupta 		/* Pointing head again to cmdqueue base*/
116*52048f8fSAshish Gupta 		cmdq->sw_head = (uint64_t *)cmdq->va;
117*52048f8fSAshish Gupta 
118*52048f8fSAshish Gupta 		ncp.u = 0ull;
119*52048f8fSAshish Gupta 		ncp.s.addr = cmdq->iova;
120*52048f8fSAshish Gupta 		*ncb_ptr = ncp.u;
121*52048f8fSAshish Gupta 	} else {
122*52048f8fSAshish Gupta 		/*Enough buffers available in the command queue*/
123*52048f8fSAshish Gupta 		memcpy((uint8_t *)cmdq->sw_head,
124*52048f8fSAshish Gupta 			(uint8_t *)cmd,
125*52048f8fSAshish Gupta 			sizeof(union zip_inst_s));
126*52048f8fSAshish Gupta 		cmdq->sw_head += ZIP_CMD_SIZE_WORDS;
127*52048f8fSAshish Gupta 	}
128*52048f8fSAshish Gupta 
129*52048f8fSAshish Gupta 	rte_wmb();
130*52048f8fSAshish Gupta 
131*52048f8fSAshish Gupta 	/* Ringing ZIP VF doorbell */
132*52048f8fSAshish Gupta 	dbell.u = 0ull;
133*52048f8fSAshish Gupta 	dbell.s.dbell_cnt = 1;
134*52048f8fSAshish Gupta 	zip_reg_write64(reg_base, ZIP_VQ_DOORBELL, dbell.u);
135*52048f8fSAshish Gupta 
136*52048f8fSAshish Gupta 	rte_spinlock_unlock(&(cmdq->qlock));
137*52048f8fSAshish Gupta }
138c378f084SAshish Gupta 
13943e610bbSSunila Sahu int
14043e610bbSSunila Sahu zipvf_create(struct rte_compressdev *compressdev)
14143e610bbSSunila Sahu {
14243e610bbSSunila Sahu 	struct   rte_pci_device *pdev = RTE_DEV_TO_PCI(compressdev->device);
14343e610bbSSunila Sahu 	struct   zip_vf *zipvf = NULL;
14443e610bbSSunila Sahu 	char     *dev_name = compressdev->data->name;
14543e610bbSSunila Sahu 	void     *vbar0;
14643e610bbSSunila Sahu 	uint64_t reg;
14743e610bbSSunila Sahu 
14843e610bbSSunila Sahu 	if (pdev->mem_resource[0].phys_addr == 0ULL)
14943e610bbSSunila Sahu 		return -EIO;
15043e610bbSSunila Sahu 
15143e610bbSSunila Sahu 	vbar0 = pdev->mem_resource[0].addr;
15243e610bbSSunila Sahu 	if (!vbar0) {
15343e610bbSSunila Sahu 		ZIP_PMD_ERR("Failed to map BAR0 of %s", dev_name);
15443e610bbSSunila Sahu 		return -ENODEV;
15543e610bbSSunila Sahu 	}
15643e610bbSSunila Sahu 
15743e610bbSSunila Sahu 	zipvf = (struct zip_vf *)(compressdev->data->dev_private);
15843e610bbSSunila Sahu 
15943e610bbSSunila Sahu 	if (!zipvf)
16043e610bbSSunila Sahu 		return -ENOMEM;
16143e610bbSSunila Sahu 
16243e610bbSSunila Sahu 	zipvf->vbar0 = vbar0;
16343e610bbSSunila Sahu 	reg = zip_reg_read64(zipvf->vbar0, ZIP_VF_PF_MBOXX(0));
16443e610bbSSunila Sahu 	/* Storing domain in local to ZIP VF */
16543e610bbSSunila Sahu 	zipvf->dom_sdom = reg;
16643e610bbSSunila Sahu 	zipvf->pdev = pdev;
16743e610bbSSunila Sahu 	zipvf->max_nb_queue_pairs = ZIP_MAX_VF_QUEUE;
16843e610bbSSunila Sahu 	return 0;
16943e610bbSSunila Sahu }
17043e610bbSSunila Sahu 
17143e610bbSSunila Sahu int
17243e610bbSSunila Sahu zipvf_destroy(struct rte_compressdev *compressdev)
17343e610bbSSunila Sahu {
17443e610bbSSunila Sahu 	struct zip_vf *vf = (struct zip_vf *)(compressdev->data->dev_private);
17543e610bbSSunila Sahu 
17643e610bbSSunila Sahu 	/* Rewriting the domain_id in ZIP_VF_MBOX for app rerun */
17743e610bbSSunila Sahu 	zip_reg_write64(vf->vbar0, ZIP_VF_PF_MBOXX(0), vf->dom_sdom);
17843e610bbSSunila Sahu 
17943e610bbSSunila Sahu 	return 0;
18043e610bbSSunila Sahu }
181