.. | .. |
---|
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 | |
---|