.. | .. |
---|
20 | 20 | * OTHER DEALINGS IN THE SOFTWARE. |
---|
21 | 21 | * |
---|
22 | 22 | */ |
---|
| 23 | + |
---|
| 24 | +#include <linux/delay.h> |
---|
23 | 25 | #include <linux/kernel.h> |
---|
24 | 26 | #include <linux/firmware.h> |
---|
25 | | -#include <drm/drmP.h> |
---|
| 27 | +#include <linux/module.h> |
---|
| 28 | +#include <linux/pci.h> |
---|
| 29 | + |
---|
26 | 30 | #include "amdgpu.h" |
---|
27 | 31 | #include "amdgpu_gfx.h" |
---|
28 | 32 | #include "vi.h" |
---|
.. | .. |
---|
44 | 48 | #include "gca/gfx_8_0_d.h" |
---|
45 | 49 | #include "gca/gfx_8_0_enum.h" |
---|
46 | 50 | #include "gca/gfx_8_0_sh_mask.h" |
---|
47 | | -#include "gca/gfx_8_0_enum.h" |
---|
48 | 51 | |
---|
49 | 52 | #include "dce/dce_10_0_d.h" |
---|
50 | 53 | #include "dce/dce_10_0_sh_mask.h" |
---|
.. | .. |
---|
54 | 57 | #include "ivsrcid/ivsrcid_vislands30.h" |
---|
55 | 58 | |
---|
56 | 59 | #define GFX8_NUM_GFX_RINGS 1 |
---|
57 | | -#define GFX8_MEC_HPD_SIZE 2048 |
---|
| 60 | +#define GFX8_MEC_HPD_SIZE 4096 |
---|
58 | 61 | |
---|
59 | 62 | #define TOPAZ_GB_ADDR_CONFIG_GOLDEN 0x22010001 |
---|
60 | 63 | #define CARRIZO_GB_ADDR_CONFIG_GOLDEN 0x22010001 |
---|
.. | .. |
---|
839 | 842 | int r; |
---|
840 | 843 | |
---|
841 | 844 | r = amdgpu_gfx_scratch_get(adev, &scratch); |
---|
842 | | - if (r) { |
---|
843 | | - DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r); |
---|
| 845 | + if (r) |
---|
844 | 846 | return r; |
---|
845 | | - } |
---|
| 847 | + |
---|
846 | 848 | WREG32(scratch, 0xCAFEDEAD); |
---|
847 | 849 | r = amdgpu_ring_alloc(ring, 3); |
---|
848 | | - if (r) { |
---|
849 | | - DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", |
---|
850 | | - ring->idx, r); |
---|
851 | | - amdgpu_gfx_scratch_free(adev, scratch); |
---|
852 | | - return r; |
---|
853 | | - } |
---|
| 850 | + if (r) |
---|
| 851 | + goto error_free_scratch; |
---|
| 852 | + |
---|
854 | 853 | amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); |
---|
855 | 854 | amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); |
---|
856 | 855 | amdgpu_ring_write(ring, 0xDEADBEEF); |
---|
.. | .. |
---|
860 | 859 | tmp = RREG32(scratch); |
---|
861 | 860 | if (tmp == 0xDEADBEEF) |
---|
862 | 861 | break; |
---|
863 | | - DRM_UDELAY(1); |
---|
| 862 | + udelay(1); |
---|
864 | 863 | } |
---|
865 | | - if (i < adev->usec_timeout) { |
---|
866 | | - DRM_DEBUG("ring test on %d succeeded in %d usecs\n", |
---|
867 | | - ring->idx, i); |
---|
868 | | - } else { |
---|
869 | | - DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", |
---|
870 | | - ring->idx, scratch, tmp); |
---|
871 | | - r = -EINVAL; |
---|
872 | | - } |
---|
| 864 | + |
---|
| 865 | + if (i >= adev->usec_timeout) |
---|
| 866 | + r = -ETIMEDOUT; |
---|
| 867 | + |
---|
| 868 | +error_free_scratch: |
---|
873 | 869 | amdgpu_gfx_scratch_free(adev, scratch); |
---|
874 | 870 | return r; |
---|
875 | 871 | } |
---|
.. | .. |
---|
886 | 882 | long r; |
---|
887 | 883 | |
---|
888 | 884 | r = amdgpu_device_wb_get(adev, &index); |
---|
889 | | - if (r) { |
---|
890 | | - dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r); |
---|
| 885 | + if (r) |
---|
891 | 886 | return r; |
---|
892 | | - } |
---|
893 | 887 | |
---|
894 | 888 | gpu_addr = adev->wb.gpu_addr + (index * 4); |
---|
895 | 889 | adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD); |
---|
896 | 890 | memset(&ib, 0, sizeof(ib)); |
---|
897 | | - r = amdgpu_ib_get(adev, NULL, 16, &ib); |
---|
898 | | - if (r) { |
---|
899 | | - DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r); |
---|
| 891 | + r = amdgpu_ib_get(adev, NULL, 16, |
---|
| 892 | + AMDGPU_IB_POOL_DIRECT, &ib); |
---|
| 893 | + if (r) |
---|
900 | 894 | goto err1; |
---|
901 | | - } |
---|
| 895 | + |
---|
902 | 896 | ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3); |
---|
903 | 897 | ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; |
---|
904 | 898 | ib.ptr[2] = lower_32_bits(gpu_addr); |
---|
.. | .. |
---|
912 | 906 | |
---|
913 | 907 | r = dma_fence_wait_timeout(f, false, timeout); |
---|
914 | 908 | if (r == 0) { |
---|
915 | | - DRM_ERROR("amdgpu: IB test timed out.\n"); |
---|
916 | 909 | r = -ETIMEDOUT; |
---|
917 | 910 | goto err2; |
---|
918 | 911 | } else if (r < 0) { |
---|
919 | | - DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); |
---|
920 | 912 | goto err2; |
---|
921 | 913 | } |
---|
922 | 914 | |
---|
923 | 915 | tmp = adev->wb.wb[index]; |
---|
924 | | - if (tmp == 0xDEADBEEF) { |
---|
925 | | - DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); |
---|
| 916 | + if (tmp == 0xDEADBEEF) |
---|
926 | 917 | r = 0; |
---|
927 | | - } else { |
---|
928 | | - DRM_ERROR("ib test on ring %d failed\n", ring->idx); |
---|
| 918 | + else |
---|
929 | 919 | r = -EINVAL; |
---|
930 | | - } |
---|
931 | 920 | |
---|
932 | 921 | err2: |
---|
933 | 922 | amdgpu_ib_free(adev, &ib, NULL); |
---|
.. | .. |
---|
1114 | 1103 | |
---|
1115 | 1104 | tmp = (unsigned int *)((uintptr_t)rlc_hdr + |
---|
1116 | 1105 | le32_to_cpu(rlc_hdr->reg_list_format_array_offset_bytes)); |
---|
1117 | | - for (i = 0 ; i < (rlc_hdr->reg_list_format_size_bytes >> 2); i++) |
---|
| 1106 | + for (i = 0 ; i < (adev->gfx.rlc.reg_list_format_size_bytes >> 2); i++) |
---|
1118 | 1107 | adev->gfx.rlc.register_list_format[i] = le32_to_cpu(tmp[i]); |
---|
1119 | 1108 | |
---|
1120 | 1109 | adev->gfx.rlc.register_restore = adev->gfx.rlc.register_list_format + i; |
---|
1121 | 1110 | |
---|
1122 | 1111 | tmp = (unsigned int *)((uintptr_t)rlc_hdr + |
---|
1123 | 1112 | le32_to_cpu(rlc_hdr->reg_list_array_offset_bytes)); |
---|
1124 | | - for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++) |
---|
| 1113 | + for (i = 0 ; i < (adev->gfx.rlc.reg_list_size_bytes >> 2); i++) |
---|
1125 | 1114 | adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]); |
---|
1126 | 1115 | |
---|
1127 | 1116 | if (adev->asic_type >= CHIP_POLARIS10 && adev->asic_type <= CHIP_POLARIS12) { |
---|
.. | .. |
---|
1173 | 1162 | } |
---|
1174 | 1163 | } |
---|
1175 | 1164 | |
---|
1176 | | - if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) { |
---|
1177 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP]; |
---|
1178 | | - info->ucode_id = AMDGPU_UCODE_ID_CP_PFP; |
---|
1179 | | - info->fw = adev->gfx.pfp_fw; |
---|
1180 | | - header = (const struct common_firmware_header *)info->fw->data; |
---|
1181 | | - adev->firmware.fw_size += |
---|
1182 | | - ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
| 1165 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP]; |
---|
| 1166 | + info->ucode_id = AMDGPU_UCODE_ID_CP_PFP; |
---|
| 1167 | + info->fw = adev->gfx.pfp_fw; |
---|
| 1168 | + header = (const struct common_firmware_header *)info->fw->data; |
---|
| 1169 | + adev->firmware.fw_size += |
---|
| 1170 | + ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1183 | 1171 | |
---|
1184 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_ME]; |
---|
1185 | | - info->ucode_id = AMDGPU_UCODE_ID_CP_ME; |
---|
1186 | | - info->fw = adev->gfx.me_fw; |
---|
1187 | | - header = (const struct common_firmware_header *)info->fw->data; |
---|
1188 | | - adev->firmware.fw_size += |
---|
1189 | | - ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
| 1172 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_ME]; |
---|
| 1173 | + info->ucode_id = AMDGPU_UCODE_ID_CP_ME; |
---|
| 1174 | + info->fw = adev->gfx.me_fw; |
---|
| 1175 | + header = (const struct common_firmware_header *)info->fw->data; |
---|
| 1176 | + adev->firmware.fw_size += |
---|
| 1177 | + ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1190 | 1178 | |
---|
1191 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_CE]; |
---|
1192 | | - info->ucode_id = AMDGPU_UCODE_ID_CP_CE; |
---|
1193 | | - info->fw = adev->gfx.ce_fw; |
---|
1194 | | - header = (const struct common_firmware_header *)info->fw->data; |
---|
1195 | | - adev->firmware.fw_size += |
---|
1196 | | - ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
| 1179 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_CE]; |
---|
| 1180 | + info->ucode_id = AMDGPU_UCODE_ID_CP_CE; |
---|
| 1181 | + info->fw = adev->gfx.ce_fw; |
---|
| 1182 | + header = (const struct common_firmware_header *)info->fw->data; |
---|
| 1183 | + adev->firmware.fw_size += |
---|
| 1184 | + ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1197 | 1185 | |
---|
1198 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_G]; |
---|
1199 | | - info->ucode_id = AMDGPU_UCODE_ID_RLC_G; |
---|
1200 | | - info->fw = adev->gfx.rlc_fw; |
---|
1201 | | - header = (const struct common_firmware_header *)info->fw->data; |
---|
1202 | | - adev->firmware.fw_size += |
---|
1203 | | - ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
| 1186 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_G]; |
---|
| 1187 | + info->ucode_id = AMDGPU_UCODE_ID_RLC_G; |
---|
| 1188 | + info->fw = adev->gfx.rlc_fw; |
---|
| 1189 | + header = (const struct common_firmware_header *)info->fw->data; |
---|
| 1190 | + adev->firmware.fw_size += |
---|
| 1191 | + ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1204 | 1192 | |
---|
1205 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1]; |
---|
1206 | | - info->ucode_id = AMDGPU_UCODE_ID_CP_MEC1; |
---|
| 1193 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1]; |
---|
| 1194 | + info->ucode_id = AMDGPU_UCODE_ID_CP_MEC1; |
---|
| 1195 | + info->fw = adev->gfx.mec_fw; |
---|
| 1196 | + header = (const struct common_firmware_header *)info->fw->data; |
---|
| 1197 | + adev->firmware.fw_size += |
---|
| 1198 | + ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
| 1199 | + |
---|
| 1200 | + /* we need account JT in */ |
---|
| 1201 | + cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
---|
| 1202 | + adev->firmware.fw_size += |
---|
| 1203 | + ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE); |
---|
| 1204 | + |
---|
| 1205 | + if (amdgpu_sriov_vf(adev)) { |
---|
| 1206 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_STORAGE]; |
---|
| 1207 | + info->ucode_id = AMDGPU_UCODE_ID_STORAGE; |
---|
1207 | 1208 | info->fw = adev->gfx.mec_fw; |
---|
| 1209 | + adev->firmware.fw_size += |
---|
| 1210 | + ALIGN(le32_to_cpu(64 * PAGE_SIZE), PAGE_SIZE); |
---|
| 1211 | + } |
---|
| 1212 | + |
---|
| 1213 | + if (adev->gfx.mec2_fw) { |
---|
| 1214 | + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2]; |
---|
| 1215 | + info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2; |
---|
| 1216 | + info->fw = adev->gfx.mec2_fw; |
---|
1208 | 1217 | header = (const struct common_firmware_header *)info->fw->data; |
---|
1209 | 1218 | adev->firmware.fw_size += |
---|
1210 | 1219 | ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1211 | | - |
---|
1212 | | - /* we need account JT in */ |
---|
1213 | | - cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
---|
1214 | | - adev->firmware.fw_size += |
---|
1215 | | - ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE); |
---|
1216 | | - |
---|
1217 | | - if (amdgpu_sriov_vf(adev)) { |
---|
1218 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_STORAGE]; |
---|
1219 | | - info->ucode_id = AMDGPU_UCODE_ID_STORAGE; |
---|
1220 | | - info->fw = adev->gfx.mec_fw; |
---|
1221 | | - adev->firmware.fw_size += |
---|
1222 | | - ALIGN(le32_to_cpu(64 * PAGE_SIZE), PAGE_SIZE); |
---|
1223 | | - } |
---|
1224 | | - |
---|
1225 | | - if (adev->gfx.mec2_fw) { |
---|
1226 | | - info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2]; |
---|
1227 | | - info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2; |
---|
1228 | | - info->fw = adev->gfx.mec2_fw; |
---|
1229 | | - header = (const struct common_firmware_header *)info->fw->data; |
---|
1230 | | - adev->firmware.fw_size += |
---|
1231 | | - ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
---|
1232 | | - } |
---|
1233 | | - |
---|
1234 | 1220 | } |
---|
1235 | 1221 | |
---|
1236 | 1222 | out: |
---|
.. | .. |
---|
1301 | 1287 | buffer[count++] = cpu_to_le32(0); |
---|
1302 | 1288 | } |
---|
1303 | 1289 | |
---|
1304 | | -static void cz_init_cp_jump_table(struct amdgpu_device *adev) |
---|
| 1290 | +static int gfx_v8_0_cp_jump_table_num(struct amdgpu_device *adev) |
---|
1305 | 1291 | { |
---|
1306 | | - const __le32 *fw_data; |
---|
1307 | | - volatile u32 *dst_ptr; |
---|
1308 | | - int me, i, max_me = 4; |
---|
1309 | | - u32 bo_offset = 0; |
---|
1310 | | - u32 table_offset, table_size; |
---|
1311 | | - |
---|
1312 | 1292 | if (adev->asic_type == CHIP_CARRIZO) |
---|
1313 | | - max_me = 5; |
---|
1314 | | - |
---|
1315 | | - /* write the cp table buffer */ |
---|
1316 | | - dst_ptr = adev->gfx.rlc.cp_table_ptr; |
---|
1317 | | - for (me = 0; me < max_me; me++) { |
---|
1318 | | - if (me == 0) { |
---|
1319 | | - const struct gfx_firmware_header_v1_0 *hdr = |
---|
1320 | | - (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; |
---|
1321 | | - fw_data = (const __le32 *) |
---|
1322 | | - (adev->gfx.ce_fw->data + |
---|
1323 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
1324 | | - table_offset = le32_to_cpu(hdr->jt_offset); |
---|
1325 | | - table_size = le32_to_cpu(hdr->jt_size); |
---|
1326 | | - } else if (me == 1) { |
---|
1327 | | - const struct gfx_firmware_header_v1_0 *hdr = |
---|
1328 | | - (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; |
---|
1329 | | - fw_data = (const __le32 *) |
---|
1330 | | - (adev->gfx.pfp_fw->data + |
---|
1331 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
1332 | | - table_offset = le32_to_cpu(hdr->jt_offset); |
---|
1333 | | - table_size = le32_to_cpu(hdr->jt_size); |
---|
1334 | | - } else if (me == 2) { |
---|
1335 | | - const struct gfx_firmware_header_v1_0 *hdr = |
---|
1336 | | - (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; |
---|
1337 | | - fw_data = (const __le32 *) |
---|
1338 | | - (adev->gfx.me_fw->data + |
---|
1339 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
1340 | | - table_offset = le32_to_cpu(hdr->jt_offset); |
---|
1341 | | - table_size = le32_to_cpu(hdr->jt_size); |
---|
1342 | | - } else if (me == 3) { |
---|
1343 | | - const struct gfx_firmware_header_v1_0 *hdr = |
---|
1344 | | - (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
---|
1345 | | - fw_data = (const __le32 *) |
---|
1346 | | - (adev->gfx.mec_fw->data + |
---|
1347 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
1348 | | - table_offset = le32_to_cpu(hdr->jt_offset); |
---|
1349 | | - table_size = le32_to_cpu(hdr->jt_size); |
---|
1350 | | - } else if (me == 4) { |
---|
1351 | | - const struct gfx_firmware_header_v1_0 *hdr = |
---|
1352 | | - (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
---|
1353 | | - fw_data = (const __le32 *) |
---|
1354 | | - (adev->gfx.mec2_fw->data + |
---|
1355 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
1356 | | - table_offset = le32_to_cpu(hdr->jt_offset); |
---|
1357 | | - table_size = le32_to_cpu(hdr->jt_size); |
---|
1358 | | - } |
---|
1359 | | - |
---|
1360 | | - for (i = 0; i < table_size; i ++) { |
---|
1361 | | - dst_ptr[bo_offset + i] = |
---|
1362 | | - cpu_to_le32(le32_to_cpu(fw_data[table_offset + i])); |
---|
1363 | | - } |
---|
1364 | | - |
---|
1365 | | - bo_offset += table_size; |
---|
1366 | | - } |
---|
1367 | | -} |
---|
1368 | | - |
---|
1369 | | -static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev) |
---|
1370 | | -{ |
---|
1371 | | - amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL); |
---|
1372 | | - amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL); |
---|
| 1293 | + return 5; |
---|
| 1294 | + else |
---|
| 1295 | + return 4; |
---|
1373 | 1296 | } |
---|
1374 | 1297 | |
---|
1375 | 1298 | static int gfx_v8_0_rlc_init(struct amdgpu_device *adev) |
---|
1376 | 1299 | { |
---|
1377 | | - volatile u32 *dst_ptr; |
---|
1378 | | - u32 dws; |
---|
1379 | 1300 | const struct cs_section_def *cs_data; |
---|
1380 | 1301 | int r; |
---|
1381 | 1302 | |
---|
.. | .. |
---|
1384 | 1305 | cs_data = adev->gfx.rlc.cs_data; |
---|
1385 | 1306 | |
---|
1386 | 1307 | if (cs_data) { |
---|
1387 | | - /* clear state block */ |
---|
1388 | | - adev->gfx.rlc.clear_state_size = dws = gfx_v8_0_get_csb_size(adev); |
---|
1389 | | - |
---|
1390 | | - r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, |
---|
1391 | | - AMDGPU_GEM_DOMAIN_VRAM, |
---|
1392 | | - &adev->gfx.rlc.clear_state_obj, |
---|
1393 | | - &adev->gfx.rlc.clear_state_gpu_addr, |
---|
1394 | | - (void **)&adev->gfx.rlc.cs_ptr); |
---|
1395 | | - if (r) { |
---|
1396 | | - dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); |
---|
1397 | | - gfx_v8_0_rlc_fini(adev); |
---|
| 1308 | + /* init clear state block */ |
---|
| 1309 | + r = amdgpu_gfx_rlc_init_csb(adev); |
---|
| 1310 | + if (r) |
---|
1398 | 1311 | return r; |
---|
1399 | | - } |
---|
1400 | | - |
---|
1401 | | - /* set up the cs buffer */ |
---|
1402 | | - dst_ptr = adev->gfx.rlc.cs_ptr; |
---|
1403 | | - gfx_v8_0_get_csb_buffer(adev, dst_ptr); |
---|
1404 | | - amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj); |
---|
1405 | | - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); |
---|
1406 | 1312 | } |
---|
1407 | 1313 | |
---|
1408 | 1314 | if ((adev->asic_type == CHIP_CARRIZO) || |
---|
1409 | 1315 | (adev->asic_type == CHIP_STONEY)) { |
---|
1410 | 1316 | adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */ |
---|
1411 | | - r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size, |
---|
1412 | | - PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, |
---|
1413 | | - &adev->gfx.rlc.cp_table_obj, |
---|
1414 | | - &adev->gfx.rlc.cp_table_gpu_addr, |
---|
1415 | | - (void **)&adev->gfx.rlc.cp_table_ptr); |
---|
1416 | | - if (r) { |
---|
1417 | | - dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r); |
---|
| 1317 | + r = amdgpu_gfx_rlc_init_cpt(adev); |
---|
| 1318 | + if (r) |
---|
1418 | 1319 | return r; |
---|
1419 | | - } |
---|
1420 | | - |
---|
1421 | | - cz_init_cp_jump_table(adev); |
---|
1422 | | - |
---|
1423 | | - amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj); |
---|
1424 | | - amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj); |
---|
1425 | 1320 | } |
---|
| 1321 | + |
---|
| 1322 | + /* init spm vmid with 0xf */ |
---|
| 1323 | + if (adev->gfx.rlc.funcs->update_spm_vmid) |
---|
| 1324 | + adev->gfx.rlc.funcs->update_spm_vmid(adev, 0xf); |
---|
1426 | 1325 | |
---|
1427 | 1326 | return 0; |
---|
1428 | 1327 | } |
---|
.. | .. |
---|
1444 | 1343 | amdgpu_gfx_compute_queue_acquire(adev); |
---|
1445 | 1344 | |
---|
1446 | 1345 | mec_hpd_size = adev->gfx.num_compute_rings * GFX8_MEC_HPD_SIZE; |
---|
| 1346 | + if (mec_hpd_size) { |
---|
| 1347 | + r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, |
---|
| 1348 | + AMDGPU_GEM_DOMAIN_VRAM, |
---|
| 1349 | + &adev->gfx.mec.hpd_eop_obj, |
---|
| 1350 | + &adev->gfx.mec.hpd_eop_gpu_addr, |
---|
| 1351 | + (void **)&hpd); |
---|
| 1352 | + if (r) { |
---|
| 1353 | + dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
---|
| 1354 | + return r; |
---|
| 1355 | + } |
---|
1447 | 1356 | |
---|
1448 | | - r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, |
---|
1449 | | - AMDGPU_GEM_DOMAIN_GTT, |
---|
1450 | | - &adev->gfx.mec.hpd_eop_obj, |
---|
1451 | | - &adev->gfx.mec.hpd_eop_gpu_addr, |
---|
1452 | | - (void **)&hpd); |
---|
1453 | | - if (r) { |
---|
1454 | | - dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
---|
1455 | | - return r; |
---|
| 1357 | + memset(hpd, 0, mec_hpd_size); |
---|
| 1358 | + |
---|
| 1359 | + amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj); |
---|
| 1360 | + amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); |
---|
1456 | 1361 | } |
---|
1457 | | - |
---|
1458 | | - memset(hpd, 0, mec_hpd_size); |
---|
1459 | | - |
---|
1460 | | - amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj); |
---|
1461 | | - amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); |
---|
1462 | 1362 | |
---|
1463 | 1363 | return 0; |
---|
1464 | 1364 | } |
---|
.. | .. |
---|
1632 | 1532 | return 0; |
---|
1633 | 1533 | |
---|
1634 | 1534 | /* bail if the compute ring is not ready */ |
---|
1635 | | - if (!ring->ready) |
---|
| 1535 | + if (!ring->sched.ready) |
---|
1636 | 1536 | return 0; |
---|
1637 | 1537 | |
---|
1638 | 1538 | tmp = RREG32(mmGB_EDC_MODE); |
---|
.. | .. |
---|
1652 | 1552 | |
---|
1653 | 1553 | /* allocate an indirect buffer to put the commands in */ |
---|
1654 | 1554 | memset(&ib, 0, sizeof(ib)); |
---|
1655 | | - r = amdgpu_ib_get(adev, NULL, total_size, &ib); |
---|
| 1555 | + r = amdgpu_ib_get(adev, NULL, total_size, |
---|
| 1556 | + AMDGPU_IB_POOL_DIRECT, &ib); |
---|
1656 | 1557 | if (r) { |
---|
1657 | 1558 | DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); |
---|
1658 | 1559 | return r; |
---|
.. | .. |
---|
1783 | 1684 | static int gfx_v8_0_gpu_early_init(struct amdgpu_device *adev) |
---|
1784 | 1685 | { |
---|
1785 | 1686 | u32 gb_addr_config; |
---|
1786 | | - u32 mc_shared_chmap, mc_arb_ramcfg; |
---|
| 1687 | + u32 mc_arb_ramcfg; |
---|
1787 | 1688 | u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map; |
---|
1788 | 1689 | u32 tmp; |
---|
1789 | 1690 | int ret; |
---|
.. | .. |
---|
1923 | 1824 | break; |
---|
1924 | 1825 | } |
---|
1925 | 1826 | |
---|
1926 | | - mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP); |
---|
1927 | 1827 | adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG); |
---|
1928 | 1828 | mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg; |
---|
| 1829 | + |
---|
| 1830 | + adev->gfx.config.num_banks = REG_GET_FIELD(mc_arb_ramcfg, |
---|
| 1831 | + MC_ARB_RAMCFG, NOOFBANK); |
---|
| 1832 | + adev->gfx.config.num_ranks = REG_GET_FIELD(mc_arb_ramcfg, |
---|
| 1833 | + MC_ARB_RAMCFG, NOOFRANKS); |
---|
1929 | 1834 | |
---|
1930 | 1835 | adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes; |
---|
1931 | 1836 | adev->gfx.config.mem_max_burst_length_bytes = 256; |
---|
.. | .. |
---|
1990 | 1895 | int r; |
---|
1991 | 1896 | unsigned irq_type; |
---|
1992 | 1897 | struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; |
---|
| 1898 | + unsigned int hw_prio; |
---|
1993 | 1899 | |
---|
1994 | 1900 | ring = &adev->gfx.compute_ring[ring_id]; |
---|
1995 | 1901 | |
---|
.. | .. |
---|
2000 | 1906 | |
---|
2001 | 1907 | ring->ring_obj = NULL; |
---|
2002 | 1908 | ring->use_doorbell = true; |
---|
2003 | | - ring->doorbell_index = AMDGPU_DOORBELL_MEC_RING0 + ring_id; |
---|
| 1909 | + ring->doorbell_index = adev->doorbell_index.mec_ring0 + ring_id; |
---|
2004 | 1910 | ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr |
---|
2005 | 1911 | + (ring_id * GFX8_MEC_HPD_SIZE); |
---|
2006 | 1912 | sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue); |
---|
.. | .. |
---|
2009 | 1915 | + ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec) |
---|
2010 | 1916 | + ring->pipe; |
---|
2011 | 1917 | |
---|
| 1918 | + hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring->pipe, |
---|
| 1919 | + ring->queue) ? |
---|
| 1920 | + AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_RING_PRIO_DEFAULT; |
---|
2012 | 1921 | /* type-2 packets are deprecated on MEC, use type-3 instead */ |
---|
2013 | 1922 | r = amdgpu_ring_init(adev, ring, 1024, |
---|
2014 | | - &adev->gfx.eop_irq, irq_type); |
---|
| 1923 | + &adev->gfx.eop_irq, irq_type, hw_prio); |
---|
2015 | 1924 | if (r) |
---|
2016 | 1925 | return r; |
---|
2017 | 1926 | |
---|
.. | .. |
---|
2048 | 1957 | adev->gfx.mec.num_pipe_per_mec = 4; |
---|
2049 | 1958 | adev->gfx.mec.num_queue_per_pipe = 8; |
---|
2050 | 1959 | |
---|
2051 | | - /* KIQ event */ |
---|
2052 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_INT_IB2, &adev->gfx.kiq.irq); |
---|
2053 | | - if (r) |
---|
2054 | | - return r; |
---|
2055 | | - |
---|
2056 | 1960 | /* EOP Event */ |
---|
2057 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_END_OF_PIPE, &adev->gfx.eop_irq); |
---|
| 1961 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_END_OF_PIPE, &adev->gfx.eop_irq); |
---|
2058 | 1962 | if (r) |
---|
2059 | 1963 | return r; |
---|
2060 | 1964 | |
---|
2061 | 1965 | /* Privileged reg */ |
---|
2062 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_REG_FAULT, |
---|
| 1966 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_REG_FAULT, |
---|
2063 | 1967 | &adev->gfx.priv_reg_irq); |
---|
2064 | 1968 | if (r) |
---|
2065 | 1969 | return r; |
---|
2066 | 1970 | |
---|
2067 | 1971 | /* Privileged inst */ |
---|
2068 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_INSTR_FAULT, |
---|
| 1972 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_INSTR_FAULT, |
---|
2069 | 1973 | &adev->gfx.priv_inst_irq); |
---|
2070 | 1974 | if (r) |
---|
2071 | 1975 | return r; |
---|
2072 | 1976 | |
---|
2073 | 1977 | /* Add CP EDC/ECC irq */ |
---|
2074 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_ECC_ERROR, |
---|
| 1978 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_ECC_ERROR, |
---|
2075 | 1979 | &adev->gfx.cp_ecc_error_irq); |
---|
2076 | 1980 | if (r) |
---|
2077 | 1981 | return r; |
---|
2078 | 1982 | |
---|
2079 | 1983 | /* SQ interrupts. */ |
---|
2080 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SQ_INTERRUPT_MSG, |
---|
| 1984 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SQ_INTERRUPT_MSG, |
---|
2081 | 1985 | &adev->gfx.sq_irq); |
---|
2082 | 1986 | if (r) { |
---|
2083 | 1987 | DRM_ERROR("amdgpu_irq_add() for SQ failed: %d\n", r); |
---|
.. | .. |
---|
2096 | 2000 | return r; |
---|
2097 | 2001 | } |
---|
2098 | 2002 | |
---|
2099 | | - r = gfx_v8_0_rlc_init(adev); |
---|
| 2003 | + r = adev->gfx.rlc.funcs->init(adev); |
---|
2100 | 2004 | if (r) { |
---|
2101 | 2005 | DRM_ERROR("Failed to init rlc BOs!\n"); |
---|
2102 | 2006 | return r; |
---|
.. | .. |
---|
2116 | 2020 | /* no gfx doorbells on iceland */ |
---|
2117 | 2021 | if (adev->asic_type != CHIP_TOPAZ) { |
---|
2118 | 2022 | ring->use_doorbell = true; |
---|
2119 | | - ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0; |
---|
| 2023 | + ring->doorbell_index = adev->doorbell_index.gfx_ring0; |
---|
2120 | 2024 | } |
---|
2121 | 2025 | |
---|
2122 | 2026 | r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, |
---|
2123 | | - AMDGPU_CP_IRQ_GFX_EOP); |
---|
| 2027 | + AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, |
---|
| 2028 | + AMDGPU_RING_PRIO_DEFAULT); |
---|
2124 | 2029 | if (r) |
---|
2125 | 2030 | return r; |
---|
2126 | 2031 | } |
---|
.. | .. |
---|
2157 | 2062 | return r; |
---|
2158 | 2063 | |
---|
2159 | 2064 | /* create MQD for all compute queues as well as KIQ for SRIOV case */ |
---|
2160 | | - r = amdgpu_gfx_compute_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation)); |
---|
2161 | | - if (r) |
---|
2162 | | - return r; |
---|
2163 | | - |
---|
2164 | | - /* reserve GDS, GWS and OA resource for gfx */ |
---|
2165 | | - r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size, |
---|
2166 | | - PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS, |
---|
2167 | | - &adev->gds.gds_gfx_bo, NULL, NULL); |
---|
2168 | | - if (r) |
---|
2169 | | - return r; |
---|
2170 | | - |
---|
2171 | | - r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size, |
---|
2172 | | - PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS, |
---|
2173 | | - &adev->gds.gws_gfx_bo, NULL, NULL); |
---|
2174 | | - if (r) |
---|
2175 | | - return r; |
---|
2176 | | - |
---|
2177 | | - r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size, |
---|
2178 | | - PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA, |
---|
2179 | | - &adev->gds.oa_gfx_bo, NULL, NULL); |
---|
| 2065 | + r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation)); |
---|
2180 | 2066 | if (r) |
---|
2181 | 2067 | return r; |
---|
2182 | 2068 | |
---|
.. | .. |
---|
2191 | 2077 | |
---|
2192 | 2078 | static int gfx_v8_0_sw_fini(void *handle) |
---|
2193 | 2079 | { |
---|
2194 | | - int i; |
---|
2195 | 2080 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
2196 | | - |
---|
2197 | | - amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL); |
---|
2198 | | - amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL); |
---|
2199 | | - amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL); |
---|
| 2081 | + int i; |
---|
2200 | 2082 | |
---|
2201 | 2083 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) |
---|
2202 | 2084 | amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); |
---|
2203 | 2085 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
---|
2204 | 2086 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
---|
2205 | 2087 | |
---|
2206 | | - amdgpu_gfx_compute_mqd_sw_fini(adev); |
---|
2207 | | - amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq); |
---|
| 2088 | + amdgpu_gfx_mqd_sw_fini(adev); |
---|
| 2089 | + amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); |
---|
2208 | 2090 | amdgpu_gfx_kiq_fini(adev); |
---|
2209 | 2091 | |
---|
2210 | 2092 | gfx_v8_0_mec_fini(adev); |
---|
2211 | | - gfx_v8_0_rlc_fini(adev); |
---|
| 2093 | + amdgpu_gfx_rlc_fini(adev); |
---|
2212 | 2094 | amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, |
---|
2213 | 2095 | &adev->gfx.rlc.clear_state_gpu_addr, |
---|
2214 | 2096 | (void **)&adev->gfx.rlc.cs_ptr); |
---|
.. | .. |
---|
3370 | 3252 | dev_warn(adev->dev, |
---|
3371 | 3253 | "Unknown chip type (%d) in function gfx_v8_0_tiling_mode_table_init() falling through to CHIP_CARRIZO\n", |
---|
3372 | 3254 | adev->asic_type); |
---|
| 3255 | + fallthrough; |
---|
3373 | 3256 | |
---|
3374 | 3257 | case CHIP_CARRIZO: |
---|
3375 | 3258 | modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
---|
.. | .. |
---|
3569 | 3452 | } |
---|
3570 | 3453 | |
---|
3571 | 3454 | static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev, |
---|
3572 | | - u32 me, u32 pipe, u32 q) |
---|
| 3455 | + u32 me, u32 pipe, u32 q, u32 vm) |
---|
3573 | 3456 | { |
---|
3574 | | - vi_srbm_select(adev, me, pipe, q, 0); |
---|
| 3457 | + vi_srbm_select(adev, me, pipe, q, vm); |
---|
3575 | 3458 | } |
---|
3576 | 3459 | |
---|
3577 | 3460 | static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev) |
---|
.. | .. |
---|
3805 | 3688 | * |
---|
3806 | 3689 | */ |
---|
3807 | 3690 | #define DEFAULT_SH_MEM_BASES (0x6000) |
---|
3808 | | -#define FIRST_COMPUTE_VMID (8) |
---|
3809 | | -#define LAST_COMPUTE_VMID (16) |
---|
3810 | 3691 | static void gfx_v8_0_init_compute_vmid(struct amdgpu_device *adev) |
---|
3811 | 3692 | { |
---|
3812 | 3693 | int i; |
---|
.. | .. |
---|
3829 | 3710 | SH_MEM_CONFIG__PRIVATE_ATC_MASK; |
---|
3830 | 3711 | |
---|
3831 | 3712 | mutex_lock(&adev->srbm_mutex); |
---|
3832 | | - for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { |
---|
| 3713 | + for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) { |
---|
3833 | 3714 | vi_srbm_select(adev, 0, 0, 0, i); |
---|
3834 | 3715 | /* CP and shaders */ |
---|
3835 | 3716 | WREG32(mmSH_MEM_CONFIG, sh_mem_config); |
---|
.. | .. |
---|
3839 | 3720 | } |
---|
3840 | 3721 | vi_srbm_select(adev, 0, 0, 0, 0); |
---|
3841 | 3722 | mutex_unlock(&adev->srbm_mutex); |
---|
| 3723 | + |
---|
| 3724 | + /* Initialize all compute VMIDs to have no GDS, GWS, or OA |
---|
| 3725 | + acccess. These should be enabled by FW for target VMIDs. */ |
---|
| 3726 | + for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) { |
---|
| 3727 | + WREG32(amdgpu_gds_reg_offset[i].mem_base, 0); |
---|
| 3728 | + WREG32(amdgpu_gds_reg_offset[i].mem_size, 0); |
---|
| 3729 | + WREG32(amdgpu_gds_reg_offset[i].gws, 0); |
---|
| 3730 | + WREG32(amdgpu_gds_reg_offset[i].oa, 0); |
---|
| 3731 | + } |
---|
| 3732 | +} |
---|
| 3733 | + |
---|
| 3734 | +static void gfx_v8_0_init_gds_vmid(struct amdgpu_device *adev) |
---|
| 3735 | +{ |
---|
| 3736 | + int vmid; |
---|
| 3737 | + |
---|
| 3738 | + /* |
---|
| 3739 | + * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA |
---|
| 3740 | + * access. Compute VMIDs should be enabled by FW for target VMIDs, |
---|
| 3741 | + * the driver can enable them for graphics. VMID0 should maintain |
---|
| 3742 | + * access so that HWS firmware can save/restore entries. |
---|
| 3743 | + */ |
---|
| 3744 | + for (vmid = 1; vmid < 16; vmid++) { |
---|
| 3745 | + WREG32(amdgpu_gds_reg_offset[vmid].mem_base, 0); |
---|
| 3746 | + WREG32(amdgpu_gds_reg_offset[vmid].mem_size, 0); |
---|
| 3747 | + WREG32(amdgpu_gds_reg_offset[vmid].gws, 0); |
---|
| 3748 | + WREG32(amdgpu_gds_reg_offset[vmid].oa, 0); |
---|
| 3749 | + } |
---|
3842 | 3750 | } |
---|
3843 | 3751 | |
---|
3844 | 3752 | static void gfx_v8_0_config_init(struct amdgpu_device *adev) |
---|
.. | .. |
---|
3854 | 3762 | } |
---|
3855 | 3763 | } |
---|
3856 | 3764 | |
---|
3857 | | -static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) |
---|
| 3765 | +static void gfx_v8_0_constants_init(struct amdgpu_device *adev) |
---|
3858 | 3766 | { |
---|
3859 | 3767 | u32 tmp, sh_static_mem_cfg; |
---|
3860 | 3768 | int i; |
---|
.. | .. |
---|
3907 | 3815 | mutex_unlock(&adev->srbm_mutex); |
---|
3908 | 3816 | |
---|
3909 | 3817 | gfx_v8_0_init_compute_vmid(adev); |
---|
| 3818 | + gfx_v8_0_init_gds_vmid(adev); |
---|
3910 | 3819 | |
---|
3911 | 3820 | mutex_lock(&adev->grbm_idx_mutex); |
---|
3912 | 3821 | /* |
---|
.. | .. |
---|
3989 | 3898 | |
---|
3990 | 3899 | static void gfx_v8_0_init_csb(struct amdgpu_device *adev) |
---|
3991 | 3900 | { |
---|
| 3901 | + adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); |
---|
3992 | 3902 | /* csib */ |
---|
3993 | 3903 | WREG32(mmRLC_CSIB_ADDR_HI, |
---|
3994 | 3904 | adev->gfx.rlc.clear_state_gpu_addr >> 32); |
---|
.. | .. |
---|
4058 | 3968 | |
---|
4059 | 3969 | int list_size; |
---|
4060 | 3970 | unsigned int *register_list_format = |
---|
4061 | | - kmalloc(adev->gfx.rlc.reg_list_format_size_bytes, GFP_KERNEL); |
---|
| 3971 | + kmemdup(adev->gfx.rlc.register_list_format, |
---|
| 3972 | + adev->gfx.rlc.reg_list_format_size_bytes, GFP_KERNEL); |
---|
4062 | 3973 | if (!register_list_format) |
---|
4063 | 3974 | return -ENOMEM; |
---|
4064 | | - memcpy(register_list_format, adev->gfx.rlc.register_list_format, |
---|
4065 | | - adev->gfx.rlc.reg_list_format_size_bytes); |
---|
4066 | 3975 | |
---|
4067 | 3976 | gfx_v8_0_parse_ind_reg_list(register_list_format, |
---|
4068 | 3977 | RLC_FormatDirectRegListLength, |
---|
.. | .. |
---|
4200 | 4109 | udelay(50); |
---|
4201 | 4110 | } |
---|
4202 | 4111 | |
---|
4203 | | -static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev) |
---|
4204 | | -{ |
---|
4205 | | - const struct rlc_firmware_header_v2_0 *hdr; |
---|
4206 | | - const __le32 *fw_data; |
---|
4207 | | - unsigned i, fw_size; |
---|
4208 | | - |
---|
4209 | | - if (!adev->gfx.rlc_fw) |
---|
4210 | | - return -EINVAL; |
---|
4211 | | - |
---|
4212 | | - hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; |
---|
4213 | | - amdgpu_ucode_print_rlc_hdr(&hdr->header); |
---|
4214 | | - |
---|
4215 | | - fw_data = (const __le32 *)(adev->gfx.rlc_fw->data + |
---|
4216 | | - le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
---|
4217 | | - fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
---|
4218 | | - |
---|
4219 | | - WREG32(mmRLC_GPM_UCODE_ADDR, 0); |
---|
4220 | | - for (i = 0; i < fw_size; i++) |
---|
4221 | | - WREG32(mmRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); |
---|
4222 | | - WREG32(mmRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version); |
---|
4223 | | - |
---|
4224 | | - return 0; |
---|
4225 | | -} |
---|
4226 | | - |
---|
4227 | 4112 | static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) |
---|
4228 | 4113 | { |
---|
4229 | | - int r; |
---|
4230 | | - u32 tmp; |
---|
4231 | | - |
---|
4232 | | - gfx_v8_0_rlc_stop(adev); |
---|
4233 | | - |
---|
4234 | | - /* disable CG */ |
---|
4235 | | - tmp = RREG32(mmRLC_CGCG_CGLS_CTRL); |
---|
4236 | | - tmp &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | |
---|
4237 | | - RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK); |
---|
4238 | | - WREG32(mmRLC_CGCG_CGLS_CTRL, tmp); |
---|
4239 | | - if (adev->asic_type == CHIP_POLARIS11 || |
---|
4240 | | - adev->asic_type == CHIP_POLARIS10 || |
---|
4241 | | - adev->asic_type == CHIP_POLARIS12 || |
---|
4242 | | - adev->asic_type == CHIP_VEGAM) { |
---|
4243 | | - tmp = RREG32(mmRLC_CGCG_CGLS_CTRL_3D); |
---|
4244 | | - tmp &= ~0x3; |
---|
4245 | | - WREG32(mmRLC_CGCG_CGLS_CTRL_3D, tmp); |
---|
| 4114 | + if (amdgpu_sriov_vf(adev)) { |
---|
| 4115 | + gfx_v8_0_init_csb(adev); |
---|
| 4116 | + return 0; |
---|
4246 | 4117 | } |
---|
4247 | 4118 | |
---|
4248 | | - /* disable PG */ |
---|
4249 | | - WREG32(mmRLC_PG_CNTL, 0); |
---|
4250 | | - |
---|
4251 | | - gfx_v8_0_rlc_reset(adev); |
---|
| 4119 | + adev->gfx.rlc.funcs->stop(adev); |
---|
| 4120 | + adev->gfx.rlc.funcs->reset(adev); |
---|
4252 | 4121 | gfx_v8_0_init_pg(adev); |
---|
4253 | | - |
---|
4254 | | - |
---|
4255 | | - if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) { |
---|
4256 | | - /* legacy rlc firmware loading */ |
---|
4257 | | - r = gfx_v8_0_rlc_load_microcode(adev); |
---|
4258 | | - if (r) |
---|
4259 | | - return r; |
---|
4260 | | - } |
---|
4261 | | - |
---|
4262 | | - gfx_v8_0_rlc_start(adev); |
---|
| 4122 | + adev->gfx.rlc.funcs->start(adev); |
---|
4263 | 4123 | |
---|
4264 | 4124 | return 0; |
---|
4265 | 4125 | } |
---|
4266 | 4126 | |
---|
4267 | 4127 | static void gfx_v8_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) |
---|
4268 | 4128 | { |
---|
4269 | | - int i; |
---|
4270 | 4129 | u32 tmp = RREG32(mmCP_ME_CNTL); |
---|
4271 | 4130 | |
---|
4272 | 4131 | if (enable) { |
---|
.. | .. |
---|
4277 | 4136 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 1); |
---|
4278 | 4137 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1); |
---|
4279 | 4138 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1); |
---|
4280 | | - for (i = 0; i < adev->gfx.num_gfx_rings; i++) |
---|
4281 | | - adev->gfx.gfx_ring[i].ready = false; |
---|
4282 | 4139 | } |
---|
4283 | 4140 | WREG32(mmCP_ME_CNTL, tmp); |
---|
4284 | 4141 | udelay(50); |
---|
4285 | | -} |
---|
4286 | | - |
---|
4287 | | -static int gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device *adev) |
---|
4288 | | -{ |
---|
4289 | | - const struct gfx_firmware_header_v1_0 *pfp_hdr; |
---|
4290 | | - const struct gfx_firmware_header_v1_0 *ce_hdr; |
---|
4291 | | - const struct gfx_firmware_header_v1_0 *me_hdr; |
---|
4292 | | - const __le32 *fw_data; |
---|
4293 | | - unsigned i, fw_size; |
---|
4294 | | - |
---|
4295 | | - if (!adev->gfx.me_fw || !adev->gfx.pfp_fw || !adev->gfx.ce_fw) |
---|
4296 | | - return -EINVAL; |
---|
4297 | | - |
---|
4298 | | - pfp_hdr = (const struct gfx_firmware_header_v1_0 *) |
---|
4299 | | - adev->gfx.pfp_fw->data; |
---|
4300 | | - ce_hdr = (const struct gfx_firmware_header_v1_0 *) |
---|
4301 | | - adev->gfx.ce_fw->data; |
---|
4302 | | - me_hdr = (const struct gfx_firmware_header_v1_0 *) |
---|
4303 | | - adev->gfx.me_fw->data; |
---|
4304 | | - |
---|
4305 | | - amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header); |
---|
4306 | | - amdgpu_ucode_print_gfx_hdr(&ce_hdr->header); |
---|
4307 | | - amdgpu_ucode_print_gfx_hdr(&me_hdr->header); |
---|
4308 | | - |
---|
4309 | | - gfx_v8_0_cp_gfx_enable(adev, false); |
---|
4310 | | - |
---|
4311 | | - /* PFP */ |
---|
4312 | | - fw_data = (const __le32 *) |
---|
4313 | | - (adev->gfx.pfp_fw->data + |
---|
4314 | | - le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes)); |
---|
4315 | | - fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4; |
---|
4316 | | - WREG32(mmCP_PFP_UCODE_ADDR, 0); |
---|
4317 | | - for (i = 0; i < fw_size; i++) |
---|
4318 | | - WREG32(mmCP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); |
---|
4319 | | - WREG32(mmCP_PFP_UCODE_ADDR, adev->gfx.pfp_fw_version); |
---|
4320 | | - |
---|
4321 | | - /* CE */ |
---|
4322 | | - fw_data = (const __le32 *) |
---|
4323 | | - (adev->gfx.ce_fw->data + |
---|
4324 | | - le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes)); |
---|
4325 | | - fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4; |
---|
4326 | | - WREG32(mmCP_CE_UCODE_ADDR, 0); |
---|
4327 | | - for (i = 0; i < fw_size; i++) |
---|
4328 | | - WREG32(mmCP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); |
---|
4329 | | - WREG32(mmCP_CE_UCODE_ADDR, adev->gfx.ce_fw_version); |
---|
4330 | | - |
---|
4331 | | - /* ME */ |
---|
4332 | | - fw_data = (const __le32 *) |
---|
4333 | | - (adev->gfx.me_fw->data + |
---|
4334 | | - le32_to_cpu(me_hdr->header.ucode_array_offset_bytes)); |
---|
4335 | | - fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4; |
---|
4336 | | - WREG32(mmCP_ME_RAM_WADDR, 0); |
---|
4337 | | - for (i = 0; i < fw_size; i++) |
---|
4338 | | - WREG32(mmCP_ME_RAM_DATA, le32_to_cpup(fw_data++)); |
---|
4339 | | - WREG32(mmCP_ME_RAM_WADDR, adev->gfx.me_fw_version); |
---|
4340 | | - |
---|
4341 | | - return 0; |
---|
4342 | 4142 | } |
---|
4343 | 4143 | |
---|
4344 | 4144 | static u32 gfx_v8_0_get_csb_size(struct amdgpu_device *adev) |
---|
.. | .. |
---|
4460 | 4260 | |
---|
4461 | 4261 | tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER, |
---|
4462 | 4262 | DOORBELL_RANGE_LOWER, |
---|
4463 | | - AMDGPU_DOORBELL_GFX_RING0); |
---|
| 4263 | + adev->doorbell_index.gfx_ring0); |
---|
4464 | 4264 | WREG32(mmCP_RB_DOORBELL_RANGE_LOWER, tmp); |
---|
4465 | 4265 | |
---|
4466 | 4266 | WREG32(mmCP_RB_DOORBELL_RANGE_UPPER, |
---|
.. | .. |
---|
4473 | 4273 | u32 tmp; |
---|
4474 | 4274 | u32 rb_bufsz; |
---|
4475 | 4275 | u64 rb_addr, rptr_addr, wptr_gpu_addr; |
---|
4476 | | - int r; |
---|
4477 | 4276 | |
---|
4478 | 4277 | /* Set the write pointer delay */ |
---|
4479 | 4278 | WREG32(mmCP_RB_WPTR_DELAY, 0); |
---|
.. | .. |
---|
4517 | 4316 | /* start the ring */ |
---|
4518 | 4317 | amdgpu_ring_clear_ring(ring); |
---|
4519 | 4318 | gfx_v8_0_cp_gfx_start(adev); |
---|
4520 | | - ring->ready = true; |
---|
4521 | | - r = amdgpu_ring_test_ring(ring); |
---|
4522 | | - if (r) |
---|
4523 | | - ring->ready = false; |
---|
| 4319 | + ring->sched.ready = true; |
---|
4524 | 4320 | |
---|
4525 | | - return r; |
---|
| 4321 | + return 0; |
---|
4526 | 4322 | } |
---|
4527 | 4323 | |
---|
4528 | 4324 | static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable) |
---|
4529 | 4325 | { |
---|
4530 | | - int i; |
---|
4531 | | - |
---|
4532 | 4326 | if (enable) { |
---|
4533 | 4327 | WREG32(mmCP_MEC_CNTL, 0); |
---|
4534 | 4328 | } else { |
---|
4535 | 4329 | WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); |
---|
4536 | | - for (i = 0; i < adev->gfx.num_compute_rings; i++) |
---|
4537 | | - adev->gfx.compute_ring[i].ready = false; |
---|
4538 | | - adev->gfx.kiq.ring.ready = false; |
---|
| 4330 | + adev->gfx.kiq.ring.sched.ready = false; |
---|
4539 | 4331 | } |
---|
4540 | 4332 | udelay(50); |
---|
4541 | | -} |
---|
4542 | | - |
---|
4543 | | -static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev) |
---|
4544 | | -{ |
---|
4545 | | - const struct gfx_firmware_header_v1_0 *mec_hdr; |
---|
4546 | | - const __le32 *fw_data; |
---|
4547 | | - unsigned i, fw_size; |
---|
4548 | | - |
---|
4549 | | - if (!adev->gfx.mec_fw) |
---|
4550 | | - return -EINVAL; |
---|
4551 | | - |
---|
4552 | | - gfx_v8_0_cp_compute_enable(adev, false); |
---|
4553 | | - |
---|
4554 | | - mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
---|
4555 | | - amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); |
---|
4556 | | - |
---|
4557 | | - fw_data = (const __le32 *) |
---|
4558 | | - (adev->gfx.mec_fw->data + |
---|
4559 | | - le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes)); |
---|
4560 | | - fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4; |
---|
4561 | | - |
---|
4562 | | - /* MEC1 */ |
---|
4563 | | - WREG32(mmCP_MEC_ME1_UCODE_ADDR, 0); |
---|
4564 | | - for (i = 0; i < fw_size; i++) |
---|
4565 | | - WREG32(mmCP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data+i)); |
---|
4566 | | - WREG32(mmCP_MEC_ME1_UCODE_ADDR, adev->gfx.mec_fw_version); |
---|
4567 | | - |
---|
4568 | | - /* Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */ |
---|
4569 | | - if (adev->gfx.mec2_fw) { |
---|
4570 | | - const struct gfx_firmware_header_v1_0 *mec2_hdr; |
---|
4571 | | - |
---|
4572 | | - mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
---|
4573 | | - amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); |
---|
4574 | | - |
---|
4575 | | - fw_data = (const __le32 *) |
---|
4576 | | - (adev->gfx.mec2_fw->data + |
---|
4577 | | - le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes)); |
---|
4578 | | - fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4; |
---|
4579 | | - |
---|
4580 | | - WREG32(mmCP_MEC_ME2_UCODE_ADDR, 0); |
---|
4581 | | - for (i = 0; i < fw_size; i++) |
---|
4582 | | - WREG32(mmCP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data+i)); |
---|
4583 | | - WREG32(mmCP_MEC_ME2_UCODE_ADDR, adev->gfx.mec2_fw_version); |
---|
4584 | | - } |
---|
4585 | | - |
---|
4586 | | - return 0; |
---|
4587 | 4333 | } |
---|
4588 | 4334 | |
---|
4589 | 4335 | /* KIQ functions */ |
---|
.. | .. |
---|
4604 | 4350 | static int gfx_v8_0_kiq_kcq_enable(struct amdgpu_device *adev) |
---|
4605 | 4351 | { |
---|
4606 | 4352 | struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; |
---|
4607 | | - uint32_t scratch, tmp = 0; |
---|
4608 | 4353 | uint64_t queue_mask = 0; |
---|
4609 | 4354 | int r, i; |
---|
4610 | 4355 | |
---|
.. | .. |
---|
4623 | 4368 | queue_mask |= (1ull << i); |
---|
4624 | 4369 | } |
---|
4625 | 4370 | |
---|
4626 | | - r = amdgpu_gfx_scratch_get(adev, &scratch); |
---|
4627 | | - if (r) { |
---|
4628 | | - DRM_ERROR("Failed to get scratch reg (%d).\n", r); |
---|
4629 | | - return r; |
---|
4630 | | - } |
---|
4631 | | - WREG32(scratch, 0xCAFEDEAD); |
---|
4632 | | - |
---|
4633 | | - r = amdgpu_ring_alloc(kiq_ring, (8 * adev->gfx.num_compute_rings) + 11); |
---|
| 4371 | + r = amdgpu_ring_alloc(kiq_ring, (8 * adev->gfx.num_compute_rings) + 8); |
---|
4634 | 4372 | if (r) { |
---|
4635 | 4373 | DRM_ERROR("Failed to lock KIQ (%d).\n", r); |
---|
4636 | | - amdgpu_gfx_scratch_free(adev, scratch); |
---|
4637 | 4374 | return r; |
---|
4638 | 4375 | } |
---|
4639 | 4376 | /* set resources */ |
---|
.. | .. |
---|
4665 | 4402 | amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr)); |
---|
4666 | 4403 | amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr)); |
---|
4667 | 4404 | } |
---|
4668 | | - /* write to scratch for completion */ |
---|
4669 | | - amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); |
---|
4670 | | - amdgpu_ring_write(kiq_ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); |
---|
4671 | | - amdgpu_ring_write(kiq_ring, 0xDEADBEEF); |
---|
| 4405 | + |
---|
4672 | 4406 | amdgpu_ring_commit(kiq_ring); |
---|
4673 | 4407 | |
---|
4674 | | - for (i = 0; i < adev->usec_timeout; i++) { |
---|
4675 | | - tmp = RREG32(scratch); |
---|
4676 | | - if (tmp == 0xDEADBEEF) |
---|
4677 | | - break; |
---|
4678 | | - DRM_UDELAY(1); |
---|
4679 | | - } |
---|
4680 | | - if (i >= adev->usec_timeout) { |
---|
4681 | | - DRM_ERROR("KCQ enable failed (scratch(0x%04X)=0x%08X)\n", |
---|
4682 | | - scratch, tmp); |
---|
4683 | | - r = -EINVAL; |
---|
4684 | | - } |
---|
4685 | | - amdgpu_gfx_scratch_free(adev, scratch); |
---|
4686 | | - |
---|
4687 | | - return r; |
---|
| 4408 | + return 0; |
---|
4688 | 4409 | } |
---|
4689 | 4410 | |
---|
4690 | 4411 | static int gfx_v8_0_deactivate_hqd(struct amdgpu_device *adev, u32 req) |
---|
.. | .. |
---|
4706 | 4427 | WREG32(mmCP_HQD_PQ_WPTR, 0); |
---|
4707 | 4428 | |
---|
4708 | 4429 | return r; |
---|
| 4430 | +} |
---|
| 4431 | + |
---|
| 4432 | +static void gfx_v8_0_mqd_set_priority(struct amdgpu_ring *ring, struct vi_mqd *mqd) |
---|
| 4433 | +{ |
---|
| 4434 | + struct amdgpu_device *adev = ring->adev; |
---|
| 4435 | + |
---|
| 4436 | + if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { |
---|
| 4437 | + if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring->pipe, |
---|
| 4438 | + ring->queue)) { |
---|
| 4439 | + mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; |
---|
| 4440 | + mqd->cp_hqd_queue_priority = |
---|
| 4441 | + AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; |
---|
| 4442 | + } |
---|
| 4443 | + } |
---|
4709 | 4444 | } |
---|
4710 | 4445 | |
---|
4711 | 4446 | static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring) |
---|
.. | .. |
---|
4831 | 4566 | /* defaults */ |
---|
4832 | 4567 | mqd->cp_hqd_eop_rptr = RREG32(mmCP_HQD_EOP_RPTR); |
---|
4833 | 4568 | mqd->cp_hqd_eop_wptr = RREG32(mmCP_HQD_EOP_WPTR); |
---|
4834 | | - mqd->cp_hqd_pipe_priority = RREG32(mmCP_HQD_PIPE_PRIORITY); |
---|
4835 | | - mqd->cp_hqd_queue_priority = RREG32(mmCP_HQD_QUEUE_PRIORITY); |
---|
4836 | | - mqd->cp_hqd_quantum = RREG32(mmCP_HQD_QUANTUM); |
---|
4837 | 4569 | mqd->cp_hqd_ctx_save_base_addr_lo = RREG32(mmCP_HQD_CTX_SAVE_BASE_ADDR_LO); |
---|
4838 | 4570 | mqd->cp_hqd_ctx_save_base_addr_hi = RREG32(mmCP_HQD_CTX_SAVE_BASE_ADDR_HI); |
---|
4839 | 4571 | mqd->cp_hqd_cntl_stack_offset = RREG32(mmCP_HQD_CNTL_STACK_OFFSET); |
---|
.. | .. |
---|
4845 | 4577 | mqd->cp_hqd_eop_wptr_mem = RREG32(mmCP_HQD_EOP_WPTR_MEM); |
---|
4846 | 4578 | mqd->cp_hqd_eop_dones = RREG32(mmCP_HQD_EOP_DONES); |
---|
4847 | 4579 | |
---|
4848 | | - /* activate the queue */ |
---|
4849 | | - mqd->cp_hqd_active = 1; |
---|
| 4580 | + /* set static priority for a queue/ring */ |
---|
| 4581 | + gfx_v8_0_mqd_set_priority(ring, mqd); |
---|
| 4582 | + mqd->cp_hqd_quantum = RREG32(mmCP_HQD_QUANTUM); |
---|
| 4583 | + |
---|
| 4584 | + /* map_queues packet doesn't need activate the queue, |
---|
| 4585 | + * so only kiq need set this field. |
---|
| 4586 | + */ |
---|
| 4587 | + if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) |
---|
| 4588 | + mqd->cp_hqd_active = 1; |
---|
4850 | 4589 | |
---|
4851 | 4590 | return 0; |
---|
4852 | 4591 | } |
---|
4853 | 4592 | |
---|
4854 | | -int gfx_v8_0_mqd_commit(struct amdgpu_device *adev, |
---|
| 4593 | +static int gfx_v8_0_mqd_commit(struct amdgpu_device *adev, |
---|
4855 | 4594 | struct vi_mqd *mqd) |
---|
4856 | 4595 | { |
---|
4857 | 4596 | uint32_t mqd_reg; |
---|
.. | .. |
---|
4896 | 4635 | |
---|
4897 | 4636 | gfx_v8_0_kiq_setting(ring); |
---|
4898 | 4637 | |
---|
4899 | | - if (adev->in_gpu_reset) { /* for GPU_RESET case */ |
---|
| 4638 | + if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ |
---|
4900 | 4639 | /* reset MQD to a clean status */ |
---|
4901 | 4640 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
---|
4902 | 4641 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); |
---|
.. | .. |
---|
4933 | 4672 | struct vi_mqd *mqd = ring->mqd_ptr; |
---|
4934 | 4673 | int mqd_idx = ring - &adev->gfx.compute_ring[0]; |
---|
4935 | 4674 | |
---|
4936 | | - if (!adev->in_gpu_reset && !adev->gfx.in_suspend) { |
---|
| 4675 | + if (!amdgpu_in_reset(adev) && !adev->in_suspend) { |
---|
4937 | 4676 | memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation)); |
---|
4938 | 4677 | ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; |
---|
4939 | 4678 | ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; |
---|
.. | .. |
---|
4945 | 4684 | |
---|
4946 | 4685 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
---|
4947 | 4686 | memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); |
---|
4948 | | - } else if (adev->in_gpu_reset) { /* for GPU_RESET case */ |
---|
| 4687 | + } else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ |
---|
4949 | 4688 | /* reset MQD to a clean status */ |
---|
4950 | 4689 | if (adev->gfx.mec.mqd_backup[mqd_idx]) |
---|
4951 | 4690 | memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); |
---|
.. | .. |
---|
4961 | 4700 | static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev) |
---|
4962 | 4701 | { |
---|
4963 | 4702 | if (adev->asic_type > CHIP_TONGA) { |
---|
4964 | | - WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, AMDGPU_DOORBELL_KIQ << 2); |
---|
4965 | | - WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, AMDGPU_DOORBELL_MEC_RING7 << 2); |
---|
| 4703 | + WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, adev->doorbell_index.kiq << 2); |
---|
| 4704 | + WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, adev->doorbell_index.mec_ring7 << 2); |
---|
4966 | 4705 | } |
---|
4967 | 4706 | /* enable doorbells */ |
---|
4968 | 4707 | WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1); |
---|
.. | .. |
---|
4970 | 4709 | |
---|
4971 | 4710 | static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev) |
---|
4972 | 4711 | { |
---|
4973 | | - struct amdgpu_ring *ring = NULL; |
---|
4974 | | - int r = 0, i; |
---|
4975 | | - |
---|
4976 | | - gfx_v8_0_cp_compute_enable(adev, true); |
---|
| 4712 | + struct amdgpu_ring *ring; |
---|
| 4713 | + int r; |
---|
4977 | 4714 | |
---|
4978 | 4715 | ring = &adev->gfx.kiq.ring; |
---|
4979 | 4716 | |
---|
4980 | 4717 | r = amdgpu_bo_reserve(ring->mqd_obj, false); |
---|
4981 | 4718 | if (unlikely(r != 0)) |
---|
4982 | | - goto done; |
---|
| 4719 | + return r; |
---|
4983 | 4720 | |
---|
4984 | 4721 | r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr); |
---|
4985 | | - if (!r) { |
---|
4986 | | - r = gfx_v8_0_kiq_init_queue(ring); |
---|
4987 | | - amdgpu_bo_kunmap(ring->mqd_obj); |
---|
4988 | | - ring->mqd_ptr = NULL; |
---|
4989 | | - } |
---|
| 4722 | + if (unlikely(r != 0)) |
---|
| 4723 | + return r; |
---|
| 4724 | + |
---|
| 4725 | + gfx_v8_0_kiq_init_queue(ring); |
---|
| 4726 | + amdgpu_bo_kunmap(ring->mqd_obj); |
---|
| 4727 | + ring->mqd_ptr = NULL; |
---|
4990 | 4728 | amdgpu_bo_unreserve(ring->mqd_obj); |
---|
4991 | | - if (r) |
---|
4992 | | - goto done; |
---|
| 4729 | + ring->sched.ready = true; |
---|
| 4730 | + return 0; |
---|
| 4731 | +} |
---|
| 4732 | + |
---|
| 4733 | +static int gfx_v8_0_kcq_resume(struct amdgpu_device *adev) |
---|
| 4734 | +{ |
---|
| 4735 | + struct amdgpu_ring *ring = NULL; |
---|
| 4736 | + int r = 0, i; |
---|
| 4737 | + |
---|
| 4738 | + gfx_v8_0_cp_compute_enable(adev, true); |
---|
4993 | 4739 | |
---|
4994 | 4740 | for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
---|
4995 | 4741 | ring = &adev->gfx.compute_ring[i]; |
---|
.. | .. |
---|
5014 | 4760 | if (r) |
---|
5015 | 4761 | goto done; |
---|
5016 | 4762 | |
---|
5017 | | - /* Test KIQ */ |
---|
5018 | | - ring = &adev->gfx.kiq.ring; |
---|
5019 | | - ring->ready = true; |
---|
5020 | | - r = amdgpu_ring_test_ring(ring); |
---|
5021 | | - if (r) { |
---|
5022 | | - ring->ready = false; |
---|
5023 | | - goto done; |
---|
5024 | | - } |
---|
5025 | | - |
---|
5026 | | - /* Test KCQs */ |
---|
5027 | | - for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
---|
5028 | | - ring = &adev->gfx.compute_ring[i]; |
---|
5029 | | - ring->ready = true; |
---|
5030 | | - r = amdgpu_ring_test_ring(ring); |
---|
5031 | | - if (r) |
---|
5032 | | - ring->ready = false; |
---|
5033 | | - } |
---|
5034 | | - |
---|
5035 | 4763 | done: |
---|
5036 | 4764 | return r; |
---|
| 4765 | +} |
---|
| 4766 | + |
---|
| 4767 | +static int gfx_v8_0_cp_test_all_rings(struct amdgpu_device *adev) |
---|
| 4768 | +{ |
---|
| 4769 | + int r, i; |
---|
| 4770 | + struct amdgpu_ring *ring; |
---|
| 4771 | + |
---|
| 4772 | + /* collect all the ring_tests here, gfx, kiq, compute */ |
---|
| 4773 | + ring = &adev->gfx.gfx_ring[0]; |
---|
| 4774 | + r = amdgpu_ring_test_helper(ring); |
---|
| 4775 | + if (r) |
---|
| 4776 | + return r; |
---|
| 4777 | + |
---|
| 4778 | + ring = &adev->gfx.kiq.ring; |
---|
| 4779 | + r = amdgpu_ring_test_helper(ring); |
---|
| 4780 | + if (r) |
---|
| 4781 | + return r; |
---|
| 4782 | + |
---|
| 4783 | + for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
---|
| 4784 | + ring = &adev->gfx.compute_ring[i]; |
---|
| 4785 | + amdgpu_ring_test_helper(ring); |
---|
| 4786 | + } |
---|
| 4787 | + |
---|
| 4788 | + return 0; |
---|
5037 | 4789 | } |
---|
5038 | 4790 | |
---|
5039 | 4791 | static int gfx_v8_0_cp_resume(struct amdgpu_device *adev) |
---|
.. | .. |
---|
5043 | 4795 | if (!(adev->flags & AMD_IS_APU)) |
---|
5044 | 4796 | gfx_v8_0_enable_gui_idle_interrupt(adev, false); |
---|
5045 | 4797 | |
---|
5046 | | - if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) { |
---|
5047 | | - /* legacy firmware loading */ |
---|
5048 | | - r = gfx_v8_0_cp_gfx_load_microcode(adev); |
---|
5049 | | - if (r) |
---|
5050 | | - return r; |
---|
5051 | | - |
---|
5052 | | - r = gfx_v8_0_cp_compute_load_microcode(adev); |
---|
5053 | | - if (r) |
---|
5054 | | - return r; |
---|
5055 | | - } |
---|
| 4798 | + r = gfx_v8_0_kiq_resume(adev); |
---|
| 4799 | + if (r) |
---|
| 4800 | + return r; |
---|
5056 | 4801 | |
---|
5057 | 4802 | r = gfx_v8_0_cp_gfx_resume(adev); |
---|
5058 | 4803 | if (r) |
---|
5059 | 4804 | return r; |
---|
5060 | 4805 | |
---|
5061 | | - r = gfx_v8_0_kiq_resume(adev); |
---|
| 4806 | + r = gfx_v8_0_kcq_resume(adev); |
---|
| 4807 | + if (r) |
---|
| 4808 | + return r; |
---|
| 4809 | + |
---|
| 4810 | + r = gfx_v8_0_cp_test_all_rings(adev); |
---|
5062 | 4811 | if (r) |
---|
5063 | 4812 | return r; |
---|
5064 | 4813 | |
---|
.. | .. |
---|
5079 | 4828 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5080 | 4829 | |
---|
5081 | 4830 | gfx_v8_0_init_golden_registers(adev); |
---|
5082 | | - gfx_v8_0_gpu_init(adev); |
---|
| 4831 | + gfx_v8_0_constants_init(adev); |
---|
5083 | 4832 | |
---|
5084 | | - r = gfx_v8_0_rlc_resume(adev); |
---|
| 4833 | + r = adev->gfx.rlc.funcs->resume(adev); |
---|
5085 | 4834 | if (r) |
---|
5086 | 4835 | return r; |
---|
5087 | 4836 | |
---|
.. | .. |
---|
5090 | 4839 | return r; |
---|
5091 | 4840 | } |
---|
5092 | 4841 | |
---|
5093 | | -static int gfx_v8_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring *ring) |
---|
| 4842 | +static int gfx_v8_0_kcq_disable(struct amdgpu_device *adev) |
---|
5094 | 4843 | { |
---|
5095 | | - struct amdgpu_device *adev = kiq_ring->adev; |
---|
5096 | | - uint32_t scratch, tmp = 0; |
---|
5097 | 4844 | int r, i; |
---|
| 4845 | + struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; |
---|
5098 | 4846 | |
---|
5099 | | - r = amdgpu_gfx_scratch_get(adev, &scratch); |
---|
5100 | | - if (r) { |
---|
5101 | | - DRM_ERROR("Failed to get scratch reg (%d).\n", r); |
---|
5102 | | - return r; |
---|
5103 | | - } |
---|
5104 | | - WREG32(scratch, 0xCAFEDEAD); |
---|
5105 | | - |
---|
5106 | | - r = amdgpu_ring_alloc(kiq_ring, 10); |
---|
5107 | | - if (r) { |
---|
| 4847 | + r = amdgpu_ring_alloc(kiq_ring, 6 * adev->gfx.num_compute_rings); |
---|
| 4848 | + if (r) |
---|
5108 | 4849 | DRM_ERROR("Failed to lock KIQ (%d).\n", r); |
---|
5109 | | - amdgpu_gfx_scratch_free(adev, scratch); |
---|
5110 | | - return r; |
---|
5111 | | - } |
---|
5112 | 4850 | |
---|
5113 | | - /* unmap queues */ |
---|
5114 | | - amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4)); |
---|
5115 | | - amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */ |
---|
| 4851 | + for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
---|
| 4852 | + struct amdgpu_ring *ring = &adev->gfx.compute_ring[i]; |
---|
| 4853 | + |
---|
| 4854 | + amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4)); |
---|
| 4855 | + amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */ |
---|
5116 | 4856 | PACKET3_UNMAP_QUEUES_ACTION(1) | /* RESET_QUEUES */ |
---|
5117 | 4857 | PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) | |
---|
5118 | 4858 | PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) | |
---|
5119 | 4859 | PACKET3_UNMAP_QUEUES_NUM_QUEUES(1)); |
---|
5120 | | - amdgpu_ring_write(kiq_ring, PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index)); |
---|
5121 | | - amdgpu_ring_write(kiq_ring, 0); |
---|
5122 | | - amdgpu_ring_write(kiq_ring, 0); |
---|
5123 | | - amdgpu_ring_write(kiq_ring, 0); |
---|
5124 | | - /* write to scratch for completion */ |
---|
5125 | | - amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); |
---|
5126 | | - amdgpu_ring_write(kiq_ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); |
---|
5127 | | - amdgpu_ring_write(kiq_ring, 0xDEADBEEF); |
---|
5128 | | - amdgpu_ring_commit(kiq_ring); |
---|
5129 | | - |
---|
5130 | | - for (i = 0; i < adev->usec_timeout; i++) { |
---|
5131 | | - tmp = RREG32(scratch); |
---|
5132 | | - if (tmp == 0xDEADBEEF) |
---|
5133 | | - break; |
---|
5134 | | - DRM_UDELAY(1); |
---|
| 4860 | + amdgpu_ring_write(kiq_ring, PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index)); |
---|
| 4861 | + amdgpu_ring_write(kiq_ring, 0); |
---|
| 4862 | + amdgpu_ring_write(kiq_ring, 0); |
---|
| 4863 | + amdgpu_ring_write(kiq_ring, 0); |
---|
5135 | 4864 | } |
---|
5136 | | - if (i >= adev->usec_timeout) { |
---|
5137 | | - DRM_ERROR("KCQ disabled failed (scratch(0x%04X)=0x%08X)\n", scratch, tmp); |
---|
5138 | | - r = -EINVAL; |
---|
5139 | | - } |
---|
5140 | | - amdgpu_gfx_scratch_free(adev, scratch); |
---|
5141 | | - return r; |
---|
5142 | | -} |
---|
| 4865 | + r = amdgpu_ring_test_helper(kiq_ring); |
---|
| 4866 | + if (r) |
---|
| 4867 | + DRM_ERROR("KCQ disable failed\n"); |
---|
5143 | 4868 | |
---|
5144 | | -static int gfx_v8_0_hw_fini(void *handle) |
---|
5145 | | -{ |
---|
5146 | | - struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5147 | | - int i; |
---|
5148 | | - |
---|
5149 | | - amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); |
---|
5150 | | - amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); |
---|
5151 | | - |
---|
5152 | | - amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0); |
---|
5153 | | - |
---|
5154 | | - amdgpu_irq_put(adev, &adev->gfx.sq_irq, 0); |
---|
5155 | | - |
---|
5156 | | - /* disable KCQ to avoid CPC touch memory not valid anymore */ |
---|
5157 | | - for (i = 0; i < adev->gfx.num_compute_rings; i++) |
---|
5158 | | - gfx_v8_0_kcq_disable(&adev->gfx.kiq.ring, &adev->gfx.compute_ring[i]); |
---|
5159 | | - |
---|
5160 | | - if (amdgpu_sriov_vf(adev)) { |
---|
5161 | | - pr_debug("For SRIOV client, shouldn't do anything.\n"); |
---|
5162 | | - return 0; |
---|
5163 | | - } |
---|
5164 | | - gfx_v8_0_cp_enable(adev, false); |
---|
5165 | | - gfx_v8_0_rlc_stop(adev); |
---|
5166 | | - |
---|
5167 | | - amdgpu_device_ip_set_powergating_state(adev, |
---|
5168 | | - AMD_IP_BLOCK_TYPE_GFX, |
---|
5169 | | - AMD_PG_STATE_UNGATE); |
---|
5170 | | - |
---|
5171 | | - return 0; |
---|
5172 | | -} |
---|
5173 | | - |
---|
5174 | | -static int gfx_v8_0_suspend(void *handle) |
---|
5175 | | -{ |
---|
5176 | | - struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5177 | | - adev->gfx.in_suspend = true; |
---|
5178 | | - return gfx_v8_0_hw_fini(adev); |
---|
5179 | | -} |
---|
5180 | | - |
---|
5181 | | -static int gfx_v8_0_resume(void *handle) |
---|
5182 | | -{ |
---|
5183 | | - int r; |
---|
5184 | | - struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5185 | | - |
---|
5186 | | - r = gfx_v8_0_hw_init(adev); |
---|
5187 | | - adev->gfx.in_suspend = false; |
---|
5188 | 4869 | return r; |
---|
5189 | 4870 | } |
---|
5190 | 4871 | |
---|
.. | .. |
---|
5192 | 4873 | { |
---|
5193 | 4874 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5194 | 4875 | |
---|
5195 | | - if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE)) |
---|
| 4876 | + if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE) |
---|
| 4877 | + || RREG32(mmGRBM_STATUS2) != 0x8) |
---|
5196 | 4878 | return false; |
---|
5197 | 4879 | else |
---|
5198 | 4880 | return true; |
---|
5199 | 4881 | } |
---|
5200 | 4882 | |
---|
| 4883 | +static bool gfx_v8_0_rlc_is_idle(void *handle) |
---|
| 4884 | +{ |
---|
| 4885 | + struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
| 4886 | + |
---|
| 4887 | + if (RREG32(mmGRBM_STATUS2) != 0x8) |
---|
| 4888 | + return false; |
---|
| 4889 | + else |
---|
| 4890 | + return true; |
---|
| 4891 | +} |
---|
| 4892 | + |
---|
| 4893 | +static int gfx_v8_0_wait_for_rlc_idle(void *handle) |
---|
| 4894 | +{ |
---|
| 4895 | + unsigned int i; |
---|
| 4896 | + struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
| 4897 | + |
---|
| 4898 | + for (i = 0; i < adev->usec_timeout; i++) { |
---|
| 4899 | + if (gfx_v8_0_rlc_is_idle(handle)) |
---|
| 4900 | + return 0; |
---|
| 4901 | + |
---|
| 4902 | + udelay(1); |
---|
| 4903 | + } |
---|
| 4904 | + return -ETIMEDOUT; |
---|
| 4905 | +} |
---|
| 4906 | + |
---|
5201 | 4907 | static int gfx_v8_0_wait_for_idle(void *handle) |
---|
5202 | 4908 | { |
---|
5203 | | - unsigned i; |
---|
| 4909 | + unsigned int i; |
---|
5204 | 4910 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5205 | 4911 | |
---|
5206 | 4912 | for (i = 0; i < adev->usec_timeout; i++) { |
---|
.. | .. |
---|
5210 | 4916 | udelay(1); |
---|
5211 | 4917 | } |
---|
5212 | 4918 | return -ETIMEDOUT; |
---|
| 4919 | +} |
---|
| 4920 | + |
---|
| 4921 | +static int gfx_v8_0_hw_fini(void *handle) |
---|
| 4922 | +{ |
---|
| 4923 | + struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
| 4924 | + |
---|
| 4925 | + amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); |
---|
| 4926 | + amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); |
---|
| 4927 | + |
---|
| 4928 | + amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0); |
---|
| 4929 | + |
---|
| 4930 | + amdgpu_irq_put(adev, &adev->gfx.sq_irq, 0); |
---|
| 4931 | + |
---|
| 4932 | + /* disable KCQ to avoid CPC touch memory not valid anymore */ |
---|
| 4933 | + gfx_v8_0_kcq_disable(adev); |
---|
| 4934 | + |
---|
| 4935 | + if (amdgpu_sriov_vf(adev)) { |
---|
| 4936 | + pr_debug("For SRIOV client, shouldn't do anything.\n"); |
---|
| 4937 | + return 0; |
---|
| 4938 | + } |
---|
| 4939 | + amdgpu_gfx_rlc_enter_safe_mode(adev); |
---|
| 4940 | + if (!gfx_v8_0_wait_for_idle(adev)) |
---|
| 4941 | + gfx_v8_0_cp_enable(adev, false); |
---|
| 4942 | + else |
---|
| 4943 | + pr_err("cp is busy, skip halt cp\n"); |
---|
| 4944 | + if (!gfx_v8_0_wait_for_rlc_idle(adev)) |
---|
| 4945 | + adev->gfx.rlc.funcs->stop(adev); |
---|
| 4946 | + else |
---|
| 4947 | + pr_err("rlc is busy, skip halt rlc\n"); |
---|
| 4948 | + amdgpu_gfx_rlc_exit_safe_mode(adev); |
---|
| 4949 | + |
---|
| 4950 | + return 0; |
---|
| 4951 | +} |
---|
| 4952 | + |
---|
| 4953 | +static int gfx_v8_0_suspend(void *handle) |
---|
| 4954 | +{ |
---|
| 4955 | + return gfx_v8_0_hw_fini(handle); |
---|
| 4956 | +} |
---|
| 4957 | + |
---|
| 4958 | +static int gfx_v8_0_resume(void *handle) |
---|
| 4959 | +{ |
---|
| 4960 | + return gfx_v8_0_hw_init(handle); |
---|
5213 | 4961 | } |
---|
5214 | 4962 | |
---|
5215 | 4963 | static bool gfx_v8_0_check_soft_reset(void *handle) |
---|
.. | .. |
---|
5277 | 5025 | static int gfx_v8_0_pre_soft_reset(void *handle) |
---|
5278 | 5026 | { |
---|
5279 | 5027 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5280 | | - u32 grbm_soft_reset = 0, srbm_soft_reset = 0; |
---|
| 5028 | + u32 grbm_soft_reset = 0; |
---|
5281 | 5029 | |
---|
5282 | 5030 | if ((!adev->gfx.grbm_soft_reset) && |
---|
5283 | 5031 | (!adev->gfx.srbm_soft_reset)) |
---|
5284 | 5032 | return 0; |
---|
5285 | 5033 | |
---|
5286 | 5034 | grbm_soft_reset = adev->gfx.grbm_soft_reset; |
---|
5287 | | - srbm_soft_reset = adev->gfx.srbm_soft_reset; |
---|
5288 | 5035 | |
---|
5289 | 5036 | /* stop the rlc */ |
---|
5290 | | - gfx_v8_0_rlc_stop(adev); |
---|
| 5037 | + adev->gfx.rlc.funcs->stop(adev); |
---|
5291 | 5038 | |
---|
5292 | 5039 | if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || |
---|
5293 | 5040 | REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) |
---|
.. | .. |
---|
5381 | 5128 | static int gfx_v8_0_post_soft_reset(void *handle) |
---|
5382 | 5129 | { |
---|
5383 | 5130 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5384 | | - u32 grbm_soft_reset = 0, srbm_soft_reset = 0; |
---|
| 5131 | + u32 grbm_soft_reset = 0; |
---|
5385 | 5132 | |
---|
5386 | 5133 | if ((!adev->gfx.grbm_soft_reset) && |
---|
5387 | 5134 | (!adev->gfx.srbm_soft_reset)) |
---|
5388 | 5135 | return 0; |
---|
5389 | 5136 | |
---|
5390 | 5137 | grbm_soft_reset = adev->gfx.grbm_soft_reset; |
---|
5391 | | - srbm_soft_reset = adev->gfx.srbm_soft_reset; |
---|
5392 | | - |
---|
5393 | | - if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || |
---|
5394 | | - REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) |
---|
5395 | | - gfx_v8_0_cp_gfx_resume(adev); |
---|
5396 | 5138 | |
---|
5397 | 5139 | if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || |
---|
5398 | 5140 | REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPF) || |
---|
.. | .. |
---|
5410 | 5152 | mutex_unlock(&adev->srbm_mutex); |
---|
5411 | 5153 | } |
---|
5412 | 5154 | gfx_v8_0_kiq_resume(adev); |
---|
| 5155 | + gfx_v8_0_kcq_resume(adev); |
---|
5413 | 5156 | } |
---|
5414 | | - gfx_v8_0_rlc_start(adev); |
---|
| 5157 | + |
---|
| 5158 | + if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || |
---|
| 5159 | + REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) |
---|
| 5160 | + gfx_v8_0_cp_gfx_resume(adev); |
---|
| 5161 | + |
---|
| 5162 | + gfx_v8_0_cp_test_all_rings(adev); |
---|
| 5163 | + |
---|
| 5164 | + adev->gfx.rlc.funcs->start(adev); |
---|
5415 | 5165 | |
---|
5416 | 5166 | return 0; |
---|
5417 | 5167 | } |
---|
.. | .. |
---|
5442 | 5192 | uint32_t gws_base, uint32_t gws_size, |
---|
5443 | 5193 | uint32_t oa_base, uint32_t oa_size) |
---|
5444 | 5194 | { |
---|
5445 | | - gds_base = gds_base >> AMDGPU_GDS_SHIFT; |
---|
5446 | | - gds_size = gds_size >> AMDGPU_GDS_SHIFT; |
---|
5447 | | - |
---|
5448 | | - gws_base = gws_base >> AMDGPU_GWS_SHIFT; |
---|
5449 | | - gws_size = gws_size >> AMDGPU_GWS_SHIFT; |
---|
5450 | | - |
---|
5451 | | - oa_base = oa_base >> AMDGPU_OA_SHIFT; |
---|
5452 | | - oa_size = oa_size >> AMDGPU_OA_SHIFT; |
---|
5453 | | - |
---|
5454 | 5195 | /* GDS Base */ |
---|
5455 | 5196 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); |
---|
5456 | 5197 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | |
---|
.. | .. |
---|
5556 | 5297 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
5557 | 5298 | |
---|
5558 | 5299 | adev->gfx.num_gfx_rings = GFX8_NUM_GFX_RINGS; |
---|
5559 | | - adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS; |
---|
| 5300 | + adev->gfx.num_compute_rings = amdgpu_num_kcq; |
---|
5560 | 5301 | adev->gfx.funcs = &gfx_v8_0_gfx_funcs; |
---|
5561 | 5302 | gfx_v8_0_set_ring_funcs(adev); |
---|
5562 | 5303 | gfx_v8_0_set_irq_funcs(adev); |
---|
.. | .. |
---|
5604 | 5345 | static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev, |
---|
5605 | 5346 | bool enable) |
---|
5606 | 5347 | { |
---|
5607 | | - if (((adev->asic_type == CHIP_POLARIS11) || |
---|
| 5348 | + if ((adev->asic_type == CHIP_POLARIS11) || |
---|
5608 | 5349 | (adev->asic_type == CHIP_POLARIS12) || |
---|
5609 | | - (adev->asic_type == CHIP_VEGAM)) && |
---|
5610 | | - adev->powerplay.pp_funcs->set_powergating_by_smu) |
---|
| 5350 | + (adev->asic_type == CHIP_VEGAM)) |
---|
5611 | 5351 | /* Send msg to SMU via Powerplay */ |
---|
5612 | 5352 | amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, enable); |
---|
5613 | 5353 | |
---|
.. | .. |
---|
5668 | 5408 | AMD_PG_SUPPORT_RLC_SMU_HS | |
---|
5669 | 5409 | AMD_PG_SUPPORT_CP | |
---|
5670 | 5410 | AMD_PG_SUPPORT_GFX_DMG)) |
---|
5671 | | - adev->gfx.rlc.funcs->enter_safe_mode(adev); |
---|
| 5411 | + amdgpu_gfx_rlc_enter_safe_mode(adev); |
---|
5672 | 5412 | switch (adev->asic_type) { |
---|
5673 | 5413 | case CHIP_CARRIZO: |
---|
5674 | 5414 | case CHIP_STONEY: |
---|
.. | .. |
---|
5722 | 5462 | AMD_PG_SUPPORT_RLC_SMU_HS | |
---|
5723 | 5463 | AMD_PG_SUPPORT_CP | |
---|
5724 | 5464 | AMD_PG_SUPPORT_GFX_DMG)) |
---|
5725 | | - adev->gfx.rlc.funcs->exit_safe_mode(adev); |
---|
| 5465 | + amdgpu_gfx_rlc_exit_safe_mode(adev); |
---|
5726 | 5466 | return 0; |
---|
5727 | 5467 | } |
---|
5728 | 5468 | |
---|
.. | .. |
---|
5816 | 5556 | #define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001 |
---|
5817 | 5557 | #define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e |
---|
5818 | 5558 | |
---|
5819 | | -static void iceland_enter_rlc_safe_mode(struct amdgpu_device *adev) |
---|
| 5559 | +static bool gfx_v8_0_is_rlc_enabled(struct amdgpu_device *adev) |
---|
5820 | 5560 | { |
---|
5821 | | - u32 data; |
---|
| 5561 | + uint32_t rlc_setting; |
---|
| 5562 | + |
---|
| 5563 | + rlc_setting = RREG32(mmRLC_CNTL); |
---|
| 5564 | + if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) |
---|
| 5565 | + return false; |
---|
| 5566 | + |
---|
| 5567 | + return true; |
---|
| 5568 | +} |
---|
| 5569 | + |
---|
| 5570 | +static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev) |
---|
| 5571 | +{ |
---|
| 5572 | + uint32_t data; |
---|
5822 | 5573 | unsigned i; |
---|
5823 | | - |
---|
5824 | 5574 | data = RREG32(mmRLC_CNTL); |
---|
5825 | | - if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK)) |
---|
5826 | | - return; |
---|
| 5575 | + data |= RLC_SAFE_MODE__CMD_MASK; |
---|
| 5576 | + data &= ~RLC_SAFE_MODE__MESSAGE_MASK; |
---|
| 5577 | + data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT); |
---|
| 5578 | + WREG32(mmRLC_SAFE_MODE, data); |
---|
5827 | 5579 | |
---|
5828 | | - if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) { |
---|
5829 | | - data |= RLC_SAFE_MODE__CMD_MASK; |
---|
5830 | | - data &= ~RLC_SAFE_MODE__MESSAGE_MASK; |
---|
5831 | | - data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT); |
---|
5832 | | - WREG32(mmRLC_SAFE_MODE, data); |
---|
5833 | | - |
---|
5834 | | - for (i = 0; i < adev->usec_timeout; i++) { |
---|
5835 | | - if ((RREG32(mmRLC_GPM_STAT) & |
---|
5836 | | - (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | |
---|
5837 | | - RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) == |
---|
5838 | | - (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | |
---|
5839 | | - RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) |
---|
5840 | | - break; |
---|
5841 | | - udelay(1); |
---|
5842 | | - } |
---|
5843 | | - |
---|
5844 | | - for (i = 0; i < adev->usec_timeout; i++) { |
---|
5845 | | - if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) |
---|
5846 | | - break; |
---|
5847 | | - udelay(1); |
---|
5848 | | - } |
---|
5849 | | - adev->gfx.rlc.in_safe_mode = true; |
---|
| 5580 | + /* wait for RLC_SAFE_MODE */ |
---|
| 5581 | + for (i = 0; i < adev->usec_timeout; i++) { |
---|
| 5582 | + if ((RREG32(mmRLC_GPM_STAT) & |
---|
| 5583 | + (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | |
---|
| 5584 | + RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) == |
---|
| 5585 | + (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | |
---|
| 5586 | + RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) |
---|
| 5587 | + break; |
---|
| 5588 | + udelay(1); |
---|
| 5589 | + } |
---|
| 5590 | + for (i = 0; i < adev->usec_timeout; i++) { |
---|
| 5591 | + if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) |
---|
| 5592 | + break; |
---|
| 5593 | + udelay(1); |
---|
5850 | 5594 | } |
---|
5851 | 5595 | } |
---|
5852 | 5596 | |
---|
5853 | | -static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev) |
---|
| 5597 | +static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev) |
---|
5854 | 5598 | { |
---|
5855 | | - u32 data = 0; |
---|
| 5599 | + uint32_t data; |
---|
5856 | 5600 | unsigned i; |
---|
5857 | 5601 | |
---|
5858 | 5602 | data = RREG32(mmRLC_CNTL); |
---|
5859 | | - if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK)) |
---|
5860 | | - return; |
---|
5861 | | - |
---|
5862 | | - if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) { |
---|
5863 | | - if (adev->gfx.rlc.in_safe_mode) { |
---|
5864 | | - data |= RLC_SAFE_MODE__CMD_MASK; |
---|
5865 | | - data &= ~RLC_SAFE_MODE__MESSAGE_MASK; |
---|
5866 | | - WREG32(mmRLC_SAFE_MODE, data); |
---|
5867 | | - adev->gfx.rlc.in_safe_mode = false; |
---|
5868 | | - } |
---|
5869 | | - } |
---|
| 5603 | + data |= RLC_SAFE_MODE__CMD_MASK; |
---|
| 5604 | + data &= ~RLC_SAFE_MODE__MESSAGE_MASK; |
---|
| 5605 | + WREG32(mmRLC_SAFE_MODE, data); |
---|
5870 | 5606 | |
---|
5871 | 5607 | for (i = 0; i < adev->usec_timeout; i++) { |
---|
5872 | 5608 | if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) |
---|
.. | .. |
---|
5875 | 5611 | } |
---|
5876 | 5612 | } |
---|
5877 | 5613 | |
---|
| 5614 | +static void gfx_v8_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid) |
---|
| 5615 | +{ |
---|
| 5616 | + u32 data; |
---|
| 5617 | + |
---|
| 5618 | + if (amdgpu_sriov_is_pp_one_vf(adev)) |
---|
| 5619 | + data = RREG32_NO_KIQ(mmRLC_SPM_VMID); |
---|
| 5620 | + else |
---|
| 5621 | + data = RREG32(mmRLC_SPM_VMID); |
---|
| 5622 | + |
---|
| 5623 | + data &= ~RLC_SPM_VMID__RLC_SPM_VMID_MASK; |
---|
| 5624 | + data |= (vmid & RLC_SPM_VMID__RLC_SPM_VMID_MASK) << RLC_SPM_VMID__RLC_SPM_VMID__SHIFT; |
---|
| 5625 | + |
---|
| 5626 | + if (amdgpu_sriov_is_pp_one_vf(adev)) |
---|
| 5627 | + WREG32_NO_KIQ(mmRLC_SPM_VMID, data); |
---|
| 5628 | + else |
---|
| 5629 | + WREG32(mmRLC_SPM_VMID, data); |
---|
| 5630 | +} |
---|
| 5631 | + |
---|
5878 | 5632 | static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { |
---|
5879 | | - .enter_safe_mode = iceland_enter_rlc_safe_mode, |
---|
5880 | | - .exit_safe_mode = iceland_exit_rlc_safe_mode |
---|
| 5633 | + .is_rlc_enabled = gfx_v8_0_is_rlc_enabled, |
---|
| 5634 | + .set_safe_mode = gfx_v8_0_set_safe_mode, |
---|
| 5635 | + .unset_safe_mode = gfx_v8_0_unset_safe_mode, |
---|
| 5636 | + .init = gfx_v8_0_rlc_init, |
---|
| 5637 | + .get_csb_size = gfx_v8_0_get_csb_size, |
---|
| 5638 | + .get_csb_buffer = gfx_v8_0_get_csb_buffer, |
---|
| 5639 | + .get_cp_table_num = gfx_v8_0_cp_jump_table_num, |
---|
| 5640 | + .resume = gfx_v8_0_rlc_resume, |
---|
| 5641 | + .stop = gfx_v8_0_rlc_stop, |
---|
| 5642 | + .reset = gfx_v8_0_rlc_reset, |
---|
| 5643 | + .start = gfx_v8_0_rlc_start, |
---|
| 5644 | + .update_spm_vmid = gfx_v8_0_update_spm_vmid |
---|
5881 | 5645 | }; |
---|
5882 | 5646 | |
---|
5883 | 5647 | static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev, |
---|
.. | .. |
---|
5885 | 5649 | { |
---|
5886 | 5650 | uint32_t temp, data; |
---|
5887 | 5651 | |
---|
5888 | | - adev->gfx.rlc.funcs->enter_safe_mode(adev); |
---|
| 5652 | + amdgpu_gfx_rlc_enter_safe_mode(adev); |
---|
5889 | 5653 | |
---|
5890 | 5654 | /* It is disabled by HW by default */ |
---|
5891 | 5655 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { |
---|
.. | .. |
---|
5981 | 5745 | gfx_v8_0_wait_for_rlc_serdes(adev); |
---|
5982 | 5746 | } |
---|
5983 | 5747 | |
---|
5984 | | - adev->gfx.rlc.funcs->exit_safe_mode(adev); |
---|
| 5748 | + amdgpu_gfx_rlc_exit_safe_mode(adev); |
---|
5985 | 5749 | } |
---|
5986 | 5750 | |
---|
5987 | 5751 | static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, |
---|
.. | .. |
---|
5991 | 5755 | |
---|
5992 | 5756 | temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL); |
---|
5993 | 5757 | |
---|
5994 | | - adev->gfx.rlc.funcs->enter_safe_mode(adev); |
---|
| 5758 | + amdgpu_gfx_rlc_enter_safe_mode(adev); |
---|
5995 | 5759 | |
---|
5996 | 5760 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) { |
---|
5997 | 5761 | temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE); |
---|
.. | .. |
---|
6074 | 5838 | |
---|
6075 | 5839 | gfx_v8_0_wait_for_rlc_serdes(adev); |
---|
6076 | 5840 | |
---|
6077 | | - adev->gfx.rlc.funcs->exit_safe_mode(adev); |
---|
| 5841 | + amdgpu_gfx_rlc_exit_safe_mode(adev); |
---|
6078 | 5842 | } |
---|
6079 | 5843 | static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev, |
---|
6080 | 5844 | bool enable) |
---|
.. | .. |
---|
6117 | 5881 | PP_BLOCK_GFX_CG, |
---|
6118 | 5882 | pp_support_state, |
---|
6119 | 5883 | pp_state); |
---|
6120 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6121 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5884 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6122 | 5885 | } |
---|
6123 | 5886 | |
---|
6124 | 5887 | if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) { |
---|
.. | .. |
---|
6139 | 5902 | PP_BLOCK_GFX_MG, |
---|
6140 | 5903 | pp_support_state, |
---|
6141 | 5904 | pp_state); |
---|
6142 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6143 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5905 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6144 | 5906 | } |
---|
6145 | 5907 | |
---|
6146 | 5908 | return 0; |
---|
.. | .. |
---|
6169 | 5931 | PP_BLOCK_GFX_CG, |
---|
6170 | 5932 | pp_support_state, |
---|
6171 | 5933 | pp_state); |
---|
6172 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6173 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5934 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6174 | 5935 | } |
---|
6175 | 5936 | |
---|
6176 | 5937 | if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_3D_CGCG | AMD_CG_SUPPORT_GFX_3D_CGLS)) { |
---|
.. | .. |
---|
6189 | 5950 | PP_BLOCK_GFX_3D, |
---|
6190 | 5951 | pp_support_state, |
---|
6191 | 5952 | pp_state); |
---|
6192 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6193 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5953 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6194 | 5954 | } |
---|
6195 | 5955 | |
---|
6196 | 5956 | if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) { |
---|
.. | .. |
---|
6211 | 5971 | PP_BLOCK_GFX_MG, |
---|
6212 | 5972 | pp_support_state, |
---|
6213 | 5973 | pp_state); |
---|
6214 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6215 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5974 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6216 | 5975 | } |
---|
6217 | 5976 | |
---|
6218 | 5977 | if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) { |
---|
.. | .. |
---|
6227 | 5986 | PP_BLOCK_GFX_RLC, |
---|
6228 | 5987 | pp_support_state, |
---|
6229 | 5988 | pp_state); |
---|
6230 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6231 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 5989 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6232 | 5990 | } |
---|
6233 | 5991 | |
---|
6234 | 5992 | if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) { |
---|
.. | .. |
---|
6242 | 6000 | PP_BLOCK_GFX_CP, |
---|
6243 | 6001 | pp_support_state, |
---|
6244 | 6002 | pp_state); |
---|
6245 | | - if (adev->powerplay.pp_funcs->set_clockgating_by_smu) |
---|
6246 | | - amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
| 6003 | + amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); |
---|
6247 | 6004 | } |
---|
6248 | 6005 | |
---|
6249 | 6006 | return 0; |
---|
.. | .. |
---|
6354 | 6111 | } |
---|
6355 | 6112 | |
---|
6356 | 6113 | static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
---|
6357 | | - struct amdgpu_ib *ib, |
---|
6358 | | - unsigned vmid, bool ctx_switch) |
---|
| 6114 | + struct amdgpu_job *job, |
---|
| 6115 | + struct amdgpu_ib *ib, |
---|
| 6116 | + uint32_t flags) |
---|
6359 | 6117 | { |
---|
| 6118 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
6360 | 6119 | u32 header, control = 0; |
---|
6361 | 6120 | |
---|
6362 | 6121 | if (ib->flags & AMDGPU_IB_FLAG_CE) |
---|
.. | .. |
---|
6369 | 6128 | if (amdgpu_sriov_vf(ring->adev) && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) { |
---|
6370 | 6129 | control |= INDIRECT_BUFFER_PRE_ENB(1); |
---|
6371 | 6130 | |
---|
6372 | | - if (!(ib->flags & AMDGPU_IB_FLAG_CE)) |
---|
| 6131 | + if (!(ib->flags & AMDGPU_IB_FLAG_CE) && vmid) |
---|
6373 | 6132 | gfx_v8_0_ring_emit_de_meta(ring); |
---|
6374 | 6133 | } |
---|
6375 | 6134 | |
---|
.. | .. |
---|
6384 | 6143 | } |
---|
6385 | 6144 | |
---|
6386 | 6145 | static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, |
---|
| 6146 | + struct amdgpu_job *job, |
---|
6387 | 6147 | struct amdgpu_ib *ib, |
---|
6388 | | - unsigned vmid, bool ctx_switch) |
---|
| 6148 | + uint32_t flags) |
---|
6389 | 6149 | { |
---|
| 6150 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
6390 | 6151 | u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); |
---|
| 6152 | + |
---|
| 6153 | + /* Currently, there is a high possibility to get wave ID mismatch |
---|
| 6154 | + * between ME and GDS, leading to a hw deadlock, because ME generates |
---|
| 6155 | + * different wave IDs than the GDS expects. This situation happens |
---|
| 6156 | + * randomly when at least 5 compute pipes use GDS ordered append. |
---|
| 6157 | + * The wave IDs generated by ME are also wrong after suspend/resume. |
---|
| 6158 | + * Those are probably bugs somewhere else in the kernel driver. |
---|
| 6159 | + * |
---|
| 6160 | + * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME and |
---|
| 6161 | + * GDS to 0 for this ring (me/pipe). |
---|
| 6162 | + */ |
---|
| 6163 | + if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) { |
---|
| 6164 | + amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
---|
| 6165 | + amdgpu_ring_write(ring, mmGDS_COMPUTE_MAX_WAVE_ID - PACKET3_SET_CONFIG_REG_START); |
---|
| 6166 | + amdgpu_ring_write(ring, ring->adev->gds.gds_compute_max_wave_id); |
---|
| 6167 | + } |
---|
6391 | 6168 | |
---|
6392 | 6169 | amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); |
---|
6393 | 6170 | amdgpu_ring_write(ring, |
---|
.. | .. |
---|
6491 | 6268 | /* XXX check if swapping is necessary on BE */ |
---|
6492 | 6269 | adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); |
---|
6493 | 6270 | WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); |
---|
6494 | | -} |
---|
6495 | | - |
---|
6496 | | -static void gfx_v8_0_ring_set_pipe_percent(struct amdgpu_ring *ring, |
---|
6497 | | - bool acquire) |
---|
6498 | | -{ |
---|
6499 | | - struct amdgpu_device *adev = ring->adev; |
---|
6500 | | - int pipe_num, tmp, reg; |
---|
6501 | | - int pipe_percent = acquire ? SPI_WCL_PIPE_PERCENT_GFX__VALUE_MASK : 0x1; |
---|
6502 | | - |
---|
6503 | | - pipe_num = ring->me * adev->gfx.mec.num_pipe_per_mec + ring->pipe; |
---|
6504 | | - |
---|
6505 | | - /* first me only has 2 entries, GFX and HP3D */ |
---|
6506 | | - if (ring->me > 0) |
---|
6507 | | - pipe_num -= 2; |
---|
6508 | | - |
---|
6509 | | - reg = mmSPI_WCL_PIPE_PERCENT_GFX + pipe_num; |
---|
6510 | | - tmp = RREG32(reg); |
---|
6511 | | - tmp = REG_SET_FIELD(tmp, SPI_WCL_PIPE_PERCENT_GFX, VALUE, pipe_percent); |
---|
6512 | | - WREG32(reg, tmp); |
---|
6513 | | -} |
---|
6514 | | - |
---|
6515 | | -static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev, |
---|
6516 | | - struct amdgpu_ring *ring, |
---|
6517 | | - bool acquire) |
---|
6518 | | -{ |
---|
6519 | | - int i, pipe; |
---|
6520 | | - bool reserve; |
---|
6521 | | - struct amdgpu_ring *iring; |
---|
6522 | | - |
---|
6523 | | - mutex_lock(&adev->gfx.pipe_reserve_mutex); |
---|
6524 | | - pipe = amdgpu_gfx_queue_to_bit(adev, ring->me, ring->pipe, 0); |
---|
6525 | | - if (acquire) |
---|
6526 | | - set_bit(pipe, adev->gfx.pipe_reserve_bitmap); |
---|
6527 | | - else |
---|
6528 | | - clear_bit(pipe, adev->gfx.pipe_reserve_bitmap); |
---|
6529 | | - |
---|
6530 | | - if (!bitmap_weight(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES)) { |
---|
6531 | | - /* Clear all reservations - everyone reacquires all resources */ |
---|
6532 | | - for (i = 0; i < adev->gfx.num_gfx_rings; ++i) |
---|
6533 | | - gfx_v8_0_ring_set_pipe_percent(&adev->gfx.gfx_ring[i], |
---|
6534 | | - true); |
---|
6535 | | - |
---|
6536 | | - for (i = 0; i < adev->gfx.num_compute_rings; ++i) |
---|
6537 | | - gfx_v8_0_ring_set_pipe_percent(&adev->gfx.compute_ring[i], |
---|
6538 | | - true); |
---|
6539 | | - } else { |
---|
6540 | | - /* Lower all pipes without a current reservation */ |
---|
6541 | | - for (i = 0; i < adev->gfx.num_gfx_rings; ++i) { |
---|
6542 | | - iring = &adev->gfx.gfx_ring[i]; |
---|
6543 | | - pipe = amdgpu_gfx_queue_to_bit(adev, |
---|
6544 | | - iring->me, |
---|
6545 | | - iring->pipe, |
---|
6546 | | - 0); |
---|
6547 | | - reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); |
---|
6548 | | - gfx_v8_0_ring_set_pipe_percent(iring, reserve); |
---|
6549 | | - } |
---|
6550 | | - |
---|
6551 | | - for (i = 0; i < adev->gfx.num_compute_rings; ++i) { |
---|
6552 | | - iring = &adev->gfx.compute_ring[i]; |
---|
6553 | | - pipe = amdgpu_gfx_queue_to_bit(adev, |
---|
6554 | | - iring->me, |
---|
6555 | | - iring->pipe, |
---|
6556 | | - 0); |
---|
6557 | | - reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); |
---|
6558 | | - gfx_v8_0_ring_set_pipe_percent(iring, reserve); |
---|
6559 | | - } |
---|
6560 | | - } |
---|
6561 | | - |
---|
6562 | | - mutex_unlock(&adev->gfx.pipe_reserve_mutex); |
---|
6563 | | -} |
---|
6564 | | - |
---|
6565 | | -static void gfx_v8_0_hqd_set_priority(struct amdgpu_device *adev, |
---|
6566 | | - struct amdgpu_ring *ring, |
---|
6567 | | - bool acquire) |
---|
6568 | | -{ |
---|
6569 | | - uint32_t pipe_priority = acquire ? 0x2 : 0x0; |
---|
6570 | | - uint32_t queue_priority = acquire ? 0xf : 0x0; |
---|
6571 | | - |
---|
6572 | | - mutex_lock(&adev->srbm_mutex); |
---|
6573 | | - vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); |
---|
6574 | | - |
---|
6575 | | - WREG32(mmCP_HQD_PIPE_PRIORITY, pipe_priority); |
---|
6576 | | - WREG32(mmCP_HQD_QUEUE_PRIORITY, queue_priority); |
---|
6577 | | - |
---|
6578 | | - vi_srbm_select(adev, 0, 0, 0, 0); |
---|
6579 | | - mutex_unlock(&adev->srbm_mutex); |
---|
6580 | | -} |
---|
6581 | | -static void gfx_v8_0_ring_set_priority_compute(struct amdgpu_ring *ring, |
---|
6582 | | - enum drm_sched_priority priority) |
---|
6583 | | -{ |
---|
6584 | | - struct amdgpu_device *adev = ring->adev; |
---|
6585 | | - bool acquire = priority == DRM_SCHED_PRIORITY_HIGH_HW; |
---|
6586 | | - |
---|
6587 | | - if (ring->funcs->type != AMDGPU_RING_TYPE_COMPUTE) |
---|
6588 | | - return; |
---|
6589 | | - |
---|
6590 | | - gfx_v8_0_hqd_set_priority(adev, ring, acquire); |
---|
6591 | | - gfx_v8_0_pipe_reserve_resources(adev, ring, acquire); |
---|
6592 | 6271 | } |
---|
6593 | 6272 | |
---|
6594 | 6273 | static void gfx_v8_0_ring_emit_fence_compute(struct amdgpu_ring *ring, |
---|
.. | .. |
---|
6703 | 6382 | ring->ring[offset] = (ring->ring_size >> 2) - offset + cur; |
---|
6704 | 6383 | } |
---|
6705 | 6384 | |
---|
6706 | | -static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) |
---|
| 6385 | +static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, |
---|
| 6386 | + uint32_t reg_val_offs) |
---|
6707 | 6387 | { |
---|
6708 | 6388 | struct amdgpu_device *adev = ring->adev; |
---|
6709 | 6389 | |
---|
.. | .. |
---|
6714 | 6394 | amdgpu_ring_write(ring, reg); |
---|
6715 | 6395 | amdgpu_ring_write(ring, 0); |
---|
6716 | 6396 | amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + |
---|
6717 | | - adev->virt.reg_val_offs * 4)); |
---|
| 6397 | + reg_val_offs * 4)); |
---|
6718 | 6398 | amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + |
---|
6719 | | - adev->virt.reg_val_offs * 4)); |
---|
| 6399 | + reg_val_offs * 4)); |
---|
6720 | 6400 | } |
---|
6721 | 6401 | |
---|
6722 | 6402 | static void gfx_v8_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, |
---|
.. | .. |
---|
6741 | 6421 | amdgpu_ring_write(ring, reg); |
---|
6742 | 6422 | amdgpu_ring_write(ring, 0); |
---|
6743 | 6423 | amdgpu_ring_write(ring, val); |
---|
| 6424 | +} |
---|
| 6425 | + |
---|
| 6426 | +static void gfx_v8_0_ring_soft_recovery(struct amdgpu_ring *ring, unsigned vmid) |
---|
| 6427 | +{ |
---|
| 6428 | + struct amdgpu_device *adev = ring->adev; |
---|
| 6429 | + uint32_t value = 0; |
---|
| 6430 | + |
---|
| 6431 | + value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03); |
---|
| 6432 | + value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); |
---|
| 6433 | + value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); |
---|
| 6434 | + value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); |
---|
| 6435 | + WREG32(mmSQ_CMD, value); |
---|
6744 | 6436 | } |
---|
6745 | 6437 | |
---|
6746 | 6438 | static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, |
---|
.. | .. |
---|
6829 | 6521 | enum amdgpu_interrupt_state state) |
---|
6830 | 6522 | { |
---|
6831 | 6523 | switch (type) { |
---|
6832 | | - case AMDGPU_CP_IRQ_GFX_EOP: |
---|
| 6524 | + case AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP: |
---|
6833 | 6525 | gfx_v8_0_set_gfx_eop_interrupt_state(adev, state); |
---|
6834 | 6526 | break; |
---|
6835 | 6527 | case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP: |
---|
.. | .. |
---|
6965 | 6657 | return 0; |
---|
6966 | 6658 | } |
---|
6967 | 6659 | |
---|
| 6660 | +static void gfx_v8_0_fault(struct amdgpu_device *adev, |
---|
| 6661 | + struct amdgpu_iv_entry *entry) |
---|
| 6662 | +{ |
---|
| 6663 | + u8 me_id, pipe_id, queue_id; |
---|
| 6664 | + struct amdgpu_ring *ring; |
---|
| 6665 | + int i; |
---|
| 6666 | + |
---|
| 6667 | + me_id = (entry->ring_id & 0x0c) >> 2; |
---|
| 6668 | + pipe_id = (entry->ring_id & 0x03) >> 0; |
---|
| 6669 | + queue_id = (entry->ring_id & 0x70) >> 4; |
---|
| 6670 | + |
---|
| 6671 | + switch (me_id) { |
---|
| 6672 | + case 0: |
---|
| 6673 | + drm_sched_fault(&adev->gfx.gfx_ring[0].sched); |
---|
| 6674 | + break; |
---|
| 6675 | + case 1: |
---|
| 6676 | + case 2: |
---|
| 6677 | + for (i = 0; i < adev->gfx.num_compute_rings; i++) { |
---|
| 6678 | + ring = &adev->gfx.compute_ring[i]; |
---|
| 6679 | + if (ring->me == me_id && ring->pipe == pipe_id && |
---|
| 6680 | + ring->queue == queue_id) |
---|
| 6681 | + drm_sched_fault(&ring->sched); |
---|
| 6682 | + } |
---|
| 6683 | + break; |
---|
| 6684 | + } |
---|
| 6685 | +} |
---|
| 6686 | + |
---|
6968 | 6687 | static int gfx_v8_0_priv_reg_irq(struct amdgpu_device *adev, |
---|
6969 | 6688 | struct amdgpu_irq_src *source, |
---|
6970 | 6689 | struct amdgpu_iv_entry *entry) |
---|
6971 | 6690 | { |
---|
6972 | 6691 | DRM_ERROR("Illegal register access in command stream\n"); |
---|
6973 | | - schedule_work(&adev->reset_work); |
---|
| 6692 | + gfx_v8_0_fault(adev, entry); |
---|
6974 | 6693 | return 0; |
---|
6975 | 6694 | } |
---|
6976 | 6695 | |
---|
.. | .. |
---|
6979 | 6698 | struct amdgpu_iv_entry *entry) |
---|
6980 | 6699 | { |
---|
6981 | 6700 | DRM_ERROR("Illegal instruction in command stream\n"); |
---|
6982 | | - schedule_work(&adev->reset_work); |
---|
| 6701 | + gfx_v8_0_fault(adev, entry); |
---|
6983 | 6702 | return 0; |
---|
6984 | 6703 | } |
---|
6985 | 6704 | |
---|
.. | .. |
---|
7091 | 6810 | return 0; |
---|
7092 | 6811 | } |
---|
7093 | 6812 | |
---|
7094 | | -static int gfx_v8_0_kiq_set_interrupt_state(struct amdgpu_device *adev, |
---|
7095 | | - struct amdgpu_irq_src *src, |
---|
7096 | | - unsigned int type, |
---|
7097 | | - enum amdgpu_interrupt_state state) |
---|
| 6813 | +static void gfx_v8_0_emit_mem_sync(struct amdgpu_ring *ring) |
---|
7098 | 6814 | { |
---|
7099 | | - struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); |
---|
7100 | | - |
---|
7101 | | - switch (type) { |
---|
7102 | | - case AMDGPU_CP_KIQ_IRQ_DRIVER0: |
---|
7103 | | - WREG32_FIELD(CPC_INT_CNTL, GENERIC2_INT_ENABLE, |
---|
7104 | | - state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
---|
7105 | | - if (ring->me == 1) |
---|
7106 | | - WREG32_FIELD_OFFSET(CP_ME1_PIPE0_INT_CNTL, |
---|
7107 | | - ring->pipe, |
---|
7108 | | - GENERIC2_INT_ENABLE, |
---|
7109 | | - state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
---|
7110 | | - else |
---|
7111 | | - WREG32_FIELD_OFFSET(CP_ME2_PIPE0_INT_CNTL, |
---|
7112 | | - ring->pipe, |
---|
7113 | | - GENERIC2_INT_ENABLE, |
---|
7114 | | - state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
---|
7115 | | - break; |
---|
7116 | | - default: |
---|
7117 | | - BUG(); /* kiq only support GENERIC2_INT now */ |
---|
7118 | | - break; |
---|
7119 | | - } |
---|
7120 | | - return 0; |
---|
| 6815 | + amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
---|
| 6816 | + amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | |
---|
| 6817 | + PACKET3_TC_ACTION_ENA | |
---|
| 6818 | + PACKET3_SH_KCACHE_ACTION_ENA | |
---|
| 6819 | + PACKET3_SH_ICACHE_ACTION_ENA | |
---|
| 6820 | + PACKET3_TC_WB_ACTION_ENA); /* CP_COHER_CNTL */ |
---|
| 6821 | + amdgpu_ring_write(ring, 0xffffffff); /* CP_COHER_SIZE */ |
---|
| 6822 | + amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */ |
---|
| 6823 | + amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ |
---|
7121 | 6824 | } |
---|
7122 | 6825 | |
---|
7123 | | -static int gfx_v8_0_kiq_irq(struct amdgpu_device *adev, |
---|
7124 | | - struct amdgpu_irq_src *source, |
---|
7125 | | - struct amdgpu_iv_entry *entry) |
---|
| 6826 | +static void gfx_v8_0_emit_mem_sync_compute(struct amdgpu_ring *ring) |
---|
7126 | 6827 | { |
---|
7127 | | - u8 me_id, pipe_id, queue_id; |
---|
7128 | | - struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); |
---|
7129 | | - |
---|
7130 | | - me_id = (entry->ring_id & 0x0c) >> 2; |
---|
7131 | | - pipe_id = (entry->ring_id & 0x03) >> 0; |
---|
7132 | | - queue_id = (entry->ring_id & 0x70) >> 4; |
---|
7133 | | - DRM_DEBUG("IH: CPC GENERIC2_INT, me:%d, pipe:%d, queue:%d\n", |
---|
7134 | | - me_id, pipe_id, queue_id); |
---|
7135 | | - |
---|
7136 | | - amdgpu_fence_process(ring); |
---|
7137 | | - return 0; |
---|
| 6828 | + amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5)); |
---|
| 6829 | + amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | |
---|
| 6830 | + PACKET3_TC_ACTION_ENA | |
---|
| 6831 | + PACKET3_SH_KCACHE_ACTION_ENA | |
---|
| 6832 | + PACKET3_SH_ICACHE_ACTION_ENA | |
---|
| 6833 | + PACKET3_TC_WB_ACTION_ENA); /* CP_COHER_CNTL */ |
---|
| 6834 | + amdgpu_ring_write(ring, 0xffffffff); /* CP_COHER_SIZE */ |
---|
| 6835 | + amdgpu_ring_write(ring, 0xff); /* CP_COHER_SIZE_HI */ |
---|
| 6836 | + amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */ |
---|
| 6837 | + amdgpu_ring_write(ring, 0); /* CP_COHER_BASE_HI */ |
---|
| 6838 | + amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ |
---|
7138 | 6839 | } |
---|
7139 | 6840 | |
---|
7140 | 6841 | static const struct amd_ip_funcs gfx_v8_0_ip_funcs = { |
---|
.. | .. |
---|
7183 | 6884 | 3 + /* CNTX_CTRL */ |
---|
7184 | 6885 | 5 + /* HDP_INVL */ |
---|
7185 | 6886 | 12 + 12 + /* FENCE x2 */ |
---|
7186 | | - 2, /* SWITCH_BUFFER */ |
---|
| 6887 | + 2 + /* SWITCH_BUFFER */ |
---|
| 6888 | + 5, /* SURFACE_SYNC */ |
---|
7187 | 6889 | .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_gfx */ |
---|
7188 | 6890 | .emit_ib = gfx_v8_0_ring_emit_ib_gfx, |
---|
7189 | 6891 | .emit_fence = gfx_v8_0_ring_emit_fence_gfx, |
---|
.. | .. |
---|
7200 | 6902 | .init_cond_exec = gfx_v8_0_ring_emit_init_cond_exec, |
---|
7201 | 6903 | .patch_cond_exec = gfx_v8_0_ring_emit_patch_cond_exec, |
---|
7202 | 6904 | .emit_wreg = gfx_v8_0_ring_emit_wreg, |
---|
| 6905 | + .soft_recovery = gfx_v8_0_ring_soft_recovery, |
---|
| 6906 | + .emit_mem_sync = gfx_v8_0_emit_mem_sync, |
---|
7203 | 6907 | }; |
---|
7204 | 6908 | |
---|
7205 | 6909 | static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { |
---|
.. | .. |
---|
7216 | 6920 | 5 + /* hdp_invalidate */ |
---|
7217 | 6921 | 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ |
---|
7218 | 6922 | VI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v8_0_ring_emit_vm_flush */ |
---|
7219 | | - 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ |
---|
7220 | | - .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ |
---|
| 6923 | + 7 + 7 + 7 + /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ |
---|
| 6924 | + 7, /* gfx_v8_0_emit_mem_sync_compute */ |
---|
| 6925 | + .emit_ib_size = 7, /* gfx_v8_0_ring_emit_ib_compute */ |
---|
7221 | 6926 | .emit_ib = gfx_v8_0_ring_emit_ib_compute, |
---|
7222 | 6927 | .emit_fence = gfx_v8_0_ring_emit_fence_compute, |
---|
7223 | 6928 | .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync, |
---|
.. | .. |
---|
7228 | 6933 | .test_ib = gfx_v8_0_ring_test_ib, |
---|
7229 | 6934 | .insert_nop = amdgpu_ring_insert_nop, |
---|
7230 | 6935 | .pad_ib = amdgpu_ring_generic_pad_ib, |
---|
7231 | | - .set_priority = gfx_v8_0_ring_set_priority_compute, |
---|
7232 | 6936 | .emit_wreg = gfx_v8_0_ring_emit_wreg, |
---|
| 6937 | + .emit_mem_sync = gfx_v8_0_emit_mem_sync_compute, |
---|
7233 | 6938 | }; |
---|
7234 | 6939 | |
---|
7235 | 6940 | static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = { |
---|
.. | .. |
---|
7247 | 6952 | 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ |
---|
7248 | 6953 | 17 + /* gfx_v8_0_ring_emit_vm_flush */ |
---|
7249 | 6954 | 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_kiq x3 for user fence, vm fence */ |
---|
7250 | | - .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ |
---|
7251 | | - .emit_ib = gfx_v8_0_ring_emit_ib_compute, |
---|
| 6955 | + .emit_ib_size = 7, /* gfx_v8_0_ring_emit_ib_compute */ |
---|
7252 | 6956 | .emit_fence = gfx_v8_0_ring_emit_fence_kiq, |
---|
7253 | 6957 | .test_ring = gfx_v8_0_ring_test_ring, |
---|
7254 | | - .test_ib = gfx_v8_0_ring_test_ib, |
---|
7255 | 6958 | .insert_nop = amdgpu_ring_insert_nop, |
---|
7256 | 6959 | .pad_ib = amdgpu_ring_generic_pad_ib, |
---|
7257 | 6960 | .emit_rreg = gfx_v8_0_ring_emit_rreg, |
---|
.. | .. |
---|
7286 | 6989 | .process = gfx_v8_0_priv_inst_irq, |
---|
7287 | 6990 | }; |
---|
7288 | 6991 | |
---|
7289 | | -static const struct amdgpu_irq_src_funcs gfx_v8_0_kiq_irq_funcs = { |
---|
7290 | | - .set = gfx_v8_0_kiq_set_interrupt_state, |
---|
7291 | | - .process = gfx_v8_0_kiq_irq, |
---|
7292 | | -}; |
---|
7293 | | - |
---|
7294 | 6992 | static const struct amdgpu_irq_src_funcs gfx_v8_0_cp_ecc_error_irq_funcs = { |
---|
7295 | 6993 | .set = gfx_v8_0_set_cp_ecc_int_state, |
---|
7296 | 6994 | .process = gfx_v8_0_cp_ecc_error_irq, |
---|
.. | .. |
---|
7312 | 7010 | adev->gfx.priv_inst_irq.num_types = 1; |
---|
7313 | 7011 | adev->gfx.priv_inst_irq.funcs = &gfx_v8_0_priv_inst_irq_funcs; |
---|
7314 | 7012 | |
---|
7315 | | - adev->gfx.kiq.irq.num_types = AMDGPU_CP_KIQ_IRQ_LAST; |
---|
7316 | | - adev->gfx.kiq.irq.funcs = &gfx_v8_0_kiq_irq_funcs; |
---|
7317 | | - |
---|
7318 | 7013 | adev->gfx.cp_ecc_error_irq.num_types = 1; |
---|
7319 | 7014 | adev->gfx.cp_ecc_error_irq.funcs = &gfx_v8_0_cp_ecc_error_irq_funcs; |
---|
7320 | 7015 | |
---|
.. | .. |
---|
7330 | 7025 | static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev) |
---|
7331 | 7026 | { |
---|
7332 | 7027 | /* init asci gds info */ |
---|
7333 | | - adev->gds.mem.total_size = RREG32(mmGDS_VMID0_SIZE); |
---|
7334 | | - adev->gds.gws.total_size = 64; |
---|
7335 | | - adev->gds.oa.total_size = 16; |
---|
7336 | | - |
---|
7337 | | - if (adev->gds.mem.total_size == 64 * 1024) { |
---|
7338 | | - adev->gds.mem.gfx_partition_size = 4096; |
---|
7339 | | - adev->gds.mem.cs_partition_size = 4096; |
---|
7340 | | - |
---|
7341 | | - adev->gds.gws.gfx_partition_size = 4; |
---|
7342 | | - adev->gds.gws.cs_partition_size = 4; |
---|
7343 | | - |
---|
7344 | | - adev->gds.oa.gfx_partition_size = 4; |
---|
7345 | | - adev->gds.oa.cs_partition_size = 1; |
---|
7346 | | - } else { |
---|
7347 | | - adev->gds.mem.gfx_partition_size = 1024; |
---|
7348 | | - adev->gds.mem.cs_partition_size = 1024; |
---|
7349 | | - |
---|
7350 | | - adev->gds.gws.gfx_partition_size = 16; |
---|
7351 | | - adev->gds.gws.cs_partition_size = 16; |
---|
7352 | | - |
---|
7353 | | - adev->gds.oa.gfx_partition_size = 4; |
---|
7354 | | - adev->gds.oa.cs_partition_size = 4; |
---|
7355 | | - } |
---|
| 7028 | + adev->gds.gds_size = RREG32(mmGDS_VMID0_SIZE); |
---|
| 7029 | + adev->gds.gws_size = 64; |
---|
| 7030 | + adev->gds.oa_size = 16; |
---|
| 7031 | + adev->gds.gds_compute_max_wave_id = RREG32(mmGDS_COMPUTE_MAX_WAVE_ID); |
---|
7356 | 7032 | } |
---|
7357 | 7033 | |
---|
7358 | 7034 | static void gfx_v8_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev, |
---|