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