diff options
author | Andrey Grodzovsky <andrey.grodzovsky@amd.com> | 2018-03-29 09:09:39 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-04-03 14:08:44 -0400 |
commit | f7a9ee81a88b83915e7c15895c507abede44b0c5 (patch) | |
tree | 61903e2fc7a93c70bdbd895cf12fda708cba7b31 /drivers/gpu/drm/amd/amdgpu | |
parent | 073997ccd9dd8eb8015f5371ff0ea85a48814bb4 (diff) |
drm/amdgpu: Add support for SRBM selection v3
Also remove code duplication in write and read regs functions.
This also fixes potential missing unlock in amdgpu_debugfs_regs_write
in case get_user would fail.
v2: Add SRBM mutex locking.
v3: Fix TO counter and fix comment location.
Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 117 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 11 |
6 files changed, 72 insertions, 79 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index f44a83ab2bf4..0193f6ced00b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -890,6 +890,7 @@ struct amdgpu_gfx_funcs { | |||
890 | void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields); | 890 | void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields); |
891 | void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t thread, uint32_t start, uint32_t size, uint32_t *dst); | 891 | void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t thread, uint32_t start, uint32_t size, uint32_t *dst); |
892 | void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t start, uint32_t size, uint32_t *dst); | 892 | void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t start, uint32_t size, uint32_t *dst); |
893 | void (*select_me_pipe_q)(struct amdgpu_device *adev, u32 me, u32 pipe, u32 queue); | ||
893 | }; | 894 | }; |
894 | 895 | ||
895 | struct amdgpu_ngg_buf { | 896 | struct amdgpu_ngg_buf { |
@@ -1812,6 +1813,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) | |||
1812 | #define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) | 1813 | #define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) |
1813 | #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) | 1814 | #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) |
1814 | #define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i)) | 1815 | #define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i)) |
1816 | #define amdgpu_gfx_select_me_pipe_q(adev, me, pipe, q) (adev)->gfx.funcs->select_me_pipe_q((adev), (me), (pipe), (q)) | ||
1815 | 1817 | ||
1816 | /* Common functions */ | 1818 | /* Common functions */ |
1817 | int amdgpu_device_gpu_recover(struct amdgpu_device *adev, | 1819 | int amdgpu_device_gpu_recover(struct amdgpu_device *adev, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 369beb5041a2..448d69fe3756 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | |||
@@ -64,16 +64,21 @@ int amdgpu_debugfs_add_files(struct amdgpu_device *adev, | |||
64 | 64 | ||
65 | #if defined(CONFIG_DEBUG_FS) | 65 | #if defined(CONFIG_DEBUG_FS) |
66 | 66 | ||
67 | static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | 67 | |
68 | size_t size, loff_t *pos) | 68 | static int amdgpu_debugfs_process_reg_op(bool read, struct file *f, |
69 | char __user *buf, size_t size, loff_t *pos) | ||
69 | { | 70 | { |
70 | struct amdgpu_device *adev = file_inode(f)->i_private; | 71 | struct amdgpu_device *adev = file_inode(f)->i_private; |
71 | ssize_t result = 0; | 72 | ssize_t result = 0; |
72 | int r; | 73 | int r; |
73 | bool pm_pg_lock, use_bank; | 74 | bool pm_pg_lock, use_bank, use_ring; |
74 | unsigned instance_bank, sh_bank, se_bank; | 75 | unsigned instance_bank, sh_bank, se_bank, me, pipe, queue; |
75 | 76 | ||
76 | if (size & 0x3 || *pos & 0x3) | 77 | pm_pg_lock = use_bank = use_ring = false; |
78 | instance_bank = sh_bank = se_bank = me = pipe = queue = 0; | ||
79 | |||
80 | if (size & 0x3 || *pos & 0x3 || | ||
81 | ((*pos & (1ULL << 62)) && (*pos & (1ULL << 61)))) | ||
77 | return -EINVAL; | 82 | return -EINVAL; |
78 | 83 | ||
79 | /* are we reading registers for which a PG lock is necessary? */ | 84 | /* are we reading registers for which a PG lock is necessary? */ |
@@ -91,8 +96,15 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | |||
91 | if (instance_bank == 0x3FF) | 96 | if (instance_bank == 0x3FF) |
92 | instance_bank = 0xFFFFFFFF; | 97 | instance_bank = 0xFFFFFFFF; |
93 | use_bank = 1; | 98 | use_bank = 1; |
99 | } else if (*pos & (1ULL << 61)) { | ||
100 | |||
101 | me = (*pos & GENMASK_ULL(33, 24)) >> 24; | ||
102 | pipe = (*pos & GENMASK_ULL(43, 34)) >> 34; | ||
103 | queue = (*pos & GENMASK_ULL(53, 44)) >> 44; | ||
104 | |||
105 | use_ring = 1; | ||
94 | } else { | 106 | } else { |
95 | use_bank = 0; | 107 | use_bank = use_ring = 0; |
96 | } | 108 | } |
97 | 109 | ||
98 | *pos &= (1UL << 22) - 1; | 110 | *pos &= (1UL << 22) - 1; |
@@ -104,6 +116,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | |||
104 | mutex_lock(&adev->grbm_idx_mutex); | 116 | mutex_lock(&adev->grbm_idx_mutex); |
105 | amdgpu_gfx_select_se_sh(adev, se_bank, | 117 | amdgpu_gfx_select_se_sh(adev, se_bank, |
106 | sh_bank, instance_bank); | 118 | sh_bank, instance_bank); |
119 | } else if (use_ring) { | ||
120 | mutex_lock(&adev->srbm_mutex); | ||
121 | amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue); | ||
107 | } | 122 | } |
108 | 123 | ||
109 | if (pm_pg_lock) | 124 | if (pm_pg_lock) |
@@ -115,8 +130,14 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | |||
115 | if (*pos > adev->rmmio_size) | 130 | if (*pos > adev->rmmio_size) |
116 | goto end; | 131 | goto end; |
117 | 132 | ||
118 | value = RREG32(*pos >> 2); | 133 | if (read) { |
119 | r = put_user(value, (uint32_t *)buf); | 134 | value = RREG32(*pos >> 2); |
135 | r = put_user(value, (uint32_t *)buf); | ||
136 | } else { | ||
137 | r = get_user(value, (uint32_t *)buf); | ||
138 | if (!r) | ||
139 | WREG32(*pos >> 2, value); | ||
140 | } | ||
120 | if (r) { | 141 | if (r) { |
121 | result = r; | 142 | result = r; |
122 | goto end; | 143 | goto end; |
@@ -132,6 +153,9 @@ end: | |||
132 | if (use_bank) { | 153 | if (use_bank) { |
133 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 154 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
134 | mutex_unlock(&adev->grbm_idx_mutex); | 155 | mutex_unlock(&adev->grbm_idx_mutex); |
156 | } else if (use_ring) { | ||
157 | amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0); | ||
158 | mutex_unlock(&adev->srbm_mutex); | ||
135 | } | 159 | } |
136 | 160 | ||
137 | if (pm_pg_lock) | 161 | if (pm_pg_lock) |
@@ -140,78 +164,17 @@ end: | |||
140 | return result; | 164 | return result; |
141 | } | 165 | } |
142 | 166 | ||
167 | |||
168 | static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | ||
169 | size_t size, loff_t *pos) | ||
170 | { | ||
171 | return amdgpu_debugfs_process_reg_op(true, f, buf, size, pos); | ||
172 | } | ||
173 | |||
143 | static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, | 174 | static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, |
144 | size_t size, loff_t *pos) | 175 | size_t size, loff_t *pos) |
145 | { | 176 | { |
146 | struct amdgpu_device *adev = file_inode(f)->i_private; | 177 | return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos); |
147 | ssize_t result = 0; | ||
148 | int r; | ||
149 | bool pm_pg_lock, use_bank; | ||
150 | unsigned instance_bank, sh_bank, se_bank; | ||
151 | |||
152 | if (size & 0x3 || *pos & 0x3) | ||
153 | return -EINVAL; | ||
154 | |||
155 | /* are we reading registers for which a PG lock is necessary? */ | ||
156 | pm_pg_lock = (*pos >> 23) & 1; | ||
157 | |||
158 | if (*pos & (1ULL << 62)) { | ||
159 | se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; | ||
160 | sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; | ||
161 | instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; | ||
162 | |||
163 | if (se_bank == 0x3FF) | ||
164 | se_bank = 0xFFFFFFFF; | ||
165 | if (sh_bank == 0x3FF) | ||
166 | sh_bank = 0xFFFFFFFF; | ||
167 | if (instance_bank == 0x3FF) | ||
168 | instance_bank = 0xFFFFFFFF; | ||
169 | use_bank = 1; | ||
170 | } else { | ||
171 | use_bank = 0; | ||
172 | } | ||
173 | |||
174 | *pos &= (1UL << 22) - 1; | ||
175 | |||
176 | if (use_bank) { | ||
177 | if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || | ||
178 | (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) | ||
179 | return -EINVAL; | ||
180 | mutex_lock(&adev->grbm_idx_mutex); | ||
181 | amdgpu_gfx_select_se_sh(adev, se_bank, | ||
182 | sh_bank, instance_bank); | ||
183 | } | ||
184 | |||
185 | if (pm_pg_lock) | ||
186 | mutex_lock(&adev->pm.mutex); | ||
187 | |||
188 | while (size) { | ||
189 | uint32_t value; | ||
190 | |||
191 | if (*pos > adev->rmmio_size) | ||
192 | return result; | ||
193 | |||
194 | r = get_user(value, (uint32_t *)buf); | ||
195 | if (r) | ||
196 | return r; | ||
197 | |||
198 | WREG32(*pos >> 2, value); | ||
199 | |||
200 | result += 4; | ||
201 | buf += 4; | ||
202 | *pos += 4; | ||
203 | size -= 4; | ||
204 | } | ||
205 | |||
206 | if (use_bank) { | ||
207 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | ||
208 | mutex_unlock(&adev->grbm_idx_mutex); | ||
209 | } | ||
210 | |||
211 | if (pm_pg_lock) | ||
212 | mutex_unlock(&adev->pm.mutex); | ||
213 | |||
214 | return result; | ||
215 | } | 178 | } |
216 | 179 | ||
217 | static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf, | 180 | static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf, |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c index 0fff5b8cd318..cd6bf291a853 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | |||
@@ -3061,11 +3061,18 @@ static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, | |||
3061 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); | 3061 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); |
3062 | } | 3062 | } |
3063 | 3063 | ||
3064 | static void gfx_v6_0_select_me_pipe_q(struct amdgpu_device *adev, | ||
3065 | u32 me, u32 pipe, u32 q) | ||
3066 | { | ||
3067 | DRM_INFO("Not implemented\n"); | ||
3068 | } | ||
3069 | |||
3064 | static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = { | 3070 | static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = { |
3065 | .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter, | 3071 | .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter, |
3066 | .select_se_sh = &gfx_v6_0_select_se_sh, | 3072 | .select_se_sh = &gfx_v6_0_select_se_sh, |
3067 | .read_wave_data = &gfx_v6_0_read_wave_data, | 3073 | .read_wave_data = &gfx_v6_0_read_wave_data, |
3068 | .read_wave_sgprs = &gfx_v6_0_read_wave_sgprs, | 3074 | .read_wave_sgprs = &gfx_v6_0_read_wave_sgprs, |
3075 | .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q | ||
3069 | }; | 3076 | }; |
3070 | 3077 | ||
3071 | static int gfx_v6_0_early_init(void *handle) | 3078 | static int gfx_v6_0_early_init(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index e13d9d83767b..42b6144c1fd5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -4270,11 +4270,18 @@ static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, | |||
4270 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); | 4270 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); |
4271 | } | 4271 | } |
4272 | 4272 | ||
4273 | static void gfx_v7_0_select_me_pipe_q(struct amdgpu_device *adev, | ||
4274 | u32 me, u32 pipe, u32 q) | ||
4275 | { | ||
4276 | cik_srbm_select(adev, me, pipe, q, 0); | ||
4277 | } | ||
4278 | |||
4273 | static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = { | 4279 | static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = { |
4274 | .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter, | 4280 | .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter, |
4275 | .select_se_sh = &gfx_v7_0_select_se_sh, | 4281 | .select_se_sh = &gfx_v7_0_select_se_sh, |
4276 | .read_wave_data = &gfx_v7_0_read_wave_data, | 4282 | .read_wave_data = &gfx_v7_0_read_wave_data, |
4277 | .read_wave_sgprs = &gfx_v7_0_read_wave_sgprs, | 4283 | .read_wave_sgprs = &gfx_v7_0_read_wave_sgprs, |
4284 | .select_me_pipe_q = &gfx_v7_0_select_me_pipe_q | ||
4278 | }; | 4285 | }; |
4279 | 4286 | ||
4280 | static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { | 4287 | static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 27943e57681c..b0e591eaa71a 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -3475,6 +3475,12 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, | |||
3475 | WREG32(mmGRBM_GFX_INDEX, data); | 3475 | WREG32(mmGRBM_GFX_INDEX, data); |
3476 | } | 3476 | } |
3477 | 3477 | ||
3478 | static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev, | ||
3479 | u32 me, u32 pipe, u32 q) | ||
3480 | { | ||
3481 | vi_srbm_select(adev, me, pipe, q, 0); | ||
3482 | } | ||
3483 | |||
3478 | static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev) | 3484 | static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev) |
3479 | { | 3485 | { |
3480 | u32 data, mask; | 3486 | u32 data, mask; |
@@ -5442,6 +5448,7 @@ static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = { | |||
5442 | .select_se_sh = &gfx_v8_0_select_se_sh, | 5448 | .select_se_sh = &gfx_v8_0_select_se_sh, |
5443 | .read_wave_data = &gfx_v8_0_read_wave_data, | 5449 | .read_wave_data = &gfx_v8_0_read_wave_data, |
5444 | .read_wave_sgprs = &gfx_v8_0_read_wave_sgprs, | 5450 | .read_wave_sgprs = &gfx_v8_0_read_wave_sgprs, |
5451 | .select_me_pipe_q = &gfx_v8_0_select_me_pipe_q | ||
5445 | }; | 5452 | }; |
5446 | 5453 | ||
5447 | static int gfx_v8_0_early_init(void *handle) | 5454 | static int gfx_v8_0_early_init(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index ae90c95e36af..9d39fd5b1822 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -998,12 +998,19 @@ static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, | |||
998 | start + SQIND_WAVE_VGPRS_OFFSET, size, dst); | 998 | start + SQIND_WAVE_VGPRS_OFFSET, size, dst); |
999 | } | 999 | } |
1000 | 1000 | ||
1001 | static void gfx_v9_0_select_me_pipe_q(struct amdgpu_device *adev, | ||
1002 | u32 me, u32 pipe, u32 q) | ||
1003 | { | ||
1004 | soc15_grbm_select(adev, me, pipe, q, 0); | ||
1005 | } | ||
1006 | |||
1001 | static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { | 1007 | static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { |
1002 | .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, | 1008 | .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, |
1003 | .select_se_sh = &gfx_v9_0_select_se_sh, | 1009 | .select_se_sh = &gfx_v9_0_select_se_sh, |
1004 | .read_wave_data = &gfx_v9_0_read_wave_data, | 1010 | .read_wave_data = &gfx_v9_0_read_wave_data, |
1005 | .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, | 1011 | .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, |
1006 | .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs, | 1012 | .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs, |
1013 | .select_me_pipe_q = &gfx_v9_0_select_me_pipe_q | ||
1007 | }; | 1014 | }; |
1008 | 1015 | ||
1009 | static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) | 1016 | static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) |
@@ -2773,13 +2780,13 @@ static int gfx_v9_0_kiq_fini_register(struct amdgpu_ring *ring) | |||
2773 | udelay(1); | 2780 | udelay(1); |
2774 | } | 2781 | } |
2775 | 2782 | ||
2776 | if (adev->usec_timeout == AMDGPU_MAX_USEC_TIMEOUT) { | 2783 | if (j == AMDGPU_MAX_USEC_TIMEOUT) { |
2777 | DRM_DEBUG("KIQ dequeue request failed.\n"); | 2784 | DRM_DEBUG("KIQ dequeue request failed.\n"); |
2778 | 2785 | ||
2786 | /* Manual disable if dequeue request times out */ | ||
2779 | WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, 0); | 2787 | WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, 0); |
2780 | } | 2788 | } |
2781 | 2789 | ||
2782 | /* Manual disable if dequeue request times out */ | ||
2783 | WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, | 2790 | WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, |
2784 | 0); | 2791 | 0); |
2785 | } | 2792 | } |