xref: /dpdk/drivers/common/cnxk/roc_dpi.c (revision fca0bae93126541c90173d84dae1ead2fe9eeacc)
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