aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c47
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c53
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v11_0.c78
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/soc15_common.h9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c30
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c18
22 files changed, 234 insertions, 129 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index cf4e190c0a72..1c49b8266d69 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1428,6 +1428,9 @@ int amdgpu_cs_fence_to_handle_ioctl(struct drm_device *dev, void *data,
1428 if (IS_ERR(fence)) 1428 if (IS_ERR(fence))
1429 return PTR_ERR(fence); 1429 return PTR_ERR(fence);
1430 1430
1431 if (!fence)
1432 fence = dma_fence_get_stub();
1433
1431 switch (info->in.what) { 1434 switch (info->in.what) {
1432 case AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ: 1435 case AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ:
1433 r = drm_syncobj_create(&syncobj, 0, fence); 1436 r = drm_syncobj_create(&syncobj, 0, fence);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index b60afeade50a..8a078f4ae73d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3476,14 +3476,16 @@ static void amdgpu_device_lock_adev(struct amdgpu_device *adev)
3476 mutex_lock(&adev->lock_reset); 3476 mutex_lock(&adev->lock_reset);
3477 atomic_inc(&adev->gpu_reset_counter); 3477 atomic_inc(&adev->gpu_reset_counter);
3478 adev->in_gpu_reset = 1; 3478 adev->in_gpu_reset = 1;
3479 /* Block kfd */ 3479 /* Block kfd: SRIOV would do it separately */
3480 amdgpu_amdkfd_pre_reset(adev); 3480 if (!amdgpu_sriov_vf(adev))
3481 amdgpu_amdkfd_pre_reset(adev);
3481} 3482}
3482 3483
3483static void amdgpu_device_unlock_adev(struct amdgpu_device *adev) 3484static void amdgpu_device_unlock_adev(struct amdgpu_device *adev)
3484{ 3485{
3485 /*unlock kfd */ 3486 /*unlock kfd: SRIOV would do it separately */
3486 amdgpu_amdkfd_post_reset(adev); 3487 if (!amdgpu_sriov_vf(adev))
3488 amdgpu_amdkfd_post_reset(adev);
3487 amdgpu_vf_error_trans_all(adev); 3489 amdgpu_vf_error_trans_all(adev);
3488 adev->in_gpu_reset = 0; 3490 adev->in_gpu_reset = 0;
3489 mutex_unlock(&adev->lock_reset); 3491 mutex_unlock(&adev->lock_reset);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 9c77eaa45982..c806f984bcc5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -865,6 +865,7 @@ static const struct pci_device_id pciidlist[] = {
865 /* VEGAM */ 865 /* VEGAM */
866 {0x1002, 0x694C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM}, 866 {0x1002, 0x694C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
867 {0x1002, 0x694E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM}, 867 {0x1002, 0x694E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
868 {0x1002, 0x694F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM},
868 /* Vega 10 */ 869 /* Vega 10 */
869 {0x1002, 0x6860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, 870 {0x1002, 0x6860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
870 {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, 871 {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index e0af44fd6a0c..0a17fb1af204 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -32,6 +32,9 @@ static void amdgpu_job_timedout(struct drm_sched_job *s_job)
32{ 32{
33 struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched); 33 struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);
34 struct amdgpu_job *job = to_amdgpu_job(s_job); 34 struct amdgpu_job *job = to_amdgpu_job(s_job);
35 struct amdgpu_task_info ti;
36
37 memset(&ti, 0, sizeof(struct amdgpu_task_info));
35 38
36 if (amdgpu_ring_soft_recovery(ring, job->vmid, s_job->s_fence->parent)) { 39 if (amdgpu_ring_soft_recovery(ring, job->vmid, s_job->s_fence->parent)) {
37 DRM_ERROR("ring %s timeout, but soft recovered\n", 40 DRM_ERROR("ring %s timeout, but soft recovered\n",
@@ -39,9 +42,12 @@ static void amdgpu_job_timedout(struct drm_sched_job *s_job)
39 return; 42 return;
40 } 43 }
41 44
45 amdgpu_vm_get_task_info(ring->adev, job->pasid, &ti);
42 DRM_ERROR("ring %s timeout, signaled seq=%u, emitted seq=%u\n", 46 DRM_ERROR("ring %s timeout, signaled seq=%u, emitted seq=%u\n",
43 job->base.sched->name, atomic_read(&ring->fence_drv.last_seq), 47 job->base.sched->name, atomic_read(&ring->fence_drv.last_seq),
44 ring->fence_drv.sync_seq); 48 ring->fence_drv.sync_seq);
49 DRM_ERROR("Process information: process %s pid %d thread %s pid %d\n",
50 ti.process_name, ti.tgid, ti.task_name, ti.pid);
45 51
46 if (amdgpu_device_should_recover_gpu(ring->adev)) 52 if (amdgpu_device_should_recover_gpu(ring->adev))
47 amdgpu_device_gpu_recover(ring->adev, job); 53 amdgpu_device_gpu_recover(ring->adev, job);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
index e55508b39496..3e6823fdd939 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
@@ -238,44 +238,40 @@ static void amdgpu_mn_invalidate_node(struct amdgpu_mn_node *node,
238 * amdgpu_mn_invalidate_range_start_gfx - callback to notify about mm change 238 * amdgpu_mn_invalidate_range_start_gfx - callback to notify about mm change
239 * 239 *
240 * @mn: our notifier 240 * @mn: our notifier
241 * @mm: the mm this callback is about 241 * @range: mmu notifier context
242 * @start: start of updated range
243 * @end: end of updated range
244 * 242 *
245 * Block for operations on BOs to finish and mark pages as accessed and 243 * Block for operations on BOs to finish and mark pages as accessed and
246 * potentially dirty. 244 * potentially dirty.
247 */ 245 */
248static int amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn, 246static int amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn,
249 struct mm_struct *mm, 247 const struct mmu_notifier_range *range)
250 unsigned long start,
251 unsigned long end,
252 bool blockable)
253{ 248{
254 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn); 249 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn);
255 struct interval_tree_node *it; 250 struct interval_tree_node *it;
251 unsigned long end;
256 252
257 /* notification is exclusive, but interval is inclusive */ 253 /* notification is exclusive, but interval is inclusive */
258 end -= 1; 254 end = range->end - 1;
259 255
260 /* TODO we should be able to split locking for interval tree and 256 /* TODO we should be able to split locking for interval tree and
261 * amdgpu_mn_invalidate_node 257 * amdgpu_mn_invalidate_node
262 */ 258 */
263 if (amdgpu_mn_read_lock(amn, blockable)) 259 if (amdgpu_mn_read_lock(amn, range->blockable))
264 return -EAGAIN; 260 return -EAGAIN;
265 261
266 it = interval_tree_iter_first(&amn->objects, start, end); 262 it = interval_tree_iter_first(&amn->objects, range->start, end);
267 while (it) { 263 while (it) {
268 struct amdgpu_mn_node *node; 264 struct amdgpu_mn_node *node;
269 265
270 if (!blockable) { 266 if (!range->blockable) {
271 amdgpu_mn_read_unlock(amn); 267 amdgpu_mn_read_unlock(amn);
272 return -EAGAIN; 268 return -EAGAIN;
273 } 269 }
274 270
275 node = container_of(it, struct amdgpu_mn_node, it); 271 node = container_of(it, struct amdgpu_mn_node, it);
276 it = interval_tree_iter_next(it, start, end); 272 it = interval_tree_iter_next(it, range->start, end);
277 273
278 amdgpu_mn_invalidate_node(node, start, end); 274 amdgpu_mn_invalidate_node(node, range->start, end);
279 } 275 }
280 276
281 return 0; 277 return 0;
@@ -294,39 +290,38 @@ static int amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn,
294 * are restorted in amdgpu_mn_invalidate_range_end_hsa. 290 * are restorted in amdgpu_mn_invalidate_range_end_hsa.
295 */ 291 */
296static int amdgpu_mn_invalidate_range_start_hsa(struct mmu_notifier *mn, 292static int amdgpu_mn_invalidate_range_start_hsa(struct mmu_notifier *mn,
297 struct mm_struct *mm, 293 const struct mmu_notifier_range *range)
298 unsigned long start,
299 unsigned long end,
300 bool blockable)
301{ 294{
302 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn); 295 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn);
303 struct interval_tree_node *it; 296 struct interval_tree_node *it;
297 unsigned long end;
304 298
305 /* notification is exclusive, but interval is inclusive */ 299 /* notification is exclusive, but interval is inclusive */
306 end -= 1; 300 end = range->end - 1;
307 301
308 if (amdgpu_mn_read_lock(amn, blockable)) 302 if (amdgpu_mn_read_lock(amn, range->blockable))
309 return -EAGAIN; 303 return -EAGAIN;
310 304
311 it = interval_tree_iter_first(&amn->objects, start, end); 305 it = interval_tree_iter_first(&amn->objects, range->start, end);
312 while (it) { 306 while (it) {
313 struct amdgpu_mn_node *node; 307 struct amdgpu_mn_node *node;
314 struct amdgpu_bo *bo; 308 struct amdgpu_bo *bo;
315 309
316 if (!blockable) { 310 if (!range->blockable) {
317 amdgpu_mn_read_unlock(amn); 311 amdgpu_mn_read_unlock(amn);
318 return -EAGAIN; 312 return -EAGAIN;
319 } 313 }
320 314
321 node = container_of(it, struct amdgpu_mn_node, it); 315 node = container_of(it, struct amdgpu_mn_node, it);
322 it = interval_tree_iter_next(it, start, end); 316 it = interval_tree_iter_next(it, range->start, end);
323 317
324 list_for_each_entry(bo, &node->bos, mn_list) { 318 list_for_each_entry(bo, &node->bos, mn_list) {
325 struct kgd_mem *mem = bo->kfd_bo; 319 struct kgd_mem *mem = bo->kfd_bo;
326 320
327 if (amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm, 321 if (amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm,
328 start, end)) 322 range->start,
329 amdgpu_amdkfd_evict_userptr(mem, mm); 323 end))
324 amdgpu_amdkfd_evict_userptr(mem, range->mm);
330 } 325 }
331 } 326 }
332 327
@@ -344,9 +339,7 @@ static int amdgpu_mn_invalidate_range_start_hsa(struct mmu_notifier *mn,
344 * Release the lock again to allow new command submissions. 339 * Release the lock again to allow new command submissions.
345 */ 340 */
346static void amdgpu_mn_invalidate_range_end(struct mmu_notifier *mn, 341static void amdgpu_mn_invalidate_range_end(struct mmu_notifier *mn,
347 struct mm_struct *mm, 342 const struct mmu_notifier_range *range)
348 unsigned long start,
349 unsigned long end)
350{ 343{
351 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn); 344 struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn);
352 345
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index fd271f9746a2..728e15e5d68a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -912,7 +912,7 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
912 struct ttm_operation_ctx ctx = { false, false }; 912 struct ttm_operation_ctx ctx = { false, false };
913 int r, i; 913 int r, i;
914 914
915 if (!bo->pin_count) { 915 if (WARN_ON_ONCE(!bo->pin_count)) {
916 dev_warn(adev->dev, "%p unpin not necessary\n", bo); 916 dev_warn(adev->dev, "%p unpin not necessary\n", bo);
917 return 0; 917 return 0;
918 } 918 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 6759d898b3ab..8fab0d637ee5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -155,14 +155,6 @@ psp_cmd_submit_buf(struct psp_context *psp,
155 return ret; 155 return ret;
156} 156}
157 157
158bool psp_support_vmr_ring(struct psp_context *psp)
159{
160 if (amdgpu_sriov_vf(psp->adev) && psp->sos_fw_version > 0x80045)
161 return true;
162 else
163 return false;
164}
165
166static void psp_prep_tmr_cmd_buf(struct psp_context *psp, 158static void psp_prep_tmr_cmd_buf(struct psp_context *psp,
167 struct psp_gfx_cmd_resp *cmd, 159 struct psp_gfx_cmd_resp *cmd,
168 uint64_t tmr_mc, uint32_t size) 160 uint64_t tmr_mc, uint32_t size)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 10decf70c9aa..3ee573b4016e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -83,12 +83,13 @@ struct psp_funcs
83 enum AMDGPU_UCODE_ID ucode_type); 83 enum AMDGPU_UCODE_ID ucode_type);
84 bool (*smu_reload_quirk)(struct psp_context *psp); 84 bool (*smu_reload_quirk)(struct psp_context *psp);
85 int (*mode1_reset)(struct psp_context *psp); 85 int (*mode1_reset)(struct psp_context *psp);
86 uint64_t (*xgmi_get_node_id)(struct psp_context *psp); 86 int (*xgmi_get_node_id)(struct psp_context *psp, uint64_t *node_id);
87 uint64_t (*xgmi_get_hive_id)(struct psp_context *psp); 87 int (*xgmi_get_hive_id)(struct psp_context *psp, uint64_t *hive_id);
88 int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices, 88 int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices,
89 struct psp_xgmi_topology_info *topology); 89 struct psp_xgmi_topology_info *topology);
90 int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices, 90 int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices,
91 struct psp_xgmi_topology_info *topology); 91 struct psp_xgmi_topology_info *topology);
92 bool (*support_vmr_ring)(struct psp_context *psp);
92}; 93};
93 94
94struct psp_xgmi_context { 95struct psp_xgmi_context {
@@ -192,12 +193,14 @@ struct psp_xgmi_topology_info {
192 ((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0) 193 ((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0)
193#define psp_smu_reload_quirk(psp) \ 194#define psp_smu_reload_quirk(psp) \
194 ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false) 195 ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
196#define psp_support_vmr_ring(psp) \
197 ((psp)->funcs->support_vmr_ring ? (psp)->funcs->support_vmr_ring((psp)) : false)
195#define psp_mode1_reset(psp) \ 198#define psp_mode1_reset(psp) \
196 ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false) 199 ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
197#define psp_xgmi_get_node_id(psp) \ 200#define psp_xgmi_get_node_id(psp, node_id) \
198 ((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp)) : 0) 201 ((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp), (node_id)) : -EINVAL)
199#define psp_xgmi_get_hive_id(psp) \ 202#define psp_xgmi_get_hive_id(psp, hive_id) \
200 ((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp)) : 0) 203 ((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp), (hive_id)) : -EINVAL)
201#define psp_xgmi_get_topology_info(psp, num_device, topology) \ 204#define psp_xgmi_get_topology_info(psp, num_device, topology) \
202 ((psp)->funcs->xgmi_get_topology_info ? \ 205 ((psp)->funcs->xgmi_get_topology_info ? \
203 (psp)->funcs->xgmi_get_topology_info((psp), (num_device), (topology)) : -EINVAL) 206 (psp)->funcs->xgmi_get_topology_info((psp), (num_device), (topology)) : -EINVAL)
@@ -217,8 +220,6 @@ extern const struct amdgpu_ip_block_version psp_v10_0_ip_block;
217 220
218int psp_gpu_reset(struct amdgpu_device *adev); 221int psp_gpu_reset(struct amdgpu_device *adev);
219int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id); 222int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
220bool psp_support_vmr_ring(struct psp_context *psp);
221
222extern const struct amdgpu_ip_block_version psp_v11_0_ip_block; 223extern const struct amdgpu_ip_block_version psp_v11_0_ip_block;
223 224
224#endif 225#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 0beb01fef83f..d87e828a084b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -29,7 +29,7 @@
29#include <drm/drm_print.h> 29#include <drm/drm_print.h>
30 30
31/* max number of rings */ 31/* max number of rings */
32#define AMDGPU_MAX_RINGS 21 32#define AMDGPU_MAX_RINGS 23
33#define AMDGPU_MAX_GFX_RINGS 1 33#define AMDGPU_MAX_GFX_RINGS 1
34#define AMDGPU_MAX_COMPUTE_RINGS 8 34#define AMDGPU_MAX_COMPUTE_RINGS 8
35#define AMDGPU_MAX_VCE_RINGS 3 35#define AMDGPU_MAX_VCE_RINGS 3
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index e2e42e3fbcf3..ecf6f96df2ad 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -262,7 +262,7 @@ static int amdgpu_vcn_pause_dpg_mode(struct amdgpu_device *adev,
262 262
263 ring = &adev->vcn.ring_dec; 263 ring = &adev->vcn.ring_dec;
264 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 264 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
265 RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2)); 265 RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2) & 0x7FFFFFFF);
266 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 266 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
267 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, 267 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON,
268 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 268 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
@@ -322,7 +322,7 @@ static int amdgpu_vcn_pause_dpg_mode(struct amdgpu_device *adev,
322 322
323 ring = &adev->vcn.ring_dec; 323 ring = &adev->vcn.ring_dec;
324 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 324 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
325 RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2)); 325 RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2) & 0x7FFFFFFF);
326 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 326 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
327 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, 327 UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON,
328 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 328 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
@@ -396,16 +396,26 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
396 396
397 if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { 397 if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
398 struct dpg_pause_state new_state; 398 struct dpg_pause_state new_state;
399 unsigned int fences = 0;
400 unsigned int i;
399 401
400 if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) 402 for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
403 fences += amdgpu_fence_count_emitted(&adev->vcn.ring_enc[i]);
404 }
405 if (fences)
401 new_state.fw_based = VCN_DPG_STATE__PAUSE; 406 new_state.fw_based = VCN_DPG_STATE__PAUSE;
402 else 407 else
403 new_state.fw_based = adev->vcn.pause_state.fw_based; 408 new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
404 409
405 if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG) 410 if (amdgpu_fence_count_emitted(&adev->vcn.ring_jpeg))
406 new_state.jpeg = VCN_DPG_STATE__PAUSE; 411 new_state.jpeg = VCN_DPG_STATE__PAUSE;
407 else 412 else
408 new_state.jpeg = adev->vcn.pause_state.jpeg; 413 new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
414
415 if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC)
416 new_state.fw_based = VCN_DPG_STATE__PAUSE;
417 else if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
418 new_state.jpeg = VCN_DPG_STATE__PAUSE;
409 419
410 amdgpu_vcn_pause_dpg_mode(adev, &new_state); 420 amdgpu_vcn_pause_dpg_mode(adev, &new_state);
411 } 421 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 0b263a9857c6..8a8bc60cb6b4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -97,8 +97,19 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
97 if (!adev->gmc.xgmi.supported) 97 if (!adev->gmc.xgmi.supported)
98 return 0; 98 return 0;
99 99
100 adev->gmc.xgmi.node_id = psp_xgmi_get_node_id(&adev->psp); 100 ret = psp_xgmi_get_node_id(&adev->psp, &adev->gmc.xgmi.node_id);
101 adev->gmc.xgmi.hive_id = psp_xgmi_get_hive_id(&adev->psp); 101 if (ret) {
102 dev_err(adev->dev,
103 "XGMI: Failed to get node id\n");
104 return ret;
105 }
106
107 ret = psp_xgmi_get_hive_id(&adev->psp, &adev->gmc.xgmi.hive_id);
108 if (ret) {
109 dev_err(adev->dev,
110 "XGMI: Failed to get hive id\n");
111 return ret;
112 }
102 113
103 mutex_lock(&xgmi_mutex); 114 mutex_lock(&xgmi_mutex);
104 hive = amdgpu_get_xgmi_hive(adev); 115 hive = amdgpu_get_xgmi_hive(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index ce150de723c9..bacdaef77b6c 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -718,37 +718,46 @@ static bool gmc_v9_0_keep_stolen_memory(struct amdgpu_device *adev)
718 } 718 }
719} 719}
720 720
721static int gmc_v9_0_late_init(void *handle) 721static int gmc_v9_0_allocate_vm_inv_eng(struct amdgpu_device *adev)
722{ 722{
723 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 723 struct amdgpu_ring *ring;
724 /* 724 unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] =
725 * The latest engine allocation on gfx9 is: 725 {GFXHUB_FREE_VM_INV_ENGS_BITMAP, MMHUB_FREE_VM_INV_ENGS_BITMAP};
726 * Engine 0, 1: idle
727 * Engine 2, 3: firmware
728 * Engine 4~13: amdgpu ring, subject to change when ring number changes
729 * Engine 14~15: idle
730 * Engine 16: kfd tlb invalidation
731 * Engine 17: Gart flushes
732 */
733 unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 };
734 unsigned i; 726 unsigned i;
735 int r; 727 unsigned vmhub, inv_eng;
736 728
737 if (!gmc_v9_0_keep_stolen_memory(adev)) 729 for (i = 0; i < adev->num_rings; ++i) {
738 amdgpu_bo_late_init(adev); 730 ring = adev->rings[i];
731 vmhub = ring->funcs->vmhub;
732
733 inv_eng = ffs(vm_inv_engs[vmhub]);
734 if (!inv_eng) {
735 dev_err(adev->dev, "no VM inv eng for ring %s\n",
736 ring->name);
737 return -EINVAL;
738 }
739 739
740 for(i = 0; i < adev->num_rings; ++i) { 740 ring->vm_inv_eng = inv_eng - 1;
741 struct amdgpu_ring *ring = adev->rings[i]; 741 change_bit(inv_eng - 1, (unsigned long *)(&vm_inv_engs[vmhub]));
742 unsigned vmhub = ring->funcs->vmhub;
743 742
744 ring->vm_inv_eng = vm_inv_eng[vmhub]++;
745 dev_info(adev->dev, "ring %s uses VM inv eng %u on hub %u\n", 743 dev_info(adev->dev, "ring %s uses VM inv eng %u on hub %u\n",
746 ring->name, ring->vm_inv_eng, ring->funcs->vmhub); 744 ring->name, ring->vm_inv_eng, ring->funcs->vmhub);
747 } 745 }
748 746
749 /* Engine 16 is used for KFD and 17 for GART flushes */ 747 return 0;
750 for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) 748}
751 BUG_ON(vm_inv_eng[i] > 16); 749
750static int gmc_v9_0_late_init(void *handle)
751{
752 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
753 int r;
754
755 if (!gmc_v9_0_keep_stolen_memory(adev))
756 amdgpu_bo_late_init(adev);
757
758 r = gmc_v9_0_allocate_vm_inv_eng(adev);
759 if (r)
760 return r;
752 761
753 if (adev->asic_type == CHIP_VEGA10 && !amdgpu_sriov_vf(adev)) { 762 if (adev->asic_type == CHIP_VEGA10 && !amdgpu_sriov_vf(adev)) {
754 r = gmc_v9_0_ecc_available(adev); 763 r = gmc_v9_0_ecc_available(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
index b030ca5ea107..5c8deac65580 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
@@ -24,6 +24,16 @@
24#ifndef __GMC_V9_0_H__ 24#ifndef __GMC_V9_0_H__
25#define __GMC_V9_0_H__ 25#define __GMC_V9_0_H__
26 26
27 /*
28 * The latest engine allocation on gfx9 is:
29 * Engine 2, 3: firmware
30 * Engine 0, 1, 4~16: amdgpu ring,
31 * subject to change when ring number changes
32 * Engine 17: Gart flushes
33 */
34#define GFXHUB_FREE_VM_INV_ENGS_BITMAP 0x1FFF3
35#define MMHUB_FREE_VM_INV_ENGS_BITMAP 0x1FFF3
36
27extern const struct amd_ip_funcs gmc_v9_0_ip_funcs; 37extern const struct amd_ip_funcs gmc_v9_0_ip_funcs;
28extern const struct amdgpu_ip_block_version gmc_v9_0_ip_block; 38extern const struct amdgpu_ip_block_version gmc_v9_0_ip_block;
29 39
diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
index 6f9c54978cc1..accdedd63c98 100644
--- a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
@@ -32,6 +32,7 @@
32#define smnCPM_CONTROL 0x11180460 32#define smnCPM_CONTROL 0x11180460
33#define smnPCIE_CNTL2 0x11180070 33#define smnPCIE_CNTL2 0x11180070
34#define smnPCIE_CONFIG_CNTL 0x11180044 34#define smnPCIE_CONFIG_CNTL 0x11180044
35#define smnPCIE_CI_CNTL 0x11180080
35 36
36static u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev) 37static u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev)
37{ 38{
@@ -270,6 +271,12 @@ static void nbio_v6_1_init_registers(struct amdgpu_device *adev)
270 271
271 if (def != data) 272 if (def != data)
272 WREG32_PCIE(smnPCIE_CONFIG_CNTL, data); 273 WREG32_PCIE(smnPCIE_CONFIG_CNTL, data);
274
275 def = data = RREG32_PCIE(smnPCIE_CI_CNTL);
276 data = REG_SET_FIELD(data, PCIE_CI_CNTL, CI_SLV_ORDERING_DIS, 1);
277
278 if (def != data)
279 WREG32_PCIE(smnPCIE_CI_CNTL, data);
273} 280}
274 281
275const struct amdgpu_nbio_funcs nbio_v6_1_funcs = { 282const struct amdgpu_nbio_funcs nbio_v6_1_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
index f8cee95d61cc..4cd31a276dcd 100644
--- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
@@ -31,6 +31,7 @@
31 31
32#define smnCPM_CONTROL 0x11180460 32#define smnCPM_CONTROL 0x11180460
33#define smnPCIE_CNTL2 0x11180070 33#define smnPCIE_CNTL2 0x11180070
34#define smnPCIE_CI_CNTL 0x11180080
34 35
35static u32 nbio_v7_4_get_rev_id(struct amdgpu_device *adev) 36static u32 nbio_v7_4_get_rev_id(struct amdgpu_device *adev)
36{ 37{
@@ -222,7 +223,13 @@ static void nbio_v7_4_detect_hw_virt(struct amdgpu_device *adev)
222 223
223static void nbio_v7_4_init_registers(struct amdgpu_device *adev) 224static void nbio_v7_4_init_registers(struct amdgpu_device *adev)
224{ 225{
226 uint32_t def, data;
227
228 def = data = RREG32_PCIE(smnPCIE_CI_CNTL);
229 data = REG_SET_FIELD(data, PCIE_CI_CNTL, CI_SLV_ORDERING_DIS, 1);
225 230
231 if (def != data)
232 WREG32_PCIE(smnPCIE_CI_CNTL, data);
226} 233}
227 234
228const struct amdgpu_nbio_funcs nbio_v7_4_funcs = { 235const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
index 6c9a1b748ca7..0c6e7f9b143f 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
@@ -34,6 +34,7 @@
34#include "nbio/nbio_7_4_offset.h" 34#include "nbio/nbio_7_4_offset.h"
35 35
36MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); 36MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
37MODULE_FIRMWARE("amdgpu/vega20_asd.bin");
37MODULE_FIRMWARE("amdgpu/vega20_ta.bin"); 38MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
38 39
39/* address block */ 40/* address block */
@@ -100,6 +101,7 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
100 char fw_name[30]; 101 char fw_name[30];
101 int err = 0; 102 int err = 0;
102 const struct psp_firmware_header_v1_0 *sos_hdr; 103 const struct psp_firmware_header_v1_0 *sos_hdr;
104 const struct psp_firmware_header_v1_0 *asd_hdr;
103 const struct ta_firmware_header_v1_0 *ta_hdr; 105 const struct ta_firmware_header_v1_0 *ta_hdr;
104 106
105 DRM_DEBUG("\n"); 107 DRM_DEBUG("\n");
@@ -132,14 +134,30 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
132 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + 134 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
133 le32_to_cpu(sos_hdr->sos_offset_bytes); 135 le32_to_cpu(sos_hdr->sos_offset_bytes);
134 136
137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
138 err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
139 if (err)
140 goto out1;
141
142 err = amdgpu_ucode_validate(adev->psp.asd_fw);
143 if (err)
144 goto out1;
145
146 asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data;
147 adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version);
148 adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version);
149 adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes);
150 adev->psp.asd_start_addr = (uint8_t *)asd_hdr +
151 le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
152
135 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); 153 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
136 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); 154 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
137 if (err) 155 if (err)
138 goto out; 156 goto out2;
139 157
140 err = amdgpu_ucode_validate(adev->psp.ta_fw); 158 err = amdgpu_ucode_validate(adev->psp.ta_fw);
141 if (err) 159 if (err)
142 goto out; 160 goto out2;
143 161
144 ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; 162 ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
145 adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); 163 adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
@@ -148,14 +166,18 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
148 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); 166 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
149 167
150 return 0; 168 return 0;
169
170out2:
171 release_firmware(adev->psp.ta_fw);
172 adev->psp.ta_fw = NULL;
173out1:
174 release_firmware(adev->psp.asd_fw);
175 adev->psp.asd_fw = NULL;
151out: 176out:
152 if (err) { 177 dev_err(adev->dev,
153 dev_err(adev->dev, 178 "psp v11.0: Failed to load firmware \"%s\"\n", fw_name);
154 "psp v11.0: Failed to load firmware \"%s\"\n", 179 release_firmware(adev->psp.sos_fw);
155 fw_name); 180 adev->psp.sos_fw = NULL;
156 release_firmware(adev->psp.sos_fw);
157 adev->psp.sos_fw = NULL;
158 }
159 181
160 return err; 182 return err;
161} 183}
@@ -291,6 +313,13 @@ static int psp_v11_0_ring_init(struct psp_context *psp,
291 return 0; 313 return 0;
292} 314}
293 315
316static bool psp_v11_0_support_vmr_ring(struct psp_context *psp)
317{
318 if (amdgpu_sriov_vf(psp->adev) && psp->sos_fw_version > 0x80045)
319 return true;
320 return false;
321}
322
294static int psp_v11_0_ring_create(struct psp_context *psp, 323static int psp_v11_0_ring_create(struct psp_context *psp,
295 enum psp_ring_type ring_type) 324 enum psp_ring_type ring_type)
296{ 325{
@@ -299,7 +328,7 @@ static int psp_v11_0_ring_create(struct psp_context *psp,
299 struct psp_ring *ring = &psp->km_ring; 328 struct psp_ring *ring = &psp->km_ring;
300 struct amdgpu_device *adev = psp->adev; 329 struct amdgpu_device *adev = psp->adev;
301 330
302 if (psp_support_vmr_ring(psp)) { 331 if (psp_v11_0_support_vmr_ring(psp)) {
303 /* Write low address of the ring to C2PMSG_102 */ 332 /* Write low address of the ring to C2PMSG_102 */
304 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr); 333 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
305 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg); 334 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg);
@@ -351,7 +380,7 @@ static int psp_v11_0_ring_stop(struct psp_context *psp,
351 struct amdgpu_device *adev = psp->adev; 380 struct amdgpu_device *adev = psp->adev;
352 381
353 /* Write the ring destroy command*/ 382 /* Write the ring destroy command*/
354 if (psp_support_vmr_ring(psp)) 383 if (psp_v11_0_support_vmr_ring(psp))
355 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, 384 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,
356 GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING); 385 GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);
357 else 386 else
@@ -362,7 +391,7 @@ static int psp_v11_0_ring_stop(struct psp_context *psp,
362 mdelay(20); 391 mdelay(20);
363 392
364 /* Wait for response flag (bit 31) */ 393 /* Wait for response flag (bit 31) */
365 if (psp_support_vmr_ring(psp)) 394 if (psp_v11_0_support_vmr_ring(psp))
366 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101), 395 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
367 0x80000000, 0x80000000, false); 396 0x80000000, 0x80000000, false);
368 else 397 else
@@ -406,7 +435,7 @@ static int psp_v11_0_cmd_submit(struct psp_context *psp,
406 uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; 435 uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4;
407 436
408 /* KM (GPCOM) prepare write pointer */ 437 /* KM (GPCOM) prepare write pointer */
409 if (psp_support_vmr_ring(psp)) 438 if (psp_v11_0_support_vmr_ring(psp))
410 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 439 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);
411 else 440 else
412 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 441 psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67);
@@ -438,7 +467,7 @@ static int psp_v11_0_cmd_submit(struct psp_context *psp,
438 467
439 /* Update the write Pointer in DWORDs */ 468 /* Update the write Pointer in DWORDs */
440 psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; 469 psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw;
441 if (psp_support_vmr_ring(psp)) { 470 if (psp_v11_0_support_vmr_ring(psp)) {
442 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg); 471 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_write_ptr_reg);
443 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD); 472 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);
444 } else 473 } else
@@ -680,7 +709,7 @@ static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
680 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); 709 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
681} 710}
682 711
683static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp) 712static int psp_v11_0_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
684{ 713{
685 struct ta_xgmi_shared_memory *xgmi_cmd; 714 struct ta_xgmi_shared_memory *xgmi_cmd;
686 int ret; 715 int ret;
@@ -693,12 +722,14 @@ static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp)
693 /* Invoke xgmi ta to get hive id */ 722 /* Invoke xgmi ta to get hive id */
694 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); 723 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
695 if (ret) 724 if (ret)
696 return 0; 725 return ret;
697 else 726
698 return xgmi_cmd->xgmi_out_message.get_hive_id.hive_id; 727 *hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
728
729 return 0;
699} 730}
700 731
701static u64 psp_v11_0_xgmi_get_node_id(struct psp_context *psp) 732static int psp_v11_0_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
702{ 733{
703 struct ta_xgmi_shared_memory *xgmi_cmd; 734 struct ta_xgmi_shared_memory *xgmi_cmd;
704 int ret; 735 int ret;
@@ -711,9 +742,11 @@ static u64 psp_v11_0_xgmi_get_node_id(struct psp_context *psp)
711 /* Invoke xgmi ta to get the node id */ 742 /* Invoke xgmi ta to get the node id */
712 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); 743 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
713 if (ret) 744 if (ret)
714 return 0; 745 return ret;
715 else 746
716 return xgmi_cmd->xgmi_out_message.get_node_id.node_id; 747 *node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
748
749 return 0;
717} 750}
718 751
719static const struct psp_funcs psp_v11_0_funcs = { 752static const struct psp_funcs psp_v11_0_funcs = {
@@ -732,6 +765,7 @@ static const struct psp_funcs psp_v11_0_funcs = {
732 .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info, 765 .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
733 .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id, 766 .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
734 .xgmi_get_node_id = psp_v11_0_xgmi_get_node_id, 767 .xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
768 .support_vmr_ring = psp_v11_0_support_vmr_ring,
735}; 769};
736 770
737void psp_v11_0_set_psp_funcs(struct psp_context *psp) 771void psp_v11_0_set_psp_funcs(struct psp_context *psp)
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index 7357fd56e614..79694ff16969 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -240,8 +240,11 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
240 * are already been loaded. 240 * are already been loaded.
241 */ 241 */
242 sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81); 242 sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
243 if (sol_reg) 243 if (sol_reg) {
244 psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
245 printk("sos fw version = 0x%x.\n", psp->sos_fw_version);
244 return 0; 246 return 0;
247 }
245 248
246 /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */ 249 /* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
247 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), 250 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 4b6d3e5c821f..fd0bfe140ee0 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -1458,8 +1458,7 @@ static bool sdma_v4_0_fw_support_paging_queue(struct amdgpu_device *adev)
1458 /*return fw_version >= 31;*/ 1458 /*return fw_version >= 31;*/
1459 return false; 1459 return false;
1460 case CHIP_VEGA20: 1460 case CHIP_VEGA20:
1461 /*return fw_version >= 115;*/ 1461 return fw_version >= 123;
1462 return false;
1463 default: 1462 default:
1464 return false; 1463 return false;
1465 } 1464 }
@@ -1706,13 +1705,15 @@ static int sdma_v4_0_process_trap_irq(struct amdgpu_device *adev,
1706 amdgpu_fence_process(&adev->sdma.instance[instance].ring); 1705 amdgpu_fence_process(&adev->sdma.instance[instance].ring);
1707 break; 1706 break;
1708 case 1: 1707 case 1:
1709 /* XXX compute */ 1708 if (adev->asic_type == CHIP_VEGA20)
1709 amdgpu_fence_process(&adev->sdma.instance[instance].page);
1710 break; 1710 break;
1711 case 2: 1711 case 2:
1712 /* XXX compute */ 1712 /* XXX compute */
1713 break; 1713 break;
1714 case 3: 1714 case 3:
1715 amdgpu_fence_process(&adev->sdma.instance[instance].page); 1715 if (adev->asic_type != CHIP_VEGA20)
1716 amdgpu_fence_process(&adev->sdma.instance[instance].page);
1716 break; 1717 break;
1717 } 1718 }
1718 return 0; 1719 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15_common.h b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
index 958b10a57073..49c262540940 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15_common.h
+++ b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
@@ -49,14 +49,19 @@
49 49
50#define SOC15_WAIT_ON_RREG(ip, inst, reg, expected_value, mask, ret) \ 50#define SOC15_WAIT_ON_RREG(ip, inst, reg, expected_value, mask, ret) \
51 do { \ 51 do { \
52 uint32_t old_ = 0; \
52 uint32_t tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ 53 uint32_t tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \
53 uint32_t loop = adev->usec_timeout; \ 54 uint32_t loop = adev->usec_timeout; \
54 while ((tmp_ & (mask)) != (expected_value)) { \ 55 while ((tmp_ & (mask)) != (expected_value)) { \
55 udelay(2); \ 56 if (old_ != tmp_) { \
57 loop = adev->usec_timeout; \
58 old_ = tmp_; \
59 } else \
60 udelay(1); \
56 tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ 61 tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \
57 loop--; \ 62 loop--; \
58 if (!loop) { \ 63 if (!loop) { \
59 DRM_ERROR("Register(%d) [%s] failed to reach value 0x%08x != 0x%08x\n", \ 64 DRM_WARN("Register(%d) [%s] failed to reach value 0x%08x != 0x%08x\n", \
60 inst, #reg, (unsigned)expected_value, (unsigned)(tmp_ & (mask))); \ 65 inst, #reg, (unsigned)expected_value, (unsigned)(tmp_ & (mask))); \
61 ret = -ETIMEDOUT; \ 66 ret = -ETIMEDOUT; \
62 break; \ 67 break; \
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
index 089645e78f98..aef924026a28 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
@@ -435,7 +435,7 @@ static int uvd_v7_0_sw_init(void *handle)
435 continue; 435 continue;
436 if (!amdgpu_sriov_vf(adev)) { 436 if (!amdgpu_sriov_vf(adev)) {
437 ring = &adev->uvd.inst[j].ring; 437 ring = &adev->uvd.inst[j].ring;
438 sprintf(ring->name, "uvd<%d>", j); 438 sprintf(ring->name, "uvd_%d", ring->me);
439 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0); 439 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0);
440 if (r) 440 if (r)
441 return r; 441 return r;
@@ -443,7 +443,7 @@ static int uvd_v7_0_sw_init(void *handle)
443 443
444 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 444 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
445 ring = &adev->uvd.inst[j].ring_enc[i]; 445 ring = &adev->uvd.inst[j].ring_enc[i];
446 sprintf(ring->name, "uvd_enc%d<%d>", i, j); 446 sprintf(ring->name, "uvd_enc_%d.%d", ring->me, i);
447 if (amdgpu_sriov_vf(adev)) { 447 if (amdgpu_sriov_vf(adev)) {
448 ring->use_doorbell = true; 448 ring->use_doorbell = true;
449 449
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 4f8352044563..89bb2fef90eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -214,7 +214,8 @@ static int vcn_v1_0_hw_fini(void *handle)
214 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 214 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
215 struct amdgpu_ring *ring = &adev->vcn.ring_dec; 215 struct amdgpu_ring *ring = &adev->vcn.ring_dec;
216 216
217 if (RREG32_SOC15(VCN, 0, mmUVD_STATUS)) 217 if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||
218 RREG32_SOC15(VCN, 0, mmUVD_STATUS))
218 vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); 219 vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE);
219 220
220 ring->sched.ready = false; 221 ring->sched.ready = false;
@@ -1087,7 +1088,8 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev)
1087 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0, 1088 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0,
1088 ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK); 1089 ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK);
1089 1090
1090 /* initialize wptr */ 1091 /* initialize JPEG wptr */
1092 ring = &adev->vcn.ring_jpeg;
1091 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 1093 ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
1092 1094
1093 /* copy patch commands to the jpeg ring */ 1095 /* copy patch commands to the jpeg ring */
@@ -1159,21 +1161,29 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev)
1159static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev) 1161static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev)
1160{ 1162{
1161 int ret_code = 0; 1163 int ret_code = 0;
1164 uint32_t tmp;
1162 1165
1163 /* Wait for power status to be UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF */ 1166 /* Wait for power status to be UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF */
1164 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 1167 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
1165 UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, 1168 UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF,
1166 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 1169 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
1167 1170
1168 if (!ret_code) { 1171 /* wait for read ptr to be equal to write ptr */
1169 int tmp = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF; 1172 tmp = RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR);
1170 /* wait for read ptr to be equal to write ptr */ 1173 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
1171 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
1172 1174
1173 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 1175 tmp = RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2);
1174 UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, 1176 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code);
1175 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 1177
1176 } 1178 tmp = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
1179 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_JRBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
1180
1181 tmp = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF;
1182 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
1183
1184 SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
1185 UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF,
1186 UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
1177 1187
1178 /* disable dynamic power gating mode */ 1188 /* disable dynamic power gating mode */
1179 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0, 1189 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0,
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index ff2906c215fa..77e367459101 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -87,9 +87,9 @@ static u32 vi_pcie_rreg(struct amdgpu_device *adev, u32 reg)
87 u32 r; 87 u32 r;
88 88
89 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 89 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
90 WREG32(mmPCIE_INDEX, reg); 90 WREG32_NO_KIQ(mmPCIE_INDEX, reg);
91 (void)RREG32(mmPCIE_INDEX); 91 (void)RREG32_NO_KIQ(mmPCIE_INDEX);
92 r = RREG32(mmPCIE_DATA); 92 r = RREG32_NO_KIQ(mmPCIE_DATA);
93 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 93 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
94 return r; 94 return r;
95} 95}
@@ -99,10 +99,10 @@ static void vi_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
99 unsigned long flags; 99 unsigned long flags;
100 100
101 spin_lock_irqsave(&adev->pcie_idx_lock, flags); 101 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
102 WREG32(mmPCIE_INDEX, reg); 102 WREG32_NO_KIQ(mmPCIE_INDEX, reg);
103 (void)RREG32(mmPCIE_INDEX); 103 (void)RREG32_NO_KIQ(mmPCIE_INDEX);
104 WREG32(mmPCIE_DATA, v); 104 WREG32_NO_KIQ(mmPCIE_DATA, v);
105 (void)RREG32(mmPCIE_DATA); 105 (void)RREG32_NO_KIQ(mmPCIE_DATA);
106 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 106 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
107} 107}
108 108
@@ -123,8 +123,8 @@ static void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
123 unsigned long flags; 123 unsigned long flags;
124 124
125 spin_lock_irqsave(&adev->smc_idx_lock, flags); 125 spin_lock_irqsave(&adev->smc_idx_lock, flags);
126 WREG32(mmSMC_IND_INDEX_11, (reg)); 126 WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
127 WREG32(mmSMC_IND_DATA_11, (v)); 127 WREG32_NO_KIQ(mmSMC_IND_DATA_11, (v));
128 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 128 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
129} 129}
130 130