| .. | .. |
|---|
| 30 | 30 | |
|---|
| 31 | 31 | #include <linux/firmware.h> |
|---|
| 32 | 32 | #include <linux/module.h> |
|---|
| 33 | | -#include <drm/drmP.h> |
|---|
| 33 | + |
|---|
| 34 | 34 | #include <drm/drm.h> |
|---|
| 35 | 35 | |
|---|
| 36 | 36 | #include "amdgpu.h" |
|---|
| .. | .. |
|---|
| 38 | 38 | #include "amdgpu_uvd.h" |
|---|
| 39 | 39 | #include "cikd.h" |
|---|
| 40 | 40 | #include "uvd/uvd_4_2_d.h" |
|---|
| 41 | + |
|---|
| 42 | +#include "amdgpu_ras.h" |
|---|
| 41 | 43 | |
|---|
| 42 | 44 | /* 1 second timeout */ |
|---|
| 43 | 45 | #define UVD_IDLE_TIMEOUT msecs_to_jiffies(1000) |
|---|
| .. | .. |
|---|
| 52 | 54 | #define FW_1_66_16 ((1 << 24) | (66 << 16) | (16 << 8)) |
|---|
| 53 | 55 | |
|---|
| 54 | 56 | /* Firmware Names */ |
|---|
| 57 | +#ifdef CONFIG_DRM_AMDGPU_SI |
|---|
| 58 | +#define FIRMWARE_TAHITI "amdgpu/tahiti_uvd.bin" |
|---|
| 59 | +#define FIRMWARE_VERDE "amdgpu/verde_uvd.bin" |
|---|
| 60 | +#define FIRMWARE_PITCAIRN "amdgpu/pitcairn_uvd.bin" |
|---|
| 61 | +#define FIRMWARE_OLAND "amdgpu/oland_uvd.bin" |
|---|
| 62 | +#endif |
|---|
| 55 | 63 | #ifdef CONFIG_DRM_AMDGPU_CIK |
|---|
| 56 | 64 | #define FIRMWARE_BONAIRE "amdgpu/bonaire_uvd.bin" |
|---|
| 57 | 65 | #define FIRMWARE_KABINI "amdgpu/kabini_uvd.bin" |
|---|
| .. | .. |
|---|
| 98 | 106 | unsigned *buf_sizes; |
|---|
| 99 | 107 | }; |
|---|
| 100 | 108 | |
|---|
| 109 | +#ifdef CONFIG_DRM_AMDGPU_SI |
|---|
| 110 | +MODULE_FIRMWARE(FIRMWARE_TAHITI); |
|---|
| 111 | +MODULE_FIRMWARE(FIRMWARE_VERDE); |
|---|
| 112 | +MODULE_FIRMWARE(FIRMWARE_PITCAIRN); |
|---|
| 113 | +MODULE_FIRMWARE(FIRMWARE_OLAND); |
|---|
| 114 | +#endif |
|---|
| 101 | 115 | #ifdef CONFIG_DRM_AMDGPU_CIK |
|---|
| 102 | 116 | MODULE_FIRMWARE(FIRMWARE_BONAIRE); |
|---|
| 103 | 117 | MODULE_FIRMWARE(FIRMWARE_KABINI); |
|---|
| .. | .. |
|---|
| 131 | 145 | INIT_DELAYED_WORK(&adev->uvd.idle_work, amdgpu_uvd_idle_work_handler); |
|---|
| 132 | 146 | |
|---|
| 133 | 147 | switch (adev->asic_type) { |
|---|
| 148 | +#ifdef CONFIG_DRM_AMDGPU_SI |
|---|
| 149 | + case CHIP_TAHITI: |
|---|
| 150 | + fw_name = FIRMWARE_TAHITI; |
|---|
| 151 | + break; |
|---|
| 152 | + case CHIP_VERDE: |
|---|
| 153 | + fw_name = FIRMWARE_VERDE; |
|---|
| 154 | + break; |
|---|
| 155 | + case CHIP_PITCAIRN: |
|---|
| 156 | + fw_name = FIRMWARE_PITCAIRN; |
|---|
| 157 | + break; |
|---|
| 158 | + case CHIP_OLAND: |
|---|
| 159 | + fw_name = FIRMWARE_OLAND; |
|---|
| 160 | + break; |
|---|
| 161 | +#endif |
|---|
| 134 | 162 | #ifdef CONFIG_DRM_AMDGPU_CIK |
|---|
| 135 | 163 | case CHIP_BONAIRE: |
|---|
| 136 | 164 | fw_name = FIRMWARE_BONAIRE; |
|---|
| .. | .. |
|---|
| 297 | 325 | { |
|---|
| 298 | 326 | int i, j; |
|---|
| 299 | 327 | |
|---|
| 328 | + cancel_delayed_work_sync(&adev->uvd.idle_work); |
|---|
| 300 | 329 | drm_sched_entity_destroy(&adev->uvd.entity); |
|---|
| 301 | 330 | |
|---|
| 302 | 331 | for (j = 0; j < adev->uvd.num_uvd_inst; ++j) { |
|---|
| .. | .. |
|---|
| 327 | 356 | int amdgpu_uvd_entity_init(struct amdgpu_device *adev) |
|---|
| 328 | 357 | { |
|---|
| 329 | 358 | struct amdgpu_ring *ring; |
|---|
| 330 | | - struct drm_sched_rq *rq; |
|---|
| 359 | + struct drm_gpu_scheduler *sched; |
|---|
| 331 | 360 | int r; |
|---|
| 332 | 361 | |
|---|
| 333 | 362 | ring = &adev->uvd.inst[0].ring; |
|---|
| 334 | | - rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL]; |
|---|
| 335 | | - r = drm_sched_entity_init(&adev->uvd.entity, &rq, 1, NULL); |
|---|
| 363 | + sched = &ring->sched; |
|---|
| 364 | + r = drm_sched_entity_init(&adev->uvd.entity, DRM_SCHED_PRIORITY_NORMAL, |
|---|
| 365 | + &sched, 1, NULL); |
|---|
| 336 | 366 | if (r) { |
|---|
| 337 | 367 | DRM_ERROR("Failed setting up UVD kernel entity.\n"); |
|---|
| 338 | 368 | return r; |
|---|
| .. | .. |
|---|
| 346 | 376 | unsigned size; |
|---|
| 347 | 377 | void *ptr; |
|---|
| 348 | 378 | int i, j; |
|---|
| 379 | + bool in_ras_intr = amdgpu_ras_intr_triggered(); |
|---|
| 349 | 380 | |
|---|
| 350 | 381 | cancel_delayed_work_sync(&adev->uvd.idle_work); |
|---|
| 351 | 382 | |
|---|
| .. | .. |
|---|
| 372 | 403 | if (!adev->uvd.inst[j].saved_bo) |
|---|
| 373 | 404 | return -ENOMEM; |
|---|
| 374 | 405 | |
|---|
| 375 | | - memcpy_fromio(adev->uvd.inst[j].saved_bo, ptr, size); |
|---|
| 406 | + /* re-write 0 since err_event_athub will corrupt VCPU buffer */ |
|---|
| 407 | + if (in_ras_intr) |
|---|
| 408 | + memset(adev->uvd.inst[j].saved_bo, 0, size); |
|---|
| 409 | + else |
|---|
| 410 | + memcpy_fromio(adev->uvd.inst[j].saved_bo, ptr, size); |
|---|
| 376 | 411 | } |
|---|
| 412 | + |
|---|
| 413 | + if (in_ras_intr) |
|---|
| 414 | + DRM_WARN("UVD VCPU state may lost due to RAS ERREVENT_ATHUB_INTERRUPT\n"); |
|---|
| 415 | + |
|---|
| 377 | 416 | return 0; |
|---|
| 378 | 417 | } |
|---|
| 379 | 418 | |
|---|
| .. | .. |
|---|
| 692 | 731 | buf_sizes[0x1] = dpb_size; |
|---|
| 693 | 732 | buf_sizes[0x2] = image_size; |
|---|
| 694 | 733 | buf_sizes[0x4] = min_ctx_size; |
|---|
| 734 | + /* store image width to adjust nb memory pstate */ |
|---|
| 735 | + adev->uvd.decode_image_width = width; |
|---|
| 695 | 736 | return 0; |
|---|
| 696 | 737 | } |
|---|
| 697 | 738 | |
|---|
| .. | .. |
|---|
| 1041 | 1082 | goto err; |
|---|
| 1042 | 1083 | } |
|---|
| 1043 | 1084 | |
|---|
| 1044 | | - r = amdgpu_job_alloc_with_ib(adev, 64, &job); |
|---|
| 1085 | + r = amdgpu_job_alloc_with_ib(adev, 64, direct ? AMDGPU_IB_POOL_DIRECT : |
|---|
| 1086 | + AMDGPU_IB_POOL_DELAYED, &job); |
|---|
| 1045 | 1087 | if (r) |
|---|
| 1046 | 1088 | goto err; |
|---|
| 1047 | 1089 | |
|---|
| .. | .. |
|---|
| 1071 | 1113 | ib->length_dw = 16; |
|---|
| 1072 | 1114 | |
|---|
| 1073 | 1115 | if (direct) { |
|---|
| 1074 | | - r = reservation_object_wait_timeout_rcu(bo->tbo.resv, |
|---|
| 1116 | + r = dma_resv_wait_timeout_rcu(bo->tbo.base.resv, |
|---|
| 1075 | 1117 | true, false, |
|---|
| 1076 | 1118 | msecs_to_jiffies(10)); |
|---|
| 1077 | 1119 | if (r == 0) |
|---|
| .. | .. |
|---|
| 1083 | 1125 | if (r) |
|---|
| 1084 | 1126 | goto err_free; |
|---|
| 1085 | 1127 | } else { |
|---|
| 1086 | | - r = amdgpu_sync_resv(adev, &job->sync, bo->tbo.resv, |
|---|
| 1087 | | - AMDGPU_FENCE_OWNER_UNDEFINED, false); |
|---|
| 1128 | + r = amdgpu_sync_resv(adev, &job->sync, bo->tbo.base.resv, |
|---|
| 1129 | + AMDGPU_SYNC_ALWAYS, |
|---|
| 1130 | + AMDGPU_FENCE_OWNER_UNDEFINED); |
|---|
| 1088 | 1131 | if (r) |
|---|
| 1089 | 1132 | goto err_free; |
|---|
| 1090 | 1133 | |
|---|
| .. | .. |
|---|
| 1243 | 1286 | { |
|---|
| 1244 | 1287 | struct dma_fence *fence; |
|---|
| 1245 | 1288 | long r; |
|---|
| 1246 | | - uint32_t ip_instance = ring->me; |
|---|
| 1247 | 1289 | |
|---|
| 1248 | 1290 | r = amdgpu_uvd_get_create_msg(ring, 1, NULL); |
|---|
| 1249 | | - if (r) { |
|---|
| 1250 | | - DRM_ERROR("amdgpu: (%d)failed to get create msg (%ld).\n", ip_instance, r); |
|---|
| 1291 | + if (r) |
|---|
| 1251 | 1292 | goto error; |
|---|
| 1252 | | - } |
|---|
| 1253 | 1293 | |
|---|
| 1254 | 1294 | r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence); |
|---|
| 1255 | | - if (r) { |
|---|
| 1256 | | - DRM_ERROR("amdgpu: (%d)failed to get destroy ib (%ld).\n", ip_instance, r); |
|---|
| 1295 | + if (r) |
|---|
| 1257 | 1296 | goto error; |
|---|
| 1258 | | - } |
|---|
| 1259 | 1297 | |
|---|
| 1260 | 1298 | r = dma_fence_wait_timeout(fence, false, timeout); |
|---|
| 1261 | | - if (r == 0) { |
|---|
| 1262 | | - DRM_ERROR("amdgpu: (%d)IB test timed out.\n", ip_instance); |
|---|
| 1299 | + if (r == 0) |
|---|
| 1263 | 1300 | r = -ETIMEDOUT; |
|---|
| 1264 | | - } else if (r < 0) { |
|---|
| 1265 | | - DRM_ERROR("amdgpu: (%d)fence wait failed (%ld).\n", ip_instance, r); |
|---|
| 1266 | | - } else { |
|---|
| 1267 | | - DRM_DEBUG("ib test on (%d)ring %d succeeded\n", ip_instance, ring->idx); |
|---|
| 1301 | + else if (r > 0) |
|---|
| 1268 | 1302 | r = 0; |
|---|
| 1269 | | - } |
|---|
| 1270 | 1303 | |
|---|
| 1271 | 1304 | dma_fence_put(fence); |
|---|
| 1272 | 1305 | |
|---|