xref: /dpdk/drivers/raw/ifpga/afu_pmd_core.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2022 Intel Corporation
3  */
4 
5 #ifndef AFU_PMD_CORE_H
6 #define AFU_PMD_CORE_H
7 
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <unistd.h>
11 
12 #include <rte_spinlock.h>
13 #include <rte_cycles.h>
14 #include <bus_ifpga_driver.h>
15 #include <rte_rawdev.h>
16 
17 #include "ifpga_rawdev.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #define AFU_RAWDEV_MAX_DRVS  32
24 
25 struct afu_rawdev;
26 
27 struct afu_ops {
28 	int (*init)(struct afu_rawdev *dev);
29 	int (*config)(struct afu_rawdev *dev, void *config,
30 		size_t config_size);
31 	int (*start)(struct afu_rawdev *dev);
32 	int (*stop)(struct afu_rawdev *dev);
33 	int (*test)(struct afu_rawdev *dev);
34 	int (*close)(struct afu_rawdev *dev);
35 	int (*reset)(struct afu_rawdev *dev);
36 	int (*dump)(struct afu_rawdev *dev, FILE *f);
37 };
38 
39 struct afu_shared_data {
40 	rte_spinlock_t lock;  /* lock for multi-process access */
41 };
42 
43 struct afu_rawdev_drv {
44 	TAILQ_ENTRY(afu_rawdev_drv) next;
45 	struct rte_afu_uuid uuid;
46 	struct afu_ops *ops;
47 };
48 
49 struct afu_rawdev {
50 	struct rte_rawdev *rawdev;  /* point to parent raw device */
51 	struct afu_shared_data *sd;  /* shared data for multi-process */
52 	struct afu_ops *ops;  /* device operation functions */
53 	int port;  /* index of port the AFU attached */
54 	void *addr;  /* base address of AFU registers */
55 	void *priv;  /* private driver data */
56 };
57 
58 static inline struct afu_rawdev *
59 afu_rawdev_get_priv(const struct rte_rawdev *rawdev)
60 {
61 	return rawdev ? (struct afu_rawdev *)rawdev->dev_private : NULL;
62 }
63 
64 #define CLS_TO_SIZE(n)  ((n) << 6)  /* get size of n cache lines */
65 #define SIZE_TO_CLS(s)  ((s) >> 6)  /* convert size to number of cache lines */
66 #define MHZ(f)  ((f) * 1000000)
67 
68 #define dsm_poll_timeout(addr, val, cond, invl, timeout) \
69 __extension__ ({                                             \
70 	uint64_t __wait = 0;                                 \
71 	uint64_t __invl = (invl);                            \
72 	uint64_t __timeout = (timeout);                      \
73 	for (; __wait <= __timeout; __wait += __invl) {      \
74 		(val) = *(addr);                                 \
75 		if (cond)                                        \
76 			break;                                       \
77 		rte_delay_ms(__invl);                            \
78 	}                                                    \
79 	(cond) ? 0 : 1;                                      \
80 })
81 
82 void afu_pmd_register(struct afu_rawdev_drv *driver);
83 void afu_pmd_unregister(struct afu_rawdev_drv *driver);
84 
85 #define AFU_PMD_REGISTER(drv)\
86 RTE_INIT(afupmdinitfunc_ ##drv)\
87 {\
88 	afu_pmd_register(&drv);\
89 }
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 
95 #endif /* AFU_PMD_CORE_H */
96