diff options
23 files changed, 567 insertions, 229 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index f5fb93795a69..dd9a4fb9ce39 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | |||
@@ -826,21 +826,13 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) | |||
826 | { | 826 | { |
827 | struct drm_minor *minor = adev->ddev->primary; | 827 | struct drm_minor *minor = adev->ddev->primary; |
828 | struct dentry *ent, *root = minor->debugfs_root; | 828 | struct dentry *ent, *root = minor->debugfs_root; |
829 | unsigned i, j; | 829 | unsigned int i; |
830 | 830 | ||
831 | for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { | 831 | for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { |
832 | ent = debugfs_create_file(debugfs_regs_names[i], | 832 | ent = debugfs_create_file(debugfs_regs_names[i], |
833 | S_IFREG | S_IRUGO, root, | 833 | S_IFREG | S_IRUGO, root, |
834 | adev, debugfs_regs[i]); | 834 | adev, debugfs_regs[i]); |
835 | if (IS_ERR(ent)) { | 835 | if (!i && !IS_ERR_OR_NULL(ent)) |
836 | for (j = 0; j < i; j++) { | ||
837 | debugfs_remove(adev->debugfs_regs[i]); | ||
838 | adev->debugfs_regs[i] = NULL; | ||
839 | } | ||
840 | return PTR_ERR(ent); | ||
841 | } | ||
842 | |||
843 | if (!i) | ||
844 | i_size_write(ent->d_inode, adev->rmmio_size); | 836 | i_size_write(ent->d_inode, adev->rmmio_size); |
845 | adev->debugfs_regs[i] = ent; | 837 | adev->debugfs_regs[i] = ent; |
846 | } | 838 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c index 3a072a7a39f0..df9b173c3d0b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | |||
@@ -574,7 +574,7 @@ void amdgpu_vmid_mgr_init(struct amdgpu_device *adev) | |||
574 | /* skip over VMID 0, since it is the system VM */ | 574 | /* skip over VMID 0, since it is the system VM */ |
575 | for (j = 1; j < id_mgr->num_ids; ++j) { | 575 | for (j = 1; j < id_mgr->num_ids; ++j) { |
576 | amdgpu_vmid_reset(adev, i, j); | 576 | amdgpu_vmid_reset(adev, i, j); |
577 | amdgpu_sync_create(&id_mgr->ids[i].active); | 577 | amdgpu_sync_create(&id_mgr->ids[j].active); |
578 | list_add_tail(&id_mgr->ids[j].list, &id_mgr->ids_lru); | 578 | list_add_tail(&id_mgr->ids[j].list, &id_mgr->ids_lru); |
579 | } | 579 | } |
580 | } | 580 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.c index b160b958e5fe..f212402570a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.c | |||
@@ -1,4 +1,4 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: MIT |
2 | /* Copyright Red Hat Inc 2010. | 2 | /* Copyright Red Hat Inc 2010. |
3 | * | 3 | * |
4 | * Permission is hereby granted, free of charge, to any person obtaining a | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index e61f6a3ca241..6d7baf59d6e1 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -97,6 +97,7 @@ MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); | |||
97 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = | 97 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = |
98 | { | 98 | { |
99 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400), | 99 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400), |
100 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0x80000000, 0x80000000), | ||
100 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000), | 101 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000), |
101 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024), | 102 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024), |
102 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001), | 103 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001), |
@@ -4904,7 +4905,20 @@ static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev) | |||
4904 | static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev) | 4905 | static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev) |
4905 | { | 4906 | { |
4906 | /* init asci gds info */ | 4907 | /* init asci gds info */ |
4907 | adev->gds.mem.total_size = RREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE); | 4908 | switch (adev->asic_type) { |
4909 | case CHIP_VEGA10: | ||
4910 | case CHIP_VEGA12: | ||
4911 | case CHIP_VEGA20: | ||
4912 | adev->gds.mem.total_size = 0x10000; | ||
4913 | break; | ||
4914 | case CHIP_RAVEN: | ||
4915 | adev->gds.mem.total_size = 0x1000; | ||
4916 | break; | ||
4917 | default: | ||
4918 | adev->gds.mem.total_size = 0x10000; | ||
4919 | break; | ||
4920 | } | ||
4921 | |||
4908 | adev->gds.gws.total_size = 64; | 4922 | adev->gds.gws.total_size = 64; |
4909 | adev->gds.oa.total_size = 16; | 4923 | adev->gds.oa.total_size = 16; |
4910 | 4924 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index c20d413f277c..04fa3d972636 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -148,6 +148,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] = | |||
148 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), | 148 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), |
149 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), | 149 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), |
150 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0), | 150 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0), |
151 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_WATERMK, 0xFE000000, 0x00000000), | ||
151 | }; | 152 | }; |
152 | 153 | ||
153 | static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { | 154 | static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { |
@@ -177,6 +178,7 @@ static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { | |||
177 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), | 178 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), |
178 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), | 179 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), |
179 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0), | 180 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0), |
181 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_WATERMK, 0xFE000000, 0x00000000), | ||
180 | }; | 182 | }; |
181 | 183 | ||
182 | static const struct soc15_reg_golden golden_settings_sdma_rv1[] = | 184 | static const struct soc15_reg_golden golden_settings_sdma_rv1[] = |
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index e9282415c24f..eae90922fdbe 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |||
@@ -37,6 +37,11 @@ | |||
37 | 37 | ||
38 | #include "ivsrcid/vcn/irqsrcs_vcn_1_0.h" | 38 | #include "ivsrcid/vcn/irqsrcs_vcn_1_0.h" |
39 | 39 | ||
40 | #define mmUVD_RBC_XX_IB_REG_CHECK 0x05ab | ||
41 | #define mmUVD_RBC_XX_IB_REG_CHECK_BASE_IDX 1 | ||
42 | #define mmUVD_REG_XX_MASK 0x05ac | ||
43 | #define mmUVD_REG_XX_MASK_BASE_IDX 1 | ||
44 | |||
40 | static int vcn_v1_0_stop(struct amdgpu_device *adev); | 45 | static int vcn_v1_0_stop(struct amdgpu_device *adev); |
41 | static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev); | 46 | static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev); |
42 | static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev); | 47 | static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev); |
@@ -320,6 +325,24 @@ static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev) | |||
320 | adev->gfx.config.gb_addr_config); | 325 | adev->gfx.config.gb_addr_config); |
321 | WREG32_SOC15(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, | 326 | WREG32_SOC15(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, |
322 | adev->gfx.config.gb_addr_config); | 327 | adev->gfx.config.gb_addr_config); |
328 | WREG32_SOC15(UVD, 0, mmUVD_UDEC_DBW_UV_ADDR_CONFIG, | ||
329 | adev->gfx.config.gb_addr_config); | ||
330 | WREG32_SOC15(UVD, 0, mmUVD_MIF_CURR_ADDR_CONFIG, | ||
331 | adev->gfx.config.gb_addr_config); | ||
332 | WREG32_SOC15(UVD, 0, mmUVD_MIF_CURR_UV_ADDR_CONFIG, | ||
333 | adev->gfx.config.gb_addr_config); | ||
334 | WREG32_SOC15(UVD, 0, mmUVD_MIF_RECON1_ADDR_CONFIG, | ||
335 | adev->gfx.config.gb_addr_config); | ||
336 | WREG32_SOC15(UVD, 0, mmUVD_MIF_RECON1_UV_ADDR_CONFIG, | ||
337 | adev->gfx.config.gb_addr_config); | ||
338 | WREG32_SOC15(UVD, 0, mmUVD_MIF_REF_ADDR_CONFIG, | ||
339 | adev->gfx.config.gb_addr_config); | ||
340 | WREG32_SOC15(UVD, 0, mmUVD_MIF_REF_UV_ADDR_CONFIG, | ||
341 | adev->gfx.config.gb_addr_config); | ||
342 | WREG32_SOC15(UVD, 0, mmUVD_JPEG_ADDR_CONFIG, | ||
343 | adev->gfx.config.gb_addr_config); | ||
344 | WREG32_SOC15(UVD, 0, mmUVD_JPEG_UV_ADDR_CONFIG, | ||
345 | adev->gfx.config.gb_addr_config); | ||
323 | } | 346 | } |
324 | 347 | ||
325 | static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev) | 348 | static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev) |
@@ -371,16 +394,27 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev) | |||
371 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE, | 394 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE, |
372 | 0xFFFFFFFF, 0); | 395 | 0xFFFFFFFF, 0); |
373 | 396 | ||
397 | /* VCN global tiling registers */ | ||
374 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_ADDR_CONFIG, | 398 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_ADDR_CONFIG, |
375 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | 399 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); |
376 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DB_ADDR_CONFIG, | 400 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DB_ADDR_CONFIG, |
377 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | 401 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); |
378 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, | 402 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, |
379 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | 403 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); |
380 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_ADDR_CONFIG, | 404 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DBW_UV_ADDR_CONFIG, |
381 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | 405 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); |
382 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_UV_ADDR_CONFIG, | 406 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_CURR_ADDR_CONFIG, |
383 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | 407 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); |
408 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_CURR_UV_ADDR_CONFIG, | ||
409 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | ||
410 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_RECON1_ADDR_CONFIG, | ||
411 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | ||
412 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_RECON1_UV_ADDR_CONFIG, | ||
413 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | ||
414 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_REF_ADDR_CONFIG, | ||
415 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | ||
416 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MIF_REF_UV_ADDR_CONFIG, | ||
417 | adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); | ||
384 | } | 418 | } |
385 | 419 | ||
386 | /** | 420 | /** |
@@ -743,41 +777,24 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev) | |||
743 | lmi_swap_cntl = 0; | 777 | lmi_swap_cntl = 0; |
744 | 778 | ||
745 | vcn_1_0_disable_static_power_gating(adev); | 779 | vcn_1_0_disable_static_power_gating(adev); |
780 | |||
781 | tmp = RREG32_SOC15(UVD, 0, mmUVD_STATUS) | UVD_STATUS__UVD_BUSY; | ||
782 | WREG32_SOC15(UVD, 0, mmUVD_STATUS, tmp); | ||
783 | |||
746 | /* disable clock gating */ | 784 | /* disable clock gating */ |
747 | vcn_v1_0_disable_clock_gating(adev); | 785 | vcn_v1_0_disable_clock_gating(adev); |
748 | 786 | ||
749 | vcn_v1_0_mc_resume_spg_mode(adev); | ||
750 | |||
751 | /* disable interupt */ | 787 | /* disable interupt */ |
752 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0, | 788 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0, |
753 | ~UVD_MASTINT_EN__VCPU_EN_MASK); | 789 | ~UVD_MASTINT_EN__VCPU_EN_MASK); |
754 | 790 | ||
755 | /* stall UMC and register bus before resetting VCPU */ | ||
756 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), | ||
757 | UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, | ||
758 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); | ||
759 | mdelay(1); | ||
760 | |||
761 | /* put LMI, VCPU, RBC etc... into reset */ | ||
762 | WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, | ||
763 | UVD_SOFT_RESET__LMI_SOFT_RESET_MASK | | ||
764 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK | | ||
765 | UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK | | ||
766 | UVD_SOFT_RESET__RBC_SOFT_RESET_MASK | | ||
767 | UVD_SOFT_RESET__CSM_SOFT_RESET_MASK | | ||
768 | UVD_SOFT_RESET__CXW_SOFT_RESET_MASK | | ||
769 | UVD_SOFT_RESET__TAP_SOFT_RESET_MASK | | ||
770 | UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK); | ||
771 | mdelay(5); | ||
772 | |||
773 | /* initialize VCN memory controller */ | 791 | /* initialize VCN memory controller */ |
774 | WREG32_SOC15(UVD, 0, mmUVD_LMI_CTRL, | 792 | tmp = RREG32_SOC15(UVD, 0, mmUVD_LMI_CTRL); |
775 | (0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | | 793 | WREG32_SOC15(UVD, 0, mmUVD_LMI_CTRL, tmp | |
776 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | | 794 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | |
777 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | | 795 | UVD_LMI_CTRL__MASK_MC_URGENT_MASK | |
778 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | | 796 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | |
779 | UVD_LMI_CTRL__REQ_MODE_MASK | | 797 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK); |
780 | 0x00100000L); | ||
781 | 798 | ||
782 | #ifdef __BIG_ENDIAN | 799 | #ifdef __BIG_ENDIAN |
783 | /* swap (8 in 32) RB and IB */ | 800 | /* swap (8 in 32) RB and IB */ |
@@ -785,29 +802,49 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev) | |||
785 | #endif | 802 | #endif |
786 | WREG32_SOC15(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl); | 803 | WREG32_SOC15(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl); |
787 | 804 | ||
788 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXA0, 0x40c2040); | 805 | tmp = RREG32_SOC15(UVD, 0, mmUVD_MPC_CNTL); |
789 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXA1, 0x0); | 806 | tmp &= ~UVD_MPC_CNTL__REPLACEMENT_MODE_MASK; |
790 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXB0, 0x40c2040); | 807 | tmp |= 0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT; |
791 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXB1, 0x0); | 808 | WREG32_SOC15(UVD, 0, mmUVD_MPC_CNTL, tmp); |
792 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_ALU, 0); | 809 | |
793 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUX, 0x88); | 810 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXA0, |
811 | ((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) | | ||
812 | (0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) | | ||
813 | (0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) | | ||
814 | (0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT))); | ||
815 | |||
816 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXB0, | ||
817 | ((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) | | ||
818 | (0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) | | ||
819 | (0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) | | ||
820 | (0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT))); | ||
794 | 821 | ||
795 | /* take all subblocks out of reset, except VCPU */ | 822 | WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUX, |
796 | WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, | 823 | ((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) | |
797 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK); | 824 | (0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) | |
798 | mdelay(5); | 825 | (0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT))); |
826 | |||
827 | vcn_v1_0_mc_resume_spg_mode(adev); | ||
828 | |||
829 | WREG32_SOC15(UVD, 0, mmUVD_REG_XX_MASK, 0x10); | ||
830 | WREG32_SOC15(UVD, 0, mmUVD_RBC_XX_IB_REG_CHECK, | ||
831 | RREG32_SOC15(UVD, 0, mmUVD_RBC_XX_IB_REG_CHECK) | 0x3); | ||
799 | 832 | ||
800 | /* enable VCPU clock */ | 833 | /* enable VCPU clock */ |
801 | WREG32_SOC15(UVD, 0, mmUVD_VCPU_CNTL, | 834 | WREG32_SOC15(UVD, 0, mmUVD_VCPU_CNTL, UVD_VCPU_CNTL__CLK_EN_MASK); |
802 | UVD_VCPU_CNTL__CLK_EN_MASK); | 835 | |
836 | /* boot up the VCPU */ | ||
837 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), 0, | ||
838 | ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK); | ||
803 | 839 | ||
804 | /* enable UMC */ | 840 | /* enable UMC */ |
805 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), 0, | 841 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), 0, |
806 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); | 842 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); |
807 | 843 | ||
808 | /* boot up the VCPU */ | 844 | tmp = RREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET); |
809 | WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, 0); | 845 | tmp &= ~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK; |
810 | mdelay(10); | 846 | tmp &= ~UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK; |
847 | WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, tmp); | ||
811 | 848 | ||
812 | for (i = 0; i < 10; ++i) { | 849 | for (i = 0; i < 10; ++i) { |
813 | uint32_t status; | 850 | uint32_t status; |
@@ -839,24 +876,22 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev) | |||
839 | } | 876 | } |
840 | /* enable master interrupt */ | 877 | /* enable master interrupt */ |
841 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), | 878 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), |
842 | (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK), | 879 | UVD_MASTINT_EN__VCPU_EN_MASK, ~UVD_MASTINT_EN__VCPU_EN_MASK); |
843 | ~(UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK)); | ||
844 | 880 | ||
845 | /* enable system interrupt for JRBC, TODO: move to set interrupt*/ | 881 | /* enable system interrupt for JRBC, TODO: move to set interrupt*/ |
846 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SYS_INT_EN), | 882 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SYS_INT_EN), |
847 | UVD_SYS_INT_EN__UVD_JRBC_EN_MASK, | 883 | UVD_SYS_INT_EN__UVD_JRBC_EN_MASK, |
848 | ~UVD_SYS_INT_EN__UVD_JRBC_EN_MASK); | 884 | ~UVD_SYS_INT_EN__UVD_JRBC_EN_MASK); |
849 | 885 | ||
850 | /* clear the bit 4 of VCN_STATUS */ | 886 | /* clear the busy bit of UVD_STATUS */ |
851 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0, | 887 | tmp = RREG32_SOC15(UVD, 0, mmUVD_STATUS) & ~UVD_STATUS__UVD_BUSY; |
852 | ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); | 888 | WREG32_SOC15(UVD, 0, mmUVD_STATUS, tmp); |
853 | 889 | ||
854 | /* force RBC into idle state */ | 890 | /* force RBC into idle state */ |
855 | rb_bufsz = order_base_2(ring->ring_size); | 891 | rb_bufsz = order_base_2(ring->ring_size); |
856 | tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); | 892 | tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); |
857 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); | 893 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); |
858 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); | 894 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); |
859 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0); | ||
860 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); | 895 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); |
861 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); | 896 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); |
862 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); | 897 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); |
@@ -923,7 +958,7 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev) | |||
923 | static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) | 958 | static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) |
924 | { | 959 | { |
925 | struct amdgpu_ring *ring = &adev->vcn.ring_dec; | 960 | struct amdgpu_ring *ring = &adev->vcn.ring_dec; |
926 | uint32_t rb_bufsz, tmp, reg_data; | 961 | uint32_t rb_bufsz, tmp; |
927 | uint32_t lmi_swap_cntl; | 962 | uint32_t lmi_swap_cntl; |
928 | 963 | ||
929 | /* disable byte swapping */ | 964 | /* disable byte swapping */ |
@@ -932,47 +967,33 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) | |||
932 | vcn_1_0_enable_static_power_gating(adev); | 967 | vcn_1_0_enable_static_power_gating(adev); |
933 | 968 | ||
934 | /* enable dynamic power gating mode */ | 969 | /* enable dynamic power gating mode */ |
935 | reg_data = RREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS); | 970 | tmp = RREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS); |
936 | reg_data |= UVD_POWER_STATUS__UVD_PG_MODE_MASK; | 971 | tmp |= UVD_POWER_STATUS__UVD_PG_MODE_MASK; |
937 | reg_data |= UVD_POWER_STATUS__UVD_PG_EN_MASK; | 972 | tmp |= UVD_POWER_STATUS__UVD_PG_EN_MASK; |
938 | WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, reg_data); | 973 | WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, tmp); |
939 | 974 | ||
940 | /* enable clock gating */ | 975 | /* enable clock gating */ |
941 | vcn_v1_0_clock_gating_dpg_mode(adev, 0); | 976 | vcn_v1_0_clock_gating_dpg_mode(adev, 0); |
942 | 977 | ||
943 | /* enable VCPU clock */ | 978 | /* enable VCPU clock */ |
944 | reg_data = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); | 979 | tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); |
945 | reg_data |= UVD_VCPU_CNTL__CLK_EN_MASK; | 980 | tmp |= UVD_VCPU_CNTL__CLK_EN_MASK; |
946 | reg_data |= UVD_VCPU_CNTL__MIF_WR_LOW_THRESHOLD_BP_MASK; | 981 | tmp |= UVD_VCPU_CNTL__MIF_WR_LOW_THRESHOLD_BP_MASK; |
947 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CNTL, reg_data, 0xFFFFFFFF, 0); | 982 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CNTL, tmp, 0xFFFFFFFF, 0); |
948 | 983 | ||
949 | /* disable interupt */ | 984 | /* disable interupt */ |
950 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, | 985 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, |
951 | 0, UVD_MASTINT_EN__VCPU_EN_MASK, 0); | 986 | 0, UVD_MASTINT_EN__VCPU_EN_MASK, 0); |
952 | 987 | ||
953 | /* stall UMC and register bus before resetting VCPU */ | ||
954 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL2, | ||
955 | UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0); | ||
956 | |||
957 | /* put LMI, VCPU, RBC etc... into reset */ | ||
958 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, | ||
959 | UVD_SOFT_RESET__LMI_SOFT_RESET_MASK | | ||
960 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK | | ||
961 | UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK | | ||
962 | UVD_SOFT_RESET__RBC_SOFT_RESET_MASK | | ||
963 | UVD_SOFT_RESET__CSM_SOFT_RESET_MASK | | ||
964 | UVD_SOFT_RESET__CXW_SOFT_RESET_MASK | | ||
965 | UVD_SOFT_RESET__TAP_SOFT_RESET_MASK | | ||
966 | UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK, | ||
967 | 0xFFFFFFFF, 0); | ||
968 | |||
969 | /* initialize VCN memory controller */ | 988 | /* initialize VCN memory controller */ |
970 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, | 989 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, |
971 | (0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | | 990 | (8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | |
972 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | | 991 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | |
973 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | | 992 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | |
974 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | | 993 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | |
975 | UVD_LMI_CTRL__REQ_MODE_MASK | | 994 | UVD_LMI_CTRL__REQ_MODE_MASK | |
995 | UVD_LMI_CTRL__CRC_RESET_MASK | | ||
996 | UVD_LMI_CTRL__MASK_MC_URGENT_MASK | | ||
976 | 0x00100000L, 0xFFFFFFFF, 0); | 997 | 0x00100000L, 0xFFFFFFFF, 0); |
977 | 998 | ||
978 | #ifdef __BIG_ENDIAN | 999 | #ifdef __BIG_ENDIAN |
@@ -981,45 +1002,54 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) | |||
981 | #endif | 1002 | #endif |
982 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl, 0xFFFFFFFF, 0); | 1003 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl, 0xFFFFFFFF, 0); |
983 | 1004 | ||
984 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXA0, 0x40c2040, 0xFFFFFFFF, 0); | 1005 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_CNTL, |
985 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXA1, 0x0, 0xFFFFFFFF, 0); | 1006 | 0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT, 0xFFFFFFFF, 0); |
986 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXB0, 0x40c2040, 0xFFFFFFFF, 0); | ||
987 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXB1, 0x0, 0xFFFFFFFF, 0); | ||
988 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_ALU, 0, 0xFFFFFFFF, 0); | ||
989 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUX, 0x88, 0xFFFFFFFF, 0); | ||
990 | 1007 | ||
991 | vcn_v1_0_mc_resume_dpg_mode(adev); | 1008 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXA0, |
1009 | ((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) | | ||
1010 | (0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) | | ||
1011 | (0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) | | ||
1012 | (0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT)), 0xFFFFFFFF, 0); | ||
992 | 1013 | ||
993 | /* take all subblocks out of reset, except VCPU */ | 1014 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXB0, |
994 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, | 1015 | ((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) | |
995 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK, 0xFFFFFFFF, 0); | 1016 | (0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) | |
1017 | (0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) | | ||
1018 | (0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT)), 0xFFFFFFFF, 0); | ||
996 | 1019 | ||
997 | /* enable VCPU clock */ | 1020 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUX, |
998 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CNTL, | 1021 | ((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) | |
999 | UVD_VCPU_CNTL__CLK_EN_MASK, 0xFFFFFFFF, 0); | 1022 | (0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) | |
1023 | (0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT)), 0xFFFFFFFF, 0); | ||
1000 | 1024 | ||
1001 | /* enable UMC */ | 1025 | vcn_v1_0_mc_resume_dpg_mode(adev); |
1002 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL2, | 1026 | |
1003 | 0, UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0); | 1027 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_REG_XX_MASK, 0x10, 0xFFFFFFFF, 0); |
1028 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_RBC_XX_IB_REG_CHECK, 0x3, 0xFFFFFFFF, 0); | ||
1004 | 1029 | ||
1005 | /* boot up the VCPU */ | 1030 | /* boot up the VCPU */ |
1006 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, 0, 0xFFFFFFFF, 0); | 1031 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, 0, 0xFFFFFFFF, 0); |
1007 | 1032 | ||
1033 | /* enable UMC */ | ||
1034 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL2, | ||
1035 | 0x1F << UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM__SHIFT, | ||
1036 | 0xFFFFFFFF, 0); | ||
1037 | |||
1008 | /* enable master interrupt */ | 1038 | /* enable master interrupt */ |
1009 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, | 1039 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, |
1010 | (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK), | 1040 | UVD_MASTINT_EN__VCPU_EN_MASK, UVD_MASTINT_EN__VCPU_EN_MASK, 0); |
1011 | (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK), 0); | ||
1012 | 1041 | ||
1013 | vcn_v1_0_clock_gating_dpg_mode(adev, 1); | 1042 | vcn_v1_0_clock_gating_dpg_mode(adev, 1); |
1014 | /* setup mmUVD_LMI_CTRL */ | 1043 | /* setup mmUVD_LMI_CTRL */ |
1015 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, | 1044 | WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, |
1016 | (UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | | 1045 | (8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | |
1017 | UVD_LMI_CTRL__CRC_RESET_MASK | | 1046 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | |
1018 | UVD_LMI_CTRL__MASK_MC_URGENT_MASK | | 1047 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | |
1019 | UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | | 1048 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | |
1020 | UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | | 1049 | UVD_LMI_CTRL__REQ_MODE_MASK | |
1021 | (8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | | 1050 | UVD_LMI_CTRL__CRC_RESET_MASK | |
1022 | 0x00100000L), 0xFFFFFFFF, 1); | 1051 | UVD_LMI_CTRL__MASK_MC_URGENT_MASK | |
1052 | 0x00100000L, 0xFFFFFFFF, 1); | ||
1023 | 1053 | ||
1024 | tmp = adev->gfx.config.gb_addr_config; | 1054 | tmp = adev->gfx.config.gb_addr_config; |
1025 | /* setup VCN global tiling registers */ | 1055 | /* setup VCN global tiling registers */ |
@@ -1035,7 +1065,6 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) | |||
1035 | tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); | 1065 | tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); |
1036 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); | 1066 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); |
1037 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); | 1067 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); |
1038 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0); | ||
1039 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); | 1068 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); |
1040 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); | 1069 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); |
1041 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); | 1070 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); |
@@ -1095,28 +1124,39 @@ static int vcn_v1_0_start(struct amdgpu_device *adev) | |||
1095 | */ | 1124 | */ |
1096 | static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev) | 1125 | static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev) |
1097 | { | 1126 | { |
1098 | /* force RBC into idle state */ | 1127 | int ret_code, tmp; |
1099 | WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, 0x11010101); | ||
1100 | 1128 | ||
1101 | /* Stall UMC and register bus before resetting VCPU */ | 1129 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_STATUS, UVD_STATUS__IDLE, 0x7, ret_code); |
1102 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), | 1130 | |
1103 | UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, | 1131 | tmp = UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN_MASK | |
1104 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); | 1132 | UVD_LMI_STATUS__READ_CLEAN_MASK | |
1105 | mdelay(1); | 1133 | UVD_LMI_STATUS__WRITE_CLEAN_MASK | |
1134 | UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK; | ||
1135 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_LMI_STATUS, tmp, tmp, ret_code); | ||
1106 | 1136 | ||
1107 | /* put VCPU into reset */ | 1137 | /* put VCPU into reset */ |
1108 | WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, | 1138 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), |
1109 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK); | 1139 | UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK, |
1110 | mdelay(5); | 1140 | ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK); |
1141 | |||
1142 | tmp = UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK | | ||
1143 | UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK; | ||
1144 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_LMI_STATUS, tmp, tmp, ret_code); | ||
1111 | 1145 | ||
1112 | /* disable VCPU clock */ | 1146 | /* disable VCPU clock */ |
1113 | WREG32_SOC15(UVD, 0, mmUVD_VCPU_CNTL, 0x0); | 1147 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CNTL), 0, |
1148 | ~UVD_VCPU_CNTL__CLK_EN_MASK); | ||
1114 | 1149 | ||
1115 | /* Unstall UMC and register bus */ | 1150 | /* reset LMI UMC/LMI */ |
1116 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), 0, | 1151 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), |
1117 | ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); | 1152 | UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK, |
1153 | ~UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK); | ||
1154 | |||
1155 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), | ||
1156 | UVD_SOFT_RESET__LMI_SOFT_RESET_MASK, | ||
1157 | ~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK); | ||
1118 | 1158 | ||
1119 | WREG32_SOC15(VCN, 0, mmUVD_STATUS, 0); | 1159 | WREG32_SOC15(UVD, 0, mmUVD_STATUS, 0); |
1120 | 1160 | ||
1121 | vcn_v1_0_enable_clock_gating(adev); | 1161 | vcn_v1_0_enable_clock_gating(adev); |
1122 | vcn_1_0_enable_static_power_gating(adev); | 1162 | vcn_1_0_enable_static_power_gating(adev); |
@@ -1125,13 +1165,23 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev) | |||
1125 | 1165 | ||
1126 | static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev) | 1166 | static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev) |
1127 | { | 1167 | { |
1128 | int ret_code; | 1168 | int ret_code = 0; |
1129 | 1169 | ||
1130 | /* Wait for power status to be UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF */ | 1170 | /* Wait for power status to be UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF */ |
1131 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, | 1171 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, |
1132 | UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, | 1172 | UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, |
1133 | UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); | 1173 | UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); |
1134 | 1174 | ||
1175 | if (!ret_code) { | ||
1176 | int tmp = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF; | ||
1177 | /* wait for read ptr to be equal to write ptr */ | ||
1178 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code); | ||
1179 | |||
1180 | SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, | ||
1181 | UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, | ||
1182 | UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); | ||
1183 | } | ||
1184 | |||
1135 | /* disable dynamic power gating mode */ | 1185 | /* disable dynamic power gating mode */ |
1136 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0, | 1186 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0, |
1137 | ~UVD_POWER_STATUS__UVD_PG_MODE_MASK); | 1187 | ~UVD_POWER_STATUS__UVD_PG_MODE_MASK); |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index 0ef4a40d2247..9a7ac58eb18e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | |||
@@ -705,7 +705,8 @@ int connector_debugfs_init(struct amdgpu_dm_connector *connector) | |||
705 | int i; | 705 | int i; |
706 | struct dentry *ent, *dir = connector->base.debugfs_entry; | 706 | struct dentry *ent, *dir = connector->base.debugfs_entry; |
707 | 707 | ||
708 | if (connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) { | 708 | if (connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort || |
709 | connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) { | ||
709 | for (i = 0; i < ARRAY_SIZE(dp_debugfs_entries); i++) { | 710 | for (i = 0; i < ARRAY_SIZE(dp_debugfs_entries); i++) { |
710 | ent = debugfs_create_file(dp_debugfs_entries[i].name, | 711 | ent = debugfs_create_file(dp_debugfs_entries[i].name, |
711 | 0644, | 712 | 0644, |
diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c index 15427f4fc990..cdcefd087487 100644 --- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | |||
@@ -1069,10 +1069,14 @@ static void build_evenly_distributed_points( | |||
1069 | struct dividers dividers) | 1069 | struct dividers dividers) |
1070 | { | 1070 | { |
1071 | struct gamma_pixel *p = points; | 1071 | struct gamma_pixel *p = points; |
1072 | struct gamma_pixel *p_last = p + numberof_points - 1; | 1072 | struct gamma_pixel *p_last; |
1073 | 1073 | ||
1074 | uint32_t i = 0; | 1074 | uint32_t i = 0; |
1075 | 1075 | ||
1076 | // This function should not gets called with 0 as a parameter | ||
1077 | ASSERT(numberof_points > 0); | ||
1078 | p_last = p + numberof_points - 1; | ||
1079 | |||
1076 | do { | 1080 | do { |
1077 | struct fixed31_32 value = dc_fixpt_from_fraction(i, | 1081 | struct fixed31_32 value = dc_fixpt_from_fraction(i, |
1078 | numberof_points - 1); | 1082 | numberof_points - 1); |
@@ -1083,7 +1087,7 @@ static void build_evenly_distributed_points( | |||
1083 | 1087 | ||
1084 | ++p; | 1088 | ++p; |
1085 | ++i; | 1089 | ++i; |
1086 | } while (i != numberof_points); | 1090 | } while (i < numberof_points); |
1087 | 1091 | ||
1088 | p->r = dc_fixpt_div(p_last->r, dividers.divider1); | 1092 | p->r = dc_fixpt_div(p_last->r, dividers.divider1); |
1089 | p->g = dc_fixpt_div(p_last->g, dividers.divider1); | 1093 | p->g = dc_fixpt_div(p_last->g, dividers.divider1); |
diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h index 4b7da589e14a..442ca7c471a5 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h | |||
@@ -82,6 +82,18 @@ | |||
82 | #define mmUVD_LCM_CGC_CNTRL 0x0123 | 82 | #define mmUVD_LCM_CGC_CNTRL 0x0123 |
83 | #define mmUVD_LCM_CGC_CNTRL_BASE_IDX 1 | 83 | #define mmUVD_LCM_CGC_CNTRL_BASE_IDX 1 |
84 | 84 | ||
85 | #define mmUVD_MIF_CURR_UV_ADDR_CONFIG 0x0184 | ||
86 | #define mmUVD_MIF_CURR_UV_ADDR_CONFIG_BASE_IDX 1 | ||
87 | #define mmUVD_MIF_REF_UV_ADDR_CONFIG 0x0185 | ||
88 | #define mmUVD_MIF_REF_UV_ADDR_CONFIG_BASE_IDX 1 | ||
89 | #define mmUVD_MIF_RECON1_UV_ADDR_CONFIG 0x0186 | ||
90 | #define mmUVD_MIF_RECON1_UV_ADDR_CONFIG_BASE_IDX 1 | ||
91 | #define mmUVD_MIF_CURR_ADDR_CONFIG 0x0192 | ||
92 | #define mmUVD_MIF_CURR_ADDR_CONFIG_BASE_IDX 1 | ||
93 | #define mmUVD_MIF_REF_ADDR_CONFIG 0x0193 | ||
94 | #define mmUVD_MIF_REF_ADDR_CONFIG_BASE_IDX 1 | ||
95 | #define mmUVD_MIF_RECON1_ADDR_CONFIG 0x01c5 | ||
96 | #define mmUVD_MIF_RECON1_ADDR_CONFIG_BASE_IDX 1 | ||
85 | 97 | ||
86 | // addressBlock: uvd_uvdnpdec | 98 | // addressBlock: uvd_uvdnpdec |
87 | // base address: 0x20000 | 99 | // base address: 0x20000 |
@@ -327,6 +339,8 @@ | |||
327 | #define mmUVD_LMI_VM_CTRL_BASE_IDX 1 | 339 | #define mmUVD_LMI_VM_CTRL_BASE_IDX 1 |
328 | #define mmUVD_LMI_SWAP_CNTL 0x056d | 340 | #define mmUVD_LMI_SWAP_CNTL 0x056d |
329 | #define mmUVD_LMI_SWAP_CNTL_BASE_IDX 1 | 341 | #define mmUVD_LMI_SWAP_CNTL_BASE_IDX 1 |
342 | #define mmUVD_MPC_CNTL 0x0577 | ||
343 | #define mmUVD_MPC_CNTL_BASE_IDX 1 | ||
330 | #define mmUVD_MPC_SET_MUXA0 0x0579 | 344 | #define mmUVD_MPC_SET_MUXA0 0x0579 |
331 | #define mmUVD_MPC_SET_MUXA0_BASE_IDX 1 | 345 | #define mmUVD_MPC_SET_MUXA0_BASE_IDX 1 |
332 | #define mmUVD_MPC_SET_MUXA1 0x057a | 346 | #define mmUVD_MPC_SET_MUXA1 0x057a |
diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h index 26382f5d5354..63457f9df4c5 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h | |||
@@ -985,6 +985,7 @@ | |||
985 | #define UVD_LMI_CTRL2__STALL_ARB_UMC__SHIFT 0x8 | 985 | #define UVD_LMI_CTRL2__STALL_ARB_UMC__SHIFT 0x8 |
986 | #define UVD_LMI_CTRL2__MC_READ_ID_SEL__SHIFT 0x9 | 986 | #define UVD_LMI_CTRL2__MC_READ_ID_SEL__SHIFT 0x9 |
987 | #define UVD_LMI_CTRL2__MC_WRITE_ID_SEL__SHIFT 0xb | 987 | #define UVD_LMI_CTRL2__MC_WRITE_ID_SEL__SHIFT 0xb |
988 | #define UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM__SHIFT 0x11 | ||
988 | #define UVD_LMI_CTRL2__SPH_DIS_MASK 0x00000001L | 989 | #define UVD_LMI_CTRL2__SPH_DIS_MASK 0x00000001L |
989 | #define UVD_LMI_CTRL2__STALL_ARB_MASK 0x00000002L | 990 | #define UVD_LMI_CTRL2__STALL_ARB_MASK 0x00000002L |
990 | #define UVD_LMI_CTRL2__ASSERT_UMC_URGENT_MASK 0x00000004L | 991 | #define UVD_LMI_CTRL2__ASSERT_UMC_URGENT_MASK 0x00000004L |
@@ -993,6 +994,7 @@ | |||
993 | #define UVD_LMI_CTRL2__STALL_ARB_UMC_MASK 0x00000100L | 994 | #define UVD_LMI_CTRL2__STALL_ARB_UMC_MASK 0x00000100L |
994 | #define UVD_LMI_CTRL2__MC_READ_ID_SEL_MASK 0x00000600L | 995 | #define UVD_LMI_CTRL2__MC_READ_ID_SEL_MASK 0x00000600L |
995 | #define UVD_LMI_CTRL2__MC_WRITE_ID_SEL_MASK 0x00001800L | 996 | #define UVD_LMI_CTRL2__MC_WRITE_ID_SEL_MASK 0x00001800L |
997 | #define UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM_MASK 0x01FE0000L | ||
996 | //UVD_MASTINT_EN | 998 | //UVD_MASTINT_EN |
997 | #define UVD_MASTINT_EN__OVERRUN_RST__SHIFT 0x0 | 999 | #define UVD_MASTINT_EN__OVERRUN_RST__SHIFT 0x0 |
998 | #define UVD_MASTINT_EN__VCPU_EN__SHIFT 0x1 | 1000 | #define UVD_MASTINT_EN__VCPU_EN__SHIFT 0x1 |
@@ -1045,6 +1047,19 @@ | |||
1045 | #define UVD_LMI_CTRL__DB_IT_DATA_COHERENCY_EN_MASK 0x01000000L | 1047 | #define UVD_LMI_CTRL__DB_IT_DATA_COHERENCY_EN_MASK 0x01000000L |
1046 | #define UVD_LMI_CTRL__IT_IT_DATA_COHERENCY_EN_MASK 0x02000000L | 1048 | #define UVD_LMI_CTRL__IT_IT_DATA_COHERENCY_EN_MASK 0x02000000L |
1047 | #define UVD_LMI_CTRL__RFU_MASK 0xF8000000L | 1049 | #define UVD_LMI_CTRL__RFU_MASK 0xF8000000L |
1050 | //UVD_LMI_STATUS | ||
1051 | #define UVD_LMI_STATUS__READ_CLEAN__SHIFT 0x0 | ||
1052 | #define UVD_LMI_STATUS__WRITE_CLEAN__SHIFT 0x1 | ||
1053 | #define UVD_LMI_STATUS__WRITE_CLEAN_RAW__SHIFT 0x2 | ||
1054 | #define UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN__SHIFT 0x3 | ||
1055 | #define UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW__SHIFT 0x6 | ||
1056 | #define UVD_LMI_STATUS__UMC_READ_CLEAN_RAW__SHIFT 0x9 | ||
1057 | #define UVD_LMI_STATUS__READ_CLEAN_MASK 0x00000001L | ||
1058 | #define UVD_LMI_STATUS__WRITE_CLEAN_MASK 0x00000002L | ||
1059 | #define UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK 0x00000004L | ||
1060 | #define UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN_MASK 0x00000008L | ||
1061 | #define UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK 0x00000040L | ||
1062 | #define UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK 0x00000200L | ||
1048 | //UVD_LMI_SWAP_CNTL | 1063 | //UVD_LMI_SWAP_CNTL |
1049 | #define UVD_LMI_SWAP_CNTL__RB_MC_SWAP__SHIFT 0x0 | 1064 | #define UVD_LMI_SWAP_CNTL__RB_MC_SWAP__SHIFT 0x0 |
1050 | #define UVD_LMI_SWAP_CNTL__IB_MC_SWAP__SHIFT 0x2 | 1065 | #define UVD_LMI_SWAP_CNTL__IB_MC_SWAP__SHIFT 0x2 |
@@ -1078,6 +1093,9 @@ | |||
1078 | #define UVD_LMI_SWAP_CNTL__RB_WR_MC_SWAP_MASK 0x0C000000L | 1093 | #define UVD_LMI_SWAP_CNTL__RB_WR_MC_SWAP_MASK 0x0C000000L |
1079 | #define UVD_LMI_SWAP_CNTL__RE_MC_SWAP_MASK 0x30000000L | 1094 | #define UVD_LMI_SWAP_CNTL__RE_MC_SWAP_MASK 0x30000000L |
1080 | #define UVD_LMI_SWAP_CNTL__MP_MC_SWAP_MASK 0xC0000000L | 1095 | #define UVD_LMI_SWAP_CNTL__MP_MC_SWAP_MASK 0xC0000000L |
1096 | //UVD_MPC_CNTL | ||
1097 | #define UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT 0x3 | ||
1098 | #define UVD_MPC_CNTL__REPLACEMENT_MODE_MASK 0x00000038L | ||
1081 | //UVD_MPC_SET_MUXA0 | 1099 | //UVD_MPC_SET_MUXA0 |
1082 | #define UVD_MPC_SET_MUXA0__VARA_0__SHIFT 0x0 | 1100 | #define UVD_MPC_SET_MUXA0__VARA_0__SHIFT 0x0 |
1083 | #define UVD_MPC_SET_MUXA0__VARA_1__SHIFT 0x6 | 1101 | #define UVD_MPC_SET_MUXA0__VARA_1__SHIFT 0x6 |
diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h index 8ae7adb7329b..d2e7c0fa96c2 100644 --- a/drivers/gpu/drm/amd/include/atomfirmware.h +++ b/drivers/gpu/drm/amd/include/atomfirmware.h | |||
@@ -1532,6 +1532,94 @@ struct atom_smc_dpm_info_v4_3 | |||
1532 | uint32_t boardreserved[10]; | 1532 | uint32_t boardreserved[10]; |
1533 | }; | 1533 | }; |
1534 | 1534 | ||
1535 | struct smudpm_i2ccontrollerconfig_t { | ||
1536 | uint32_t enabled; | ||
1537 | uint32_t slaveaddress; | ||
1538 | uint32_t controllerport; | ||
1539 | uint32_t controllername; | ||
1540 | uint32_t thermalthrottler; | ||
1541 | uint32_t i2cprotocol; | ||
1542 | uint32_t i2cspeed; | ||
1543 | }; | ||
1544 | |||
1545 | struct atom_smc_dpm_info_v4_4 | ||
1546 | { | ||
1547 | struct atom_common_table_header table_header; | ||
1548 | uint32_t i2c_padding[3]; | ||
1549 | |||
1550 | uint16_t maxvoltagestepgfx; | ||
1551 | uint16_t maxvoltagestepsoc; | ||
1552 | |||
1553 | uint8_t vddgfxvrmapping; | ||
1554 | uint8_t vddsocvrmapping; | ||
1555 | uint8_t vddmem0vrmapping; | ||
1556 | uint8_t vddmem1vrmapping; | ||
1557 | |||
1558 | uint8_t gfxulvphasesheddingmask; | ||
1559 | uint8_t soculvphasesheddingmask; | ||
1560 | uint8_t externalsensorpresent; | ||
1561 | uint8_t padding8_v; | ||
1562 | |||
1563 | uint16_t gfxmaxcurrent; | ||
1564 | uint8_t gfxoffset; | ||
1565 | uint8_t padding_telemetrygfx; | ||
1566 | |||
1567 | uint16_t socmaxcurrent; | ||
1568 | uint8_t socoffset; | ||
1569 | uint8_t padding_telemetrysoc; | ||
1570 | |||
1571 | uint16_t mem0maxcurrent; | ||
1572 | uint8_t mem0offset; | ||
1573 | uint8_t padding_telemetrymem0; | ||
1574 | |||
1575 | uint16_t mem1maxcurrent; | ||
1576 | uint8_t mem1offset; | ||
1577 | uint8_t padding_telemetrymem1; | ||
1578 | |||
1579 | |||
1580 | uint8_t acdcgpio; | ||
1581 | uint8_t acdcpolarity; | ||
1582 | uint8_t vr0hotgpio; | ||
1583 | uint8_t vr0hotpolarity; | ||
1584 | |||
1585 | uint8_t vr1hotgpio; | ||
1586 | uint8_t vr1hotpolarity; | ||
1587 | uint8_t padding1; | ||
1588 | uint8_t padding2; | ||
1589 | |||
1590 | |||
1591 | uint8_t ledpin0; | ||
1592 | uint8_t ledpin1; | ||
1593 | uint8_t ledpin2; | ||
1594 | uint8_t padding8_4; | ||
1595 | |||
1596 | |||
1597 | uint8_t pllgfxclkspreadenabled; | ||
1598 | uint8_t pllgfxclkspreadpercent; | ||
1599 | uint16_t pllgfxclkspreadfreq; | ||
1600 | |||
1601 | |||
1602 | uint8_t uclkspreadenabled; | ||
1603 | uint8_t uclkspreadpercent; | ||
1604 | uint16_t uclkspreadfreq; | ||
1605 | |||
1606 | |||
1607 | uint8_t fclkspreadenabled; | ||
1608 | uint8_t fclkspreadpercent; | ||
1609 | uint16_t fclkspreadfreq; | ||
1610 | |||
1611 | |||
1612 | uint8_t fllgfxclkspreadenabled; | ||
1613 | uint8_t fllgfxclkspreadpercent; | ||
1614 | uint16_t fllgfxclkspreadfreq; | ||
1615 | |||
1616 | |||
1617 | struct smudpm_i2ccontrollerconfig_t i2ccontrollers[7]; | ||
1618 | |||
1619 | |||
1620 | uint32_t boardreserved[10]; | ||
1621 | }; | ||
1622 | |||
1535 | /* | 1623 | /* |
1536 | *************************************************************************** | 1624 | *************************************************************************** |
1537 | Data Table asic_profiling_info structure | 1625 | Data Table asic_profiling_info structure |
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index 75b56ae032ce..e8964cae6b93 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c | |||
@@ -894,9 +894,14 @@ static int pp_set_power_profile_mode(void *handle, long *input, uint32_t size) | |||
894 | pr_info("%s was not implemented.\n", __func__); | 894 | pr_info("%s was not implemented.\n", __func__); |
895 | return ret; | 895 | return ret; |
896 | } | 896 | } |
897 | |||
898 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) { | ||
899 | pr_info("power profile setting is for manual dpm mode only.\n"); | ||
900 | return ret; | ||
901 | } | ||
902 | |||
897 | mutex_lock(&hwmgr->smu_lock); | 903 | mutex_lock(&hwmgr->smu_lock); |
898 | if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) | 904 | ret = hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, input, size); |
899 | ret = hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, input, size); | ||
900 | mutex_unlock(&hwmgr->smu_lock); | 905 | mutex_unlock(&hwmgr->smu_lock); |
901 | return ret; | 906 | return ret; |
902 | } | 907 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 958af7b48827..b4dbbb7c334c 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -3175,6 +3175,34 @@ static int vega20_power_off_asic(struct pp_hwmgr *hwmgr) | |||
3175 | return result; | 3175 | return result; |
3176 | } | 3176 | } |
3177 | 3177 | ||
3178 | static int conv_power_profile_to_pplib_workload(int power_profile) | ||
3179 | { | ||
3180 | int pplib_workload = 0; | ||
3181 | |||
3182 | switch (power_profile) { | ||
3183 | case PP_SMC_POWER_PROFILE_FULLSCREEN3D: | ||
3184 | pplib_workload = WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT; | ||
3185 | break; | ||
3186 | case PP_SMC_POWER_PROFILE_POWERSAVING: | ||
3187 | pplib_workload = WORKLOAD_PPLIB_POWER_SAVING_BIT; | ||
3188 | break; | ||
3189 | case PP_SMC_POWER_PROFILE_VIDEO: | ||
3190 | pplib_workload = WORKLOAD_PPLIB_VIDEO_BIT; | ||
3191 | break; | ||
3192 | case PP_SMC_POWER_PROFILE_VR: | ||
3193 | pplib_workload = WORKLOAD_PPLIB_VR_BIT; | ||
3194 | break; | ||
3195 | case PP_SMC_POWER_PROFILE_COMPUTE: | ||
3196 | pplib_workload = WORKLOAD_PPLIB_COMPUTE_BIT; | ||
3197 | break; | ||
3198 | case PP_SMC_POWER_PROFILE_CUSTOM: | ||
3199 | pplib_workload = WORKLOAD_PPLIB_CUSTOM_BIT; | ||
3200 | break; | ||
3201 | } | ||
3202 | |||
3203 | return pplib_workload; | ||
3204 | } | ||
3205 | |||
3178 | static int vega20_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf) | 3206 | static int vega20_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf) |
3179 | { | 3207 | { |
3180 | DpmActivityMonitorCoeffInt_t activity_monitor; | 3208 | DpmActivityMonitorCoeffInt_t activity_monitor; |
@@ -3210,7 +3238,7 @@ static int vega20_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf) | |||
3210 | 3238 | ||
3211 | for (i = 0; i <= PP_SMC_POWER_PROFILE_CUSTOM; i++) { | 3239 | for (i = 0; i <= PP_SMC_POWER_PROFILE_CUSTOM; i++) { |
3212 | /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ | 3240 | /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ |
3213 | workload_type = i + 1; | 3241 | workload_type = conv_power_profile_to_pplib_workload(i); |
3214 | result = vega20_get_activity_monitor_coeff(hwmgr, | 3242 | result = vega20_get_activity_monitor_coeff(hwmgr, |
3215 | (uint8_t *)(&activity_monitor), workload_type); | 3243 | (uint8_t *)(&activity_monitor), workload_type); |
3216 | PP_ASSERT_WITH_CODE(!result, | 3244 | PP_ASSERT_WITH_CODE(!result, |
@@ -3283,10 +3311,15 @@ static int vega20_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf) | |||
3283 | static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) | 3311 | static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) |
3284 | { | 3312 | { |
3285 | DpmActivityMonitorCoeffInt_t activity_monitor; | 3313 | DpmActivityMonitorCoeffInt_t activity_monitor; |
3286 | int result = 0; | 3314 | int workload_type, result = 0; |
3287 | 3315 | ||
3288 | hwmgr->power_profile_mode = input[size]; | 3316 | hwmgr->power_profile_mode = input[size]; |
3289 | 3317 | ||
3318 | if (hwmgr->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { | ||
3319 | pr_err("Invalid power profile mode %d\n", hwmgr->power_profile_mode); | ||
3320 | return -EINVAL; | ||
3321 | } | ||
3322 | |||
3290 | if (hwmgr->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { | 3323 | if (hwmgr->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { |
3291 | if (size < 10) | 3324 | if (size < 10) |
3292 | return -EINVAL; | 3325 | return -EINVAL; |
@@ -3353,8 +3386,11 @@ static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui | |||
3353 | return result); | 3386 | return result); |
3354 | } | 3387 | } |
3355 | 3388 | ||
3389 | /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ | ||
3390 | workload_type = | ||
3391 | conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode); | ||
3356 | smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask, | 3392 | smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask, |
3357 | 1 << hwmgr->power_profile_mode); | 3393 | 1 << workload_type); |
3358 | 3394 | ||
3359 | return 0; | 3395 | return 0; |
3360 | } | 3396 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c index 32fe38452094..e5f7f8230065 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c | |||
@@ -100,9 +100,8 @@ static void dump_pptable(PPTable_t *pptable) | |||
100 | pr_info("PpmTemperatureThreshold = %d\n", pptable->PpmTemperatureThreshold); | 100 | pr_info("PpmTemperatureThreshold = %d\n", pptable->PpmTemperatureThreshold); |
101 | 101 | ||
102 | pr_info("MemoryOnPackage = 0x%02x\n", pptable->MemoryOnPackage); | 102 | pr_info("MemoryOnPackage = 0x%02x\n", pptable->MemoryOnPackage); |
103 | pr_info("padding8_limits[0] = 0x%02x\n", pptable->padding8_limits[0]); | 103 | pr_info("padding8_limits = 0x%02x\n", pptable->padding8_limits); |
104 | pr_info("padding8_limits[1] = 0x%02x\n", pptable->padding8_limits[1]); | 104 | pr_info("Tvr_SocLimit = %d\n", pptable->Tvr_SocLimit); |
105 | pr_info("padding8_limits[2] = 0x%02x\n", pptable->padding8_limits[2]); | ||
106 | 105 | ||
107 | pr_info("UlvVoltageOffsetSoc = %d\n", pptable->UlvVoltageOffsetSoc); | 106 | pr_info("UlvVoltageOffsetSoc = %d\n", pptable->UlvVoltageOffsetSoc); |
108 | pr_info("UlvVoltageOffsetGfx = %d\n", pptable->UlvVoltageOffsetGfx); | 107 | pr_info("UlvVoltageOffsetGfx = %d\n", pptable->UlvVoltageOffsetGfx); |
@@ -417,8 +416,8 @@ static void dump_pptable(PPTable_t *pptable) | |||
417 | pr_info("FanGainEdge = %d\n", pptable->FanGainEdge); | 416 | pr_info("FanGainEdge = %d\n", pptable->FanGainEdge); |
418 | pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot); | 417 | pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot); |
419 | pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid); | 418 | pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid); |
420 | pr_info("FanGainVrVddc = %d\n", pptable->FanGainVrVddc); | 419 | pr_info("FanGainVrGfx = %d\n", pptable->FanGainVrGfx); |
421 | pr_info("FanGainVrMvdd = %d\n", pptable->FanGainVrMvdd); | 420 | pr_info("FanGainVrSoc = %d\n", pptable->FanGainVrSoc); |
422 | pr_info("FanGainPlx = %d\n", pptable->FanGainPlx); | 421 | pr_info("FanGainPlx = %d\n", pptable->FanGainPlx); |
423 | pr_info("FanGainHbm = %d\n", pptable->FanGainHbm); | 422 | pr_info("FanGainHbm = %d\n", pptable->FanGainHbm); |
424 | pr_info("FanPwmMin = %d\n", pptable->FanPwmMin); | 423 | pr_info("FanPwmMin = %d\n", pptable->FanPwmMin); |
@@ -533,23 +532,20 @@ static void dump_pptable(PPTable_t *pptable) | |||
533 | pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx); | 532 | pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx); |
534 | pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc); | 533 | pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc); |
535 | 534 | ||
536 | for (i = 0; i < 14; i++) | 535 | pr_info("MGpuFanBoostLimitRpm = %d\n", pptable->MGpuFanBoostLimitRpm); |
537 | pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]); | 536 | pr_info("padding16_Fan = %d\n", pptable->padding16_Fan); |
537 | |||
538 | pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0); | ||
539 | pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0); | ||
538 | 540 | ||
539 | pr_info("Liquid1_I2C_address = 0x%x\n", pptable->Liquid1_I2C_address); | 541 | pr_info("DcBtcGb[AVFS_VOLTAGE_GFX] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_GFX]); |
540 | pr_info("Liquid2_I2C_address = 0x%x\n", pptable->Liquid2_I2C_address); | 542 | pr_info("DcBtcGb[AVFS_VOLTAGE_SOC] = 0x%x\n", pptable->DcBtcGb[AVFS_VOLTAGE_SOC]); |
541 | pr_info("Vr_I2C_address = 0x%x\n", pptable->Vr_I2C_address); | ||
542 | pr_info("Plx_I2C_address = 0x%x\n", pptable->Plx_I2C_address); | ||
543 | 543 | ||
544 | pr_info("Liquid_I2C_LineSCL = 0x%x\n", pptable->Liquid_I2C_LineSCL); | 544 | for (i = 0; i < 11; i++) |
545 | pr_info("Liquid_I2C_LineSDA = 0x%x\n", pptable->Liquid_I2C_LineSDA); | 545 | pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]); |
546 | pr_info("Vr_I2C_LineSCL = 0x%x\n", pptable->Vr_I2C_LineSCL); | ||
547 | pr_info("Vr_I2C_LineSDA = 0x%x\n", pptable->Vr_I2C_LineSDA); | ||
548 | 546 | ||
549 | pr_info("Plx_I2C_LineSCL = 0x%x\n", pptable->Plx_I2C_LineSCL); | 547 | for (i = 0; i < 3; i++) |
550 | pr_info("Plx_I2C_LineSDA = 0x%x\n", pptable->Plx_I2C_LineSDA); | 548 | pr_info("Padding32[%d] = 0x%x\n", i, pptable->Padding32[i]); |
551 | pr_info("VrSensorPresent = 0x%x\n", pptable->VrSensorPresent); | ||
552 | pr_info("LiquidSensorPresent = 0x%x\n", pptable->LiquidSensorPresent); | ||
553 | 549 | ||
554 | pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx); | 550 | pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx); |
555 | pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc); | 551 | pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc); |
@@ -611,6 +607,24 @@ static void dump_pptable(PPTable_t *pptable) | |||
611 | pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent); | 607 | pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent); |
612 | pr_info("FllGfxclkSpreadFreq = %d\n", pptable->FllGfxclkSpreadFreq); | 608 | pr_info("FllGfxclkSpreadFreq = %d\n", pptable->FllGfxclkSpreadFreq); |
613 | 609 | ||
610 | for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) { | ||
611 | pr_info("I2cControllers[%d]:\n", i); | ||
612 | pr_info(" .Enabled = %d\n", | ||
613 | pptable->I2cControllers[i].Enabled); | ||
614 | pr_info(" .SlaveAddress = 0x%x\n", | ||
615 | pptable->I2cControllers[i].SlaveAddress); | ||
616 | pr_info(" .ControllerPort = %d\n", | ||
617 | pptable->I2cControllers[i].ControllerPort); | ||
618 | pr_info(" .ControllerName = %d\n", | ||
619 | pptable->I2cControllers[i].ControllerName); | ||
620 | pr_info(" .ThermalThrottler = %d\n", | ||
621 | pptable->I2cControllers[i].ThermalThrottler); | ||
622 | pr_info(" .I2cProtocol = %d\n", | ||
623 | pptable->I2cControllers[i].I2cProtocol); | ||
624 | pr_info(" .I2cSpeed = %d\n", | ||
625 | pptable->I2cControllers[i].I2cSpeed); | ||
626 | } | ||
627 | |||
614 | for (i = 0; i < 10; i++) | 628 | for (i = 0; i < 10; i++) |
615 | pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]); | 629 | pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]); |
616 | 630 | ||
@@ -693,29 +707,19 @@ static int copy_overdrive_feature_capabilities_array( | |||
693 | 707 | ||
694 | static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable) | 708 | static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable) |
695 | { | 709 | { |
696 | struct atom_smc_dpm_info_v4_3 *smc_dpm_table; | 710 | struct atom_smc_dpm_info_v4_4 *smc_dpm_table; |
697 | int index = GetIndexIntoMasterDataTable(smc_dpm_info); | 711 | int index = GetIndexIntoMasterDataTable(smc_dpm_info); |
712 | int i; | ||
698 | 713 | ||
699 | PP_ASSERT_WITH_CODE( | 714 | PP_ASSERT_WITH_CODE( |
700 | smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL), | 715 | smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL), |
701 | "[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!", | 716 | "[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!", |
702 | return -1); | 717 | return -1); |
703 | 718 | ||
704 | ppsmc_pptable->Liquid1_I2C_address = smc_dpm_table->liquid1_i2c_address; | 719 | memset(ppsmc_pptable->Padding32, |
705 | ppsmc_pptable->Liquid2_I2C_address = smc_dpm_table->liquid2_i2c_address; | 720 | 0, |
706 | ppsmc_pptable->Vr_I2C_address = smc_dpm_table->vr_i2c_address; | 721 | sizeof(struct atom_smc_dpm_info_v4_4) - |
707 | ppsmc_pptable->Plx_I2C_address = smc_dpm_table->plx_i2c_address; | 722 | sizeof(struct atom_common_table_header)); |
708 | |||
709 | ppsmc_pptable->Liquid_I2C_LineSCL = smc_dpm_table->liquid_i2c_linescl; | ||
710 | ppsmc_pptable->Liquid_I2C_LineSDA = smc_dpm_table->liquid_i2c_linesda; | ||
711 | ppsmc_pptable->Vr_I2C_LineSCL = smc_dpm_table->vr_i2c_linescl; | ||
712 | ppsmc_pptable->Vr_I2C_LineSDA = smc_dpm_table->vr_i2c_linesda; | ||
713 | |||
714 | ppsmc_pptable->Plx_I2C_LineSCL = smc_dpm_table->plx_i2c_linescl; | ||
715 | ppsmc_pptable->Plx_I2C_LineSDA = smc_dpm_table->plx_i2c_linesda; | ||
716 | ppsmc_pptable->VrSensorPresent = smc_dpm_table->vrsensorpresent; | ||
717 | ppsmc_pptable->LiquidSensorPresent = smc_dpm_table->liquidsensorpresent; | ||
718 | |||
719 | ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx; | 723 | ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx; |
720 | ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc; | 724 | ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc; |
721 | 725 | ||
@@ -774,6 +778,24 @@ static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable | |||
774 | ppsmc_pptable->FllGfxclkSpreadPercent = smc_dpm_table->fllgfxclkspreadpercent; | 778 | ppsmc_pptable->FllGfxclkSpreadPercent = smc_dpm_table->fllgfxclkspreadpercent; |
775 | ppsmc_pptable->FllGfxclkSpreadFreq = smc_dpm_table->fllgfxclkspreadfreq; | 779 | ppsmc_pptable->FllGfxclkSpreadFreq = smc_dpm_table->fllgfxclkspreadfreq; |
776 | 780 | ||
781 | if ((smc_dpm_table->table_header.format_revision == 4) && | ||
782 | (smc_dpm_table->table_header.content_revision == 4)) { | ||
783 | for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) { | ||
784 | ppsmc_pptable->I2cControllers[i].Enabled = | ||
785 | smc_dpm_table->i2ccontrollers[i].enabled; | ||
786 | ppsmc_pptable->I2cControllers[i].SlaveAddress = | ||
787 | smc_dpm_table->i2ccontrollers[i].slaveaddress; | ||
788 | ppsmc_pptable->I2cControllers[i].ControllerPort = | ||
789 | smc_dpm_table->i2ccontrollers[i].controllerport; | ||
790 | ppsmc_pptable->I2cControllers[i].ThermalThrottler = | ||
791 | smc_dpm_table->i2ccontrollers[i].thermalthrottler; | ||
792 | ppsmc_pptable->I2cControllers[i].I2cProtocol = | ||
793 | smc_dpm_table->i2ccontrollers[i].i2cprotocol; | ||
794 | ppsmc_pptable->I2cControllers[i].I2cSpeed = | ||
795 | smc_dpm_table->i2ccontrollers[i].i2cspeed; | ||
796 | } | ||
797 | } | ||
798 | |||
777 | return 0; | 799 | return 0; |
778 | } | 800 | } |
779 | 801 | ||
@@ -860,7 +882,15 @@ static int init_powerplay_table_information( | |||
860 | if (pptable_information->smc_pptable == NULL) | 882 | if (pptable_information->smc_pptable == NULL) |
861 | return -ENOMEM; | 883 | return -ENOMEM; |
862 | 884 | ||
863 | memcpy(pptable_information->smc_pptable, &(powerplay_table->smcPPTable), sizeof(PPTable_t)); | 885 | if (powerplay_table->smcPPTable.Version <= 2) |
886 | memcpy(pptable_information->smc_pptable, | ||
887 | &(powerplay_table->smcPPTable), | ||
888 | sizeof(PPTable_t) - | ||
889 | sizeof(I2cControllerConfig_t) * I2C_CONTROLLER_NAME_COUNT); | ||
890 | else | ||
891 | memcpy(pptable_information->smc_pptable, | ||
892 | &(powerplay_table->smcPPTable), | ||
893 | sizeof(PPTable_t)); | ||
864 | 894 | ||
865 | result = append_vbios_pptable(hwmgr, (pptable_information->smc_pptable)); | 895 | result = append_vbios_pptable(hwmgr, (pptable_information->smc_pptable)); |
866 | 896 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h b/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h index a002021414ff..2998a49960ed 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h +++ b/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h | |||
@@ -27,7 +27,7 @@ | |||
27 | // *** IMPORTANT *** | 27 | // *** IMPORTANT *** |
28 | // SMU TEAM: Always increment the interface version if | 28 | // SMU TEAM: Always increment the interface version if |
29 | // any structure is changed in this file | 29 | // any structure is changed in this file |
30 | #define SMU11_DRIVER_IF_VERSION 0x11 | 30 | #define SMU11_DRIVER_IF_VERSION 0x12 |
31 | 31 | ||
32 | #define PPTABLE_V20_SMU_VERSION 2 | 32 | #define PPTABLE_V20_SMU_VERSION 2 |
33 | 33 | ||
@@ -165,7 +165,7 @@ | |||
165 | #define FEATURE_DS_FCLK_MASK (1 << FEATURE_DS_FCLK_BIT ) | 165 | #define FEATURE_DS_FCLK_MASK (1 << FEATURE_DS_FCLK_BIT ) |
166 | #define FEATURE_DS_MP1CLK_MASK (1 << FEATURE_DS_MP1CLK_BIT ) | 166 | #define FEATURE_DS_MP1CLK_MASK (1 << FEATURE_DS_MP1CLK_BIT ) |
167 | #define FEATURE_DS_MP0CLK_MASK (1 << FEATURE_DS_MP0CLK_BIT ) | 167 | #define FEATURE_DS_MP0CLK_MASK (1 << FEATURE_DS_MP0CLK_BIT ) |
168 | 168 | #define FEATURE_XGMI_MASK (1 << FEATURE_XGMI_BIT ) | |
169 | 169 | ||
170 | #define DPM_OVERRIDE_DISABLE_SOCCLK_PID 0x00000001 | 170 | #define DPM_OVERRIDE_DISABLE_SOCCLK_PID 0x00000001 |
171 | #define DPM_OVERRIDE_DISABLE_UCLK_PID 0x00000002 | 171 | #define DPM_OVERRIDE_DISABLE_UCLK_PID 0x00000002 |
@@ -186,6 +186,9 @@ | |||
186 | #define DPM_OVERRIDE_ENABLE_GFXOFF_UCLK_SWITCH 0x00010000 | 186 | #define DPM_OVERRIDE_ENABLE_GFXOFF_UCLK_SWITCH 0x00010000 |
187 | #define DPM_OVERRIDE_ENABLE_GFXOFF_FCLK_SWITCH 0x00020000 | 187 | #define DPM_OVERRIDE_ENABLE_GFXOFF_FCLK_SWITCH 0x00020000 |
188 | 188 | ||
189 | #define I2C_CONTROLLER_ENABLED 1 | ||
190 | #define I2C_CONTROLLER_DISABLED 0 | ||
191 | |||
189 | #define VR_MAPPING_VR_SELECT_MASK 0x01 | 192 | #define VR_MAPPING_VR_SELECT_MASK 0x01 |
190 | #define VR_MAPPING_VR_SELECT_SHIFT 0x00 | 193 | #define VR_MAPPING_VR_SELECT_SHIFT 0x00 |
191 | 194 | ||
@@ -208,15 +211,17 @@ | |||
208 | #define THROTTLER_STATUS_TEMP_HOTSPOT_BIT 2 | 211 | #define THROTTLER_STATUS_TEMP_HOTSPOT_BIT 2 |
209 | #define THROTTLER_STATUS_TEMP_HBM_BIT 3 | 212 | #define THROTTLER_STATUS_TEMP_HBM_BIT 3 |
210 | #define THROTTLER_STATUS_TEMP_VR_GFX_BIT 4 | 213 | #define THROTTLER_STATUS_TEMP_VR_GFX_BIT 4 |
211 | #define THROTTLER_STATUS_TEMP_VR_MEM_BIT 5 | 214 | #define THROTTLER_STATUS_TEMP_VR_SOC_BIT 5 |
212 | #define THROTTLER_STATUS_TEMP_LIQUID_BIT 6 | 215 | #define THROTTLER_STATUS_TEMP_VR_MEM0_BIT 6 |
213 | #define THROTTLER_STATUS_TEMP_PLX_BIT 7 | 216 | #define THROTTLER_STATUS_TEMP_VR_MEM1_BIT 7 |
214 | #define THROTTLER_STATUS_TEMP_SKIN_BIT 8 | 217 | #define THROTTLER_STATUS_TEMP_LIQUID_BIT 8 |
215 | #define THROTTLER_STATUS_TDC_GFX_BIT 9 | 218 | #define THROTTLER_STATUS_TEMP_PLX_BIT 9 |
216 | #define THROTTLER_STATUS_TDC_SOC_BIT 10 | 219 | #define THROTTLER_STATUS_TEMP_SKIN_BIT 10 |
217 | #define THROTTLER_STATUS_PPT_BIT 11 | 220 | #define THROTTLER_STATUS_TDC_GFX_BIT 11 |
218 | #define THROTTLER_STATUS_FIT_BIT 12 | 221 | #define THROTTLER_STATUS_TDC_SOC_BIT 12 |
219 | #define THROTTLER_STATUS_PPM_BIT 13 | 222 | #define THROTTLER_STATUS_PPT_BIT 13 |
223 | #define THROTTLER_STATUS_FIT_BIT 14 | ||
224 | #define THROTTLER_STATUS_PPM_BIT 15 | ||
220 | 225 | ||
221 | 226 | ||
222 | #define TABLE_TRANSFER_OK 0x0 | 227 | #define TABLE_TRANSFER_OK 0x0 |
@@ -236,6 +241,58 @@ | |||
236 | #define XGMI_STATE_D0 1 | 241 | #define XGMI_STATE_D0 1 |
237 | #define XGMI_STATE_D3 0 | 242 | #define XGMI_STATE_D3 0 |
238 | 243 | ||
244 | typedef enum { | ||
245 | I2C_CONTROLLER_PORT_0 = 0, | ||
246 | I2C_CONTROLLER_PORT_1 = 1, | ||
247 | } I2cControllerPort_e; | ||
248 | |||
249 | typedef enum { | ||
250 | I2C_CONTROLLER_NAME_VR_GFX = 0, | ||
251 | I2C_CONTROLLER_NAME_VR_SOC, | ||
252 | I2C_CONTROLLER_NAME_VR_VDDCI, | ||
253 | I2C_CONTROLLER_NAME_VR_HBM, | ||
254 | I2C_CONTROLLER_NAME_LIQUID_0, | ||
255 | I2C_CONTROLLER_NAME_LIQUID_1, | ||
256 | I2C_CONTROLLER_NAME_PLX, | ||
257 | I2C_CONTROLLER_NAME_COUNT, | ||
258 | } I2cControllerName_e; | ||
259 | |||
260 | typedef enum { | ||
261 | I2C_CONTROLLER_THROTTLER_TYPE_NONE = 0, | ||
262 | I2C_CONTROLLER_THROTTLER_VR_GFX, | ||
263 | I2C_CONTROLLER_THROTTLER_VR_SOC, | ||
264 | I2C_CONTROLLER_THROTTLER_VR_VDDCI, | ||
265 | I2C_CONTROLLER_THROTTLER_VR_HBM, | ||
266 | I2C_CONTROLLER_THROTTLER_LIQUID_0, | ||
267 | I2C_CONTROLLER_THROTTLER_LIQUID_1, | ||
268 | I2C_CONTROLLER_THROTTLER_PLX, | ||
269 | } I2cControllerThrottler_e; | ||
270 | |||
271 | typedef enum { | ||
272 | I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5, | ||
273 | I2C_CONTROLLER_PROTOCOL_VR_IR35217, | ||
274 | I2C_CONTROLLER_PROTOCOL_TMP_TMP102A, | ||
275 | I2C_CONTROLLER_PROTOCOL_SPARE_0, | ||
276 | I2C_CONTROLLER_PROTOCOL_SPARE_1, | ||
277 | I2C_CONTROLLER_PROTOCOL_SPARE_2, | ||
278 | } I2cControllerProtocol_e; | ||
279 | |||
280 | typedef enum { | ||
281 | I2C_CONTROLLER_SPEED_SLOW = 0, | ||
282 | I2C_CONTROLLER_SPEED_FAST = 1, | ||
283 | } I2cControllerSpeed_e; | ||
284 | |||
285 | typedef struct { | ||
286 | uint32_t Enabled; | ||
287 | uint32_t SlaveAddress; | ||
288 | uint32_t ControllerPort; | ||
289 | uint32_t ControllerName; | ||
290 | |||
291 | uint32_t ThermalThrottler; | ||
292 | uint32_t I2cProtocol; | ||
293 | uint32_t I2cSpeed; | ||
294 | } I2cControllerConfig_t; | ||
295 | |||
239 | typedef struct { | 296 | typedef struct { |
240 | uint32_t a; | 297 | uint32_t a; |
241 | uint32_t b; | 298 | uint32_t b; |
@@ -334,8 +391,8 @@ typedef struct { | |||
334 | uint16_t PpmTemperatureThreshold; | 391 | uint16_t PpmTemperatureThreshold; |
335 | 392 | ||
336 | uint8_t MemoryOnPackage; | 393 | uint8_t MemoryOnPackage; |
337 | uint8_t padding8_limits[3]; | 394 | uint8_t padding8_limits; |
338 | 395 | uint16_t Tvr_SocLimit; | |
339 | 396 | ||
340 | uint16_t UlvVoltageOffsetSoc; | 397 | uint16_t UlvVoltageOffsetSoc; |
341 | uint16_t UlvVoltageOffsetGfx; | 398 | uint16_t UlvVoltageOffsetGfx; |
@@ -406,8 +463,8 @@ typedef struct { | |||
406 | uint16_t FanGainEdge; | 463 | uint16_t FanGainEdge; |
407 | uint16_t FanGainHotspot; | 464 | uint16_t FanGainHotspot; |
408 | uint16_t FanGainLiquid; | 465 | uint16_t FanGainLiquid; |
409 | uint16_t FanGainVrVddc; | 466 | uint16_t FanGainVrGfx; |
410 | uint16_t FanGainVrMvdd; | 467 | uint16_t FanGainVrSoc; |
411 | uint16_t FanGainPlx; | 468 | uint16_t FanGainPlx; |
412 | uint16_t FanGainHbm; | 469 | uint16_t FanGainHbm; |
413 | uint16_t FanPwmMin; | 470 | uint16_t FanPwmMin; |
@@ -444,7 +501,7 @@ typedef struct { | |||
444 | uint8_t DcBtcEnabled[AVFS_VOLTAGE_COUNT]; | 501 | uint8_t DcBtcEnabled[AVFS_VOLTAGE_COUNT]; |
445 | uint8_t Padding8_GfxBtc[2]; | 502 | uint8_t Padding8_GfxBtc[2]; |
446 | 503 | ||
447 | uint16_t DcBtcMin[AVFS_VOLTAGE_COUNT]; | 504 | int16_t DcBtcMin[AVFS_VOLTAGE_COUNT]; |
448 | uint16_t DcBtcMax[AVFS_VOLTAGE_COUNT]; | 505 | uint16_t DcBtcMax[AVFS_VOLTAGE_COUNT]; |
449 | 506 | ||
450 | 507 | ||
@@ -467,24 +524,14 @@ typedef struct { | |||
467 | uint16_t MGpuFanBoostLimitRpm; | 524 | uint16_t MGpuFanBoostLimitRpm; |
468 | uint16_t padding16_Fan; | 525 | uint16_t padding16_Fan; |
469 | 526 | ||
470 | uint32_t Reserved[13]; | 527 | uint16_t FanGainVrMem0; |
471 | 528 | uint16_t FanGainVrMem1; | |
472 | 529 | ||
530 | uint16_t DcBtcGb[AVFS_VOLTAGE_COUNT]; | ||
473 | 531 | ||
474 | uint8_t Liquid1_I2C_address; | 532 | uint32_t Reserved[11]; |
475 | uint8_t Liquid2_I2C_address; | ||
476 | uint8_t Vr_I2C_address; | ||
477 | uint8_t Plx_I2C_address; | ||
478 | 533 | ||
479 | uint8_t Liquid_I2C_LineSCL; | 534 | uint32_t Padding32[3]; |
480 | uint8_t Liquid_I2C_LineSDA; | ||
481 | uint8_t Vr_I2C_LineSCL; | ||
482 | uint8_t Vr_I2C_LineSDA; | ||
483 | |||
484 | uint8_t Plx_I2C_LineSCL; | ||
485 | uint8_t Plx_I2C_LineSDA; | ||
486 | uint8_t VrSensorPresent; | ||
487 | uint8_t LiquidSensorPresent; | ||
488 | 535 | ||
489 | uint16_t MaxVoltageStepGfx; | 536 | uint16_t MaxVoltageStepGfx; |
490 | uint16_t MaxVoltageStepSoc; | 537 | uint16_t MaxVoltageStepSoc; |
@@ -551,6 +598,8 @@ typedef struct { | |||
551 | uint8_t FllGfxclkSpreadPercent; | 598 | uint8_t FllGfxclkSpreadPercent; |
552 | uint16_t FllGfxclkSpreadFreq; | 599 | uint16_t FllGfxclkSpreadFreq; |
553 | 600 | ||
601 | I2cControllerConfig_t I2cControllers[I2C_CONTROLLER_NAME_COUNT]; | ||
602 | |||
554 | uint32_t BoardReserved[10]; | 603 | uint32_t BoardReserved[10]; |
555 | 604 | ||
556 | 605 | ||
@@ -607,7 +656,9 @@ typedef struct { | |||
607 | uint16_t TemperatureHotspot ; | 656 | uint16_t TemperatureHotspot ; |
608 | uint16_t TemperatureHBM ; | 657 | uint16_t TemperatureHBM ; |
609 | uint16_t TemperatureVrGfx ; | 658 | uint16_t TemperatureVrGfx ; |
610 | uint16_t TemperatureVrMem ; | 659 | uint16_t TemperatureVrSoc ; |
660 | uint16_t TemperatureVrMem0 ; | ||
661 | uint16_t TemperatureVrMem1 ; | ||
611 | uint16_t TemperatureLiquid ; | 662 | uint16_t TemperatureLiquid ; |
612 | uint16_t TemperaturePlx ; | 663 | uint16_t TemperaturePlx ; |
613 | uint32_t ThrottlerStatus ; | 664 | uint32_t ThrottlerStatus ; |
diff --git a/drivers/gpu/drm/radeon/mkregtable.c b/drivers/gpu/drm/radeon/mkregtable.c index ba704633b072..52a7246fed9e 100644 --- a/drivers/gpu/drm/radeon/mkregtable.c +++ b/drivers/gpu/drm/radeon/mkregtable.c | |||
@@ -1,4 +1,4 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: MIT |
2 | /* utility to create the register check tables | 2 | /* utility to create the register check tables |
3 | * this includes inlined list.h safe for userspace. | 3 | * this includes inlined list.h safe for userspace. |
4 | * | 4 | * |
diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h index ad16a925f8d5..57e2b09784be 100644 --- a/drivers/gpu/drm/radeon/r100_track.h +++ b/drivers/gpu/drm/radeon/r100_track.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: MIT */ |
2 | 2 | ||
3 | #define R100_TRACK_MAX_TEXTURE 3 | 3 | #define R100_TRACK_MAX_TEXTURE 3 |
4 | #define R200_TRACK_MAX_TEXTURE 6 | 4 | #define R200_TRACK_MAX_TEXTURE 6 |
diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c index f920be236cc9..84b3ad2172a3 100644 --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c | |||
@@ -1,4 +1,4 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: MIT |
2 | 2 | ||
3 | #include <drm/drmP.h> | 3 | #include <drm/drmP.h> |
4 | #include <drm/drm_dp_mst_helper.h> | 4 | #include <drm/drm_dp_mst_helper.h> |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c index 611cf934b211..4278272e3191 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c | |||
@@ -1,4 +1,4 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: MIT |
2 | #include <drm/drmP.h> | 2 | #include <drm/drmP.h> |
3 | #include <drm/drm_crtc_helper.h> | 3 | #include <drm/drm_crtc_helper.h> |
4 | #include "radeon.h" | 4 | #include "radeon.h" |
diff --git a/drivers/gpu/drm/radeon/radeon_trace.h b/drivers/gpu/drm/radeon/radeon_trace.h index bc26efd1793e..0d84b8aafab3 100644 --- a/drivers/gpu/drm/radeon/radeon_trace.h +++ b/drivers/gpu/drm/radeon/radeon_trace.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: MIT */ |
2 | #if !defined(_RADEON_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) | 2 | #if !defined(_RADEON_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) |
3 | #define _RADEON_TRACE_H_ | 3 | #define _RADEON_TRACE_H_ |
4 | 4 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_trace_points.c b/drivers/gpu/drm/radeon/radeon_trace_points.c index 66b3d5084662..65e92302f974 100644 --- a/drivers/gpu/drm/radeon/radeon_trace_points.c +++ b/drivers/gpu/drm/radeon/radeon_trace_points.c | |||
@@ -1,4 +1,4 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: MIT |
2 | /* Copyright Red Hat Inc 2010. | 2 | /* Copyright Red Hat Inc 2010. |
3 | * Author : Dave Airlie <airlied@redhat.com> | 3 | * Author : Dave Airlie <airlied@redhat.com> |
4 | */ | 4 | */ |
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c index 4e8505d51795..44fe587aaef9 100644 --- a/drivers/gpu/drm/scheduler/sched_main.c +++ b/drivers/gpu/drm/scheduler/sched_main.c | |||
@@ -182,6 +182,20 @@ bool drm_sched_dependency_optimized(struct dma_fence* fence, | |||
182 | } | 182 | } |
183 | EXPORT_SYMBOL(drm_sched_dependency_optimized); | 183 | EXPORT_SYMBOL(drm_sched_dependency_optimized); |
184 | 184 | ||
185 | /** | ||
186 | * drm_sched_start_timeout - start timeout for reset worker | ||
187 | * | ||
188 | * @sched: scheduler instance to start the worker for | ||
189 | * | ||
190 | * Start the timeout for the given scheduler. | ||
191 | */ | ||
192 | static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched) | ||
193 | { | ||
194 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT && | ||
195 | !list_empty(&sched->ring_mirror_list)) | ||
196 | schedule_delayed_work(&sched->work_tdr, sched->timeout); | ||
197 | } | ||
198 | |||
185 | /* job_finish is called after hw fence signaled | 199 | /* job_finish is called after hw fence signaled |
186 | */ | 200 | */ |
187 | static void drm_sched_job_finish(struct work_struct *work) | 201 | static void drm_sched_job_finish(struct work_struct *work) |
@@ -203,9 +217,7 @@ static void drm_sched_job_finish(struct work_struct *work) | |||
203 | /* remove job from ring_mirror_list */ | 217 | /* remove job from ring_mirror_list */ |
204 | list_del(&s_job->node); | 218 | list_del(&s_job->node); |
205 | /* queue TDR for next job */ | 219 | /* queue TDR for next job */ |
206 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT && | 220 | drm_sched_start_timeout(sched); |
207 | !list_empty(&sched->ring_mirror_list)) | ||
208 | schedule_delayed_work(&sched->work_tdr, sched->timeout); | ||
209 | spin_unlock(&sched->job_list_lock); | 221 | spin_unlock(&sched->job_list_lock); |
210 | 222 | ||
211 | dma_fence_put(&s_job->s_fence->finished); | 223 | dma_fence_put(&s_job->s_fence->finished); |
@@ -229,10 +241,7 @@ static void drm_sched_job_begin(struct drm_sched_job *s_job) | |||
229 | 241 | ||
230 | spin_lock(&sched->job_list_lock); | 242 | spin_lock(&sched->job_list_lock); |
231 | list_add_tail(&s_job->node, &sched->ring_mirror_list); | 243 | list_add_tail(&s_job->node, &sched->ring_mirror_list); |
232 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT && | 244 | drm_sched_start_timeout(sched); |
233 | list_first_entry_or_null(&sched->ring_mirror_list, | ||
234 | struct drm_sched_job, node) == s_job) | ||
235 | schedule_delayed_work(&sched->work_tdr, sched->timeout); | ||
236 | spin_unlock(&sched->job_list_lock); | 245 | spin_unlock(&sched->job_list_lock); |
237 | } | 246 | } |
238 | 247 | ||
@@ -240,13 +249,41 @@ static void drm_sched_job_timedout(struct work_struct *work) | |||
240 | { | 249 | { |
241 | struct drm_gpu_scheduler *sched; | 250 | struct drm_gpu_scheduler *sched; |
242 | struct drm_sched_job *job; | 251 | struct drm_sched_job *job; |
252 | int r; | ||
243 | 253 | ||
244 | sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work); | 254 | sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work); |
255 | |||
256 | spin_lock(&sched->job_list_lock); | ||
257 | list_for_each_entry_reverse(job, &sched->ring_mirror_list, node) { | ||
258 | struct drm_sched_fence *fence = job->s_fence; | ||
259 | |||
260 | if (!dma_fence_remove_callback(fence->parent, &fence->cb)) | ||
261 | goto already_signaled; | ||
262 | } | ||
263 | |||
245 | job = list_first_entry_or_null(&sched->ring_mirror_list, | 264 | job = list_first_entry_or_null(&sched->ring_mirror_list, |
246 | struct drm_sched_job, node); | 265 | struct drm_sched_job, node); |
266 | spin_unlock(&sched->job_list_lock); | ||
247 | 267 | ||
248 | if (job) | 268 | if (job) |
249 | job->sched->ops->timedout_job(job); | 269 | sched->ops->timedout_job(job); |
270 | |||
271 | spin_lock(&sched->job_list_lock); | ||
272 | list_for_each_entry(job, &sched->ring_mirror_list, node) { | ||
273 | struct drm_sched_fence *fence = job->s_fence; | ||
274 | |||
275 | if (!fence->parent || !list_empty(&fence->cb.node)) | ||
276 | continue; | ||
277 | |||
278 | r = dma_fence_add_callback(fence->parent, &fence->cb, | ||
279 | drm_sched_process_job); | ||
280 | if (r) | ||
281 | drm_sched_process_job(fence->parent, &fence->cb); | ||
282 | |||
283 | already_signaled: | ||
284 | ; | ||
285 | } | ||
286 | spin_unlock(&sched->job_list_lock); | ||
250 | } | 287 | } |
251 | 288 | ||
252 | /** | 289 | /** |
@@ -313,11 +350,6 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched) | |||
313 | int r; | 350 | int r; |
314 | 351 | ||
315 | spin_lock(&sched->job_list_lock); | 352 | spin_lock(&sched->job_list_lock); |
316 | s_job = list_first_entry_or_null(&sched->ring_mirror_list, | ||
317 | struct drm_sched_job, node); | ||
318 | if (s_job && sched->timeout != MAX_SCHEDULE_TIMEOUT) | ||
319 | schedule_delayed_work(&sched->work_tdr, sched->timeout); | ||
320 | |||
321 | list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) { | 353 | list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) { |
322 | struct drm_sched_fence *s_fence = s_job->s_fence; | 354 | struct drm_sched_fence *s_fence = s_job->s_fence; |
323 | struct dma_fence *fence; | 355 | struct dma_fence *fence; |
@@ -350,6 +382,7 @@ void drm_sched_job_recovery(struct drm_gpu_scheduler *sched) | |||
350 | } | 382 | } |
351 | spin_lock(&sched->job_list_lock); | 383 | spin_lock(&sched->job_list_lock); |
352 | } | 384 | } |
385 | drm_sched_start_timeout(sched); | ||
353 | spin_unlock(&sched->job_list_lock); | 386 | spin_unlock(&sched->job_list_lock); |
354 | } | 387 | } |
355 | EXPORT_SYMBOL(drm_sched_job_recovery); | 388 | EXPORT_SYMBOL(drm_sched_job_recovery); |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 683742826511..b7e899ce44f0 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: MIT */ |
2 | #define radeon_PCI_IDS \ | 2 | #define radeon_PCI_IDS \ |
3 | {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 3 | {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
4 | {0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 4 | {0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |