xref: /dpdk/lib/gpudev/gpudev_driver.h (revision c6552d9a8deffa448de2d5e2e726f50508c1efd2)
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