1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2021 NVIDIA Corporation & Affiliates 3 */ 4 5 /* 6 * This header file must be included only by drivers. 7 * It is considered internal, i.e. hidden for the application. 8 * The prefix rte_ is used to avoid namespace clash in drivers. 9 */ 10 11 #ifndef RTE_GPUDEV_DRIVER_H 12 #define RTE_GPUDEV_DRIVER_H 13 14 #include <stdint.h> 15 #include <sys/queue.h> 16 17 #include <rte_dev.h> 18 19 #include "rte_gpudev.h" 20 21 /* Flags indicate current state of device. */ 22 enum rte_gpu_state { 23 RTE_GPU_STATE_UNUSED, /* not initialized */ 24 RTE_GPU_STATE_INITIALIZED, /* initialized */ 25 }; 26 27 struct rte_gpu; 28 typedef int (rte_gpu_close_t)(struct rte_gpu *dev); 29 typedef int (rte_gpu_info_get_t)(struct rte_gpu *dev, struct rte_gpu_info *info); 30 typedef int (rte_gpu_mem_alloc_t)(struct rte_gpu *dev, size_t size, void **ptr); 31 typedef int (rte_gpu_mem_free_t)(struct rte_gpu *dev, void *ptr); 32 typedef int (rte_gpu_mem_register_t)(struct rte_gpu *dev, size_t size, void *ptr); 33 typedef int (rte_gpu_mem_unregister_t)(struct rte_gpu *dev, void *ptr); 34 typedef int (rte_gpu_wmb_t)(struct rte_gpu *dev); 35 36 struct rte_gpu_ops { 37 /* Get device info. If NULL, info is just copied. */ 38 rte_gpu_info_get_t *dev_info_get; 39 /* Close device or child context. */ 40 rte_gpu_close_t *dev_close; 41 /* Allocate memory in device. */ 42 rte_gpu_mem_alloc_t *mem_alloc; 43 /* Free memory allocated in device. */ 44 rte_gpu_mem_free_t *mem_free; 45 /* Register CPU memory in device. */ 46 rte_gpu_mem_register_t *mem_register; 47 /* Unregister CPU memory from device. */ 48 rte_gpu_mem_unregister_t *mem_unregister; 49 /* Enforce GPU write memory barrier. */ 50 rte_gpu_wmb_t *wmb; 51 }; 52 53 struct rte_gpu_mpshared { 54 /* Unique identifier name. */ 55 char name[RTE_DEV_NAME_MAX_LEN]; /* Updated by this library. */ 56 /* Driver-specific private data shared in multi-process. */ 57 void *dev_private; 58 /* Device info structure. */ 59 struct rte_gpu_info info; 60 /* Counter of processes using the device. */ 61 uint16_t process_refcnt; /* Updated by this library. */ 62 }; 63 64 struct rte_gpu { 65 /* Backing device. */ 66 struct rte_device *device; 67 /* Data shared between processes. */ 68 struct rte_gpu_mpshared *mpshared; 69 /* Driver functions. */ 70 struct rte_gpu_ops ops; 71 /* Event callback list. */ 72 TAILQ_HEAD(rte_gpu_callback_list, rte_gpu_callback) callbacks; 73 /* Current state (used or not) in the running process. */ 74 enum rte_gpu_state process_state; /* Updated by this library. */ 75 /* Driver-specific private data for the running process. */ 76 void *process_private; 77 } __rte_cache_aligned; 78 79 __rte_internal 80 struct rte_gpu *rte_gpu_get_by_name(const char *name); 81 82 /* First step of initialization in primary process. */ 83 __rte_internal 84 struct rte_gpu *rte_gpu_allocate(const char *name); 85 86 /* First step of initialization in secondary process. */ 87 __rte_internal 88 struct rte_gpu *rte_gpu_attach(const char *name); 89 90 /* Last step of initialization. */ 91 __rte_internal 92 void rte_gpu_complete_new(struct rte_gpu *dev); 93 94 /* Last step of removal (primary or secondary process). */ 95 __rte_internal 96 int rte_gpu_release(struct rte_gpu *dev); 97 98 /* Call registered callbacks. No multi-process event. */ 99 __rte_internal 100 void rte_gpu_notify(struct rte_gpu *dev, enum rte_gpu_event); 101 102 #endif /* RTE_GPUDEV_DRIVER_H */ 103