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