• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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