1b6e39569SRadha Mohan Chintakuntla /* SPDX-License-Identifier: BSD-3-Clause 2b6e39569SRadha Mohan Chintakuntla * Copyright(C) 2021 Marvell. 3b6e39569SRadha Mohan Chintakuntla */ 4233692f5SPavan Nikhilesh 5b6e39569SRadha Mohan Chintakuntla #include <fcntl.h> 6b6e39569SRadha Mohan Chintakuntla #include <sys/stat.h> 7b6e39569SRadha Mohan Chintakuntla #include <sys/types.h> 8b6e39569SRadha Mohan Chintakuntla #include <unistd.h> 9b6e39569SRadha Mohan Chintakuntla 10b6e39569SRadha Mohan Chintakuntla #include "roc_api.h" 11b6e39569SRadha Mohan Chintakuntla #include "roc_priv.h" 12b6e39569SRadha Mohan Chintakuntla 13b6e39569SRadha Mohan Chintakuntla #define DPI_PF_MBOX_SYSFS_ENTRY "dpi_device_config" 14b6e39569SRadha Mohan Chintakuntla 15b6e39569SRadha Mohan Chintakuntla static inline int 16b6e39569SRadha Mohan Chintakuntla send_msg_to_pf(struct plt_pci_addr *pci_addr, const char *value, int size) 17b6e39569SRadha Mohan Chintakuntla { 18b6e39569SRadha Mohan Chintakuntla char buf[255] = {0}; 19b6e39569SRadha Mohan Chintakuntla int res, fd; 20b6e39569SRadha Mohan Chintakuntla 21b6e39569SRadha Mohan Chintakuntla res = snprintf( 22b6e39569SRadha Mohan Chintakuntla buf, sizeof(buf), "/sys/bus/pci/devices/" PCI_PRI_FMT "/%s", 23b6e39569SRadha Mohan Chintakuntla pci_addr->domain, pci_addr->bus, DPI_PF_DBDF_DEVICE & 0x7, 24b6e39569SRadha Mohan Chintakuntla DPI_PF_DBDF_FUNCTION & 0x7, DPI_PF_MBOX_SYSFS_ENTRY); 25b6e39569SRadha Mohan Chintakuntla 26b6e39569SRadha Mohan Chintakuntla if ((res < 0) || ((size_t)res > sizeof(buf))) 27b6e39569SRadha Mohan Chintakuntla return -ERANGE; 28b6e39569SRadha Mohan Chintakuntla 29b6e39569SRadha Mohan Chintakuntla fd = open(buf, O_WRONLY); 30b6e39569SRadha Mohan Chintakuntla if (fd < 0) 31b6e39569SRadha Mohan Chintakuntla return -EACCES; 32b6e39569SRadha Mohan Chintakuntla 33b6e39569SRadha Mohan Chintakuntla res = write(fd, value, size); 34b6e39569SRadha Mohan Chintakuntla close(fd); 35b6e39569SRadha Mohan Chintakuntla if (res < 0) 36b6e39569SRadha Mohan Chintakuntla return -EACCES; 37b6e39569SRadha Mohan Chintakuntla 38b6e39569SRadha Mohan Chintakuntla return 0; 39b6e39569SRadha Mohan Chintakuntla } 40b6e39569SRadha Mohan Chintakuntla 41b6e39569SRadha Mohan Chintakuntla int 42b34cea79SPavan Nikhilesh roc_dpi_wait_queue_idle(struct roc_dpi *roc_dpi) 43b34cea79SPavan Nikhilesh { 44b34cea79SPavan Nikhilesh const uint64_t cyc = (DPI_QUEUE_IDLE_TMO_MS * plt_tsc_hz()) / 1E3; 45b34cea79SPavan Nikhilesh const uint64_t start = plt_tsc_cycles(); 46b34cea79SPavan Nikhilesh uint64_t reg; 47b34cea79SPavan Nikhilesh 48b34cea79SPavan Nikhilesh /* Wait for SADDR to become idle */ 49b34cea79SPavan Nikhilesh reg = plt_read64(roc_dpi->rbase + DPI_VDMA_SADDR); 50b34cea79SPavan Nikhilesh while (!(reg & BIT_ULL(63))) { 51b34cea79SPavan Nikhilesh reg = plt_read64(roc_dpi->rbase + DPI_VDMA_SADDR); 52b34cea79SPavan Nikhilesh if (plt_tsc_cycles() - start == cyc) 53b34cea79SPavan Nikhilesh return -ETIMEDOUT; 54b34cea79SPavan Nikhilesh } 55b34cea79SPavan Nikhilesh 56b34cea79SPavan Nikhilesh return 0; 57b34cea79SPavan Nikhilesh } 58b34cea79SPavan Nikhilesh 59b34cea79SPavan Nikhilesh int 60b6e39569SRadha Mohan Chintakuntla roc_dpi_enable(struct roc_dpi *dpi) 61b6e39569SRadha Mohan Chintakuntla { 62b6e39569SRadha Mohan Chintakuntla plt_write64(0x1, dpi->rbase + DPI_VDMA_EN); 63b6e39569SRadha Mohan Chintakuntla return 0; 64b6e39569SRadha Mohan Chintakuntla } 65b6e39569SRadha Mohan Chintakuntla 66b6e39569SRadha Mohan Chintakuntla int 67b6e39569SRadha Mohan Chintakuntla roc_dpi_disable(struct roc_dpi *dpi) 68b6e39569SRadha Mohan Chintakuntla { 69b6e39569SRadha Mohan Chintakuntla plt_write64(0x0, dpi->rbase + DPI_VDMA_EN); 70b6e39569SRadha Mohan Chintakuntla return 0; 71b6e39569SRadha Mohan Chintakuntla } 72b6e39569SRadha Mohan Chintakuntla 73b6e39569SRadha Mohan Chintakuntla int 74233692f5SPavan Nikhilesh roc_dpi_configure(struct roc_dpi *roc_dpi, uint32_t chunk_sz, uint64_t aura, uint64_t chunk_base) 75b6e39569SRadha Mohan Chintakuntla { 76b6e39569SRadha Mohan Chintakuntla struct plt_pci_device *pci_dev; 77b6e39569SRadha Mohan Chintakuntla dpi_mbox_msg_t mbox_msg; 78233692f5SPavan Nikhilesh int rc; 79b6e39569SRadha Mohan Chintakuntla 80b6e39569SRadha Mohan Chintakuntla if (!roc_dpi) { 81b6e39569SRadha Mohan Chintakuntla plt_err("roc_dpi is NULL"); 82b6e39569SRadha Mohan Chintakuntla return -EINVAL; 83b6e39569SRadha Mohan Chintakuntla } 84b6e39569SRadha Mohan Chintakuntla 85b6e39569SRadha Mohan Chintakuntla pci_dev = roc_dpi->pci_dev; 86b6e39569SRadha Mohan Chintakuntla 87233692f5SPavan Nikhilesh roc_dpi_disable(roc_dpi); 88b34cea79SPavan Nikhilesh rc = roc_dpi_wait_queue_idle(roc_dpi); 89b34cea79SPavan Nikhilesh if (rc) 90b34cea79SPavan Nikhilesh return rc; 91b6e39569SRadha Mohan Chintakuntla 92b6e39569SRadha Mohan Chintakuntla plt_write64(0x0, roc_dpi->rbase + DPI_VDMA_REQQ_CTL); 93233692f5SPavan Nikhilesh plt_write64(chunk_base, roc_dpi->rbase + DPI_VDMA_SADDR); 94b6e39569SRadha Mohan Chintakuntla mbox_msg.u[0] = 0; 95b6e39569SRadha Mohan Chintakuntla mbox_msg.u[1] = 0; 96b6e39569SRadha Mohan Chintakuntla /* DPI PF driver expects vfid starts from index 0 */ 97b6e39569SRadha Mohan Chintakuntla mbox_msg.s.vfid = roc_dpi->vfid; 98*fca0bae9SVamsi Attunuru mbox_msg.s.pri = roc_dpi->priority; 99b6e39569SRadha Mohan Chintakuntla mbox_msg.s.cmd = DPI_QUEUE_OPEN; 100233692f5SPavan Nikhilesh mbox_msg.s.csize = chunk_sz; 101233692f5SPavan Nikhilesh mbox_msg.s.aura = aura; 102b6e39569SRadha Mohan Chintakuntla mbox_msg.s.sso_pf_func = idev_sso_pffunc_get(); 103b6e39569SRadha Mohan Chintakuntla mbox_msg.s.npa_pf_func = idev_npa_pffunc_get(); 10494163794SAmit Prakash Shukla mbox_msg.s.wqecsoff = idev_dma_cs_offset_get(); 10594163794SAmit Prakash Shukla if (mbox_msg.s.wqecsoff) 10694163794SAmit Prakash Shukla mbox_msg.s.wqecs = 1; 107b6e39569SRadha Mohan Chintakuntla 108b34cea79SPavan Nikhilesh rc = send_msg_to_pf(&pci_dev->addr, (const char *)&mbox_msg, sizeof(dpi_mbox_msg_t)); 109b34cea79SPavan Nikhilesh if (rc < 0) 110b34cea79SPavan Nikhilesh plt_err("Failed to send mbox message %d to DPI PF, err %d", mbox_msg.s.cmd, rc); 111b34cea79SPavan Nikhilesh 112b34cea79SPavan Nikhilesh return rc; 113b34cea79SPavan Nikhilesh } 114b34cea79SPavan Nikhilesh 115b34cea79SPavan Nikhilesh int 116b34cea79SPavan Nikhilesh roc_dpi_configure_v2(struct roc_dpi *roc_dpi, uint32_t chunk_sz, uint64_t aura, uint64_t chunk_base) 117b34cea79SPavan Nikhilesh { 118b34cea79SPavan Nikhilesh struct plt_pci_device *pci_dev; 119b34cea79SPavan Nikhilesh dpi_mbox_msg_t mbox_msg; 120b34cea79SPavan Nikhilesh int rc; 121b34cea79SPavan Nikhilesh 122b34cea79SPavan Nikhilesh if (!roc_dpi) { 123b34cea79SPavan Nikhilesh plt_err("roc_dpi is NULL"); 124b34cea79SPavan Nikhilesh return -EINVAL; 125b34cea79SPavan Nikhilesh } 126b34cea79SPavan Nikhilesh 127b34cea79SPavan Nikhilesh pci_dev = roc_dpi->pci_dev; 128b34cea79SPavan Nikhilesh 129b34cea79SPavan Nikhilesh roc_dpi_disable(roc_dpi); 130b34cea79SPavan Nikhilesh 131b34cea79SPavan Nikhilesh rc = roc_dpi_wait_queue_idle(roc_dpi); 132b34cea79SPavan Nikhilesh if (rc) 133b34cea79SPavan Nikhilesh return rc; 134b34cea79SPavan Nikhilesh 135b34cea79SPavan Nikhilesh plt_write64(0x0, roc_dpi->rbase + DPI_VDMA_REQQ_CTL); 136b34cea79SPavan Nikhilesh plt_write64(chunk_base, roc_dpi->rbase + DPI_VDMA_SADDR); 137b34cea79SPavan Nikhilesh mbox_msg.u[0] = 0; 138b34cea79SPavan Nikhilesh mbox_msg.u[1] = 0; 139b34cea79SPavan Nikhilesh /* DPI PF driver expects vfid starts from index 0 */ 140b34cea79SPavan Nikhilesh mbox_msg.s.vfid = roc_dpi->vfid; 141*fca0bae9SVamsi Attunuru mbox_msg.s.pri = roc_dpi->priority; 142b34cea79SPavan Nikhilesh mbox_msg.s.cmd = DPI_QUEUE_OPEN_V2; 143b34cea79SPavan Nikhilesh mbox_msg.s.csize = chunk_sz / 8; 144b34cea79SPavan Nikhilesh mbox_msg.s.aura = aura; 145b34cea79SPavan Nikhilesh mbox_msg.s.sso_pf_func = idev_sso_pffunc_get(); 146b34cea79SPavan Nikhilesh mbox_msg.s.npa_pf_func = idev_npa_pffunc_get(); 147b34cea79SPavan Nikhilesh 148b6e39569SRadha Mohan Chintakuntla rc = send_msg_to_pf(&pci_dev->addr, (const char *)&mbox_msg, 149b6e39569SRadha Mohan Chintakuntla sizeof(dpi_mbox_msg_t)); 150233692f5SPavan Nikhilesh if (rc < 0) 151b6e39569SRadha Mohan Chintakuntla plt_err("Failed to send mbox message %d to DPI PF, err %d", 152b6e39569SRadha Mohan Chintakuntla mbox_msg.s.cmd, rc); 153b6e39569SRadha Mohan Chintakuntla 154b6e39569SRadha Mohan Chintakuntla return rc; 155b6e39569SRadha Mohan Chintakuntla } 156b6e39569SRadha Mohan Chintakuntla 157b6e39569SRadha Mohan Chintakuntla int 15894163794SAmit Prakash Shukla roc_dpi_dev_init(struct roc_dpi *roc_dpi, uint8_t offset) 159b6e39569SRadha Mohan Chintakuntla { 160b6e39569SRadha Mohan Chintakuntla struct plt_pci_device *pci_dev = roc_dpi->pci_dev; 161b6e39569SRadha Mohan Chintakuntla uint16_t vfid; 162b6e39569SRadha Mohan Chintakuntla 163b6e39569SRadha Mohan Chintakuntla roc_dpi->rbase = pci_dev->mem_resource[0].addr; 164233692f5SPavan Nikhilesh vfid = ((pci_dev->addr.devid & 0x1F) << 3) | (pci_dev->addr.function & 0x7); 165b6e39569SRadha Mohan Chintakuntla vfid -= 1; 166b6e39569SRadha Mohan Chintakuntla roc_dpi->vfid = vfid; 16794163794SAmit Prakash Shukla idev_dma_cs_offset_set(offset); 168b6e39569SRadha Mohan Chintakuntla 169b6e39569SRadha Mohan Chintakuntla return 0; 170b6e39569SRadha Mohan Chintakuntla } 171b6e39569SRadha Mohan Chintakuntla 172b6e39569SRadha Mohan Chintakuntla int 173b6e39569SRadha Mohan Chintakuntla roc_dpi_dev_fini(struct roc_dpi *roc_dpi) 174b6e39569SRadha Mohan Chintakuntla { 175b6e39569SRadha Mohan Chintakuntla struct plt_pci_device *pci_dev = roc_dpi->pci_dev; 176b6e39569SRadha Mohan Chintakuntla dpi_mbox_msg_t mbox_msg; 177b6e39569SRadha Mohan Chintakuntla int rc; 178b6e39569SRadha Mohan Chintakuntla 179b34cea79SPavan Nikhilesh rc = roc_dpi_wait_queue_idle(roc_dpi); 180b34cea79SPavan Nikhilesh if (rc) 181b34cea79SPavan Nikhilesh return rc; 182b6e39569SRadha Mohan Chintakuntla 183b6e39569SRadha Mohan Chintakuntla mbox_msg.u[0] = 0; 184b6e39569SRadha Mohan Chintakuntla mbox_msg.u[1] = 0; 185b6e39569SRadha Mohan Chintakuntla mbox_msg.s.vfid = roc_dpi->vfid; 186b6e39569SRadha Mohan Chintakuntla mbox_msg.s.cmd = DPI_QUEUE_CLOSE; 187b6e39569SRadha Mohan Chintakuntla 188233692f5SPavan Nikhilesh rc = send_msg_to_pf(&pci_dev->addr, (const char *)&mbox_msg, sizeof(dpi_mbox_msg_t)); 189b6e39569SRadha Mohan Chintakuntla if (rc < 0) 190233692f5SPavan Nikhilesh plt_err("Failed to send mbox message %d to DPI PF, err %d", mbox_msg.s.cmd, rc); 191b6e39569SRadha Mohan Chintakuntla 192b6e39569SRadha Mohan Chintakuntla return rc; 193b6e39569SRadha Mohan Chintakuntla } 194