1 /* 2 * Copyright © 2024 Advanced Micro Devices, Inc. 3 * 4 * SPDX-License-Identifier: MIT 5 */ 6 7 #ifndef AMDGPU_USERQ_H 8 #define AMDGPU_USERQ_H 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 /* ring size should be power of 2 and enough to hold AMDGPU_FENCE_RING_SIZE ibs */ 15 #define AMDGPU_USERQ_RING_SIZE 0x10000 16 #define AMDGPU_USERQ_RING_SIZE_DW (AMDGPU_USERQ_RING_SIZE >> 2) 17 #define AMDGPU_USERQ_RING_SIZE_DW_MASK (AMDGPU_USERQ_RING_SIZE_DW - 1) 18 19 /* An offset into doorbell page. Any number will work. */ 20 #define AMDGPU_USERQ_DOORBELL_INDEX 4 21 22 #define amdgpu_pkt_begin() uint32_t __num_dw_written = 0; \ 23 uint32_t __ring_start = *userq->wptr_bo_map & AMDGPU_USERQ_RING_SIZE_DW_MASK; 24 25 #define amdgpu_pkt_add_dw(value) do { \ 26 *(userq->ring_ptr + ((__ring_start + __num_dw_written) & AMDGPU_USERQ_RING_SIZE_DW_MASK)) \ 27 = value; \ 28 __num_dw_written++; \ 29 } while (0) 30 31 #define amdgpu_pkt_end() do { \ 32 *userq->wptr_bo_map += __num_dw_written; \ 33 } while (0) 34 35 struct amdgpu_winsys; 36 37 struct amdgpu_userq_gfx_data { 38 struct pb_buffer_lean *csa_bo; 39 struct pb_buffer_lean *shadow_bo; 40 }; 41 42 struct amdgpu_userq_compute_data { 43 struct pb_buffer_lean *eop_bo; 44 }; 45 46 struct amdgpu_userq_sdma_data { 47 struct pb_buffer_lean *csa_bo; 48 }; 49 50 /* For gfx, compute and sdma ip there will be one userqueue per process. 51 * i.e. commands from all context will be submitted to single userqueue. 52 * There will be one struct amdgpu_userq per gfx, compute and sdma ip. 53 */ 54 struct amdgpu_userq { 55 struct pb_buffer_lean *gtt_bo; 56 uint8_t *gtt_bo_map; 57 58 uint32_t *ring_ptr; 59 uint64_t *user_fence_ptr; 60 uint64_t user_fence_va; 61 uint64_t user_fence_seq_num; 62 63 struct pb_buffer_lean *wptr_bo; 64 uint64_t *wptr_bo_map; 65 struct pb_buffer_lean *rptr_bo; 66 67 struct pb_buffer_lean *doorbell_bo; 68 uint64_t *doorbell_bo_map; 69 70 uint32_t userq_handle; 71 enum amd_ip_type ip_type; 72 simple_mtx_t lock; 73 74 union { 75 struct amdgpu_userq_gfx_data gfx_data; 76 struct amdgpu_userq_compute_data compute_data; 77 struct amdgpu_userq_sdma_data sdma_data; 78 }; 79 }; 80 81 bool 82 amdgpu_userq_init(struct amdgpu_winsys *aws, struct amdgpu_userq *userq, enum amd_ip_type ip_type); 83 void 84 amdgpu_userq_deinit(struct amdgpu_winsys *aws, struct amdgpu_userq *userq); 85 86 #ifdef __cplusplus 87 } 88 #endif 89 90 #endif 91