diff options
author | Dave Airlie <airlied@redhat.com> | 2015-08-17 00:13:53 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-08-17 00:13:53 -0400 |
commit | 4eebf60b7452fbd551fd7dece855ba7825a49cbc (patch) | |
tree | 490b4d194ba09c90e10201ab7fc084a0bda0ed27 /drivers/gpu/drm/amd/amdgpu | |
parent | 8f9cb50789e76f3e224e8861adf650e55c747af4 (diff) | |
parent | 2c6625cd545bdd66acff14f3394865d43920a5c7 (diff) |
Merge tag 'v4.2-rc7' into drm-next
Linux 4.2-rc7
Backmerge master for i915 fixes
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_dpm.c | 70 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 54 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 85 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 48 |
15 files changed, 296 insertions, 97 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index f3791e0d27d4..baefa635169a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1130,6 +1130,9 @@ struct amdgpu_gfx { | |||
1130 | uint32_t me_feature_version; | 1130 | uint32_t me_feature_version; |
1131 | uint32_t ce_feature_version; | 1131 | uint32_t ce_feature_version; |
1132 | uint32_t pfp_feature_version; | 1132 | uint32_t pfp_feature_version; |
1133 | uint32_t rlc_feature_version; | ||
1134 | uint32_t mec_feature_version; | ||
1135 | uint32_t mec2_feature_version; | ||
1133 | struct amdgpu_ring gfx_ring[AMDGPU_MAX_GFX_RINGS]; | 1136 | struct amdgpu_ring gfx_ring[AMDGPU_MAX_GFX_RINGS]; |
1134 | unsigned num_gfx_rings; | 1137 | unsigned num_gfx_rings; |
1135 | struct amdgpu_ring compute_ring[AMDGPU_MAX_COMPUTE_RINGS]; | 1138 | struct amdgpu_ring compute_ring[AMDGPU_MAX_COMPUTE_RINGS]; |
@@ -1614,6 +1617,9 @@ struct amdgpu_uvd { | |||
1614 | #define AMDGPU_MAX_VCE_HANDLES 16 | 1617 | #define AMDGPU_MAX_VCE_HANDLES 16 |
1615 | #define AMDGPU_VCE_FIRMWARE_OFFSET 256 | 1618 | #define AMDGPU_VCE_FIRMWARE_OFFSET 256 |
1616 | 1619 | ||
1620 | #define AMDGPU_VCE_HARVEST_VCE0 (1 << 0) | ||
1621 | #define AMDGPU_VCE_HARVEST_VCE1 (1 << 1) | ||
1622 | |||
1617 | struct amdgpu_vce { | 1623 | struct amdgpu_vce { |
1618 | struct amdgpu_bo *vcpu_bo; | 1624 | struct amdgpu_bo *vcpu_bo; |
1619 | uint64_t gpu_addr; | 1625 | uint64_t gpu_addr; |
@@ -1626,6 +1632,7 @@ struct amdgpu_vce { | |||
1626 | const struct firmware *fw; /* VCE firmware */ | 1632 | const struct firmware *fw; /* VCE firmware */ |
1627 | struct amdgpu_ring ring[AMDGPU_MAX_VCE_RINGS]; | 1633 | struct amdgpu_ring ring[AMDGPU_MAX_VCE_RINGS]; |
1628 | struct amdgpu_irq_src irq; | 1634 | struct amdgpu_irq_src irq; |
1635 | unsigned harvest_config; | ||
1629 | }; | 1636 | }; |
1630 | 1637 | ||
1631 | /* | 1638 | /* |
@@ -1635,6 +1642,7 @@ struct amdgpu_sdma { | |||
1635 | /* SDMA firmware */ | 1642 | /* SDMA firmware */ |
1636 | const struct firmware *fw; | 1643 | const struct firmware *fw; |
1637 | uint32_t fw_version; | 1644 | uint32_t fw_version; |
1645 | uint32_t feature_version; | ||
1638 | 1646 | ||
1639 | struct amdgpu_ring ring; | 1647 | struct amdgpu_ring ring; |
1640 | }; | 1648 | }; |
@@ -1862,6 +1870,12 @@ typedef void (*amdgpu_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t); | |||
1862 | typedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t); | 1870 | typedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t); |
1863 | typedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t); | 1871 | typedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t); |
1864 | 1872 | ||
1873 | struct amdgpu_ip_block_status { | ||
1874 | bool valid; | ||
1875 | bool sw; | ||
1876 | bool hw; | ||
1877 | }; | ||
1878 | |||
1865 | struct amdgpu_device { | 1879 | struct amdgpu_device { |
1866 | struct device *dev; | 1880 | struct device *dev; |
1867 | struct drm_device *ddev; | 1881 | struct drm_device *ddev; |
@@ -2004,7 +2018,7 @@ struct amdgpu_device { | |||
2004 | 2018 | ||
2005 | const struct amdgpu_ip_block_version *ip_blocks; | 2019 | const struct amdgpu_ip_block_version *ip_blocks; |
2006 | int num_ip_blocks; | 2020 | int num_ip_blocks; |
2007 | bool *ip_block_enabled; | 2021 | struct amdgpu_ip_block_status *ip_block_status; |
2008 | struct mutex mn_lock; | 2022 | struct mutex mn_lock; |
2009 | DECLARE_HASHTABLE(mn_hash, 7); | 2023 | DECLARE_HASHTABLE(mn_hash, 7); |
2010 | 2024 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index d79009b65867..99f158e1baff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1191,8 +1191,9 @@ static int amdgpu_early_init(struct amdgpu_device *adev) | |||
1191 | return -EINVAL; | 1191 | return -EINVAL; |
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | adev->ip_block_enabled = kcalloc(adev->num_ip_blocks, sizeof(bool), GFP_KERNEL); | 1194 | adev->ip_block_status = kcalloc(adev->num_ip_blocks, |
1195 | if (adev->ip_block_enabled == NULL) | 1195 | sizeof(struct amdgpu_ip_block_status), GFP_KERNEL); |
1196 | if (adev->ip_block_status == NULL) | ||
1196 | return -ENOMEM; | 1197 | return -ENOMEM; |
1197 | 1198 | ||
1198 | if (adev->ip_blocks == NULL) { | 1199 | if (adev->ip_blocks == NULL) { |
@@ -1203,18 +1204,18 @@ static int amdgpu_early_init(struct amdgpu_device *adev) | |||
1203 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1204 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1204 | if ((amdgpu_ip_block_mask & (1 << i)) == 0) { | 1205 | if ((amdgpu_ip_block_mask & (1 << i)) == 0) { |
1205 | DRM_ERROR("disabled ip block: %d\n", i); | 1206 | DRM_ERROR("disabled ip block: %d\n", i); |
1206 | adev->ip_block_enabled[i] = false; | 1207 | adev->ip_block_status[i].valid = false; |
1207 | } else { | 1208 | } else { |
1208 | if (adev->ip_blocks[i].funcs->early_init) { | 1209 | if (adev->ip_blocks[i].funcs->early_init) { |
1209 | r = adev->ip_blocks[i].funcs->early_init((void *)adev); | 1210 | r = adev->ip_blocks[i].funcs->early_init((void *)adev); |
1210 | if (r == -ENOENT) | 1211 | if (r == -ENOENT) |
1211 | adev->ip_block_enabled[i] = false; | 1212 | adev->ip_block_status[i].valid = false; |
1212 | else if (r) | 1213 | else if (r) |
1213 | return r; | 1214 | return r; |
1214 | else | 1215 | else |
1215 | adev->ip_block_enabled[i] = true; | 1216 | adev->ip_block_status[i].valid = true; |
1216 | } else { | 1217 | } else { |
1217 | adev->ip_block_enabled[i] = true; | 1218 | adev->ip_block_status[i].valid = true; |
1218 | } | 1219 | } |
1219 | } | 1220 | } |
1220 | } | 1221 | } |
@@ -1227,11 +1228,12 @@ static int amdgpu_init(struct amdgpu_device *adev) | |||
1227 | int i, r; | 1228 | int i, r; |
1228 | 1229 | ||
1229 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1230 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1230 | if (!adev->ip_block_enabled[i]) | 1231 | if (!adev->ip_block_status[i].valid) |
1231 | continue; | 1232 | continue; |
1232 | r = adev->ip_blocks[i].funcs->sw_init((void *)adev); | 1233 | r = adev->ip_blocks[i].funcs->sw_init((void *)adev); |
1233 | if (r) | 1234 | if (r) |
1234 | return r; | 1235 | return r; |
1236 | adev->ip_block_status[i].sw = true; | ||
1235 | /* need to do gmc hw init early so we can allocate gpu mem */ | 1237 | /* need to do gmc hw init early so we can allocate gpu mem */ |
1236 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { | 1238 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { |
1237 | r = amdgpu_vram_scratch_init(adev); | 1239 | r = amdgpu_vram_scratch_init(adev); |
@@ -1243,11 +1245,12 @@ static int amdgpu_init(struct amdgpu_device *adev) | |||
1243 | r = amdgpu_wb_init(adev); | 1245 | r = amdgpu_wb_init(adev); |
1244 | if (r) | 1246 | if (r) |
1245 | return r; | 1247 | return r; |
1248 | adev->ip_block_status[i].hw = true; | ||
1246 | } | 1249 | } |
1247 | } | 1250 | } |
1248 | 1251 | ||
1249 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1252 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1250 | if (!adev->ip_block_enabled[i]) | 1253 | if (!adev->ip_block_status[i].sw) |
1251 | continue; | 1254 | continue; |
1252 | /* gmc hw init is done early */ | 1255 | /* gmc hw init is done early */ |
1253 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) | 1256 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) |
@@ -1255,6 +1258,7 @@ static int amdgpu_init(struct amdgpu_device *adev) | |||
1255 | r = adev->ip_blocks[i].funcs->hw_init((void *)adev); | 1258 | r = adev->ip_blocks[i].funcs->hw_init((void *)adev); |
1256 | if (r) | 1259 | if (r) |
1257 | return r; | 1260 | return r; |
1261 | adev->ip_block_status[i].hw = true; | ||
1258 | } | 1262 | } |
1259 | 1263 | ||
1260 | return 0; | 1264 | return 0; |
@@ -1265,7 +1269,7 @@ static int amdgpu_late_init(struct amdgpu_device *adev) | |||
1265 | int i = 0, r; | 1269 | int i = 0, r; |
1266 | 1270 | ||
1267 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1271 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1268 | if (!adev->ip_block_enabled[i]) | 1272 | if (!adev->ip_block_status[i].valid) |
1269 | continue; | 1273 | continue; |
1270 | /* enable clockgating to save power */ | 1274 | /* enable clockgating to save power */ |
1271 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, | 1275 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, |
@@ -1287,7 +1291,7 @@ static int amdgpu_fini(struct amdgpu_device *adev) | |||
1287 | int i, r; | 1291 | int i, r; |
1288 | 1292 | ||
1289 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1293 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1290 | if (!adev->ip_block_enabled[i]) | 1294 | if (!adev->ip_block_status[i].hw) |
1291 | continue; | 1295 | continue; |
1292 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { | 1296 | if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { |
1293 | amdgpu_wb_fini(adev); | 1297 | amdgpu_wb_fini(adev); |
@@ -1300,14 +1304,16 @@ static int amdgpu_fini(struct amdgpu_device *adev) | |||
1300 | return r; | 1304 | return r; |
1301 | r = adev->ip_blocks[i].funcs->hw_fini((void *)adev); | 1305 | r = adev->ip_blocks[i].funcs->hw_fini((void *)adev); |
1302 | /* XXX handle errors */ | 1306 | /* XXX handle errors */ |
1307 | adev->ip_block_status[i].hw = false; | ||
1303 | } | 1308 | } |
1304 | 1309 | ||
1305 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1310 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1306 | if (!adev->ip_block_enabled[i]) | 1311 | if (!adev->ip_block_status[i].sw) |
1307 | continue; | 1312 | continue; |
1308 | r = adev->ip_blocks[i].funcs->sw_fini((void *)adev); | 1313 | r = adev->ip_blocks[i].funcs->sw_fini((void *)adev); |
1309 | /* XXX handle errors */ | 1314 | /* XXX handle errors */ |
1310 | adev->ip_block_enabled[i] = false; | 1315 | adev->ip_block_status[i].sw = false; |
1316 | adev->ip_block_status[i].valid = false; | ||
1311 | } | 1317 | } |
1312 | 1318 | ||
1313 | return 0; | 1319 | return 0; |
@@ -1318,7 +1324,7 @@ static int amdgpu_suspend(struct amdgpu_device *adev) | |||
1318 | int i, r; | 1324 | int i, r; |
1319 | 1325 | ||
1320 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1326 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1321 | if (!adev->ip_block_enabled[i]) | 1327 | if (!adev->ip_block_status[i].valid) |
1322 | continue; | 1328 | continue; |
1323 | /* ungate blocks so that suspend can properly shut them down */ | 1329 | /* ungate blocks so that suspend can properly shut them down */ |
1324 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, | 1330 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, |
@@ -1336,7 +1342,7 @@ static int amdgpu_resume(struct amdgpu_device *adev) | |||
1336 | int i, r; | 1342 | int i, r; |
1337 | 1343 | ||
1338 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1344 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1339 | if (!adev->ip_block_enabled[i]) | 1345 | if (!adev->ip_block_status[i].valid) |
1340 | continue; | 1346 | continue; |
1341 | r = adev->ip_blocks[i].funcs->resume(adev); | 1347 | r = adev->ip_blocks[i].funcs->resume(adev); |
1342 | if (r) | 1348 | if (r) |
@@ -1582,8 +1588,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev) | |||
1582 | amdgpu_fence_driver_fini(adev); | 1588 | amdgpu_fence_driver_fini(adev); |
1583 | amdgpu_fbdev_fini(adev); | 1589 | amdgpu_fbdev_fini(adev); |
1584 | r = amdgpu_fini(adev); | 1590 | r = amdgpu_fini(adev); |
1585 | kfree(adev->ip_block_enabled); | 1591 | kfree(adev->ip_block_status); |
1586 | adev->ip_block_enabled = NULL; | 1592 | adev->ip_block_status = NULL; |
1587 | adev->accel_working = false; | 1593 | adev->accel_working = false; |
1588 | /* free i2c buses */ | 1594 | /* free i2c buses */ |
1589 | amdgpu_i2c_fini(adev); | 1595 | amdgpu_i2c_fini(adev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index ae43b58c9733..4afc507820c0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -449,7 +449,7 @@ out: | |||
449 | * vital here, so they are not reported back to userspace. | 449 | * vital here, so they are not reported back to userspace. |
450 | */ | 450 | */ |
451 | static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | 451 | static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, |
452 | struct amdgpu_bo_va *bo_va) | 452 | struct amdgpu_bo_va *bo_va, uint32_t operation) |
453 | { | 453 | { |
454 | struct ttm_validate_buffer tv, *entry; | 454 | struct ttm_validate_buffer tv, *entry; |
455 | struct amdgpu_bo_list_entry *vm_bos; | 455 | struct amdgpu_bo_list_entry *vm_bos; |
@@ -485,7 +485,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
485 | if (r) | 485 | if (r) |
486 | goto error_unlock; | 486 | goto error_unlock; |
487 | 487 | ||
488 | r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); | 488 | |
489 | if (operation == AMDGPU_VA_OP_MAP) | ||
490 | r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); | ||
489 | 491 | ||
490 | error_unlock: | 492 | error_unlock: |
491 | mutex_unlock(&bo_va->vm->mutex); | 493 | mutex_unlock(&bo_va->vm->mutex); |
@@ -580,7 +582,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
580 | } | 582 | } |
581 | 583 | ||
582 | if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) | 584 | if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) |
583 | amdgpu_gem_va_update_vm(adev, bo_va); | 585 | amdgpu_gem_va_update_vm(adev, bo_va, args->operation); |
584 | 586 | ||
585 | drm_gem_object_unreference_unlocked(gobj); | 587 | drm_gem_object_unreference_unlocked(gobj); |
586 | return r; | 588 | return r; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 52dff75aac6f..bc0fac618a3f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -180,16 +180,16 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs, | |||
180 | if (vm) { | 180 | if (vm) { |
181 | /* do context switch */ | 181 | /* do context switch */ |
182 | amdgpu_vm_flush(ring, vm, ib->sync.last_vm_update); | 182 | amdgpu_vm_flush(ring, vm, ib->sync.last_vm_update); |
183 | } | ||
184 | 183 | ||
185 | if (vm && ring->funcs->emit_gds_switch) | 184 | if (ring->funcs->emit_gds_switch) |
186 | amdgpu_ring_emit_gds_switch(ring, ib->vm->ids[ring->idx].id, | 185 | amdgpu_ring_emit_gds_switch(ring, ib->vm->ids[ring->idx].id, |
187 | ib->gds_base, ib->gds_size, | 186 | ib->gds_base, ib->gds_size, |
188 | ib->gws_base, ib->gws_size, | 187 | ib->gws_base, ib->gws_size, |
189 | ib->oa_base, ib->oa_size); | 188 | ib->oa_base, ib->oa_size); |
190 | 189 | ||
191 | if (ring->funcs->emit_hdp_flush) | 190 | if (ring->funcs->emit_hdp_flush) |
192 | amdgpu_ring_emit_hdp_flush(ring); | 191 | amdgpu_ring_emit_hdp_flush(ring); |
192 | } | ||
193 | 193 | ||
194 | old_ctx = ring->current_ctx; | 194 | old_ctx = ring->current_ctx; |
195 | for (i = 0; i < num_ibs; ++i) { | 195 | for (i = 0; i < num_ibs; ++i) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 8c40a9671b9f..93000af92283 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -242,7 +242,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
242 | 242 | ||
243 | for (i = 0; i < adev->num_ip_blocks; i++) { | 243 | for (i = 0; i < adev->num_ip_blocks; i++) { |
244 | if (adev->ip_blocks[i].type == type && | 244 | if (adev->ip_blocks[i].type == type && |
245 | adev->ip_block_enabled[i]) { | 245 | adev->ip_block_status[i].valid) { |
246 | ip.hw_ip_version_major = adev->ip_blocks[i].major; | 246 | ip.hw_ip_version_major = adev->ip_blocks[i].major; |
247 | ip.hw_ip_version_minor = adev->ip_blocks[i].minor; | 247 | ip.hw_ip_version_minor = adev->ip_blocks[i].minor; |
248 | ip.capabilities_flags = 0; | 248 | ip.capabilities_flags = 0; |
@@ -281,7 +281,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
281 | 281 | ||
282 | for (i = 0; i < adev->num_ip_blocks; i++) | 282 | for (i = 0; i < adev->num_ip_blocks; i++) |
283 | if (adev->ip_blocks[i].type == type && | 283 | if (adev->ip_blocks[i].type == type && |
284 | adev->ip_block_enabled[i] && | 284 | adev->ip_block_status[i].valid && |
285 | count < AMDGPU_HW_IP_INSTANCE_MAX_COUNT) | 285 | count < AMDGPU_HW_IP_INSTANCE_MAX_COUNT) |
286 | count++; | 286 | count++; |
287 | 287 | ||
@@ -324,16 +324,17 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
324 | break; | 324 | break; |
325 | case AMDGPU_INFO_FW_GFX_RLC: | 325 | case AMDGPU_INFO_FW_GFX_RLC: |
326 | fw_info.ver = adev->gfx.rlc_fw_version; | 326 | fw_info.ver = adev->gfx.rlc_fw_version; |
327 | fw_info.feature = 0; | 327 | fw_info.feature = adev->gfx.rlc_feature_version; |
328 | break; | 328 | break; |
329 | case AMDGPU_INFO_FW_GFX_MEC: | 329 | case AMDGPU_INFO_FW_GFX_MEC: |
330 | if (info->query_fw.index == 0) | 330 | if (info->query_fw.index == 0) { |
331 | fw_info.ver = adev->gfx.mec_fw_version; | 331 | fw_info.ver = adev->gfx.mec_fw_version; |
332 | else if (info->query_fw.index == 1) | 332 | fw_info.feature = adev->gfx.mec_feature_version; |
333 | } else if (info->query_fw.index == 1) { | ||
333 | fw_info.ver = adev->gfx.mec2_fw_version; | 334 | fw_info.ver = adev->gfx.mec2_fw_version; |
334 | else | 335 | fw_info.feature = adev->gfx.mec2_feature_version; |
336 | } else | ||
335 | return -EINVAL; | 337 | return -EINVAL; |
336 | fw_info.feature = 0; | ||
337 | break; | 338 | break; |
338 | case AMDGPU_INFO_FW_SMC: | 339 | case AMDGPU_INFO_FW_SMC: |
339 | fw_info.ver = adev->pm.fw_version; | 340 | fw_info.ver = adev->pm.fw_version; |
@@ -343,7 +344,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
343 | if (info->query_fw.index >= 2) | 344 | if (info->query_fw.index >= 2) |
344 | return -EINVAL; | 345 | return -EINVAL; |
345 | fw_info.ver = adev->sdma[info->query_fw.index].fw_version; | 346 | fw_info.ver = adev->sdma[info->query_fw.index].fw_version; |
346 | fw_info.feature = 0; | 347 | fw_info.feature = adev->sdma[info->query_fw.index].feature_version; |
347 | break; | 348 | break; |
348 | default: | 349 | default: |
349 | return -EINVAL; | 350 | return -EINVAL; |
@@ -423,7 +424,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
423 | return n ? -EFAULT : 0; | 424 | return n ? -EFAULT : 0; |
424 | } | 425 | } |
425 | case AMDGPU_INFO_DEV_INFO: { | 426 | case AMDGPU_INFO_DEV_INFO: { |
426 | struct drm_amdgpu_info_device dev_info; | 427 | struct drm_amdgpu_info_device dev_info = {}; |
427 | struct amdgpu_cu_info cu_info; | 428 | struct amdgpu_cu_info cu_info; |
428 | 429 | ||
429 | dev_info.device_id = dev->pdev->device; | 430 | dev_info.device_id = dev->pdev->device; |
@@ -466,6 +467,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
466 | memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap)); | 467 | memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap)); |
467 | dev_info.vram_type = adev->mc.vram_type; | 468 | dev_info.vram_type = adev->mc.vram_type; |
468 | dev_info.vram_bit_width = adev->mc.vram_width; | 469 | dev_info.vram_bit_width = adev->mc.vram_width; |
470 | dev_info.vce_harvest_config = adev->vce.harvest_config; | ||
469 | 471 | ||
470 | return copy_to_user(out, &dev_info, | 472 | return copy_to_user(out, &dev_info, |
471 | min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; | 473 | min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 2f7a5efa21c2..f5c22556ec2c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | |||
@@ -374,7 +374,7 @@ static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[]) | |||
374 | unsigned height_in_mb = ALIGN(height / 16, 2); | 374 | unsigned height_in_mb = ALIGN(height / 16, 2); |
375 | unsigned fs_in_mb = width_in_mb * height_in_mb; | 375 | unsigned fs_in_mb = width_in_mb * height_in_mb; |
376 | 376 | ||
377 | unsigned image_size, tmp, min_dpb_size, num_dpb_buffer; | 377 | unsigned image_size, tmp, min_dpb_size, num_dpb_buffer, min_ctx_size; |
378 | 378 | ||
379 | image_size = width * height; | 379 | image_size = width * height; |
380 | image_size += image_size / 2; | 380 | image_size += image_size / 2; |
@@ -466,6 +466,8 @@ static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[]) | |||
466 | 466 | ||
467 | num_dpb_buffer = (le32_to_cpu(msg[59]) & 0xff) + 2; | 467 | num_dpb_buffer = (le32_to_cpu(msg[59]) & 0xff) + 2; |
468 | min_dpb_size = image_size * num_dpb_buffer; | 468 | min_dpb_size = image_size * num_dpb_buffer; |
469 | min_ctx_size = ((width + 255) / 16) * ((height + 255) / 16) | ||
470 | * 16 * num_dpb_buffer + 52 * 1024; | ||
469 | break; | 471 | break; |
470 | 472 | ||
471 | default: | 473 | default: |
@@ -486,6 +488,7 @@ static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[]) | |||
486 | 488 | ||
487 | buf_sizes[0x1] = dpb_size; | 489 | buf_sizes[0x1] = dpb_size; |
488 | buf_sizes[0x2] = image_size; | 490 | buf_sizes[0x2] = image_size; |
491 | buf_sizes[0x4] = min_ctx_size; | ||
489 | return 0; | 492 | return 0; |
490 | } | 493 | } |
491 | 494 | ||
@@ -628,6 +631,13 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx) | |||
628 | return -EINVAL; | 631 | return -EINVAL; |
629 | } | 632 | } |
630 | 633 | ||
634 | } else if (cmd == 0x206) { | ||
635 | if ((end - start) < ctx->buf_sizes[4]) { | ||
636 | DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd, | ||
637 | (unsigned)(end - start), | ||
638 | ctx->buf_sizes[4]); | ||
639 | return -EINVAL; | ||
640 | } | ||
631 | } else if ((cmd != 0x100) && (cmd != 0x204)) { | 641 | } else if ((cmd != 0x100) && (cmd != 0x204)) { |
632 | DRM_ERROR("invalid UVD command %X!\n", cmd); | 642 | DRM_ERROR("invalid UVD command %X!\n", cmd); |
633 | return -EINVAL; | 643 | return -EINVAL; |
@@ -755,9 +765,10 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) | |||
755 | struct amdgpu_uvd_cs_ctx ctx = {}; | 765 | struct amdgpu_uvd_cs_ctx ctx = {}; |
756 | unsigned buf_sizes[] = { | 766 | unsigned buf_sizes[] = { |
757 | [0x00000000] = 2048, | 767 | [0x00000000] = 2048, |
758 | [0x00000001] = 32 * 1024 * 1024, | 768 | [0x00000001] = 0xFFFFFFFF, |
759 | [0x00000002] = 2048 * 1152 * 3, | 769 | [0x00000002] = 0xFFFFFFFF, |
760 | [0x00000003] = 2048, | 770 | [0x00000003] = 2048, |
771 | [0x00000004] = 0xFFFFFFFF, | ||
761 | }; | 772 | }; |
762 | struct amdgpu_ib *ib = &parser->ibs[ib_idx]; | 773 | struct amdgpu_ib *ib = &parser->ibs[ib_idx]; |
763 | int r; | 774 | int r; |
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index ab83cc1ca4cc..15df46c93f0a 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |||
@@ -500,6 +500,7 @@ static int cik_sdma_load_microcode(struct amdgpu_device *adev) | |||
500 | amdgpu_ucode_print_sdma_hdr(&hdr->header); | 500 | amdgpu_ucode_print_sdma_hdr(&hdr->header); |
501 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; | 501 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
502 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); | 502 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); |
503 | adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); | ||
503 | fw_data = (const __le32 *) | 504 | fw_data = (const __le32 *) |
504 | (adev->sdma[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); | 505 | (adev->sdma[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
505 | WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); | 506 | WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); |
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index 1a2d419cbf16..ace870afc7d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c | |||
@@ -494,29 +494,67 @@ static void cz_dpm_fini(struct amdgpu_device *adev) | |||
494 | amdgpu_free_extended_power_table(adev); | 494 | amdgpu_free_extended_power_table(adev); |
495 | } | 495 | } |
496 | 496 | ||
497 | #define ixSMUSVI_NB_CURRENTVID 0xD8230044 | ||
498 | #define CURRENT_NB_VID_MASK 0xff000000 | ||
499 | #define CURRENT_NB_VID__SHIFT 24 | ||
500 | #define ixSMUSVI_GFX_CURRENTVID 0xD8230048 | ||
501 | #define CURRENT_GFX_VID_MASK 0xff000000 | ||
502 | #define CURRENT_GFX_VID__SHIFT 24 | ||
503 | |||
497 | static void | 504 | static void |
498 | cz_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev, | 505 | cz_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev, |
499 | struct seq_file *m) | 506 | struct seq_file *m) |
500 | { | 507 | { |
508 | struct cz_power_info *pi = cz_get_pi(adev); | ||
501 | struct amdgpu_clock_voltage_dependency_table *table = | 509 | struct amdgpu_clock_voltage_dependency_table *table = |
502 | &adev->pm.dpm.dyn_state.vddc_dependency_on_sclk; | 510 | &adev->pm.dpm.dyn_state.vddc_dependency_on_sclk; |
503 | u32 current_index = | 511 | struct amdgpu_uvd_clock_voltage_dependency_table *uvd_table = |
504 | (RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX) & | 512 | &adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; |
505 | TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX_MASK) >> | 513 | struct amdgpu_vce_clock_voltage_dependency_table *vce_table = |
506 | TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX__SHIFT; | 514 | &adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table; |
507 | u32 sclk, tmp; | 515 | u32 sclk_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX), |
508 | u16 vddc; | 516 | TARGET_AND_CURRENT_PROFILE_INDEX, CURR_SCLK_INDEX); |
509 | 517 | u32 uvd_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2), | |
510 | if (current_index >= NUM_SCLK_LEVELS) { | 518 | TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_UVD_INDEX); |
511 | seq_printf(m, "invalid dpm profile %d\n", current_index); | 519 | u32 vce_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2), |
520 | TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX); | ||
521 | u32 sclk, vclk, dclk, ecclk, tmp; | ||
522 | u16 vddnb, vddgfx; | ||
523 | |||
524 | if (sclk_index >= NUM_SCLK_LEVELS) { | ||
525 | seq_printf(m, "invalid sclk dpm profile %d\n", sclk_index); | ||
512 | } else { | 526 | } else { |
513 | sclk = table->entries[current_index].clk; | 527 | sclk = table->entries[sclk_index].clk; |
514 | tmp = (RREG32_SMC(ixSMU_VOLTAGE_STATUS) & | 528 | seq_printf(m, "%u sclk: %u\n", sclk_index, sclk); |
515 | SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL_MASK) >> | 529 | } |
516 | SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL__SHIFT; | 530 | |
517 | vddc = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); | 531 | tmp = (RREG32_SMC(ixSMUSVI_NB_CURRENTVID) & |
518 | seq_printf(m, "power level %d sclk: %u vddc: %u\n", | 532 | CURRENT_NB_VID_MASK) >> CURRENT_NB_VID__SHIFT; |
519 | current_index, sclk, vddc); | 533 | vddnb = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); |
534 | tmp = (RREG32_SMC(ixSMUSVI_GFX_CURRENTVID) & | ||
535 | CURRENT_GFX_VID_MASK) >> CURRENT_GFX_VID__SHIFT; | ||
536 | vddgfx = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); | ||
537 | seq_printf(m, "vddnb: %u vddgfx: %u\n", vddnb, vddgfx); | ||
538 | |||
539 | seq_printf(m, "uvd %sabled\n", pi->uvd_power_gated ? "dis" : "en"); | ||
540 | if (!pi->uvd_power_gated) { | ||
541 | if (uvd_index >= CZ_MAX_HARDWARE_POWERLEVELS) { | ||
542 | seq_printf(m, "invalid uvd dpm level %d\n", uvd_index); | ||
543 | } else { | ||
544 | vclk = uvd_table->entries[uvd_index].vclk; | ||
545 | dclk = uvd_table->entries[uvd_index].dclk; | ||
546 | seq_printf(m, "%u uvd vclk: %u dclk: %u\n", uvd_index, vclk, dclk); | ||
547 | } | ||
548 | } | ||
549 | |||
550 | seq_printf(m, "vce %sabled\n", pi->vce_power_gated ? "dis" : "en"); | ||
551 | if (!pi->vce_power_gated) { | ||
552 | if (vce_index >= CZ_MAX_HARDWARE_POWERLEVELS) { | ||
553 | seq_printf(m, "invalid vce dpm level %d\n", vce_index); | ||
554 | } else { | ||
555 | ecclk = vce_table->entries[vce_index].ecclk; | ||
556 | seq_printf(m, "%u vce ecclk: %u\n", vce_index, ecclk); | ||
557 | } | ||
520 | } | 558 | } |
521 | } | 559 | } |
522 | 560 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index 6e77964f1b64..e70a26f587a0 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | |||
@@ -2632,6 +2632,7 @@ static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
2632 | struct drm_device *dev = crtc->dev; | 2632 | struct drm_device *dev = crtc->dev; |
2633 | struct amdgpu_device *adev = dev->dev_private; | 2633 | struct amdgpu_device *adev = dev->dev_private; |
2634 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | 2634 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
2635 | unsigned type; | ||
2635 | 2636 | ||
2636 | switch (mode) { | 2637 | switch (mode) { |
2637 | case DRM_MODE_DPMS_ON: | 2638 | case DRM_MODE_DPMS_ON: |
@@ -2640,6 +2641,9 @@ static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
2640 | dce_v10_0_vga_enable(crtc, true); | 2641 | dce_v10_0_vga_enable(crtc, true); |
2641 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); | 2642 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
2642 | dce_v10_0_vga_enable(crtc, false); | 2643 | dce_v10_0_vga_enable(crtc, false); |
2644 | /* Make sure VBLANK interrupt is still enabled */ | ||
2645 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); | ||
2646 | amdgpu_irq_update(adev, &adev->crtc_irq, type); | ||
2643 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); | 2647 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
2644 | dce_v10_0_crtc_load_lut(crtc); | 2648 | dce_v10_0_crtc_load_lut(crtc); |
2645 | break; | 2649 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index 7f7abb0e0be5..dcb402ee048a 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | |||
@@ -2631,6 +2631,7 @@ static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
2631 | struct drm_device *dev = crtc->dev; | 2631 | struct drm_device *dev = crtc->dev; |
2632 | struct amdgpu_device *adev = dev->dev_private; | 2632 | struct amdgpu_device *adev = dev->dev_private; |
2633 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | 2633 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
2634 | unsigned type; | ||
2634 | 2635 | ||
2635 | switch (mode) { | 2636 | switch (mode) { |
2636 | case DRM_MODE_DPMS_ON: | 2637 | case DRM_MODE_DPMS_ON: |
@@ -2639,6 +2640,9 @@ static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
2639 | dce_v11_0_vga_enable(crtc, true); | 2640 | dce_v11_0_vga_enable(crtc, true); |
2640 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); | 2641 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
2641 | dce_v11_0_vga_enable(crtc, false); | 2642 | dce_v11_0_vga_enable(crtc, false); |
2643 | /* Make sure VBLANK interrupt is still enabled */ | ||
2644 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); | ||
2645 | amdgpu_irq_update(adev, &adev->crtc_irq, type); | ||
2642 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); | 2646 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
2643 | dce_v11_0_crtc_load_lut(crtc); | 2647 | dce_v11_0_crtc_load_lut(crtc); |
2644 | break; | 2648 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 2c188fb9fd22..0d8bf2cb1956 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -2561,7 +2561,7 @@ static bool gfx_v7_0_ring_emit_semaphore(struct amdgpu_ring *ring, | |||
2561 | * sheduling on the ring. This function schedules the IB | 2561 | * sheduling on the ring. This function schedules the IB |
2562 | * on the gfx ring for execution by the GPU. | 2562 | * on the gfx ring for execution by the GPU. |
2563 | */ | 2563 | */ |
2564 | static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | 2564 | static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
2565 | struct amdgpu_ib *ib) | 2565 | struct amdgpu_ib *ib) |
2566 | { | 2566 | { |
2567 | bool need_ctx_switch = ring->current_ctx != ib->ctx; | 2567 | bool need_ctx_switch = ring->current_ctx != ib->ctx; |
@@ -2569,15 +2569,10 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2569 | u32 next_rptr = ring->wptr + 5; | 2569 | u32 next_rptr = ring->wptr + 5; |
2570 | 2570 | ||
2571 | /* drop the CE preamble IB for the same context */ | 2571 | /* drop the CE preamble IB for the same context */ |
2572 | if ((ring->type == AMDGPU_RING_TYPE_GFX) && | 2572 | if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch) |
2573 | (ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && | ||
2574 | !need_ctx_switch) | ||
2575 | return; | 2573 | return; |
2576 | 2574 | ||
2577 | if (ring->type == AMDGPU_RING_TYPE_COMPUTE) | 2575 | if (need_ctx_switch) |
2578 | control |= INDIRECT_BUFFER_VALID; | ||
2579 | |||
2580 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) | ||
2581 | next_rptr += 2; | 2576 | next_rptr += 2; |
2582 | 2577 | ||
2583 | next_rptr += 4; | 2578 | next_rptr += 4; |
@@ -2588,7 +2583,7 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2588 | amdgpu_ring_write(ring, next_rptr); | 2583 | amdgpu_ring_write(ring, next_rptr); |
2589 | 2584 | ||
2590 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ | 2585 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
2591 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) { | 2586 | if (need_ctx_switch) { |
2592 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | 2587 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
2593 | amdgpu_ring_write(ring, 0); | 2588 | amdgpu_ring_write(ring, 0); |
2594 | } | 2589 | } |
@@ -2611,6 +2606,35 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2611 | amdgpu_ring_write(ring, control); | 2606 | amdgpu_ring_write(ring, control); |
2612 | } | 2607 | } |
2613 | 2608 | ||
2609 | static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | ||
2610 | struct amdgpu_ib *ib) | ||
2611 | { | ||
2612 | u32 header, control = 0; | ||
2613 | u32 next_rptr = ring->wptr + 5; | ||
2614 | |||
2615 | control |= INDIRECT_BUFFER_VALID; | ||
2616 | next_rptr += 4; | ||
2617 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
2618 | amdgpu_ring_write(ring, WRITE_DATA_DST_SEL(5) | WR_CONFIRM); | ||
2619 | amdgpu_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); | ||
2620 | amdgpu_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); | ||
2621 | amdgpu_ring_write(ring, next_rptr); | ||
2622 | |||
2623 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | ||
2624 | |||
2625 | control |= ib->length_dw | | ||
2626 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
2627 | |||
2628 | amdgpu_ring_write(ring, header); | ||
2629 | amdgpu_ring_write(ring, | ||
2630 | #ifdef __BIG_ENDIAN | ||
2631 | (2 << 0) | | ||
2632 | #endif | ||
2633 | (ib->gpu_addr & 0xFFFFFFFC)); | ||
2634 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); | ||
2635 | amdgpu_ring_write(ring, control); | ||
2636 | } | ||
2637 | |||
2614 | /** | 2638 | /** |
2615 | * gfx_v7_0_ring_test_ib - basic ring IB test | 2639 | * gfx_v7_0_ring_test_ib - basic ring IB test |
2616 | * | 2640 | * |
@@ -3056,6 +3080,8 @@ static int gfx_v7_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
3056 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | 3080 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
3057 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); | 3081 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); |
3058 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); | 3082 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); |
3083 | adev->gfx.mec_feature_version = le32_to_cpu( | ||
3084 | mec_hdr->ucode_feature_version); | ||
3059 | 3085 | ||
3060 | gfx_v7_0_cp_compute_enable(adev, false); | 3086 | gfx_v7_0_cp_compute_enable(adev, false); |
3061 | 3087 | ||
@@ -3078,6 +3104,8 @@ static int gfx_v7_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
3078 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; | 3104 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
3079 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); | 3105 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); |
3080 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); | 3106 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); |
3107 | adev->gfx.mec2_feature_version = le32_to_cpu( | ||
3108 | mec2_hdr->ucode_feature_version); | ||
3081 | 3109 | ||
3082 | /* MEC2 */ | 3110 | /* MEC2 */ |
3083 | fw_data = (const __le32 *) | 3111 | fw_data = (const __le32 *) |
@@ -4042,6 +4070,8 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev) | |||
4042 | hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; | 4070 | hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; |
4043 | amdgpu_ucode_print_rlc_hdr(&hdr->header); | 4071 | amdgpu_ucode_print_rlc_hdr(&hdr->header); |
4044 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); | 4072 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); |
4073 | adev->gfx.rlc_feature_version = le32_to_cpu( | ||
4074 | hdr->ucode_feature_version); | ||
4045 | 4075 | ||
4046 | gfx_v7_0_rlc_stop(adev); | 4076 | gfx_v7_0_rlc_stop(adev); |
4047 | 4077 | ||
@@ -5098,7 +5128,7 @@ static void gfx_v7_0_print_status(void *handle) | |||
5098 | dev_info(adev->dev, " CP_HPD_EOP_CONTROL=0x%08X\n", | 5128 | dev_info(adev->dev, " CP_HPD_EOP_CONTROL=0x%08X\n", |
5099 | RREG32(mmCP_HPD_EOP_CONTROL)); | 5129 | RREG32(mmCP_HPD_EOP_CONTROL)); |
5100 | 5130 | ||
5101 | for (queue = 0; queue < 8; i++) { | 5131 | for (queue = 0; queue < 8; queue++) { |
5102 | cik_srbm_select(adev, me, pipe, queue, 0); | 5132 | cik_srbm_select(adev, me, pipe, queue, 0); |
5103 | dev_info(adev->dev, " queue: %d\n", queue); | 5133 | dev_info(adev->dev, " queue: %d\n", queue); |
5104 | dev_info(adev->dev, " CP_PQ_WPTR_POLL_CNTL=0x%08X\n", | 5134 | dev_info(adev->dev, " CP_PQ_WPTR_POLL_CNTL=0x%08X\n", |
@@ -5555,7 +5585,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = { | |||
5555 | .get_wptr = gfx_v7_0_ring_get_wptr_gfx, | 5585 | .get_wptr = gfx_v7_0_ring_get_wptr_gfx, |
5556 | .set_wptr = gfx_v7_0_ring_set_wptr_gfx, | 5586 | .set_wptr = gfx_v7_0_ring_set_wptr_gfx, |
5557 | .parse_cs = NULL, | 5587 | .parse_cs = NULL, |
5558 | .emit_ib = gfx_v7_0_ring_emit_ib, | 5588 | .emit_ib = gfx_v7_0_ring_emit_ib_gfx, |
5559 | .emit_fence = gfx_v7_0_ring_emit_fence_gfx, | 5589 | .emit_fence = gfx_v7_0_ring_emit_fence_gfx, |
5560 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, | 5590 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, |
5561 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, | 5591 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, |
@@ -5571,7 +5601,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = { | |||
5571 | .get_wptr = gfx_v7_0_ring_get_wptr_compute, | 5601 | .get_wptr = gfx_v7_0_ring_get_wptr_compute, |
5572 | .set_wptr = gfx_v7_0_ring_set_wptr_compute, | 5602 | .set_wptr = gfx_v7_0_ring_set_wptr_compute, |
5573 | .parse_cs = NULL, | 5603 | .parse_cs = NULL, |
5574 | .emit_ib = gfx_v7_0_ring_emit_ib, | 5604 | .emit_ib = gfx_v7_0_ring_emit_ib_compute, |
5575 | .emit_fence = gfx_v7_0_ring_emit_fence_compute, | 5605 | .emit_fence = gfx_v7_0_ring_emit_fence_compute, |
5576 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, | 5606 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, |
5577 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, | 5607 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 1c7c992dea37..20e2cfd521d5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -587,6 +587,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
587 | int err; | 587 | int err; |
588 | struct amdgpu_firmware_info *info = NULL; | 588 | struct amdgpu_firmware_info *info = NULL; |
589 | const struct common_firmware_header *header = NULL; | 589 | const struct common_firmware_header *header = NULL; |
590 | const struct gfx_firmware_header_v1_0 *cp_hdr; | ||
590 | 591 | ||
591 | DRM_DEBUG("\n"); | 592 | DRM_DEBUG("\n"); |
592 | 593 | ||
@@ -611,6 +612,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
611 | err = amdgpu_ucode_validate(adev->gfx.pfp_fw); | 612 | err = amdgpu_ucode_validate(adev->gfx.pfp_fw); |
612 | if (err) | 613 | if (err) |
613 | goto out; | 614 | goto out; |
615 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; | ||
616 | adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
617 | adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
614 | 618 | ||
615 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); | 619 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); |
616 | err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); | 620 | err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); |
@@ -619,6 +623,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
619 | err = amdgpu_ucode_validate(adev->gfx.me_fw); | 623 | err = amdgpu_ucode_validate(adev->gfx.me_fw); |
620 | if (err) | 624 | if (err) |
621 | goto out; | 625 | goto out; |
626 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; | ||
627 | adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
628 | adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
622 | 629 | ||
623 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); | 630 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); |
624 | err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); | 631 | err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); |
@@ -627,12 +634,18 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
627 | err = amdgpu_ucode_validate(adev->gfx.ce_fw); | 634 | err = amdgpu_ucode_validate(adev->gfx.ce_fw); |
628 | if (err) | 635 | if (err) |
629 | goto out; | 636 | goto out; |
637 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; | ||
638 | adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
639 | adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
630 | 640 | ||
631 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); | 641 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
632 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); | 642 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
633 | if (err) | 643 | if (err) |
634 | goto out; | 644 | goto out; |
635 | err = amdgpu_ucode_validate(adev->gfx.rlc_fw); | 645 | err = amdgpu_ucode_validate(adev->gfx.rlc_fw); |
646 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; | ||
647 | adev->gfx.rlc_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
648 | adev->gfx.rlc_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
636 | 649 | ||
637 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); | 650 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); |
638 | err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); | 651 | err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); |
@@ -641,6 +654,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
641 | err = amdgpu_ucode_validate(adev->gfx.mec_fw); | 654 | err = amdgpu_ucode_validate(adev->gfx.mec_fw); |
642 | if (err) | 655 | if (err) |
643 | goto out; | 656 | goto out; |
657 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | ||
658 | adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
659 | adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
644 | 660 | ||
645 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); | 661 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); |
646 | err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); | 662 | err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); |
@@ -648,6 +664,12 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
648 | err = amdgpu_ucode_validate(adev->gfx.mec2_fw); | 664 | err = amdgpu_ucode_validate(adev->gfx.mec2_fw); |
649 | if (err) | 665 | if (err) |
650 | goto out; | 666 | goto out; |
667 | cp_hdr = (const struct gfx_firmware_header_v1_0 *) | ||
668 | adev->gfx.mec2_fw->data; | ||
669 | adev->gfx.mec2_fw_version = le32_to_cpu( | ||
670 | cp_hdr->header.ucode_version); | ||
671 | adev->gfx.mec2_feature_version = le32_to_cpu( | ||
672 | cp_hdr->ucode_feature_version); | ||
651 | } else { | 673 | } else { |
652 | err = 0; | 674 | err = 0; |
653 | adev->gfx.mec2_fw = NULL; | 675 | adev->gfx.mec2_fw = NULL; |
@@ -1983,6 +2005,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
1983 | adev->gfx.config.max_shader_engines = 1; | 2005 | adev->gfx.config.max_shader_engines = 1; |
1984 | adev->gfx.config.max_tile_pipes = 2; | 2006 | adev->gfx.config.max_tile_pipes = 2; |
1985 | adev->gfx.config.max_sh_per_se = 1; | 2007 | adev->gfx.config.max_sh_per_se = 1; |
2008 | adev->gfx.config.max_backends_per_se = 2; | ||
1986 | 2009 | ||
1987 | switch (adev->pdev->revision) { | 2010 | switch (adev->pdev->revision) { |
1988 | case 0xc4: | 2011 | case 0xc4: |
@@ -1991,7 +2014,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
1991 | case 0xcc: | 2014 | case 0xcc: |
1992 | /* B10 */ | 2015 | /* B10 */ |
1993 | adev->gfx.config.max_cu_per_sh = 8; | 2016 | adev->gfx.config.max_cu_per_sh = 8; |
1994 | adev->gfx.config.max_backends_per_se = 2; | ||
1995 | break; | 2017 | break; |
1996 | case 0xc5: | 2018 | case 0xc5: |
1997 | case 0x81: | 2019 | case 0x81: |
@@ -2000,14 +2022,12 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2000 | case 0xcd: | 2022 | case 0xcd: |
2001 | /* B8 */ | 2023 | /* B8 */ |
2002 | adev->gfx.config.max_cu_per_sh = 6; | 2024 | adev->gfx.config.max_cu_per_sh = 6; |
2003 | adev->gfx.config.max_backends_per_se = 2; | ||
2004 | break; | 2025 | break; |
2005 | case 0xc6: | 2026 | case 0xc6: |
2006 | case 0xca: | 2027 | case 0xca: |
2007 | case 0xce: | 2028 | case 0xce: |
2008 | /* B6 */ | 2029 | /* B6 */ |
2009 | adev->gfx.config.max_cu_per_sh = 6; | 2030 | adev->gfx.config.max_cu_per_sh = 6; |
2010 | adev->gfx.config.max_backends_per_se = 2; | ||
2011 | break; | 2031 | break; |
2012 | case 0xc7: | 2032 | case 0xc7: |
2013 | case 0x87: | 2033 | case 0x87: |
@@ -2015,7 +2035,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2015 | default: | 2035 | default: |
2016 | /* B4 */ | 2036 | /* B4 */ |
2017 | adev->gfx.config.max_cu_per_sh = 4; | 2037 | adev->gfx.config.max_cu_per_sh = 4; |
2018 | adev->gfx.config.max_backends_per_se = 1; | ||
2019 | break; | 2038 | break; |
2020 | } | 2039 | } |
2021 | 2040 | ||
@@ -2275,7 +2294,6 @@ static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev) | |||
2275 | 2294 | ||
2276 | hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; | 2295 | hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; |
2277 | amdgpu_ucode_print_rlc_hdr(&hdr->header); | 2296 | amdgpu_ucode_print_rlc_hdr(&hdr->header); |
2278 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
2279 | 2297 | ||
2280 | fw_data = (const __le32 *)(adev->gfx.rlc_fw->data + | 2298 | fw_data = (const __le32 *)(adev->gfx.rlc_fw->data + |
2281 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); | 2299 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
@@ -2361,12 +2379,6 @@ static int gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device *adev) | |||
2361 | amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header); | 2379 | amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header); |
2362 | amdgpu_ucode_print_gfx_hdr(&ce_hdr->header); | 2380 | amdgpu_ucode_print_gfx_hdr(&ce_hdr->header); |
2363 | amdgpu_ucode_print_gfx_hdr(&me_hdr->header); | 2381 | amdgpu_ucode_print_gfx_hdr(&me_hdr->header); |
2364 | adev->gfx.pfp_fw_version = le32_to_cpu(pfp_hdr->header.ucode_version); | ||
2365 | adev->gfx.ce_fw_version = le32_to_cpu(ce_hdr->header.ucode_version); | ||
2366 | adev->gfx.me_fw_version = le32_to_cpu(me_hdr->header.ucode_version); | ||
2367 | adev->gfx.me_feature_version = le32_to_cpu(me_hdr->ucode_feature_version); | ||
2368 | adev->gfx.ce_feature_version = le32_to_cpu(ce_hdr->ucode_feature_version); | ||
2369 | adev->gfx.pfp_feature_version = le32_to_cpu(pfp_hdr->ucode_feature_version); | ||
2370 | 2382 | ||
2371 | gfx_v8_0_cp_gfx_enable(adev, false); | 2383 | gfx_v8_0_cp_gfx_enable(adev, false); |
2372 | 2384 | ||
@@ -2622,7 +2634,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
2622 | 2634 | ||
2623 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | 2635 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
2624 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); | 2636 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); |
2625 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); | ||
2626 | 2637 | ||
2627 | fw_data = (const __le32 *) | 2638 | fw_data = (const __le32 *) |
2628 | (adev->gfx.mec_fw->data + | 2639 | (adev->gfx.mec_fw->data + |
@@ -2641,7 +2652,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
2641 | 2652 | ||
2642 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; | 2653 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
2643 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); | 2654 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); |
2644 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); | ||
2645 | 2655 | ||
2646 | fw_data = (const __le32 *) | 2656 | fw_data = (const __le32 *) |
2647 | (adev->gfx.mec2_fw->data + | 2657 | (adev->gfx.mec2_fw->data + |
@@ -3125,7 +3135,7 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3125 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, | 3135 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, |
3126 | AMDGPU_DOORBELL_KIQ << 2); | 3136 | AMDGPU_DOORBELL_KIQ << 2); |
3127 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, | 3137 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, |
3128 | 0x7FFFF << 2); | 3138 | AMDGPU_DOORBELL_MEC_RING7 << 2); |
3129 | } | 3139 | } |
3130 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); | 3140 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); |
3131 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, | 3141 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, |
@@ -3753,7 +3763,7 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
3753 | amdgpu_ring_write(ring, 0x20); /* poll interval */ | 3763 | amdgpu_ring_write(ring, 0x20); /* poll interval */ |
3754 | } | 3764 | } |
3755 | 3765 | ||
3756 | static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | 3766 | static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
3757 | struct amdgpu_ib *ib) | 3767 | struct amdgpu_ib *ib) |
3758 | { | 3768 | { |
3759 | bool need_ctx_switch = ring->current_ctx != ib->ctx; | 3769 | bool need_ctx_switch = ring->current_ctx != ib->ctx; |
@@ -3761,15 +3771,10 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3761 | u32 next_rptr = ring->wptr + 5; | 3771 | u32 next_rptr = ring->wptr + 5; |
3762 | 3772 | ||
3763 | /* drop the CE preamble IB for the same context */ | 3773 | /* drop the CE preamble IB for the same context */ |
3764 | if ((ring->type == AMDGPU_RING_TYPE_GFX) && | 3774 | if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch) |
3765 | (ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && | ||
3766 | !need_ctx_switch) | ||
3767 | return; | 3775 | return; |
3768 | 3776 | ||
3769 | if (ring->type == AMDGPU_RING_TYPE_COMPUTE) | 3777 | if (need_ctx_switch) |
3770 | control |= INDIRECT_BUFFER_VALID; | ||
3771 | |||
3772 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) | ||
3773 | next_rptr += 2; | 3778 | next_rptr += 2; |
3774 | 3779 | ||
3775 | next_rptr += 4; | 3780 | next_rptr += 4; |
@@ -3780,7 +3785,7 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3780 | amdgpu_ring_write(ring, next_rptr); | 3785 | amdgpu_ring_write(ring, next_rptr); |
3781 | 3786 | ||
3782 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ | 3787 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
3783 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) { | 3788 | if (need_ctx_switch) { |
3784 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | 3789 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
3785 | amdgpu_ring_write(ring, 0); | 3790 | amdgpu_ring_write(ring, 0); |
3786 | } | 3791 | } |
@@ -3803,6 +3808,36 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3803 | amdgpu_ring_write(ring, control); | 3808 | amdgpu_ring_write(ring, control); |
3804 | } | 3809 | } |
3805 | 3810 | ||
3811 | static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | ||
3812 | struct amdgpu_ib *ib) | ||
3813 | { | ||
3814 | u32 header, control = 0; | ||
3815 | u32 next_rptr = ring->wptr + 5; | ||
3816 | |||
3817 | control |= INDIRECT_BUFFER_VALID; | ||
3818 | |||
3819 | next_rptr += 4; | ||
3820 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3821 | amdgpu_ring_write(ring, WRITE_DATA_DST_SEL(5) | WR_CONFIRM); | ||
3822 | amdgpu_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); | ||
3823 | amdgpu_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); | ||
3824 | amdgpu_ring_write(ring, next_rptr); | ||
3825 | |||
3826 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | ||
3827 | |||
3828 | control |= ib->length_dw | | ||
3829 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
3830 | |||
3831 | amdgpu_ring_write(ring, header); | ||
3832 | amdgpu_ring_write(ring, | ||
3833 | #ifdef __BIG_ENDIAN | ||
3834 | (2 << 0) | | ||
3835 | #endif | ||
3836 | (ib->gpu_addr & 0xFFFFFFFC)); | ||
3837 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); | ||
3838 | amdgpu_ring_write(ring, control); | ||
3839 | } | ||
3840 | |||
3806 | static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, | 3841 | static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, |
3807 | u64 seq, unsigned flags) | 3842 | u64 seq, unsigned flags) |
3808 | { | 3843 | { |
@@ -4224,7 +4259,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { | |||
4224 | .get_wptr = gfx_v8_0_ring_get_wptr_gfx, | 4259 | .get_wptr = gfx_v8_0_ring_get_wptr_gfx, |
4225 | .set_wptr = gfx_v8_0_ring_set_wptr_gfx, | 4260 | .set_wptr = gfx_v8_0_ring_set_wptr_gfx, |
4226 | .parse_cs = NULL, | 4261 | .parse_cs = NULL, |
4227 | .emit_ib = gfx_v8_0_ring_emit_ib, | 4262 | .emit_ib = gfx_v8_0_ring_emit_ib_gfx, |
4228 | .emit_fence = gfx_v8_0_ring_emit_fence_gfx, | 4263 | .emit_fence = gfx_v8_0_ring_emit_fence_gfx, |
4229 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, | 4264 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, |
4230 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, | 4265 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, |
@@ -4240,7 +4275,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { | |||
4240 | .get_wptr = gfx_v8_0_ring_get_wptr_compute, | 4275 | .get_wptr = gfx_v8_0_ring_get_wptr_compute, |
4241 | .set_wptr = gfx_v8_0_ring_set_wptr_compute, | 4276 | .set_wptr = gfx_v8_0_ring_set_wptr_compute, |
4242 | .parse_cs = NULL, | 4277 | .parse_cs = NULL, |
4243 | .emit_ib = gfx_v8_0_ring_emit_ib, | 4278 | .emit_ib = gfx_v8_0_ring_emit_ib_compute, |
4244 | .emit_fence = gfx_v8_0_ring_emit_fence_compute, | 4279 | .emit_fence = gfx_v8_0_ring_emit_fence_compute, |
4245 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, | 4280 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, |
4246 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, | 4281 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index d7895885fe0c..a988dfb1d394 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | |||
@@ -121,6 +121,7 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev) | |||
121 | int err, i; | 121 | int err, i; |
122 | struct amdgpu_firmware_info *info = NULL; | 122 | struct amdgpu_firmware_info *info = NULL; |
123 | const struct common_firmware_header *header = NULL; | 123 | const struct common_firmware_header *header = NULL; |
124 | const struct sdma_firmware_header_v1_0 *hdr; | ||
124 | 125 | ||
125 | DRM_DEBUG("\n"); | 126 | DRM_DEBUG("\n"); |
126 | 127 | ||
@@ -142,6 +143,9 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev) | |||
142 | err = amdgpu_ucode_validate(adev->sdma[i].fw); | 143 | err = amdgpu_ucode_validate(adev->sdma[i].fw); |
143 | if (err) | 144 | if (err) |
144 | goto out; | 145 | goto out; |
146 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; | ||
147 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
148 | adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); | ||
145 | 149 | ||
146 | if (adev->firmware.smu_load) { | 150 | if (adev->firmware.smu_load) { |
147 | info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; | 151 | info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; |
@@ -541,8 +545,6 @@ static int sdma_v2_4_load_microcode(struct amdgpu_device *adev) | |||
541 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; | 545 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; |
542 | amdgpu_ucode_print_sdma_hdr(&hdr->header); | 546 | amdgpu_ucode_print_sdma_hdr(&hdr->header); |
543 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; | 547 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
544 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
545 | |||
546 | fw_data = (const __le32 *) | 548 | fw_data = (const __le32 *) |
547 | (adev->sdma[i].fw->data + | 549 | (adev->sdma[i].fw->data + |
548 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); | 550 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 7bb37b93993f..2b86569b18d3 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | |||
@@ -159,6 +159,7 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev) | |||
159 | int err, i; | 159 | int err, i; |
160 | struct amdgpu_firmware_info *info = NULL; | 160 | struct amdgpu_firmware_info *info = NULL; |
161 | const struct common_firmware_header *header = NULL; | 161 | const struct common_firmware_header *header = NULL; |
162 | const struct sdma_firmware_header_v1_0 *hdr; | ||
162 | 163 | ||
163 | DRM_DEBUG("\n"); | 164 | DRM_DEBUG("\n"); |
164 | 165 | ||
@@ -183,6 +184,9 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev) | |||
183 | err = amdgpu_ucode_validate(adev->sdma[i].fw); | 184 | err = amdgpu_ucode_validate(adev->sdma[i].fw); |
184 | if (err) | 185 | if (err) |
185 | goto out; | 186 | goto out; |
187 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; | ||
188 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
189 | adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); | ||
186 | 190 | ||
187 | if (adev->firmware.smu_load) { | 191 | if (adev->firmware.smu_load) { |
188 | info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; | 192 | info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; |
@@ -630,8 +634,6 @@ static int sdma_v3_0_load_microcode(struct amdgpu_device *adev) | |||
630 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; | 634 | hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; |
631 | amdgpu_ucode_print_sdma_hdr(&hdr->header); | 635 | amdgpu_ucode_print_sdma_hdr(&hdr->header); |
632 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; | 636 | fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
633 | adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
634 | |||
635 | fw_data = (const __le32 *) | 637 | fw_data = (const __le32 *) |
636 | (adev->sdma[i].fw->data + | 638 | (adev->sdma[i].fw->data + |
637 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); | 639 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index d62c4002e39c..d1064ca3670e 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include "oss/oss_2_0_d.h" | 35 | #include "oss/oss_2_0_d.h" |
36 | #include "oss/oss_2_0_sh_mask.h" | 36 | #include "oss/oss_2_0_sh_mask.h" |
37 | #include "gca/gfx_8_0_d.h" | 37 | #include "gca/gfx_8_0_d.h" |
38 | #include "smu/smu_7_1_2_d.h" | ||
39 | #include "smu/smu_7_1_2_sh_mask.h" | ||
38 | 40 | ||
39 | #define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04 | 41 | #define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04 |
40 | #define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10 | 42 | #define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10 |
@@ -112,6 +114,10 @@ static int vce_v3_0_start(struct amdgpu_device *adev) | |||
112 | 114 | ||
113 | mutex_lock(&adev->grbm_idx_mutex); | 115 | mutex_lock(&adev->grbm_idx_mutex); |
114 | for (idx = 0; idx < 2; ++idx) { | 116 | for (idx = 0; idx < 2; ++idx) { |
117 | |||
118 | if (adev->vce.harvest_config & (1 << idx)) | ||
119 | continue; | ||
120 | |||
115 | if(idx == 0) | 121 | if(idx == 0) |
116 | WREG32_P(mmGRBM_GFX_INDEX, 0, | 122 | WREG32_P(mmGRBM_GFX_INDEX, 0, |
117 | ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); | 123 | ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); |
@@ -190,10 +196,52 @@ static int vce_v3_0_start(struct amdgpu_device *adev) | |||
190 | return 0; | 196 | return 0; |
191 | } | 197 | } |
192 | 198 | ||
199 | #define ixVCE_HARVEST_FUSE_MACRO__ADDRESS 0xC0014074 | ||
200 | #define VCE_HARVEST_FUSE_MACRO__SHIFT 27 | ||
201 | #define VCE_HARVEST_FUSE_MACRO__MASK 0x18000000 | ||
202 | |||
203 | static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev) | ||
204 | { | ||
205 | u32 tmp; | ||
206 | unsigned ret; | ||
207 | |||
208 | if (adev->flags & AMDGPU_IS_APU) | ||
209 | tmp = (RREG32_SMC(ixVCE_HARVEST_FUSE_MACRO__ADDRESS) & | ||
210 | VCE_HARVEST_FUSE_MACRO__MASK) >> | ||
211 | VCE_HARVEST_FUSE_MACRO__SHIFT; | ||
212 | else | ||
213 | tmp = (RREG32_SMC(ixCC_HARVEST_FUSES) & | ||
214 | CC_HARVEST_FUSES__VCE_DISABLE_MASK) >> | ||
215 | CC_HARVEST_FUSES__VCE_DISABLE__SHIFT; | ||
216 | |||
217 | switch (tmp) { | ||
218 | case 1: | ||
219 | ret = AMDGPU_VCE_HARVEST_VCE0; | ||
220 | break; | ||
221 | case 2: | ||
222 | ret = AMDGPU_VCE_HARVEST_VCE1; | ||
223 | break; | ||
224 | case 3: | ||
225 | ret = AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1; | ||
226 | break; | ||
227 | default: | ||
228 | ret = 0; | ||
229 | } | ||
230 | |||
231 | return ret; | ||
232 | } | ||
233 | |||
193 | static int vce_v3_0_early_init(void *handle) | 234 | static int vce_v3_0_early_init(void *handle) |
194 | { | 235 | { |
195 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 236 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
196 | 237 | ||
238 | adev->vce.harvest_config = vce_v3_0_get_harvest_config(adev); | ||
239 | |||
240 | if ((adev->vce.harvest_config & | ||
241 | (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1)) == | ||
242 | (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1)) | ||
243 | return -ENOENT; | ||
244 | |||
197 | vce_v3_0_set_ring_funcs(adev); | 245 | vce_v3_0_set_ring_funcs(adev); |
198 | vce_v3_0_set_irq_funcs(adev); | 246 | vce_v3_0_set_irq_funcs(adev); |
199 | 247 | ||