Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-next-5.5-2019-11-22' of git://people.freedesktop.org/~agd5f/linux into drm-next

drm-next-5.5-2019-11-22:

amdgpu:
- Fix bad DMA on some PPC platforms
- MMHUB fix for powergating
- BACO fix for Navi
- Misc raven fixes
- Enable vbios fetch directly from rom on navi
- debugfs fix for DC
- SR-IOV fixes for arcturus
- Misc power fixes

radeon:
- Fix bad DMA on some PPC platforms

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191122203025.3787-1-alexander.deucher@amd.com

+362 -53
+1 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 3109 3109 int r; 3110 3110 3111 3111 DRM_INFO("amdgpu: finishing device.\n"); 3112 - adev->shutdown = true; 3113 - 3114 3112 flush_delayed_work(&adev->delayed_init_work); 3113 + adev->shutdown = true; 3115 3114 3116 3115 /* disable all interrupts */ 3117 3116 amdgpu_irq_disable_all(adev); ··· 3129 3130 adev->firmware.gpu_info_fw = NULL; 3130 3131 } 3131 3132 adev->accel_working = false; 3132 - cancel_delayed_work_sync(&adev->delayed_init_work); 3133 3133 /* free i2c buses */ 3134 3134 if (!amdgpu_device_has_dc_support(adev)) 3135 3135 amdgpu_i2c_fini(adev);
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
··· 514 514 * Also, don't allow GTT domain if the BO doens't have USWC falg set. 515 515 */ 516 516 if (adev->asic_type >= CHIP_CARRIZO && 517 - adev->asic_type <= CHIP_RAVEN && 517 + adev->asic_type < CHIP_RAVEN && 518 518 (adev->flags & AMD_IS_APU) && 519 519 (bo_flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) && 520 520 amdgpu_bo_support_uswc(bo_flags) &&
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 998 998 {0x1002, 0x731B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10}, 999 999 {0x1002, 0x731F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10}, 1000 1000 /* Navi14 */ 1001 - {0x1002, 0x7340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14|AMD_EXP_HW_SUPPORT}, 1002 - {0x1002, 0x7341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14|AMD_EXP_HW_SUPPORT}, 1003 - {0x1002, 0x7347, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14|AMD_EXP_HW_SUPPORT}, 1004 - {0x1002, 0x734F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14|AMD_EXP_HW_SUPPORT}, 1001 + {0x1002, 0x7340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14}, 1002 + {0x1002, 0x7341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14}, 1003 + {0x1002, 0x7347, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14}, 1004 + {0x1002, 0x734F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14}, 1005 1005 1006 1006 /* Renoir */ 1007 1007 {0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU|AMD_EXP_HW_SUPPORT},
-2
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
··· 454 454 } 455 455 456 456 ring = &adev->gfx.kiq.ring; 457 - if (adev->asic_type >= CHIP_NAVI10 && amdgpu_async_gfx_ring) 458 - kfree(adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS]); 459 457 kfree(adev->gfx.mec.mqd_backup[AMDGPU_MAX_COMPUTE_RINGS]); 460 458 amdgpu_bo_free_kernel(&ring->mqd_obj, 461 459 &ring->mqd_gpu_addr,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
··· 225 225 uint32_t num_me; 226 226 uint32_t num_pipe_per_me; 227 227 uint32_t num_queue_per_pipe; 228 - void *mqd_backup[AMDGPU_MAX_GFX_RINGS + 1]; 228 + void *mqd_backup[AMDGPU_MAX_GFX_RINGS]; 229 229 230 230 /* These are the resources for which amdgpu takes ownership */ 231 231 DECLARE_BITMAP(queue_bitmap, AMDGPU_MAX_GFX_QUEUES);
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
··· 77 77 struct amdgpu_vmhub { 78 78 uint32_t ctx0_ptb_addr_lo32; 79 79 uint32_t ctx0_ptb_addr_hi32; 80 + uint32_t vm_inv_eng0_sem; 80 81 uint32_t vm_inv_eng0_req; 81 82 uint32_t vm_inv_eng0_ack; 82 83 uint32_t vm_context0_cntl;
+5 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
··· 655 655 return -ENOMEM; 656 656 alloc_size = info->read_mmr_reg.count * sizeof(*regs); 657 657 658 - for (i = 0; i < info->read_mmr_reg.count; i++) 658 + amdgpu_gfx_off_ctrl(adev, false); 659 + for (i = 0; i < info->read_mmr_reg.count; i++) { 659 660 if (amdgpu_asic_read_register(adev, se_num, sh_num, 660 661 info->read_mmr_reg.dword_offset + i, 661 662 &regs[i])) { 662 663 DRM_DEBUG_KMS("unallowed offset %#x\n", 663 664 info->read_mmr_reg.dword_offset + i); 664 665 kfree(regs); 666 + amdgpu_gfx_off_ctrl(adev, true); 665 667 return -EFAULT; 666 668 } 669 + } 670 + amdgpu_gfx_off_ctrl(adev, true); 667 671 n = copy_to_user(out, regs, min(size, alloc_size)); 668 672 kfree(regs); 669 673 return n ? -EFAULT : 0;
+40 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 758 758 { 759 759 int ret; 760 760 761 + /* 762 + * TODO: bypass the terminate in sriov for now 763 + */ 764 + if (amdgpu_sriov_vf(psp->adev)) 765 + return 0; 766 + 761 767 if (!psp->ras.ras_initialized) 762 768 return 0; 763 769 ··· 784 778 static int psp_ras_initialize(struct psp_context *psp) 785 779 { 786 780 int ret; 781 + 782 + /* 783 + * TODO: bypass the initialize in sriov for now 784 + */ 785 + if (amdgpu_sriov_vf(psp->adev)) 786 + return 0; 787 787 788 788 if (!psp->adev->psp.ta_ras_ucode_size || 789 789 !psp->adev->psp.ta_ras_start_addr) { ··· 886 874 { 887 875 int ret; 888 876 877 + /* 878 + * TODO: bypass the initialize in sriov for now 879 + */ 880 + if (amdgpu_sriov_vf(psp->adev)) 881 + return 0; 882 + 889 883 if (!psp->adev->psp.ta_hdcp_ucode_size || 890 884 !psp->adev->psp.ta_hdcp_start_addr) { 891 885 dev_warn(psp->adev->dev, "HDCP: hdcp ta ucode is not available\n"); ··· 979 961 static int psp_hdcp_terminate(struct psp_context *psp) 980 962 { 981 963 int ret; 964 + 965 + /* 966 + * TODO: bypass the terminate in sriov for now 967 + */ 968 + if (amdgpu_sriov_vf(psp->adev)) 969 + return 0; 982 970 983 971 if (!psp->hdcp_context.hdcp_initialized) 984 972 return 0; ··· 1077 1053 { 1078 1054 int ret; 1079 1055 1056 + /* 1057 + * TODO: bypass the initialize in sriov for now 1058 + */ 1059 + if (amdgpu_sriov_vf(psp->adev)) 1060 + return 0; 1061 + 1080 1062 if (!psp->adev->psp.ta_dtm_ucode_size || 1081 1063 !psp->adev->psp.ta_dtm_start_addr) { 1082 1064 dev_warn(psp->adev->dev, "DTM: dtm ta ucode is not available\n"); ··· 1140 1110 static int psp_dtm_terminate(struct psp_context *psp) 1141 1111 { 1142 1112 int ret; 1113 + 1114 + /* 1115 + * TODO: bypass the terminate in sriov for now 1116 + */ 1117 + if (amdgpu_sriov_vf(psp->adev)) 1118 + return 0; 1143 1119 1144 1120 if (!psp->dtm_context.dtm_initialized) 1145 1121 return 0; ··· 1467 1431 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5 1468 1432 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6 1469 1433 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7 1470 - || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G)) 1434 + || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G 1435 + || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL 1436 + || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM 1437 + || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM)) 1471 1438 /*skip ucode loading in SRIOV VF */ 1472 1439 continue; 1473 1440
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
··· 473 473 TP_PROTO(struct amdgpu_job *sched_job, struct dma_fence *fence), 474 474 TP_ARGS(sched_job, fence), 475 475 TP_STRUCT__entry( 476 - __string(ring, sched_job->base.sched->name); 476 + __string(ring, sched_job->base.sched->name) 477 477 __field(uint64_t, id) 478 478 __field(struct dma_fence *, fence) 479 479 __field(uint64_t, ctx)
+54 -12
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
··· 1785 1785 WREG32_SOC15(GC, 0, mmCP_INT_CNTL_RING0, tmp); 1786 1786 } 1787 1787 1788 - static void gfx_v10_0_init_csb(struct amdgpu_device *adev) 1788 + static int gfx_v10_0_init_csb(struct amdgpu_device *adev) 1789 1789 { 1790 + int r; 1791 + 1792 + if (adev->in_gpu_reset) { 1793 + r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1794 + if (r) 1795 + return r; 1796 + 1797 + r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, 1798 + (void **)&adev->gfx.rlc.cs_ptr); 1799 + if (!r) { 1800 + adev->gfx.rlc.funcs->get_csb_buffer(adev, 1801 + adev->gfx.rlc.cs_ptr); 1802 + amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj); 1803 + } 1804 + 1805 + amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1806 + if (r) 1807 + return r; 1808 + } 1809 + 1790 1810 /* csib */ 1791 1811 WREG32_SOC15(GC, 0, mmRLC_CSIB_ADDR_HI, 1792 1812 adev->gfx.rlc.clear_state_gpu_addr >> 32); 1793 1813 WREG32_SOC15(GC, 0, mmRLC_CSIB_ADDR_LO, 1794 1814 adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc); 1795 1815 WREG32_SOC15(GC, 0, mmRLC_CSIB_LENGTH, adev->gfx.rlc.clear_state_size); 1816 + 1817 + return 0; 1796 1818 } 1797 1819 1798 - static void gfx_v10_0_init_pg(struct amdgpu_device *adev) 1820 + static int gfx_v10_0_init_pg(struct amdgpu_device *adev) 1799 1821 { 1800 1822 int i; 1823 + int r; 1801 1824 1802 - gfx_v10_0_init_csb(adev); 1825 + r = gfx_v10_0_init_csb(adev); 1826 + if (r) 1827 + return r; 1803 1828 1804 1829 for (i = 0; i < adev->num_vmhubs; i++) 1805 1830 amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0); 1806 1831 1807 1832 /* TODO: init power gating */ 1808 - return; 1833 + return 0; 1809 1834 } 1810 1835 1811 1836 void gfx_v10_0_rlc_stop(struct amdgpu_device *adev) ··· 1932 1907 r = gfx_v10_0_wait_for_rlc_autoload_complete(adev); 1933 1908 if (r) 1934 1909 return r; 1935 - gfx_v10_0_init_pg(adev); 1910 + 1911 + r = gfx_v10_0_init_pg(adev); 1912 + if (r) 1913 + return r; 1936 1914 1937 1915 /* enable RLC SRM */ 1938 1916 gfx_v10_0_rlc_enable_srm(adev); ··· 1961 1933 return r; 1962 1934 } 1963 1935 1964 - gfx_v10_0_init_pg(adev); 1936 + r = gfx_v10_0_init_pg(adev); 1937 + if (r) 1938 + return r; 1939 + 1965 1940 adev->gfx.rlc.funcs->start(adev); 1966 1941 1967 1942 if (adev->firmware.load_type == AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO) { ··· 2431 2400 return 0; 2432 2401 } 2433 2402 2434 - static void gfx_v10_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) 2403 + static int gfx_v10_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) 2435 2404 { 2436 2405 int i; 2437 2406 u32 tmp = RREG32_SOC15(GC, 0, mmCP_ME_CNTL); ··· 2444 2413 adev->gfx.gfx_ring[i].sched.ready = false; 2445 2414 } 2446 2415 WREG32_SOC15(GC, 0, mmCP_ME_CNTL, tmp); 2447 - udelay(50); 2416 + 2417 + for (i = 0; i < adev->usec_timeout; i++) { 2418 + if (RREG32_SOC15(GC, 0, mmCP_STAT) == 0) 2419 + break; 2420 + udelay(1); 2421 + } 2422 + 2423 + if (i >= adev->usec_timeout) 2424 + DRM_ERROR("failed to %s cp gfx\n", enable ? "unhalt" : "halt"); 2425 + 2426 + return 0; 2448 2427 } 2449 2428 2450 2429 static int gfx_v10_0_cp_gfx_load_pfp_microcode(struct amdgpu_device *adev) ··· 3155 3114 { 3156 3115 struct amdgpu_device *adev = ring->adev; 3157 3116 struct v10_gfx_mqd *mqd = ring->mqd_ptr; 3117 + int mqd_idx = ring - &adev->gfx.gfx_ring[0]; 3158 3118 3159 3119 if (!adev->in_gpu_reset && !adev->in_suspend) { 3160 3120 memset((void *)mqd, 0, sizeof(*mqd)); ··· 3167 3125 #endif 3168 3126 nv_grbm_select(adev, 0, 0, 0, 0); 3169 3127 mutex_unlock(&adev->srbm_mutex); 3170 - if (adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS]) 3171 - memcpy(adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS], mqd, sizeof(*mqd)); 3128 + if (adev->gfx.me.mqd_backup[mqd_idx]) 3129 + memcpy(adev->gfx.me.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); 3172 3130 } else if (adev->in_gpu_reset) { 3173 3131 /* reset mqd with the backup copy */ 3174 - if (adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS]) 3175 - memcpy(mqd, adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS], sizeof(*mqd)); 3132 + if (adev->gfx.me.mqd_backup[mqd_idx]) 3133 + memcpy(mqd, adev->gfx.me.mqd_backup[mqd_idx], sizeof(*mqd)); 3176 3134 /* reset the ring */ 3177 3135 ring->wptr = 0; 3178 3136 adev->wb.wb[ring->wptr_offs] = 0;
+8 -2
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 704 704 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_4_ARCT, 0x3fffffff, 0xb90f5b1), 705 705 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_5_ARCT, 0x3ff, 0x135), 706 706 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_CONFIG, 0xffffffff, 0x011A0000), 707 + SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_FIFO_SIZES, 0xffffffff, 0x00000f00), 707 708 }; 708 709 709 710 static const u32 GFX_RLC_SRM_INDEX_CNTL_ADDR_OFFSETS[] = ··· 1052 1051 case CHIP_VEGA20: 1053 1052 break; 1054 1053 case CHIP_RAVEN: 1055 - if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) 1056 - &&((adev->gfx.rlc_fw_version != 106 && 1054 + /* Disable GFXOFF on original raven. There are combinations 1055 + * of sbios and platforms that are not stable. 1056 + */ 1057 + if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8)) 1058 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 1059 + else if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) 1060 + &&((adev->gfx.rlc_fw_version != 106 && 1057 1061 adev->gfx.rlc_fw_version < 531) || 1058 1062 (adev->gfx.rlc_fw_version == 53815) || 1059 1063 (adev->gfx.rlc_feature_version < 1) ||
+2
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
··· 367 367 hub->ctx0_ptb_addr_hi32 = 368 368 SOC15_REG_OFFSET(GC, 0, 369 369 mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); 370 + hub->vm_inv_eng0_sem = 371 + SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG0_SEM); 370 372 hub->vm_inv_eng0_req = 371 373 SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG0_REQ); 372 374 hub->vm_inv_eng0_ack =
+2
drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c
··· 356 356 hub->ctx0_ptb_addr_hi32 = 357 357 SOC15_REG_OFFSET(GC, 0, 358 358 mmGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); 359 + hub->vm_inv_eng0_sem = 360 + SOC15_REG_OFFSET(GC, 0, mmGCVM_INVALIDATE_ENG0_SEM); 359 361 hub->vm_inv_eng0_req = 360 362 SOC15_REG_OFFSET(GC, 0, mmGCVM_INVALIDATE_ENG0_REQ); 361 363 hub->vm_inv_eng0_ack =
+57
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
··· 235 235 const unsigned eng = 17; 236 236 unsigned int i; 237 237 238 + spin_lock(&adev->gmc.invalidate_lock); 239 + /* 240 + * It may lose gpuvm invalidate acknowldege state across power-gating 241 + * off cycle, add semaphore acquire before invalidation and semaphore 242 + * release after invalidation to avoid entering power gated state 243 + * to WA the Issue 244 + */ 245 + 246 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 247 + if (vmhub == AMDGPU_MMHUB_0 || 248 + vmhub == AMDGPU_MMHUB_1) { 249 + for (i = 0; i < adev->usec_timeout; i++) { 250 + /* a read return value of 1 means semaphore acuqire */ 251 + tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem + eng); 252 + if (tmp & 0x1) 253 + break; 254 + udelay(1); 255 + } 256 + 257 + if (i >= adev->usec_timeout) 258 + DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n"); 259 + } 260 + 238 261 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); 239 262 240 263 /* ··· 276 253 277 254 udelay(1); 278 255 } 256 + 257 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 258 + if (vmhub == AMDGPU_MMHUB_0 || 259 + vmhub == AMDGPU_MMHUB_1) 260 + /* 261 + * add semaphore release after invalidation, 262 + * write with 0 means semaphore release 263 + */ 264 + WREG32_NO_KIQ(hub->vm_inv_eng0_sem + eng, 0); 265 + 266 + spin_unlock(&adev->gmc.invalidate_lock); 279 267 280 268 if (i < adev->usec_timeout) 281 269 return; ··· 372 338 uint32_t req = gmc_v10_0_get_invalidate_req(vmid, 0); 373 339 unsigned eng = ring->vm_inv_eng; 374 340 341 + /* 342 + * It may lose gpuvm invalidate acknowldege state across power-gating 343 + * off cycle, add semaphore acquire before invalidation and semaphore 344 + * release after invalidation to avoid entering power gated state 345 + * to WA the Issue 346 + */ 347 + 348 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 349 + if (ring->funcs->vmhub == AMDGPU_MMHUB_0 || 350 + ring->funcs->vmhub == AMDGPU_MMHUB_1) 351 + /* a read return value of 1 means semaphore acuqire */ 352 + amdgpu_ring_emit_reg_wait(ring, 353 + hub->vm_inv_eng0_sem + eng, 0x1, 0x1); 354 + 375 355 amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + (2 * vmid), 376 356 lower_32_bits(pd_addr)); 377 357 ··· 395 347 amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req + eng, 396 348 hub->vm_inv_eng0_ack + eng, 397 349 req, 1 << vmid); 350 + 351 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 352 + if (ring->funcs->vmhub == AMDGPU_MMHUB_0 || 353 + ring->funcs->vmhub == AMDGPU_MMHUB_1) 354 + /* 355 + * add semaphore release after invalidation, 356 + * write with 0 means semaphore release 357 + */ 358 + amdgpu_ring_emit_wreg(ring, hub->vm_inv_eng0_sem + eng, 0); 398 359 399 360 return pd_addr; 400 361 }
+57
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 459 459 } 460 460 461 461 spin_lock(&adev->gmc.invalidate_lock); 462 + 463 + /* 464 + * It may lose gpuvm invalidate acknowldege state across power-gating 465 + * off cycle, add semaphore acquire before invalidation and semaphore 466 + * release after invalidation to avoid entering power gated state 467 + * to WA the Issue 468 + */ 469 + 470 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 471 + if (vmhub == AMDGPU_MMHUB_0 || 472 + vmhub == AMDGPU_MMHUB_1) { 473 + for (j = 0; j < adev->usec_timeout; j++) { 474 + /* a read return value of 1 means semaphore acuqire */ 475 + tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem + eng); 476 + if (tmp & 0x1) 477 + break; 478 + udelay(1); 479 + } 480 + 481 + if (j >= adev->usec_timeout) 482 + DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n"); 483 + } 484 + 462 485 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); 463 486 464 487 /* ··· 497 474 break; 498 475 udelay(1); 499 476 } 477 + 478 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 479 + if (vmhub == AMDGPU_MMHUB_0 || 480 + vmhub == AMDGPU_MMHUB_1) 481 + /* 482 + * add semaphore release after invalidation, 483 + * write with 0 means semaphore release 484 + */ 485 + WREG32_NO_KIQ(hub->vm_inv_eng0_sem + eng, 0); 486 + 500 487 spin_unlock(&adev->gmc.invalidate_lock); 488 + 501 489 if (j < adev->usec_timeout) 502 490 return; 503 491 ··· 523 489 uint32_t req = gmc_v9_0_get_invalidate_req(vmid, 0); 524 490 unsigned eng = ring->vm_inv_eng; 525 491 492 + /* 493 + * It may lose gpuvm invalidate acknowldege state across power-gating 494 + * off cycle, add semaphore acquire before invalidation and semaphore 495 + * release after invalidation to avoid entering power gated state 496 + * to WA the Issue 497 + */ 498 + 499 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 500 + if (ring->funcs->vmhub == AMDGPU_MMHUB_0 || 501 + ring->funcs->vmhub == AMDGPU_MMHUB_1) 502 + /* a read return value of 1 means semaphore acuqire */ 503 + amdgpu_ring_emit_reg_wait(ring, 504 + hub->vm_inv_eng0_sem + eng, 0x1, 0x1); 505 + 526 506 amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + (2 * vmid), 527 507 lower_32_bits(pd_addr)); 528 508 ··· 546 498 amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req + eng, 547 499 hub->vm_inv_eng0_ack + eng, 548 500 req, 1 << vmid); 501 + 502 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 503 + if (ring->funcs->vmhub == AMDGPU_MMHUB_0 || 504 + ring->funcs->vmhub == AMDGPU_MMHUB_1) 505 + /* 506 + * add semaphore release after invalidation, 507 + * write with 0 means semaphore release 508 + */ 509 + amdgpu_ring_emit_wreg(ring, hub->vm_inv_eng0_sem + eng, 0); 549 510 550 511 return pd_addr; 551 512 }
+2
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 420 420 hub->ctx0_ptb_addr_hi32 = 421 421 SOC15_REG_OFFSET(MMHUB, 0, 422 422 mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); 423 + hub->vm_inv_eng0_sem = 424 + SOC15_REG_OFFSET(MMHUB, 0, mmVM_INVALIDATE_ENG0_SEM); 423 425 hub->vm_inv_eng0_req = 424 426 SOC15_REG_OFFSET(MMHUB, 0, mmVM_INVALIDATE_ENG0_REQ); 425 427 hub->vm_inv_eng0_ack =
+2
drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
··· 348 348 hub->ctx0_ptb_addr_hi32 = 349 349 SOC15_REG_OFFSET(MMHUB, 0, 350 350 mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); 351 + hub->vm_inv_eng0_sem = 352 + SOC15_REG_OFFSET(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_SEM); 351 353 hub->vm_inv_eng0_req = 352 354 SOC15_REG_OFFSET(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_REQ); 353 355 hub->vm_inv_eng0_ack =
+4
drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
··· 504 504 SOC15_REG_OFFSET(MMHUB, 0, 505 505 mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32) + 506 506 i * MMHUB_INSTANCE_REGISTER_OFFSET; 507 + hub[i]->vm_inv_eng0_sem = 508 + SOC15_REG_OFFSET(MMHUB, 0, 509 + mmVML2VC0_VM_INVALIDATE_ENG0_SEM) + 510 + i * MMHUB_INSTANCE_REGISTER_OFFSET; 507 511 hub[i]->vm_inv_eng0_req = 508 512 SOC15_REG_OFFSET(MMHUB, 0, 509 513 mmVML2VC0_VM_INVALIDATE_ENG0_REQ) +
+22 -2
drivers/gpu/drm/amd/amdgpu/nv.c
··· 40 40 #include "gc/gc_10_1_0_sh_mask.h" 41 41 #include "hdp/hdp_5_0_0_offset.h" 42 42 #include "hdp/hdp_5_0_0_sh_mask.h" 43 + #include "smuio/smuio_11_0_0_offset.h" 43 44 44 45 #include "soc15.h" 45 46 #include "soc15_common.h" ··· 157 156 static bool nv_read_bios_from_rom(struct amdgpu_device *adev, 158 157 u8 *bios, u32 length_bytes) 159 158 { 160 - /* TODO: will implement it when SMU header is available */ 161 - return false; 159 + u32 *dw_ptr; 160 + u32 i, length_dw; 161 + 162 + if (bios == NULL) 163 + return false; 164 + if (length_bytes == 0) 165 + return false; 166 + /* APU vbios image is part of sbios image */ 167 + if (adev->flags & AMD_IS_APU) 168 + return false; 169 + 170 + dw_ptr = (u32 *)bios; 171 + length_dw = ALIGN(length_bytes, 4) / 4; 172 + 173 + /* set rom index to 0 */ 174 + WREG32(SOC15_REG_OFFSET(SMUIO, 0, mmROM_INDEX), 0); 175 + /* read out the rom data */ 176 + for (i = 0; i < length_dw; i++) 177 + dw_ptr[i] = RREG32(SOC15_REG_OFFSET(SMUIO, 0, mmROM_DATA)); 178 + 179 + return true; 162 180 } 163 181 164 182 static struct soc15_allowed_register_entry nv_allowed_read_registers[] = {
+2 -1
drivers/gpu/drm/amd/amdgpu/si_ih.c
··· 64 64 u32 interrupt_cntl, ih_cntl, ih_rb_cntl; 65 65 66 66 si_ih_disable_interrupts(adev); 67 - WREG32(INTERRUPT_CNTL2, adev->irq.ih.gpu_addr >> 8); 67 + /* set dummy read address to dummy page address */ 68 + WREG32(INTERRUPT_CNTL2, adev->dummy_page_addr >> 8); 68 69 interrupt_cntl = RREG32(INTERRUPT_CNTL); 69 70 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE; 70 71 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
+2 -2
drivers/gpu/drm/amd/amdgpu/soc15.h
··· 28 28 #include "nbio_v7_0.h" 29 29 #include "nbio_v7_4.h" 30 30 31 - #define SOC15_FLUSH_GPU_TLB_NUM_WREG 4 32 - #define SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT 1 31 + #define SOC15_FLUSH_GPU_TLB_NUM_WREG 6 32 + #define SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT 3 33 33 34 34 extern const struct amd_ip_funcs soc15_common_ip_funcs; 35 35
+3 -3
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
··· 293 293 { 294 294 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 295 295 struct amdgpu_ring *ring; 296 - int i; 296 + int i, j; 297 297 298 298 for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 299 299 if (adev->vcn.harvest_config & (1 << i)) ··· 305 305 306 306 ring->sched.ready = false; 307 307 308 - for (i = 0; i < adev->vcn.num_enc_rings; ++i) { 309 - ring = &adev->vcn.inst[i].ring_enc[i]; 308 + for (j = 0; j < adev->vcn.num_enc_rings; ++j) { 309 + ring = &adev->vcn.inst[i].ring_enc[j]; 310 310 ring->sched.ready = false; 311 311 } 312 312
+1 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 719 719 */ 720 720 if (adev->flags & AMD_IS_APU && 721 721 adev->asic_type >= CHIP_CARRIZO && 722 - adev->asic_type <= CHIP_RAVEN) 722 + adev->asic_type < CHIP_RAVEN) 723 723 init_data.flags.gpu_vm_support = true; 724 724 725 725 if (amdgpu_dc_feature_mask & DC_FBC_MASK)
+9 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
··· 36 36 #include "dc_link_ddc.h" 37 37 38 38 #include "i2caux_interface.h" 39 - 39 + #if defined(CONFIG_DEBUG_FS) 40 + #include "amdgpu_dm_debugfs.h" 41 + #endif 40 42 /* #define TRACE_DPCD */ 41 43 42 44 #ifdef TRACE_DPCD ··· 148 146 struct amdgpu_dm_connector *amdgpu_dm_connector = 149 147 to_amdgpu_dm_connector(connector); 150 148 struct drm_dp_mst_port *port = amdgpu_dm_connector->port; 149 + 150 + #if defined(CONFIG_DEBUG_FS) 151 + connector_debugfs_init(amdgpu_dm_connector); 152 + amdgpu_dm_connector->debugfs_dpcd_address = 0; 153 + amdgpu_dm_connector->debugfs_dpcd_size = 0; 154 + #endif 151 155 152 156 return drm_dp_mst_connector_late_register(connector, port); 153 157 }
+29 -4
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
··· 591 591 smu_table->power_play_table = smu_table->hardcode_pptable; 592 592 smu_table->power_play_table_size = size; 593 593 594 + /* 595 + * Special hw_fini action(for Navi1x, the DPMs disablement will be 596 + * skipped) may be needed for custom pptable uploading. 597 + */ 598 + smu->uploading_custom_pp_table = true; 599 + 594 600 ret = smu_reset(smu); 595 601 if (ret) 596 602 pr_info("smu reset failed, ret = %d\n", ret); 603 + 604 + smu->uploading_custom_pp_table = false; 597 605 598 606 failed: 599 607 mutex_unlock(&smu->mutex); ··· 727 719 728 720 switch (adev->asic_type) { 729 721 case CHIP_VEGA20: 722 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 730 723 vega20_set_ppt_funcs(smu); 731 724 break; 732 725 case CHIP_NAVI10: ··· 736 727 navi10_set_ppt_funcs(smu); 737 728 break; 738 729 case CHIP_ARCTURUS: 730 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 739 731 arcturus_set_ppt_funcs(smu); 740 732 /* OD is not supported on Arcturus */ 741 733 smu->od_enabled =false; ··· 1305 1295 return ret; 1306 1296 } 1307 1297 1308 - ret = smu_stop_dpms(smu); 1309 - if (ret) { 1310 - pr_warn("Fail to stop Dpms!\n"); 1311 - return ret; 1298 + /* 1299 + * For custom pptable uploading, skip the DPM features 1300 + * disable process on Navi1x ASICs. 1301 + * - As the gfx related features are under control of 1302 + * RLC on those ASICs. RLC reinitialization will be 1303 + * needed to reenable them. That will cost much more 1304 + * efforts. 1305 + * 1306 + * - SMU firmware can handle the DPM reenablement 1307 + * properly. 1308 + */ 1309 + if (!smu->uploading_custom_pp_table || 1310 + !((adev->asic_type >= CHIP_NAVI10) && 1311 + (adev->asic_type <= CHIP_NAVI12))) { 1312 + ret = smu_stop_dpms(smu); 1313 + if (ret) { 1314 + pr_warn("Fail to stop Dpms!\n"); 1315 + return ret; 1316 + } 1312 1317 } 1313 1318 1314 1319 kfree(table_context->driver_pptable);
+9
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
··· 81 81 82 82 int hwmgr_early_init(struct pp_hwmgr *hwmgr) 83 83 { 84 + struct amdgpu_device *adev; 85 + 84 86 if (!hwmgr) 85 87 return -EINVAL; 86 88 ··· 96 94 hwmgr_init_workload_prority(hwmgr); 97 95 hwmgr->gfxoff_state_changed_by_workload = false; 98 96 97 + adev = hwmgr->adev; 98 + 99 99 switch (hwmgr->chip_family) { 100 100 case AMDGPU_FAMILY_CI: 101 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 101 102 hwmgr->smumgr_funcs = &ci_smu_funcs; 102 103 ci_set_asic_special_caps(hwmgr); 103 104 hwmgr->feature_mask &= ~(PP_VBI_TIME_SUPPORT_MASK | ··· 111 106 smu7_init_function_pointers(hwmgr); 112 107 break; 113 108 case AMDGPU_FAMILY_CZ: 109 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 114 110 hwmgr->od_enabled = false; 115 111 hwmgr->smumgr_funcs = &smu8_smu_funcs; 116 112 hwmgr->feature_mask &= ~PP_GFXOFF_MASK; 117 113 smu8_init_function_pointers(hwmgr); 118 114 break; 119 115 case AMDGPU_FAMILY_VI: 116 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 120 117 hwmgr->feature_mask &= ~PP_GFXOFF_MASK; 121 118 switch (hwmgr->chip_id) { 122 119 case CHIP_TOPAZ: ··· 160 153 case AMDGPU_FAMILY_AI: 161 154 switch (hwmgr->chip_id) { 162 155 case CHIP_VEGA10: 156 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 163 157 hwmgr->feature_mask &= ~PP_GFXOFF_MASK; 164 158 hwmgr->smumgr_funcs = &vega10_smu_funcs; 165 159 vega10_hwmgr_init(hwmgr); ··· 170 162 vega12_hwmgr_init(hwmgr); 171 163 break; 172 164 case CHIP_VEGA20: 165 + adev->pm.pp_feature &= ~PP_GFXOFF_MASK; 173 166 hwmgr->feature_mask &= ~PP_GFXOFF_MASK; 174 167 hwmgr->smumgr_funcs = &vega20_smu_funcs; 175 168 vega20_hwmgr_init(hwmgr);
+18 -5
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 3477 3477 3478 3478 static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query) 3479 3479 { 3480 + struct amdgpu_device *adev = hwmgr->adev; 3480 3481 int i; 3481 3482 u32 tmp = 0; 3482 3483 3483 3484 if (!query) 3484 3485 return -EINVAL; 3485 3486 3486 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0); 3487 - tmp = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); 3488 - *query = tmp; 3487 + /* 3488 + * PPSMC_MSG_GetCurrPkgPwr is not supported on: 3489 + * - Hawaii 3490 + * - Bonaire 3491 + * - Fiji 3492 + * - Tonga 3493 + */ 3494 + if ((adev->asic_type != CHIP_HAWAII) && 3495 + (adev->asic_type != CHIP_BONAIRE) && 3496 + (adev->asic_type != CHIP_FIJI) && 3497 + (adev->asic_type != CHIP_TONGA)) { 3498 + smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0); 3499 + tmp = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); 3500 + *query = tmp; 3489 3501 3490 - if (tmp != 0) 3491 - return 0; 3502 + if (tmp != 0) 3503 + return 0; 3504 + } 3492 3505 3493 3506 smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogStart); 3494 3507 cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+1
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
··· 390 390 391 391 uint32_t smc_if_version; 392 392 393 + bool uploading_custom_pp_table; 393 394 }; 394 395 395 396 struct i2c_adapter;
+18
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
··· 859 859 case SMU_UCLK: 860 860 case SMU_DCEFCLK: 861 861 case SMU_FCLK: 862 + /* There is only 2 levels for fine grained DPM */ 863 + if (navi10_is_support_fine_grained_dpm(smu, clk_type)) { 864 + soft_max_level = (soft_max_level >= 1 ? 1 : 0); 865 + soft_min_level = (soft_min_level >= 1 ? 1 : 0); 866 + } 867 + 862 868 ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq); 863 869 if (ret) 864 870 return size; ··· 1986 1980 return ret; 1987 1981 } 1988 1982 1983 + static int navi10_run_btc(struct smu_context *smu) 1984 + { 1985 + int ret = 0; 1986 + 1987 + ret = smu_send_smc_msg(smu, SMU_MSG_RunBtc); 1988 + if (ret) 1989 + pr_err("RunBtc failed!\n"); 1990 + 1991 + return ret; 1992 + } 1993 + 1989 1994 static const struct pptable_funcs navi10_ppt_funcs = { 1990 1995 .tables_init = navi10_tables_init, 1991 1996 .alloc_dpm_context = navi10_allocate_dpm_context, ··· 2088 2071 .set_default_od_settings = navi10_set_default_od_settings, 2089 2072 .od_edit_dpm_table = navi10_od_edit_dpm_table, 2090 2073 .get_pptable_power_limit = navi10_get_pptable_power_limit, 2074 + .run_btc = navi10_run_btc, 2091 2075 }; 2092 2076 2093 2077 void navi10_set_ppt_funcs(struct smu_context *smu)
+2 -2
drivers/gpu/drm/radeon/cik.c
··· 6965 6965 } 6966 6966 6967 6967 /* setup interrupt control */ 6968 - /* XXX this should actually be a bus address, not an MC address. same on older asics */ 6969 - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); 6968 + /* set dummy read address to dummy page address */ 6969 + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); 6970 6970 interrupt_cntl = RREG32(INTERRUPT_CNTL); 6971 6971 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi 6972 6972 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
+2 -2
drivers/gpu/drm/radeon/r600.c
··· 3696 3696 } 3697 3697 3698 3698 /* setup interrupt control */ 3699 - /* set dummy read address to ring address */ 3700 - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); 3699 + /* set dummy read address to dummy page address */ 3700 + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); 3701 3701 interrupt_cntl = RREG32(INTERRUPT_CNTL); 3702 3702 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi 3703 3703 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
+2 -2
drivers/gpu/drm/radeon/si.c
··· 5997 5997 } 5998 5998 5999 5999 /* setup interrupt control */ 6000 - /* set dummy read address to ring address */ 6001 - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); 6000 + /* set dummy read address to dummy page address */ 6001 + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); 6002 6002 interrupt_cntl = RREG32(INTERRUPT_CNTL); 6003 6003 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi 6004 6004 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN