18b8036a6SElena Agostini /* SPDX-License-Identifier: BSD-3-Clause 28b8036a6SElena Agostini * Copyright (c) 2021 NVIDIA Corporation & Affiliates 38b8036a6SElena Agostini */ 48b8036a6SElena Agostini 58b8036a6SElena Agostini /* 68b8036a6SElena Agostini * This header file must be included only by drivers. 78b8036a6SElena Agostini * It is considered internal, i.e. hidden for the application. 88b8036a6SElena Agostini * The prefix rte_ is used to avoid namespace clash in drivers. 98b8036a6SElena Agostini */ 108b8036a6SElena Agostini 118b8036a6SElena Agostini #ifndef RTE_GPUDEV_DRIVER_H 128b8036a6SElena Agostini #define RTE_GPUDEV_DRIVER_H 138b8036a6SElena Agostini 148b8036a6SElena Agostini #include <stdint.h> 1518cb0756SThomas Monjalon #include <sys/queue.h> 168b8036a6SElena Agostini 171acb7f54SDavid Marchand #include <dev_driver.h> 188b8036a6SElena Agostini 191094dd94SDavid Marchand #include <rte_compat.h> 208b8036a6SElena Agostini #include "rte_gpudev.h" 218b8036a6SElena Agostini 225dd7c0d6SThomas Monjalon #ifdef __cplusplus 235dd7c0d6SThomas Monjalon extern "C" { 245dd7c0d6SThomas Monjalon #endif 255dd7c0d6SThomas Monjalon 268b8036a6SElena Agostini /* Flags indicate current state of device. */ 278b8036a6SElena Agostini enum rte_gpu_state { 288b8036a6SElena Agostini RTE_GPU_STATE_UNUSED, /* not initialized */ 298b8036a6SElena Agostini RTE_GPU_STATE_INITIALIZED, /* initialized */ 308b8036a6SElena Agostini }; 318b8036a6SElena Agostini 328b8036a6SElena Agostini struct rte_gpu; 338b8036a6SElena Agostini typedef int (rte_gpu_close_t)(struct rte_gpu *dev); 348b8036a6SElena Agostini typedef int (rte_gpu_info_get_t)(struct rte_gpu *dev, struct rte_gpu_info *info); 35c8557ed4SElena Agostini typedef int (rte_gpu_mem_alloc_t)(struct rte_gpu *dev, size_t size, unsigned int align, void **ptr); 36e818c4e2SElena Agostini typedef int (rte_gpu_mem_free_t)(struct rte_gpu *dev, void *ptr); 37e818c4e2SElena Agostini typedef int (rte_gpu_mem_register_t)(struct rte_gpu *dev, size_t size, void *ptr); 38e818c4e2SElena Agostini typedef int (rte_gpu_mem_unregister_t)(struct rte_gpu *dev, void *ptr); 39d69bb47dSElena Agostini typedef int (rte_gpu_mem_cpu_map_t)(struct rte_gpu *dev, size_t size, void *ptr_in, void **ptr_out); 40d69bb47dSElena Agostini typedef int (rte_gpu_mem_cpu_unmap_t)(struct rte_gpu *dev, void *ptr); 412d61b429SElena Agostini typedef int (rte_gpu_wmb_t)(struct rte_gpu *dev); 428b8036a6SElena Agostini 438b8036a6SElena Agostini struct rte_gpu_ops { 448b8036a6SElena Agostini /* Get device info. If NULL, info is just copied. */ 458b8036a6SElena Agostini rte_gpu_info_get_t *dev_info_get; 4682e5f6b6SThomas Monjalon /* Close device or child context. */ 478b8036a6SElena Agostini rte_gpu_close_t *dev_close; 48e818c4e2SElena Agostini /* Allocate memory in device. */ 49e818c4e2SElena Agostini rte_gpu_mem_alloc_t *mem_alloc; 50e818c4e2SElena Agostini /* Free memory allocated in device. */ 51e818c4e2SElena Agostini rte_gpu_mem_free_t *mem_free; 52e818c4e2SElena Agostini /* Register CPU memory in device. */ 53e818c4e2SElena Agostini rte_gpu_mem_register_t *mem_register; 54e818c4e2SElena Agostini /* Unregister CPU memory from device. */ 55e818c4e2SElena Agostini rte_gpu_mem_unregister_t *mem_unregister; 56d69bb47dSElena Agostini /* Map GPU memory for CPU visibility. */ 57d69bb47dSElena Agostini rte_gpu_mem_cpu_map_t *mem_cpu_map; 58d69bb47dSElena Agostini /* Unmap GPU memory for CPU visibility. */ 59d69bb47dSElena Agostini rte_gpu_mem_cpu_unmap_t *mem_cpu_unmap; 602d61b429SElena Agostini /* Enforce GPU write memory barrier. */ 612d61b429SElena Agostini rte_gpu_wmb_t *wmb; 628b8036a6SElena Agostini }; 638b8036a6SElena Agostini 64a9af048aSThomas Monjalon struct rte_gpu_mpshared { 65a9af048aSThomas Monjalon /* Unique identifier name. */ 66a9af048aSThomas Monjalon char name[RTE_DEV_NAME_MAX_LEN]; /* Updated by this library. */ 67a9af048aSThomas Monjalon /* Driver-specific private data shared in multi-process. */ 68a9af048aSThomas Monjalon void *dev_private; 69a9af048aSThomas Monjalon /* Device info structure. */ 70a9af048aSThomas Monjalon struct rte_gpu_info info; 71a9af048aSThomas Monjalon /* Counter of processes using the device. */ 725dbd4e93STyler Retzlaff RTE_ATOMIC(uint16_t) process_refcnt; /* Updated by this library. */ 73a9af048aSThomas Monjalon }; 74a9af048aSThomas Monjalon 75*c6552d9aSTyler Retzlaff struct __rte_cache_aligned rte_gpu { 768b8036a6SElena Agostini /* Backing device. */ 778b8036a6SElena Agostini struct rte_device *device; 78a9af048aSThomas Monjalon /* Data shared between processes. */ 79a9af048aSThomas Monjalon struct rte_gpu_mpshared *mpshared; 808b8036a6SElena Agostini /* Driver functions. */ 818b8036a6SElena Agostini struct rte_gpu_ops ops; 8218cb0756SThomas Monjalon /* Event callback list. */ 8318cb0756SThomas Monjalon TAILQ_HEAD(rte_gpu_callback_list, rte_gpu_callback) callbacks; 848b8036a6SElena Agostini /* Current state (used or not) in the running process. */ 85a9af048aSThomas Monjalon enum rte_gpu_state process_state; /* Updated by this library. */ 868b8036a6SElena Agostini /* Driver-specific private data for the running process. */ 878b8036a6SElena Agostini void *process_private; 88*c6552d9aSTyler Retzlaff }; 898b8036a6SElena Agostini 908b8036a6SElena Agostini __rte_internal 918b8036a6SElena Agostini struct rte_gpu *rte_gpu_get_by_name(const char *name); 928b8036a6SElena Agostini 93a9af048aSThomas Monjalon /* First step of initialization in primary process. */ 948b8036a6SElena Agostini __rte_internal 958b8036a6SElena Agostini struct rte_gpu *rte_gpu_allocate(const char *name); 968b8036a6SElena Agostini 97a9af048aSThomas Monjalon /* First step of initialization in secondary process. */ 98a9af048aSThomas Monjalon __rte_internal 99a9af048aSThomas Monjalon struct rte_gpu *rte_gpu_attach(const char *name); 100a9af048aSThomas Monjalon 1018b8036a6SElena Agostini /* Last step of initialization. */ 1028b8036a6SElena Agostini __rte_internal 1038b8036a6SElena Agostini void rte_gpu_complete_new(struct rte_gpu *dev); 1048b8036a6SElena Agostini 105a9af048aSThomas Monjalon /* Last step of removal (primary or secondary process). */ 1068b8036a6SElena Agostini __rte_internal 1078b8036a6SElena Agostini int rte_gpu_release(struct rte_gpu *dev); 1088b8036a6SElena Agostini 10918cb0756SThomas Monjalon /* Call registered callbacks. No multi-process event. */ 11018cb0756SThomas Monjalon __rte_internal 11118cb0756SThomas Monjalon void rte_gpu_notify(struct rte_gpu *dev, enum rte_gpu_event); 11218cb0756SThomas Monjalon 1135dd7c0d6SThomas Monjalon #ifdef __cplusplus 1145dd7c0d6SThomas Monjalon } 1155dd7c0d6SThomas Monjalon #endif 1165dd7c0d6SThomas Monjalon 1178b8036a6SElena Agostini #endif /* RTE_GPUDEV_DRIVER_H */ 118