diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
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 | ||
| 3483 | static void amdgpu_device_unlock_adev(struct amdgpu_device *adev) | 3484 | static 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 | */ |
| 248 | static int amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn, | 246 | static 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 | */ |
| 296 | static int amdgpu_mn_invalidate_range_start_hsa(struct mmu_notifier *mn, | 292 | static 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 | */ |
| 346 | static void amdgpu_mn_invalidate_range_end(struct mmu_notifier *mn, | 341 | static 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 | ||
| 158 | bool 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 | |||
| 166 | static void psp_prep_tmr_cmd_buf(struct psp_context *psp, | 158 | static 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 | ||
| 94 | struct psp_xgmi_context { | 95 | struct 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 | ||
| 218 | int psp_gpu_reset(struct amdgpu_device *adev); | 221 | int psp_gpu_reset(struct amdgpu_device *adev); |
| 219 | int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id); | 222 | int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id); |
| 220 | bool psp_support_vmr_ring(struct psp_context *psp); | ||
| 221 | |||
| 222 | extern const struct amdgpu_ip_block_version psp_v11_0_ip_block; | 223 | extern 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 | ||
| 721 | static int gmc_v9_0_late_init(void *handle) | 721 | static 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 | |
| 750 | static 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 | |||
| 27 | extern const struct amd_ip_funcs gmc_v9_0_ip_funcs; | 37 | extern const struct amd_ip_funcs gmc_v9_0_ip_funcs; |
| 28 | extern const struct amdgpu_ip_block_version gmc_v9_0_ip_block; | 38 | extern 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 | ||
| 36 | static u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev) | 37 | static 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 | ||
| 275 | const struct amdgpu_nbio_funcs nbio_v6_1_funcs = { | 282 | const 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 | ||
| 35 | static u32 nbio_v7_4_get_rev_id(struct amdgpu_device *adev) | 36 | static 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 | ||
| 223 | static void nbio_v7_4_init_registers(struct amdgpu_device *adev) | 224 | static 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 | ||
| 228 | const struct amdgpu_nbio_funcs nbio_v7_4_funcs = { | 235 | const 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 | ||
| 36 | MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); | 36 | MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); |
| 37 | MODULE_FIRMWARE("amdgpu/vega20_asd.bin"); | ||
| 37 | MODULE_FIRMWARE("amdgpu/vega20_ta.bin"); | 38 | MODULE_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 | |||
| 170 | out2: | ||
| 171 | release_firmware(adev->psp.ta_fw); | ||
| 172 | adev->psp.ta_fw = NULL; | ||
| 173 | out1: | ||
| 174 | release_firmware(adev->psp.asd_fw); | ||
| 175 | adev->psp.asd_fw = NULL; | ||
| 151 | out: | 176 | out: |
| 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 | ||
| 316 | static 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 | |||
| 294 | static int psp_v11_0_ring_create(struct psp_context *psp, | 323 | static 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 | ||
| 683 | static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp) | 712 | static 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 | ||
| 701 | static u64 psp_v11_0_xgmi_get_node_id(struct psp_context *psp) | 732 | static 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 | ||
| 719 | static const struct psp_funcs psp_v11_0_funcs = { | 752 | static 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 | ||
| 737 | void psp_v11_0_set_psp_funcs(struct psp_context *psp) | 771 | void 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) | |||
| 1159 | static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev) | 1161 | static 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 | ||
