xref: /dpdk/drivers/bus/dpaa/bus_dpaa_driver.h (revision 1acb7f547455f636a6968cb3b4ca3870279dfece)
1a2f1da7dSDavid Marchand /* SPDX-License-Identifier: BSD-3-Clause
2a2f1da7dSDavid Marchand  *
3a2f1da7dSDavid Marchand  *   Copyright 2017-2022 NXP
4a2f1da7dSDavid Marchand  *
5a2f1da7dSDavid Marchand  */
6a2f1da7dSDavid Marchand #ifndef BUS_DPAA_DRIVER_H
7a2f1da7dSDavid Marchand #define BUS_DPAA_DRIVER_H
8a2f1da7dSDavid Marchand 
9a2f1da7dSDavid Marchand #include <rte_compat.h>
10*1acb7f54SDavid Marchand #include <dev_driver.h>
11a2f1da7dSDavid Marchand #include <rte_mbuf_dyn.h>
12a2f1da7dSDavid Marchand #include <rte_mempool.h>
13a2f1da7dSDavid Marchand 
14a2f1da7dSDavid Marchand #include <dpaax_iova_table.h>
15a2f1da7dSDavid Marchand 
16a2f1da7dSDavid Marchand #include <dpaa_of.h>
17a2f1da7dSDavid Marchand #include <fsl_usd.h>
18a2f1da7dSDavid Marchand #include <fsl_qman.h>
19a2f1da7dSDavid Marchand #include <fsl_bman.h>
20a2f1da7dSDavid Marchand #include <netcfg.h>
21a2f1da7dSDavid Marchand 
22a2f1da7dSDavid Marchand #ifdef __cplusplus
23a2f1da7dSDavid Marchand extern "C" {
24a2f1da7dSDavid Marchand #endif
25a2f1da7dSDavid Marchand 
26a2f1da7dSDavid Marchand /* This sequence number field is used to store event entry index for
27a2f1da7dSDavid Marchand  * driver specific usage. For parallel mode queues, invalid
28a2f1da7dSDavid Marchand  * index will be set and for atomic mode queues, valid value
29a2f1da7dSDavid Marchand  * ranging from 1 to 16.
30a2f1da7dSDavid Marchand  */
31a2f1da7dSDavid Marchand #define DPAA_INVALID_MBUF_SEQN  0
32a2f1da7dSDavid Marchand 
33a2f1da7dSDavid Marchand typedef uint32_t dpaa_seqn_t;
34a2f1da7dSDavid Marchand extern int dpaa_seqn_dynfield_offset;
35a2f1da7dSDavid Marchand 
36a2f1da7dSDavid Marchand /**
37a2f1da7dSDavid Marchand  * Read dpaa sequence number from mbuf.
38a2f1da7dSDavid Marchand  *
39a2f1da7dSDavid Marchand  * @param mbuf Structure to read from.
40a2f1da7dSDavid Marchand  * @return pointer to dpaa sequence number.
41a2f1da7dSDavid Marchand  */
42a2f1da7dSDavid Marchand __rte_internal
43a2f1da7dSDavid Marchand static inline dpaa_seqn_t *
dpaa_seqn(struct rte_mbuf * mbuf)44a2f1da7dSDavid Marchand dpaa_seqn(struct rte_mbuf *mbuf)
45a2f1da7dSDavid Marchand {
46a2f1da7dSDavid Marchand 	return RTE_MBUF_DYNFIELD(mbuf, dpaa_seqn_dynfield_offset,
47a2f1da7dSDavid Marchand 		dpaa_seqn_t *);
48a2f1da7dSDavid Marchand }
49a2f1da7dSDavid Marchand 
50a2f1da7dSDavid Marchand #define DPAA_MEMPOOL_OPS_NAME	"dpaa"
51a2f1da7dSDavid Marchand 
52a2f1da7dSDavid Marchand #define DEV_TO_DPAA_DEVICE(ptr)	\
53a2f1da7dSDavid Marchand 		container_of(ptr, struct rte_dpaa_device, device)
54a2f1da7dSDavid Marchand 
55a2f1da7dSDavid Marchand /* DPAA SoC identifier; If this is not available, it can be concluded
56a2f1da7dSDavid Marchand  * that board is non-DPAA. Single slot is currently supported.
57a2f1da7dSDavid Marchand  */
58a2f1da7dSDavid Marchand #define DPAA_SOC_ID_FILE	"/sys/devices/soc0/soc_id"
59a2f1da7dSDavid Marchand 
60a2f1da7dSDavid Marchand #define SVR_LS1043A_FAMILY	0x87920000
61a2f1da7dSDavid Marchand #define SVR_LS1046A_FAMILY	0x87070000
62a2f1da7dSDavid Marchand #define SVR_MASK		0xffff0000
63a2f1da7dSDavid Marchand 
64a2f1da7dSDavid Marchand /** Device driver supports link state interrupt */
65a2f1da7dSDavid Marchand #define RTE_DPAA_DRV_INTR_LSC  0x0008
66a2f1da7dSDavid Marchand 
67a2f1da7dSDavid Marchand /** Number of supported QDMA devices */
68a2f1da7dSDavid Marchand #define RTE_DPAA_QDMA_DEVICES  1
69a2f1da7dSDavid Marchand 
70a2f1da7dSDavid Marchand #define RTE_DEV_TO_DPAA_CONST(ptr) \
71a2f1da7dSDavid Marchand 	container_of(ptr, const struct rte_dpaa_device, device)
72a2f1da7dSDavid Marchand 
73a2f1da7dSDavid Marchand extern unsigned int dpaa_svr_family;
74a2f1da7dSDavid Marchand 
75a2f1da7dSDavid Marchand struct rte_dpaa_device;
76a2f1da7dSDavid Marchand struct rte_dpaa_driver;
77a2f1da7dSDavid Marchand 
78a2f1da7dSDavid Marchand enum rte_dpaa_type {
79a2f1da7dSDavid Marchand 	FSL_DPAA_ETH = 1,
80a2f1da7dSDavid Marchand 	FSL_DPAA_CRYPTO,
81a2f1da7dSDavid Marchand 	FSL_DPAA_QDMA
82a2f1da7dSDavid Marchand };
83a2f1da7dSDavid Marchand 
84a2f1da7dSDavid Marchand struct dpaa_device_id {
85a2f1da7dSDavid Marchand 	uint8_t fman_id; /**< Fman interface ID, for ETH type device */
86a2f1da7dSDavid Marchand 	uint8_t mac_id; /**< Fman MAC interface ID, for ETH type device */
87a2f1da7dSDavid Marchand 	uint16_t dev_id; /**< Device Identifier from DPDK */
88a2f1da7dSDavid Marchand };
89a2f1da7dSDavid Marchand 
90a2f1da7dSDavid Marchand struct rte_dpaa_device {
91a2f1da7dSDavid Marchand 	TAILQ_ENTRY(rte_dpaa_device) next;
92a2f1da7dSDavid Marchand 	struct rte_device device;
93a2f1da7dSDavid Marchand 	union {
94a2f1da7dSDavid Marchand 		struct rte_eth_dev *eth_dev;
95a2f1da7dSDavid Marchand 		struct rte_cryptodev *crypto_dev;
96a2f1da7dSDavid Marchand 		struct rte_dma_dev *dmadev;
97a2f1da7dSDavid Marchand 	};
98a2f1da7dSDavid Marchand 	struct rte_dpaa_driver *driver;
99a2f1da7dSDavid Marchand 	struct dpaa_device_id id;
100a2f1da7dSDavid Marchand 	struct rte_intr_handle *intr_handle;
101a2f1da7dSDavid Marchand 	enum rte_dpaa_type device_type; /**< Ethernet or crypto type device */
102a2f1da7dSDavid Marchand 	char name[RTE_ETH_NAME_MAX_LEN];
103a2f1da7dSDavid Marchand };
104a2f1da7dSDavid Marchand 
105a2f1da7dSDavid Marchand typedef int (*rte_dpaa_probe_t)(struct rte_dpaa_driver *dpaa_drv,
106a2f1da7dSDavid Marchand 				struct rte_dpaa_device *dpaa_dev);
107a2f1da7dSDavid Marchand typedef int (*rte_dpaa_remove_t)(struct rte_dpaa_device *dpaa_dev);
108a2f1da7dSDavid Marchand 
109a2f1da7dSDavid Marchand struct rte_dpaa_driver {
110a2f1da7dSDavid Marchand 	TAILQ_ENTRY(rte_dpaa_driver) next;
111a2f1da7dSDavid Marchand 	struct rte_driver driver;
112a2f1da7dSDavid Marchand 	enum rte_dpaa_type drv_type;
113a2f1da7dSDavid Marchand 	rte_dpaa_probe_t probe;
114a2f1da7dSDavid Marchand 	rte_dpaa_remove_t remove;
115a2f1da7dSDavid Marchand 	uint32_t drv_flags;                 /**< Flags for controlling device.*/
116a2f1da7dSDavid Marchand };
117a2f1da7dSDavid Marchand 
118a2f1da7dSDavid Marchand /* Create storage for dqrr entries per lcore */
119a2f1da7dSDavid Marchand #define DPAA_PORTAL_DEQUEUE_DEPTH	16
120a2f1da7dSDavid Marchand struct dpaa_portal_dqrr {
121a2f1da7dSDavid Marchand 	void *mbuf[DPAA_PORTAL_DEQUEUE_DEPTH];
122a2f1da7dSDavid Marchand 	uint64_t dqrr_held;
123a2f1da7dSDavid Marchand 	uint8_t dqrr_size;
124a2f1da7dSDavid Marchand };
125a2f1da7dSDavid Marchand 
126a2f1da7dSDavid Marchand struct dpaa_portal {
127a2f1da7dSDavid Marchand 	uint32_t bman_idx; /**< BMAN Portal ID*/
128a2f1da7dSDavid Marchand 	uint32_t qman_idx; /**< QMAN Portal ID*/
129a2f1da7dSDavid Marchand 	struct dpaa_portal_dqrr dpaa_held_bufs;
130a2f1da7dSDavid Marchand 	uint64_t tid;/**< Parent Thread id for this portal */
131a2f1da7dSDavid Marchand };
132a2f1da7dSDavid Marchand 
133a2f1da7dSDavid Marchand RTE_DECLARE_PER_LCORE(struct dpaa_portal *, dpaa_io);
134a2f1da7dSDavid Marchand 
135a2f1da7dSDavid Marchand #define DPAA_PER_LCORE_PORTAL \
136a2f1da7dSDavid Marchand 	RTE_PER_LCORE(dpaa_io)
137a2f1da7dSDavid Marchand #define DPAA_PER_LCORE_DQRR_SIZE \
138a2f1da7dSDavid Marchand 	RTE_PER_LCORE(dpaa_io)->dpaa_held_bufs.dqrr_size
139a2f1da7dSDavid Marchand #define DPAA_PER_LCORE_DQRR_HELD \
140a2f1da7dSDavid Marchand 	RTE_PER_LCORE(dpaa_io)->dpaa_held_bufs.dqrr_held
141a2f1da7dSDavid Marchand #define DPAA_PER_LCORE_DQRR_MBUF(i) \
142a2f1da7dSDavid Marchand 	RTE_PER_LCORE(dpaa_io)->dpaa_held_bufs.mbuf[i]
143a2f1da7dSDavid Marchand 
144a2f1da7dSDavid Marchand /* Various structures representing contiguous memory maps */
145a2f1da7dSDavid Marchand struct dpaa_memseg {
146a2f1da7dSDavid Marchand 	TAILQ_ENTRY(dpaa_memseg) next;
147a2f1da7dSDavid Marchand 	char *vaddr;
148a2f1da7dSDavid Marchand 	rte_iova_t iova;
149a2f1da7dSDavid Marchand 	size_t len;
150a2f1da7dSDavid Marchand };
151a2f1da7dSDavid Marchand 
152a2f1da7dSDavid Marchand TAILQ_HEAD(dpaa_memseg_list, dpaa_memseg);
153a2f1da7dSDavid Marchand extern struct dpaa_memseg_list rte_dpaa_memsegs;
154a2f1da7dSDavid Marchand 
155a2f1da7dSDavid Marchand /* Either iterate over the list of internal memseg references or fallback to
156a2f1da7dSDavid Marchand  * EAL memseg based iova2virt.
157a2f1da7dSDavid Marchand  */
158a2f1da7dSDavid Marchand __rte_internal
rte_dpaa_mem_ptov(phys_addr_t paddr)159a2f1da7dSDavid Marchand static inline void *rte_dpaa_mem_ptov(phys_addr_t paddr)
160a2f1da7dSDavid Marchand {
161a2f1da7dSDavid Marchand 	struct dpaa_memseg *ms;
162a2f1da7dSDavid Marchand 	void *va;
163a2f1da7dSDavid Marchand 
164a2f1da7dSDavid Marchand 	va = dpaax_iova_table_get_va(paddr);
165a2f1da7dSDavid Marchand 	if (likely(va != NULL))
166a2f1da7dSDavid Marchand 		return va;
167a2f1da7dSDavid Marchand 
168a2f1da7dSDavid Marchand 	/* Check if the address is already part of the memseg list internally
169a2f1da7dSDavid Marchand 	 * maintained by the dpaa driver.
170a2f1da7dSDavid Marchand 	 */
171a2f1da7dSDavid Marchand 	TAILQ_FOREACH(ms, &rte_dpaa_memsegs, next) {
172a2f1da7dSDavid Marchand 		if (paddr >= ms->iova && paddr <
173a2f1da7dSDavid Marchand 			ms->iova + ms->len)
174a2f1da7dSDavid Marchand 			return RTE_PTR_ADD(ms->vaddr, (uintptr_t)(paddr - ms->iova));
175a2f1da7dSDavid Marchand 	}
176a2f1da7dSDavid Marchand 
177a2f1da7dSDavid Marchand 	/* If not, Fallback to full memseg list searching */
178a2f1da7dSDavid Marchand 	va = rte_mem_iova2virt(paddr);
179a2f1da7dSDavid Marchand 
180a2f1da7dSDavid Marchand 	dpaax_iova_table_update(paddr, va, RTE_CACHE_LINE_SIZE);
181a2f1da7dSDavid Marchand 
182a2f1da7dSDavid Marchand 	return va;
183a2f1da7dSDavid Marchand }
184a2f1da7dSDavid Marchand 
185a2f1da7dSDavid Marchand __rte_internal
186a2f1da7dSDavid Marchand static inline rte_iova_t
rte_dpaa_mem_vtop(void * vaddr)187a2f1da7dSDavid Marchand rte_dpaa_mem_vtop(void *vaddr)
188a2f1da7dSDavid Marchand {
189a2f1da7dSDavid Marchand 	const struct rte_memseg *ms;
190a2f1da7dSDavid Marchand 
191a2f1da7dSDavid Marchand 	ms = rte_mem_virt2memseg(vaddr, NULL);
192a2f1da7dSDavid Marchand 	if (ms)
193a2f1da7dSDavid Marchand 		return ms->iova + RTE_PTR_DIFF(vaddr, ms->addr);
194a2f1da7dSDavid Marchand 
195a2f1da7dSDavid Marchand 	return (size_t)NULL;
196a2f1da7dSDavid Marchand }
197a2f1da7dSDavid Marchand 
198a2f1da7dSDavid Marchand /**
199a2f1da7dSDavid Marchand  * Register a DPAA driver.
200a2f1da7dSDavid Marchand  *
201a2f1da7dSDavid Marchand  * @param driver
202a2f1da7dSDavid Marchand  *   A pointer to a rte_dpaa_driver structure describing the driver
203a2f1da7dSDavid Marchand  *   to be registered.
204a2f1da7dSDavid Marchand  */
205a2f1da7dSDavid Marchand __rte_internal
206a2f1da7dSDavid Marchand void rte_dpaa_driver_register(struct rte_dpaa_driver *driver);
207a2f1da7dSDavid Marchand 
208a2f1da7dSDavid Marchand /**
209a2f1da7dSDavid Marchand  * Unregister a DPAA driver.
210a2f1da7dSDavid Marchand  *
211a2f1da7dSDavid Marchand  * @param driver
212a2f1da7dSDavid Marchand  *	A pointer to a rte_dpaa_driver structure describing the driver
213a2f1da7dSDavid Marchand  *	to be unregistered.
214a2f1da7dSDavid Marchand  */
215a2f1da7dSDavid Marchand __rte_internal
216a2f1da7dSDavid Marchand void rte_dpaa_driver_unregister(struct rte_dpaa_driver *driver);
217a2f1da7dSDavid Marchand 
218a2f1da7dSDavid Marchand /**
219a2f1da7dSDavid Marchand  * Initialize a DPAA portal
220a2f1da7dSDavid Marchand  *
221a2f1da7dSDavid Marchand  * @param arg
222a2f1da7dSDavid Marchand  *	Per thread ID
223a2f1da7dSDavid Marchand  *
224a2f1da7dSDavid Marchand  * @return
225a2f1da7dSDavid Marchand  *	0 in case of success, error otherwise
226a2f1da7dSDavid Marchand  */
227a2f1da7dSDavid Marchand __rte_internal
228a2f1da7dSDavid Marchand int rte_dpaa_portal_init(void *arg);
229a2f1da7dSDavid Marchand 
230a2f1da7dSDavid Marchand __rte_internal
231a2f1da7dSDavid Marchand int rte_dpaa_portal_fq_init(void *arg, struct qman_fq *fq);
232a2f1da7dSDavid Marchand 
233a2f1da7dSDavid Marchand __rte_internal
234a2f1da7dSDavid Marchand int rte_dpaa_portal_fq_close(struct qman_fq *fq);
235a2f1da7dSDavid Marchand 
236a2f1da7dSDavid Marchand /**
237a2f1da7dSDavid Marchand  * Cleanup a DPAA Portal
238a2f1da7dSDavid Marchand  */
239a2f1da7dSDavid Marchand void dpaa_portal_finish(void *arg);
240a2f1da7dSDavid Marchand 
241a2f1da7dSDavid Marchand /** Helper for DPAA device registration from driver (eth, crypto) instance */
242a2f1da7dSDavid Marchand #define RTE_PMD_REGISTER_DPAA(nm, dpaa_drv) \
243a2f1da7dSDavid Marchand RTE_INIT(dpaainitfn_ ##nm) \
244a2f1da7dSDavid Marchand {\
245a2f1da7dSDavid Marchand 	(dpaa_drv).driver.name = RTE_STR(nm);\
246a2f1da7dSDavid Marchand 	rte_dpaa_driver_register(&dpaa_drv); \
247a2f1da7dSDavid Marchand } \
248a2f1da7dSDavid Marchand RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
249a2f1da7dSDavid Marchand 
250a2f1da7dSDavid Marchand __rte_internal
251a2f1da7dSDavid Marchand struct fm_eth_port_cfg *dpaa_get_eth_port_cfg(int dev_id);
252a2f1da7dSDavid Marchand 
253a2f1da7dSDavid Marchand #ifdef __cplusplus
254a2f1da7dSDavid Marchand }
255a2f1da7dSDavid Marchand #endif
256a2f1da7dSDavid Marchand 
257a2f1da7dSDavid Marchand #endif /* BUS_DPAA_DRIVER_H */
258