• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2024 Advanced Micro Devices, Inc.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef AC_LINUX_DRM_H
7 #define AC_LINUX_DRM_H
8 
9 #include <stdbool.h>
10 #include <stdint.h>
11 
12 #ifndef _WIN32
13 #include "drm-uapi/amdgpu_drm.h"
14 #include "amdgpu.h"
15 #endif
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 /* All functions are static inline stubs on Windows. */
22 #ifdef _WIN32
23 #define PROC static inline
24 #define TAIL                                                                                       \
25    {                                                                                               \
26       return -1;                                                                                   \
27    }
28 #define TAILV                                                                                      \
29    {                                                                                               \
30    }
31 #define TAILPTR                                                                                    \
32    {                                                                                               \
33       return NULL;                                                                                 \
34    }
35 typedef void* amdgpu_va_handle;
36 #else
37 #define PROC
38 #define TAIL
39 #define TAILV
40 #define TAILPTR
41 #endif
42 
43 struct ac_drm_device;
44 typedef struct ac_drm_device ac_drm_device;
45 
46 typedef union ac_drm_bo {
47 #ifdef _WIN32
48    void *abo;
49 #else
50    amdgpu_bo_handle abo;
51 #endif
52 #ifdef HAVE_AMDGPU_VIRTIO
53    struct amdvgpu_bo *vbo;
54 #endif
55 } ac_drm_bo;
56 
57 struct ac_drm_bo_import_result {
58    ac_drm_bo bo;
59    uint64_t alloc_size;
60 };
61 
62 PROC int ac_drm_device_initialize(int fd, bool is_virtio,
63                                   uint32_t *major_version, uint32_t *minor_version,
64                                   ac_drm_device **device_handle) TAIL;
65 PROC void ac_drm_device_deinitialize(ac_drm_device *dev) TAILV;
66 PROC int ac_drm_device_get_fd(ac_drm_device *dev) TAIL;
67 PROC int ac_drm_bo_set_metadata(ac_drm_device *dev, uint32_t bo_handle,
68                                 struct amdgpu_bo_metadata *info) TAIL;
69 PROC int ac_drm_bo_query_info(ac_drm_device *dev, uint32_t bo_handle, struct amdgpu_bo_info *info) TAIL;
70 PROC int ac_drm_bo_wait_for_idle(ac_drm_device *dev, ac_drm_bo bo, uint64_t timeout_ns,
71                                  bool *busy) TAIL;
72 PROC int ac_drm_bo_va_op(ac_drm_device *dev, uint32_t bo_handle, uint64_t offset, uint64_t size,
73                          uint64_t addr, uint64_t flags, uint32_t ops) TAIL;
74 PROC int ac_drm_bo_va_op_raw(ac_drm_device *dev, uint32_t bo_handle, uint64_t offset, uint64_t size,
75                              uint64_t addr, uint64_t flags, uint32_t ops) TAIL;
76 PROC int ac_drm_bo_va_op_raw2(ac_drm_device *dev, uint32_t bo_handle, uint64_t offset, uint64_t size,
77                               uint64_t addr, uint64_t flags, uint32_t ops,
78                               uint32_t vm_timeline_syncobj_out, uint64_t vm_timeline_point,
79                               uint64_t input_fence_syncobj_handles,
80                               uint32_t num_syncobj_handles) TAIL;
81 PROC int ac_drm_cs_ctx_create2(ac_drm_device *dev, uint32_t priority, uint32_t *ctx_id) TAIL;
82 PROC int ac_drm_cs_ctx_free(ac_drm_device *dev, uint32_t ctx_id) TAIL;
83 PROC int ac_drm_cs_ctx_stable_pstate(ac_drm_device *dev, uint32_t ctx_id, uint32_t op,
84                                      uint32_t flags, uint32_t *out_flags) TAIL;
85 PROC int ac_drm_cs_query_reset_state2(ac_drm_device *dev, uint32_t ctx_id, uint64_t *flags) TAIL;
86 PROC int ac_drm_cs_query_fence_status(ac_drm_device *dev, uint32_t ctx_id, uint32_t ip_type,
87                                       uint32_t ip_instance, uint32_t ring, uint64_t fence_seq_no,
88                                       uint64_t timeout_ns, uint64_t flags, uint32_t *expired) TAIL;
89 PROC int ac_drm_cs_create_syncobj2(int device_fd, uint32_t flags, uint32_t *handle) TAIL;
90 PROC int ac_drm_cs_create_syncobj(int device_fd, uint32_t *handle) TAIL;
91 PROC int ac_drm_cs_destroy_syncobj(int device_fd, uint32_t handle) TAIL;
92 PROC int ac_drm_cs_syncobj_wait(int device_fd, uint32_t *handles, unsigned num_handles,
93                                 int64_t timeout_nsec, unsigned flags,
94                                 uint32_t *first_signaled) TAIL;
95 PROC int ac_drm_cs_syncobj_query2(int device_fd, uint32_t *handles, uint64_t *points,
96                                   unsigned num_handles, uint32_t flags) TAIL;
97 PROC int ac_drm_cs_import_syncobj(int device_fd, int shared_fd, uint32_t *handle) TAIL;
98 PROC int ac_drm_cs_syncobj_export_sync_file(int device_fd, uint32_t syncobj,
99                                             int *sync_file_fd) TAIL;
100 PROC int ac_drm_cs_syncobj_import_sync_file(int device_fd, uint32_t syncobj, int sync_file_fd) TAIL;
101 PROC int ac_drm_cs_syncobj_export_sync_file2(int device_fd, uint32_t syncobj, uint64_t point,
102                                              uint32_t flags, int *sync_file_fd) TAIL;
103 PROC int ac_drm_cs_syncobj_transfer(int device_fd, uint32_t dst_handle, uint64_t dst_point,
104                                     uint32_t src_handle, uint64_t src_point, uint32_t flags) TAIL;
105 PROC int ac_drm_cs_submit_raw2(ac_drm_device *dev, uint32_t ctx_id, uint32_t bo_list_handle,
106                                int num_chunks, struct drm_amdgpu_cs_chunk *chunks,
107                                uint64_t *seq_no) TAIL;
108 PROC void ac_drm_cs_chunk_fence_info_to_data(uint32_t bo_handle, uint64_t offset,
109                                              struct drm_amdgpu_cs_chunk_data *data) TAILV;
110 PROC int ac_drm_cs_syncobj_timeline_wait(int device_fd, uint32_t *handles, uint64_t *points,
111                                          unsigned num_handles, int64_t timeout_nsec, unsigned flags,
112                                          uint32_t *first_signaled) TAIL;
113 PROC int ac_drm_query_info(ac_drm_device *dev, unsigned info_id, unsigned size, void *value) TAIL;
114 PROC int ac_drm_read_mm_registers(ac_drm_device *dev, unsigned dword_offset, unsigned count,
115                                   uint32_t instance, uint32_t flags, uint32_t *values) TAIL;
116 PROC int ac_drm_query_hw_ip_count(ac_drm_device *dev, unsigned type, uint32_t *count) TAIL;
117 PROC int ac_drm_query_hw_ip_info(ac_drm_device *dev, unsigned type, unsigned ip_instance,
118                                  struct drm_amdgpu_info_hw_ip *info) TAIL;
119 PROC int ac_drm_query_firmware_version(ac_drm_device *dev, unsigned fw_type, unsigned ip_instance,
120                                        unsigned index, uint32_t *version, uint32_t *feature) TAIL;
121 PROC int ac_drm_query_uq_fw_area_info(ac_drm_device *dev, unsigned type, unsigned ip_instance,
122                                       struct drm_amdgpu_info_uq_fw_areas *info) TAIL;
123 PROC int ac_drm_query_gpu_info(ac_drm_device *dev, struct amdgpu_gpu_info *info) TAIL;
124 PROC int ac_drm_query_heap_info(ac_drm_device *dev, uint32_t heap, uint32_t flags,
125                                 struct amdgpu_heap_info *info) TAIL;
126 PROC int ac_drm_query_sensor_info(ac_drm_device *dev, unsigned sensor_type, unsigned size,
127                                   void *value) TAIL;
128 PROC int ac_drm_query_video_caps_info(ac_drm_device *dev, unsigned cap_type, unsigned size,
129                                       void *value) TAIL;
130 PROC int ac_drm_query_gpuvm_fault_info(ac_drm_device *dev, unsigned size, void *value) TAIL;
131 PROC int ac_drm_vm_reserve_vmid(ac_drm_device *dev, uint32_t flags) TAIL;
132 PROC int ac_drm_vm_unreserve_vmid(ac_drm_device *dev, uint32_t flags) TAIL;
133 PROC const char *ac_drm_get_marketing_name(ac_drm_device *device) TAILPTR;
134 PROC int ac_drm_query_sw_info(ac_drm_device *dev,
135                               enum amdgpu_sw_info info, void *value) TAIL;
136 PROC int ac_drm_bo_alloc(ac_drm_device *dev, struct amdgpu_bo_alloc_request *alloc_buffer,
137                          ac_drm_bo *bo) TAIL;
138 PROC int ac_drm_bo_export(ac_drm_device *dev, ac_drm_bo bo,
139                           enum amdgpu_bo_handle_type type, uint32_t *shared_handle) TAIL;
140 PROC int ac_drm_bo_import(ac_drm_device *dev, enum amdgpu_bo_handle_type type,
141                           uint32_t shared_handle, struct ac_drm_bo_import_result *output) TAIL;
142 PROC int ac_drm_create_bo_from_user_mem(ac_drm_device *dev, void *cpu,
143                                         uint64_t size, ac_drm_bo *bo) TAIL;
144 PROC int ac_drm_bo_free(ac_drm_device *dev, ac_drm_bo bo) TAIL;
145 PROC int ac_drm_bo_cpu_map(ac_drm_device *dev, ac_drm_bo bo, void **cpu) TAIL;
146 PROC int ac_drm_bo_cpu_unmap(ac_drm_device *dev, ac_drm_bo bo) TAIL;
147 PROC int ac_drm_va_range_alloc(ac_drm_device *dev, enum amdgpu_gpu_va_range va_range_type,
148                                uint64_t size, uint64_t va_base_alignment, uint64_t va_base_required,
149                                uint64_t *va_base_allocated, amdgpu_va_handle *va_range_handle,
150                                uint64_t flags) TAIL;
151 PROC int ac_drm_va_range_free(amdgpu_va_handle va_range_handle) TAIL;
152 PROC int ac_drm_create_userqueue(ac_drm_device *dev, uint32_t ip_type, uint32_t doorbell_handle,
153                                  uint32_t doorbell_offset, uint64_t queue_va, uint64_t queue_size,
154                                  uint64_t wptr_va, uint64_t rptr_va, void *mqd_in,
155                                  uint32_t *queue_id) TAIL;
156 PROC int ac_drm_free_userqueue(ac_drm_device *dev, uint32_t queue_id) TAIL;
157 PROC int ac_drm_userq_signal(ac_drm_device *dev, struct drm_amdgpu_userq_signal *signal_data) TAIL;
158 PROC int ac_drm_userq_wait(ac_drm_device *dev, struct drm_amdgpu_userq_wait *wait_data) TAIL;
159 
160 #ifdef __cplusplus
161 }
162 #endif
163 
164 #endif
165