xref: /dpdk/drivers/compress/octeontx/otx_zip.c (revision 43e610bb85658fca3b1d6ce00ef8a58c46336695)
1*43e610bbSSunila Sahu /* SPDX-License-Identifier: BSD-3-Clause
2*43e610bbSSunila Sahu  * Copyright(c) 2018 Cavium, Inc
3*43e610bbSSunila Sahu  */
4*43e610bbSSunila Sahu 
5*43e610bbSSunila Sahu #include "otx_zip.h"
6*43e610bbSSunila Sahu 
7*43e610bbSSunila Sahu uint64_t
8*43e610bbSSunila Sahu zip_reg_read64(uint8_t *hw_addr, uint64_t offset)
9*43e610bbSSunila Sahu {
10*43e610bbSSunila Sahu 	uint8_t *base = hw_addr;
11*43e610bbSSunila Sahu 	return *(volatile uint64_t *)(base + offset);
12*43e610bbSSunila Sahu }
13*43e610bbSSunila Sahu 
14*43e610bbSSunila Sahu void
15*43e610bbSSunila Sahu zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val)
16*43e610bbSSunila Sahu {
17*43e610bbSSunila Sahu 	uint8_t *base = hw_addr;
18*43e610bbSSunila Sahu 	*(uint64_t *)(base + offset) = val;
19*43e610bbSSunila Sahu }
20*43e610bbSSunila Sahu 
21*43e610bbSSunila Sahu int
22*43e610bbSSunila Sahu zipvf_create(struct rte_compressdev *compressdev)
23*43e610bbSSunila Sahu {
24*43e610bbSSunila Sahu 	struct   rte_pci_device *pdev = RTE_DEV_TO_PCI(compressdev->device);
25*43e610bbSSunila Sahu 	struct   zip_vf *zipvf = NULL;
26*43e610bbSSunila Sahu 	char     *dev_name = compressdev->data->name;
27*43e610bbSSunila Sahu 	void     *vbar0;
28*43e610bbSSunila Sahu 	uint64_t reg;
29*43e610bbSSunila Sahu 
30*43e610bbSSunila Sahu 	if (pdev->mem_resource[0].phys_addr == 0ULL)
31*43e610bbSSunila Sahu 		return -EIO;
32*43e610bbSSunila Sahu 
33*43e610bbSSunila Sahu 	vbar0 = pdev->mem_resource[0].addr;
34*43e610bbSSunila Sahu 	if (!vbar0) {
35*43e610bbSSunila Sahu 		ZIP_PMD_ERR("Failed to map BAR0 of %s", dev_name);
36*43e610bbSSunila Sahu 		return -ENODEV;
37*43e610bbSSunila Sahu 	}
38*43e610bbSSunila Sahu 
39*43e610bbSSunila Sahu 	zipvf = (struct zip_vf *)(compressdev->data->dev_private);
40*43e610bbSSunila Sahu 
41*43e610bbSSunila Sahu 	if (!zipvf)
42*43e610bbSSunila Sahu 		return -ENOMEM;
43*43e610bbSSunila Sahu 
44*43e610bbSSunila Sahu 	zipvf->vbar0 = vbar0;
45*43e610bbSSunila Sahu 	reg = zip_reg_read64(zipvf->vbar0, ZIP_VF_PF_MBOXX(0));
46*43e610bbSSunila Sahu 	/* Storing domain in local to ZIP VF */
47*43e610bbSSunila Sahu 	zipvf->dom_sdom = reg;
48*43e610bbSSunila Sahu 	zipvf->pdev = pdev;
49*43e610bbSSunila Sahu 	zipvf->max_nb_queue_pairs = ZIP_MAX_VF_QUEUE;
50*43e610bbSSunila Sahu 	return 0;
51*43e610bbSSunila Sahu }
52*43e610bbSSunila Sahu 
53*43e610bbSSunila Sahu int
54*43e610bbSSunila Sahu zipvf_destroy(struct rte_compressdev *compressdev)
55*43e610bbSSunila Sahu {
56*43e610bbSSunila Sahu 	struct zip_vf *vf = (struct zip_vf *)(compressdev->data->dev_private);
57*43e610bbSSunila Sahu 
58*43e610bbSSunila Sahu 	/* Rewriting the domain_id in ZIP_VF_MBOX for app rerun */
59*43e610bbSSunila Sahu 	zip_reg_write64(vf->vbar0, ZIP_VF_PF_MBOXX(0), vf->dom_sdom);
60*43e610bbSSunila Sahu 
61*43e610bbSSunila Sahu 	return 0;
62*43e610bbSSunila Sahu }
63