xref: /dpdk/drivers/raw/ifpga/afu_pmd_core.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
103260531SWei Huang /* SPDX-License-Identifier: BSD-3-Clause
203260531SWei Huang  * Copyright 2022 Intel Corporation
303260531SWei Huang  */
403260531SWei Huang 
503260531SWei Huang #ifndef AFU_PMD_CORE_H
603260531SWei Huang #define AFU_PMD_CORE_H
703260531SWei Huang 
803260531SWei Huang #include <stdint.h>
903260531SWei Huang #include <stdio.h>
1003260531SWei Huang #include <unistd.h>
1103260531SWei Huang 
1203260531SWei Huang #include <rte_spinlock.h>
137d63899aSWei Huang #include <rte_cycles.h>
14925c074eSDavid Marchand #include <bus_ifpga_driver.h>
1503260531SWei Huang #include <rte_rawdev.h>
1603260531SWei Huang 
1703260531SWei Huang #include "ifpga_rawdev.h"
1803260531SWei Huang 
19*719834a6SMattias Rönnblom #ifdef __cplusplus
20*719834a6SMattias Rönnblom extern "C" {
21*719834a6SMattias Rönnblom #endif
22*719834a6SMattias Rönnblom 
2303260531SWei Huang #define AFU_RAWDEV_MAX_DRVS  32
2403260531SWei Huang 
2503260531SWei Huang struct afu_rawdev;
2603260531SWei Huang 
2703260531SWei Huang struct afu_ops {
2803260531SWei Huang 	int (*init)(struct afu_rawdev *dev);
2903260531SWei Huang 	int (*config)(struct afu_rawdev *dev, void *config,
3003260531SWei Huang 		size_t config_size);
3103260531SWei Huang 	int (*start)(struct afu_rawdev *dev);
3203260531SWei Huang 	int (*stop)(struct afu_rawdev *dev);
3303260531SWei Huang 	int (*test)(struct afu_rawdev *dev);
3403260531SWei Huang 	int (*close)(struct afu_rawdev *dev);
3503260531SWei Huang 	int (*reset)(struct afu_rawdev *dev);
3603260531SWei Huang 	int (*dump)(struct afu_rawdev *dev, FILE *f);
3703260531SWei Huang };
3803260531SWei Huang 
3903260531SWei Huang struct afu_shared_data {
4003260531SWei Huang 	rte_spinlock_t lock;  /* lock for multi-process access */
4103260531SWei Huang };
4203260531SWei Huang 
4303260531SWei Huang struct afu_rawdev_drv {
4403260531SWei Huang 	TAILQ_ENTRY(afu_rawdev_drv) next;
4503260531SWei Huang 	struct rte_afu_uuid uuid;
4603260531SWei Huang 	struct afu_ops *ops;
4703260531SWei Huang };
4803260531SWei Huang 
4903260531SWei Huang struct afu_rawdev {
5003260531SWei Huang 	struct rte_rawdev *rawdev;  /* point to parent raw device */
5103260531SWei Huang 	struct afu_shared_data *sd;  /* shared data for multi-process */
5203260531SWei Huang 	struct afu_ops *ops;  /* device operation functions */
5303260531SWei Huang 	int port;  /* index of port the AFU attached */
5403260531SWei Huang 	void *addr;  /* base address of AFU registers */
5503260531SWei Huang 	void *priv;  /* private driver data */
5603260531SWei Huang };
5703260531SWei Huang 
5803260531SWei Huang static inline struct afu_rawdev *
5903260531SWei Huang afu_rawdev_get_priv(const struct rte_rawdev *rawdev)
6003260531SWei Huang {
6103260531SWei Huang 	return rawdev ? (struct afu_rawdev *)rawdev->dev_private : NULL;
6203260531SWei Huang }
6303260531SWei Huang 
647d63899aSWei Huang #define CLS_TO_SIZE(n)  ((n) << 6)  /* get size of n cache lines */
657d63899aSWei Huang #define SIZE_TO_CLS(s)  ((s) >> 6)  /* convert size to number of cache lines */
667d63899aSWei Huang #define MHZ(f)  ((f) * 1000000)
677d63899aSWei Huang 
687d63899aSWei Huang #define dsm_poll_timeout(addr, val, cond, invl, timeout) \
6993998f3cSTyler Retzlaff __extension__ ({                                             \
707d63899aSWei Huang 	uint64_t __wait = 0;                                 \
717d63899aSWei Huang 	uint64_t __invl = (invl);                            \
727d63899aSWei Huang 	uint64_t __timeout = (timeout);                      \
737d63899aSWei Huang 	for (; __wait <= __timeout; __wait += __invl) {      \
747d63899aSWei Huang 		(val) = *(addr);                                 \
757d63899aSWei Huang 		if (cond)                                        \
767d63899aSWei Huang 			break;                                       \
777d63899aSWei Huang 		rte_delay_ms(__invl);                            \
787d63899aSWei Huang 	}                                                    \
797d63899aSWei Huang 	(cond) ? 0 : 1;                                      \
807d63899aSWei Huang })
817d63899aSWei Huang 
8203260531SWei Huang void afu_pmd_register(struct afu_rawdev_drv *driver);
8303260531SWei Huang void afu_pmd_unregister(struct afu_rawdev_drv *driver);
8403260531SWei Huang 
8503260531SWei Huang #define AFU_PMD_REGISTER(drv)\
8603260531SWei Huang RTE_INIT(afupmdinitfunc_ ##drv)\
8703260531SWei Huang {\
8803260531SWei Huang 	afu_pmd_register(&drv);\
8903260531SWei Huang }
9003260531SWei Huang 
9103260531SWei Huang #ifdef __cplusplus
9203260531SWei Huang }
9303260531SWei Huang #endif
9403260531SWei Huang 
9503260531SWei Huang #endif /* AFU_PMD_CORE_H */
96