aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2019-05-02 20:00:42 -0400
committerDave Airlie <airlied@redhat.com>2019-05-02 20:31:07 -0400
commit422449238e9853458283beffed77562d4b40a2fa (patch)
tree2eec3947c77dcdced46a7e391b49b326c2dc18f5
parent9f17847d853bbaa6d06510a31bff70716cbb73ab (diff)
parentb0fc850fd95f8ecceb601bbb40624da0a8c220a0 (diff)
Merge branch 'drm-next-5.2' of git://people.freedesktop.org/~agd5f/linux into drm-next
- SR-IOV fixes - Raven flickering fix - Misc spelling fixes - Vega20 power fixes - Freesync improvements - DC fixes Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190502193020.3562-1-alexander.deucher@amd.com
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c37
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c61
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c61
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c54
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/soc15.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v2_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v4_0.c15
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device.c4
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c302
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c71
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c77
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c21
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_stream.c23
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_link.h1
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_stream.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_abm.c18
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c35
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c27
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c49
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h63
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c6
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h4
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c13
-rw-r--r--drivers/gpu/drm/amd/display/dc/dm_pp_smu.h23
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/core_types.h1
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h6
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h1
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c6
-rw-r--r--drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h8
-rw-r--r--drivers/gpu/drm/amd/include/atomfirmware.h1
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h16
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c114
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c13
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smu10.h14
-rw-r--r--drivers/gpu/drm/amd/powerplay/smu_v11_0.c9
46 files changed, 734 insertions, 473 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index acf8ae0cee9a..aeead072fa79 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -335,6 +335,43 @@ void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
335 amdgpu_bo_unref(&(bo)); 335 amdgpu_bo_unref(&(bo));
336} 336}
337 337
338uint32_t amdgpu_amdkfd_get_fw_version(struct kgd_dev *kgd,
339 enum kgd_engine_type type)
340{
341 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
342
343 switch (type) {
344 case KGD_ENGINE_PFP:
345 return adev->gfx.pfp_fw_version;
346
347 case KGD_ENGINE_ME:
348 return adev->gfx.me_fw_version;
349
350 case KGD_ENGINE_CE:
351 return adev->gfx.ce_fw_version;
352
353 case KGD_ENGINE_MEC1:
354 return adev->gfx.mec_fw_version;
355
356 case KGD_ENGINE_MEC2:
357 return adev->gfx.mec2_fw_version;
358
359 case KGD_ENGINE_RLC:
360 return adev->gfx.rlc_fw_version;
361
362 case KGD_ENGINE_SDMA1:
363 return adev->sdma.instance[0].fw_version;
364
365 case KGD_ENGINE_SDMA2:
366 return adev->sdma.instance[1].fw_version;
367
368 default:
369 return 0;
370 }
371
372 return 0;
373}
374
338void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, 375void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd,
339 struct kfd_local_mem_info *mem_info) 376 struct kfd_local_mem_info *mem_info)
340{ 377{
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 775f815f9521..4e37fa7e85b1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -81,6 +81,18 @@ struct amdgpu_kfd_dev {
81 uint64_t vram_used; 81 uint64_t vram_used;
82}; 82};
83 83
84enum kgd_engine_type {
85 KGD_ENGINE_PFP = 1,
86 KGD_ENGINE_ME,
87 KGD_ENGINE_CE,
88 KGD_ENGINE_MEC1,
89 KGD_ENGINE_MEC2,
90 KGD_ENGINE_RLC,
91 KGD_ENGINE_SDMA1,
92 KGD_ENGINE_SDMA2,
93 KGD_ENGINE_MAX
94};
95
84struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, 96struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
85 struct mm_struct *mm); 97 struct mm_struct *mm);
86bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm); 98bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm);
@@ -142,6 +154,8 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
142 void **mem_obj, uint64_t *gpu_addr, 154 void **mem_obj, uint64_t *gpu_addr,
143 void **cpu_ptr, bool mqd_gfx9); 155 void **cpu_ptr, bool mqd_gfx9);
144void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 156void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
157uint32_t amdgpu_amdkfd_get_fw_version(struct kgd_dev *kgd,
158 enum kgd_engine_type type);
145void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, 159void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd,
146 struct kfd_local_mem_info *mem_info); 160 struct kfd_local_mem_info *mem_info);
147uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd); 161uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index ff7fac7df34b..fa09e11a600c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -22,14 +22,12 @@
22 22
23#include <linux/fdtable.h> 23#include <linux/fdtable.h>
24#include <linux/uaccess.h> 24#include <linux/uaccess.h>
25#include <linux/firmware.h>
26#include <linux/mmu_context.h> 25#include <linux/mmu_context.h>
27#include <drm/drmP.h> 26#include <drm/drmP.h>
28#include "amdgpu.h" 27#include "amdgpu.h"
29#include "amdgpu_amdkfd.h" 28#include "amdgpu_amdkfd.h"
30#include "cikd.h" 29#include "cikd.h"
31#include "cik_sdma.h" 30#include "cik_sdma.h"
32#include "amdgpu_ucode.h"
33#include "gfx_v7_0.h" 31#include "gfx_v7_0.h"
34#include "gca/gfx_7_2_d.h" 32#include "gca/gfx_7_2_d.h"
35#include "gca/gfx_7_2_enum.h" 33#include "gca/gfx_7_2_enum.h"
@@ -139,7 +137,6 @@ static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid);
139static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, 137static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
140 uint8_t vmid); 138 uint8_t vmid);
141 139
142static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
143static void set_scratch_backing_va(struct kgd_dev *kgd, 140static void set_scratch_backing_va(struct kgd_dev *kgd,
144 uint64_t va, uint32_t vmid); 141 uint64_t va, uint32_t vmid);
145static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 142static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
@@ -191,7 +188,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
191 .address_watch_get_offset = kgd_address_watch_get_offset, 188 .address_watch_get_offset = kgd_address_watch_get_offset,
192 .get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid, 189 .get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid,
193 .get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid, 190 .get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid,
194 .get_fw_version = get_fw_version,
195 .set_scratch_backing_va = set_scratch_backing_va, 191 .set_scratch_backing_va = set_scratch_backing_va,
196 .get_tile_config = get_tile_config, 192 .get_tile_config = get_tile_config,
197 .set_vm_context_page_table_base = set_vm_context_page_table_base, 193 .set_vm_context_page_table_base = set_vm_context_page_table_base,
@@ -792,63 +788,6 @@ static void set_scratch_backing_va(struct kgd_dev *kgd,
792 unlock_srbm(kgd); 788 unlock_srbm(kgd);
793} 789}
794 790
795static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
796{
797 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
798 const union amdgpu_firmware_header *hdr;
799
800 switch (type) {
801 case KGD_ENGINE_PFP:
802 hdr = (const union amdgpu_firmware_header *)
803 adev->gfx.pfp_fw->data;
804 break;
805
806 case KGD_ENGINE_ME:
807 hdr = (const union amdgpu_firmware_header *)
808 adev->gfx.me_fw->data;
809 break;
810
811 case KGD_ENGINE_CE:
812 hdr = (const union amdgpu_firmware_header *)
813 adev->gfx.ce_fw->data;
814 break;
815
816 case KGD_ENGINE_MEC1:
817 hdr = (const union amdgpu_firmware_header *)
818 adev->gfx.mec_fw->data;
819 break;
820
821 case KGD_ENGINE_MEC2:
822 hdr = (const union amdgpu_firmware_header *)
823 adev->gfx.mec2_fw->data;
824 break;
825
826 case KGD_ENGINE_RLC:
827 hdr = (const union amdgpu_firmware_header *)
828 adev->gfx.rlc_fw->data;
829 break;
830
831 case KGD_ENGINE_SDMA1:
832 hdr = (const union amdgpu_firmware_header *)
833 adev->sdma.instance[0].fw->data;
834 break;
835
836 case KGD_ENGINE_SDMA2:
837 hdr = (const union amdgpu_firmware_header *)
838 adev->sdma.instance[1].fw->data;
839 break;
840
841 default:
842 return 0;
843 }
844
845 if (hdr == NULL)
846 return 0;
847
848 /* Only 12 bit in use*/
849 return hdr->common.ucode_version;
850}
851
852static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 791static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
853 uint64_t page_table_base) 792 uint64_t page_table_base)
854{ 793{
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index 56ea929f524b..fec3a6aa1de6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -23,12 +23,10 @@
23#include <linux/module.h> 23#include <linux/module.h>
24#include <linux/fdtable.h> 24#include <linux/fdtable.h>
25#include <linux/uaccess.h> 25#include <linux/uaccess.h>
26#include <linux/firmware.h>
27#include <linux/mmu_context.h> 26#include <linux/mmu_context.h>
28#include <drm/drmP.h> 27#include <drm/drmP.h>
29#include "amdgpu.h" 28#include "amdgpu.h"
30#include "amdgpu_amdkfd.h" 29#include "amdgpu_amdkfd.h"
31#include "amdgpu_ucode.h"
32#include "gfx_v8_0.h" 30#include "gfx_v8_0.h"
33#include "gca/gfx_8_0_sh_mask.h" 31#include "gca/gfx_8_0_sh_mask.h"
34#include "gca/gfx_8_0_d.h" 32#include "gca/gfx_8_0_d.h"
@@ -95,7 +93,6 @@ static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd,
95 uint8_t vmid); 93 uint8_t vmid);
96static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, 94static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
97 uint8_t vmid); 95 uint8_t vmid);
98static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
99static void set_scratch_backing_va(struct kgd_dev *kgd, 96static void set_scratch_backing_va(struct kgd_dev *kgd,
100 uint64_t va, uint32_t vmid); 97 uint64_t va, uint32_t vmid);
101static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 98static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
@@ -148,7 +145,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
148 get_atc_vmid_pasid_mapping_pasid, 145 get_atc_vmid_pasid_mapping_pasid,
149 .get_atc_vmid_pasid_mapping_valid = 146 .get_atc_vmid_pasid_mapping_valid =
150 get_atc_vmid_pasid_mapping_valid, 147 get_atc_vmid_pasid_mapping_valid,
151 .get_fw_version = get_fw_version,
152 .set_scratch_backing_va = set_scratch_backing_va, 148 .set_scratch_backing_va = set_scratch_backing_va,
153 .get_tile_config = get_tile_config, 149 .get_tile_config = get_tile_config,
154 .set_vm_context_page_table_base = set_vm_context_page_table_base, 150 .set_vm_context_page_table_base = set_vm_context_page_table_base,
@@ -751,63 +747,6 @@ static void set_scratch_backing_va(struct kgd_dev *kgd,
751 unlock_srbm(kgd); 747 unlock_srbm(kgd);
752} 748}
753 749
754static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
755{
756 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
757 const union amdgpu_firmware_header *hdr;
758
759 switch (type) {
760 case KGD_ENGINE_PFP:
761 hdr = (const union amdgpu_firmware_header *)
762 adev->gfx.pfp_fw->data;
763 break;
764
765 case KGD_ENGINE_ME:
766 hdr = (const union amdgpu_firmware_header *)
767 adev->gfx.me_fw->data;
768 break;
769
770 case KGD_ENGINE_CE:
771 hdr = (const union amdgpu_firmware_header *)
772 adev->gfx.ce_fw->data;
773 break;
774
775 case KGD_ENGINE_MEC1:
776 hdr = (const union amdgpu_firmware_header *)
777 adev->gfx.mec_fw->data;
778 break;
779
780 case KGD_ENGINE_MEC2:
781 hdr = (const union amdgpu_firmware_header *)
782 adev->gfx.mec2_fw->data;
783 break;
784
785 case KGD_ENGINE_RLC:
786 hdr = (const union amdgpu_firmware_header *)
787 adev->gfx.rlc_fw->data;
788 break;
789
790 case KGD_ENGINE_SDMA1:
791 hdr = (const union amdgpu_firmware_header *)
792 adev->sdma.instance[0].fw->data;
793 break;
794
795 case KGD_ENGINE_SDMA2:
796 hdr = (const union amdgpu_firmware_header *)
797 adev->sdma.instance[1].fw->data;
798 break;
799
800 default:
801 return 0;
802 }
803
804 if (hdr == NULL)
805 return 0;
806
807 /* Only 12 bit in use*/
808 return hdr->common.ucode_version;
809}
810
811static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 750static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
812 uint64_t page_table_base) 751 uint64_t page_table_base)
813{ 752{
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
index 5c51d4910650..ef3d93b995b2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -25,12 +25,10 @@
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/fdtable.h> 26#include <linux/fdtable.h>
27#include <linux/uaccess.h> 27#include <linux/uaccess.h>
28#include <linux/firmware.h>
29#include <linux/mmu_context.h> 28#include <linux/mmu_context.h>
30#include <drm/drmP.h> 29#include <drm/drmP.h>
31#include "amdgpu.h" 30#include "amdgpu.h"
32#include "amdgpu_amdkfd.h" 31#include "amdgpu_amdkfd.h"
33#include "amdgpu_ucode.h"
34#include "soc15_hw_ip.h" 32#include "soc15_hw_ip.h"
35#include "gc/gc_9_0_offset.h" 33#include "gc/gc_9_0_offset.h"
36#include "gc/gc_9_0_sh_mask.h" 34#include "gc/gc_9_0_sh_mask.h"
@@ -111,7 +109,6 @@ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
111 uint8_t vmid); 109 uint8_t vmid);
112static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 110static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
113 uint64_t page_table_base); 111 uint64_t page_table_base);
114static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
115static void set_scratch_backing_va(struct kgd_dev *kgd, 112static void set_scratch_backing_va(struct kgd_dev *kgd,
116 uint64_t va, uint32_t vmid); 113 uint64_t va, uint32_t vmid);
117static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); 114static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
@@ -158,7 +155,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
158 get_atc_vmid_pasid_mapping_pasid, 155 get_atc_vmid_pasid_mapping_pasid,
159 .get_atc_vmid_pasid_mapping_valid = 156 .get_atc_vmid_pasid_mapping_valid =
160 get_atc_vmid_pasid_mapping_valid, 157 get_atc_vmid_pasid_mapping_valid,
161 .get_fw_version = get_fw_version,
162 .set_scratch_backing_va = set_scratch_backing_va, 158 .set_scratch_backing_va = set_scratch_backing_va,
163 .get_tile_config = amdgpu_amdkfd_get_tile_config, 159 .get_tile_config = amdgpu_amdkfd_get_tile_config,
164 .set_vm_context_page_table_base = set_vm_context_page_table_base, 160 .set_vm_context_page_table_base = set_vm_context_page_table_base,
@@ -874,56 +870,6 @@ static void set_scratch_backing_va(struct kgd_dev *kgd,
874 */ 870 */
875} 871}
876 872
877/* FIXME: Does this need to be ASIC-specific code? */
878static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
879{
880 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
881 const union amdgpu_firmware_header *hdr;
882
883 switch (type) {
884 case KGD_ENGINE_PFP:
885 hdr = (const union amdgpu_firmware_header *)adev->gfx.pfp_fw->data;
886 break;
887
888 case KGD_ENGINE_ME:
889 hdr = (const union amdgpu_firmware_header *)adev->gfx.me_fw->data;
890 break;
891
892 case KGD_ENGINE_CE:
893 hdr = (const union amdgpu_firmware_header *)adev->gfx.ce_fw->data;
894 break;
895
896 case KGD_ENGINE_MEC1:
897 hdr = (const union amdgpu_firmware_header *)adev->gfx.mec_fw->data;
898 break;
899
900 case KGD_ENGINE_MEC2:
901 hdr = (const union amdgpu_firmware_header *)adev->gfx.mec2_fw->data;
902 break;
903
904 case KGD_ENGINE_RLC:
905 hdr = (const union amdgpu_firmware_header *)adev->gfx.rlc_fw->data;
906 break;
907
908 case KGD_ENGINE_SDMA1:
909 hdr = (const union amdgpu_firmware_header *)adev->sdma.instance[0].fw->data;
910 break;
911
912 case KGD_ENGINE_SDMA2:
913 hdr = (const union amdgpu_firmware_header *)adev->sdma.instance[1].fw->data;
914 break;
915
916 default:
917 return 0;
918 }
919
920 if (hdr == NULL)
921 return 0;
922
923 /* Only 12 bit in use*/
924 return hdr->common.ucode_version;
925}
926
927static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 873static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
928 uint64_t page_table_base) 874 uint64_t page_table_base)
929{ 875{
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index d47354997e3c..9ec6356d3f0b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3437,7 +3437,7 @@ static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,
3437 3437
3438 vram_lost = amdgpu_device_check_vram_lost(tmp_adev); 3438 vram_lost = amdgpu_device_check_vram_lost(tmp_adev);
3439 if (vram_lost) { 3439 if (vram_lost) {
3440 DRM_ERROR("VRAM is lost!\n"); 3440 DRM_INFO("VRAM is lost due to GPU reset!\n");
3441 atomic_inc(&tmp_adev->vram_lost_counter); 3441 atomic_inc(&tmp_adev->vram_lost_counter);
3442 } 3442 }
3443 3443
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index ec9e45004bff..93b2c5a48a71 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -88,12 +88,14 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
88 if (bo->gem_base.import_attach) 88 if (bo->gem_base.import_attach)
89 drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg); 89 drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
90 drm_gem_object_release(&bo->gem_base); 90 drm_gem_object_release(&bo->gem_base);
91 amdgpu_bo_unref(&bo->parent); 91 /* in case amdgpu_device_recover_vram got NULL of bo->parent */
92 if (!list_empty(&bo->shadow_list)) { 92 if (!list_empty(&bo->shadow_list)) {
93 mutex_lock(&adev->shadow_list_lock); 93 mutex_lock(&adev->shadow_list_lock);
94 list_del_init(&bo->shadow_list); 94 list_del_init(&bo->shadow_list);
95 mutex_unlock(&adev->shadow_list_lock); 95 mutex_unlock(&adev->shadow_list_lock);
96 } 96 }
97 amdgpu_bo_unref(&bo->parent);
98
97 kfree(bo->metadata); 99 kfree(bo->metadata);
98 kfree(bo); 100 kfree(bo);
99} 101}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 4b7a076eea9c..95144e49c7f9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -144,7 +144,7 @@ static ssize_t amdgpu_get_dpm_state(struct device *dev,
144 struct amdgpu_device *adev = ddev->dev_private; 144 struct amdgpu_device *adev = ddev->dev_private;
145 enum amd_pm_state_type pm; 145 enum amd_pm_state_type pm;
146 146
147 if (adev->smu.ppt_funcs->get_current_power_state) 147 if (is_support_sw_smu(adev) && adev->smu.ppt_funcs->get_current_power_state)
148 pm = amdgpu_smu_get_current_power_state(adev); 148 pm = amdgpu_smu_get_current_power_state(adev);
149 else if (adev->powerplay.pp_funcs->get_current_power_state) 149 else if (adev->powerplay.pp_funcs->get_current_power_state)
150 pm = amdgpu_dpm_get_current_power_state(adev); 150 pm = amdgpu_dpm_get_current_power_state(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index 7e7f9ed89ee1..7d484fad3909 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -36,6 +36,7 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)
36 /* enable virtual display */ 36 /* enable virtual display */
37 adev->mode_info.num_crtc = 1; 37 adev->mode_info.num_crtc = 1;
38 adev->enable_virtual_display = true; 38 adev->enable_virtual_display = true;
39 adev->ddev->driver->driver_features &= ~DRIVER_ATOMIC;
39 adev->cg_flags = 0; 40 adev->cg_flags = 0;
40 adev->pg_flags = 0; 41 adev->pg_flags = 0;
41} 42}
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
index 6a0fcd67662a..aef9d059ae52 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
@@ -515,7 +515,7 @@ static void xgpu_vi_mailbox_flr_work(struct work_struct *work)
515 515
516 /* wait until RCV_MSG become 3 */ 516 /* wait until RCV_MSG become 3 */
517 if (xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL)) { 517 if (xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL)) {
518 pr_err("failed to recieve FLR_CMPL\n"); 518 pr_err("failed to receive FLR_CMPL\n");
519 return; 519 return;
520 } 520 }
521 521
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 1ec60f54b992..9c88ce513d78 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -156,7 +156,6 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =
156 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), 156 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001),
157 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), 157 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
158 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0), 158 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0),
159 SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_WATERMK, 0xFE000000, 0x00000000),
160}; 159};
161 160
162static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { 161static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = {
@@ -186,7 +185,6 @@ static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = {
186 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001), 185 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001),
187 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), 186 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
188 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0), 187 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0),
189 SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_WATERMK, 0xFE000000, 0x00000000),
190}; 188};
191 189
192static const struct soc15_reg_golden golden_settings_sdma_rv1[] = 190static const struct soc15_reg_golden golden_settings_sdma_rv1[] =
@@ -851,7 +849,7 @@ static void sdma_v4_0_gfx_resume(struct amdgpu_device *adev, unsigned int i)
851 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL); 849 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL);
852 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, 850 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
853 SDMA0_GFX_RB_WPTR_POLL_CNTL, 851 SDMA0_GFX_RB_WPTR_POLL_CNTL,
854 F32_POLL_ENABLE, amdgpu_sriov_vf(adev)); 852 F32_POLL_ENABLE, amdgpu_sriov_vf(adev)? 1 : 0);
855 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, wptr_poll_cntl); 853 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, wptr_poll_cntl);
856 854
857 /* enable DMA RB */ 855 /* enable DMA RB */
@@ -942,7 +940,7 @@ static void sdma_v4_0_page_resume(struct amdgpu_device *adev, unsigned int i)
942 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL); 940 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL);
943 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, 941 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
944 SDMA0_PAGE_RB_WPTR_POLL_CNTL, 942 SDMA0_PAGE_RB_WPTR_POLL_CNTL,
945 F32_POLL_ENABLE, amdgpu_sriov_vf(adev)); 943 F32_POLL_ENABLE, amdgpu_sriov_vf(adev)? 1 : 0);
946 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL, wptr_poll_cntl); 944 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL, wptr_poll_cntl);
947 945
948 /* enable DMA RB */ 946 /* enable DMA RB */
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
index bdb5ad93990d..4900e4958dec 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
@@ -470,6 +470,12 @@ static int soc15_asic_reset(struct amdgpu_device *adev)
470 case CHIP_VEGA12: 470 case CHIP_VEGA12:
471 soc15_asic_get_baco_capability(adev, &baco_reset); 471 soc15_asic_get_baco_capability(adev, &baco_reset);
472 break; 472 break;
473 case CHIP_VEGA20:
474 if (adev->psp.sos_fw_version >= 0x80067)
475 soc15_asic_get_baco_capability(adev, &baco_reset);
476 else
477 baco_reset = false;
478 break;
473 default: 479 default:
474 baco_reset = false; 480 baco_reset = false;
475 break; 481 break;
@@ -895,7 +901,8 @@ static int soc15_common_early_init(void *handle)
895 901
896 adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN; 902 adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN;
897 } else if (adev->pdev->device == 0x15d8) { 903 } else if (adev->pdev->device == 0x15d8) {
898 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGLS | 904 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
905 AMD_CG_SUPPORT_GFX_MGLS |
899 AMD_CG_SUPPORT_GFX_CP_LS | 906 AMD_CG_SUPPORT_GFX_CP_LS |
900 AMD_CG_SUPPORT_GFX_3D_CGCG | 907 AMD_CG_SUPPORT_GFX_3D_CGCG |
901 AMD_CG_SUPPORT_GFX_3D_CGLS | 908 AMD_CG_SUPPORT_GFX_3D_CGLS |
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
index bed78a778e3f..40363ca6c5f1 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
@@ -283,7 +283,7 @@ static int vce_v2_0_stop(struct amdgpu_device *adev)
283 } 283 }
284 284
285 if (vce_v2_0_wait_for_idle(adev)) { 285 if (vce_v2_0_wait_for_idle(adev)) {
286 DRM_INFO("VCE is busy, Can't set clock gateing"); 286 DRM_INFO("VCE is busy, Can't set clock gating");
287 return 0; 287 return 0;
288 } 288 }
289 289
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
index aadc3e66ebd7..f3f5938430d4 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
@@ -382,6 +382,7 @@ static int vce_v4_0_start(struct amdgpu_device *adev)
382static int vce_v4_0_stop(struct amdgpu_device *adev) 382static int vce_v4_0_stop(struct amdgpu_device *adev)
383{ 383{
384 384
385 /* Disable VCPU */
385 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL), 0, ~0x200001); 386 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL), 0, ~0x200001);
386 387
387 /* hold on ECPU */ 388 /* hold on ECPU */
@@ -389,8 +390,8 @@ static int vce_v4_0_stop(struct amdgpu_device *adev)
389 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, 390 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
390 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK); 391 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
391 392
392 /* clear BUSY flag */ 393 /* clear VCE_STATUS */
393 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 0, ~VCE_STATUS__JOB_BUSY_MASK); 394 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 0);
394 395
395 /* Set Clock-Gating off */ 396 /* Set Clock-Gating off */
396 /* if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG) 397 /* if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
@@ -922,6 +923,7 @@ static int vce_v4_0_set_clockgating_state(void *handle,
922 923
923 return 0; 924 return 0;
924} 925}
926#endif
925 927
926static int vce_v4_0_set_powergating_state(void *handle, 928static int vce_v4_0_set_powergating_state(void *handle,
927 enum amd_powergating_state state) 929 enum amd_powergating_state state)
@@ -935,16 +937,11 @@ static int vce_v4_0_set_powergating_state(void *handle,
935 */ 937 */
936 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 938 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
937 939
938 if (!(adev->pg_flags & AMD_PG_SUPPORT_VCE))
939 return 0;
940
941 if (state == AMD_PG_STATE_GATE) 940 if (state == AMD_PG_STATE_GATE)
942 /* XXX do we need a vce_v4_0_stop()? */ 941 return vce_v4_0_stop(adev);
943 return 0;
944 else 942 else
945 return vce_v4_0_start(adev); 943 return vce_v4_0_start(adev);
946} 944}
947#endif
948 945
949static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job, 946static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job,
950 struct amdgpu_ib *ib, uint32_t flags) 947 struct amdgpu_ib *ib, uint32_t flags)
@@ -1059,7 +1056,7 @@ const struct amd_ip_funcs vce_v4_0_ip_funcs = {
1059 .soft_reset = NULL /* vce_v4_0_soft_reset */, 1056 .soft_reset = NULL /* vce_v4_0_soft_reset */,
1060 .post_soft_reset = NULL /* vce_v4_0_post_soft_reset */, 1057 .post_soft_reset = NULL /* vce_v4_0_post_soft_reset */,
1061 .set_clockgating_state = vce_v4_0_set_clockgating_state, 1058 .set_clockgating_state = vce_v4_0_set_clockgating_state,
1062 .set_powergating_state = NULL /* vce_v4_0_set_powergating_state */, 1059 .set_powergating_state = vce_v4_0_set_powergating_state,
1063}; 1060};
1064 1061
1065static const struct amdgpu_ring_funcs vce_v4_0_ring_vm_funcs = { 1062static const struct amdgpu_ring_funcs vce_v4_0_ring_vm_funcs = {
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 2fee3063a0d6..c1e4d44d6137 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -494,9 +494,9 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
494{ 494{
495 unsigned int size; 495 unsigned int size;
496 496
497 kfd->mec_fw_version = kfd->kfd2kgd->get_fw_version(kfd->kgd, 497 kfd->mec_fw_version = amdgpu_amdkfd_get_fw_version(kfd->kgd,
498 KGD_ENGINE_MEC1); 498 KGD_ENGINE_MEC1);
499 kfd->sdma_fw_version = kfd->kfd2kgd->get_fw_version(kfd->kgd, 499 kfd->sdma_fw_version = amdgpu_amdkfd_get_fw_version(kfd->kgd,
500 KGD_ENGINE_SDMA1); 500 KGD_ENGINE_SDMA1);
501 kfd->shared_resources = *gpu_resources; 501 kfd->shared_resources = *gpu_resources;
502 502
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 923cb5ca5a57..1854506e3e8f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -364,6 +364,7 @@ static void dm_vupdate_high_irq(void *interrupt_params)
364 struct amdgpu_device *adev = irq_params->adev; 364 struct amdgpu_device *adev = irq_params->adev;
365 struct amdgpu_crtc *acrtc; 365 struct amdgpu_crtc *acrtc;
366 struct dm_crtc_state *acrtc_state; 366 struct dm_crtc_state *acrtc_state;
367 unsigned long flags;
367 368
368 acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VUPDATE); 369 acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VUPDATE);
369 370
@@ -379,8 +380,25 @@ static void dm_vupdate_high_irq(void *interrupt_params)
379 * page-flip completion events that have been queued to us 380 * page-flip completion events that have been queued to us
380 * if a pageflip happened inside front-porch. 381 * if a pageflip happened inside front-porch.
381 */ 382 */
382 if (amdgpu_dm_vrr_active(acrtc_state)) 383 if (amdgpu_dm_vrr_active(acrtc_state)) {
383 drm_crtc_handle_vblank(&acrtc->base); 384 drm_crtc_handle_vblank(&acrtc->base);
385
386 /* BTR processing for pre-DCE12 ASICs */
387 if (acrtc_state->stream &&
388 adev->family < AMDGPU_FAMILY_AI) {
389 spin_lock_irqsave(&adev->ddev->event_lock, flags);
390 mod_freesync_handle_v_update(
391 adev->dm.freesync_module,
392 acrtc_state->stream,
393 &acrtc_state->vrr_params);
394
395 dc_stream_adjust_vmin_vmax(
396 adev->dm.dc,
397 acrtc_state->stream,
398 &acrtc_state->vrr_params.adjust);
399 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
400 }
401 }
384 } 402 }
385} 403}
386 404
@@ -390,6 +408,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
390 struct amdgpu_device *adev = irq_params->adev; 408 struct amdgpu_device *adev = irq_params->adev;
391 struct amdgpu_crtc *acrtc; 409 struct amdgpu_crtc *acrtc;
392 struct dm_crtc_state *acrtc_state; 410 struct dm_crtc_state *acrtc_state;
411 unsigned long flags;
393 412
394 acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VBLANK); 413 acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VBLANK);
395 414
@@ -412,9 +431,10 @@ static void dm_crtc_high_irq(void *interrupt_params)
412 */ 431 */
413 amdgpu_dm_crtc_handle_crc_irq(&acrtc->base); 432 amdgpu_dm_crtc_handle_crc_irq(&acrtc->base);
414 433
415 if (acrtc_state->stream && 434 if (acrtc_state->stream && adev->family >= AMDGPU_FAMILY_AI &&
416 acrtc_state->vrr_params.supported && 435 acrtc_state->vrr_params.supported &&
417 acrtc_state->freesync_config.state == VRR_STATE_ACTIVE_VARIABLE) { 436 acrtc_state->freesync_config.state == VRR_STATE_ACTIVE_VARIABLE) {
437 spin_lock_irqsave(&adev->ddev->event_lock, flags);
418 mod_freesync_handle_v_update( 438 mod_freesync_handle_v_update(
419 adev->dm.freesync_module, 439 adev->dm.freesync_module,
420 acrtc_state->stream, 440 acrtc_state->stream,
@@ -424,6 +444,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
424 adev->dm.dc, 444 adev->dm.dc,
425 acrtc_state->stream, 445 acrtc_state->stream,
426 &acrtc_state->vrr_params.adjust); 446 &acrtc_state->vrr_params.adjust);
447 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
427 } 448 }
428 } 449 }
429} 450}
@@ -534,6 +555,8 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
534 if (amdgpu_dc_feature_mask & DC_FBC_MASK) 555 if (amdgpu_dc_feature_mask & DC_FBC_MASK)
535 init_data.flags.fbc_support = true; 556 init_data.flags.fbc_support = true;
536 557
558 init_data.flags.power_down_display_on_boot = true;
559
537 /* Display Core create. */ 560 /* Display Core create. */
538 adev->dm.dc = dc_create(&init_data); 561 adev->dm.dc = dc_create(&init_data);
539 562
@@ -3438,6 +3461,8 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc)
3438 dc_stream_retain(state->stream); 3461 dc_stream_retain(state->stream);
3439 } 3462 }
3440 3463
3464 state->active_planes = cur->active_planes;
3465 state->interrupts_enabled = cur->interrupts_enabled;
3441 state->vrr_params = cur->vrr_params; 3466 state->vrr_params = cur->vrr_params;
3442 state->vrr_infopacket = cur->vrr_infopacket; 3467 state->vrr_infopacket = cur->vrr_infopacket;
3443 state->abm_level = cur->abm_level; 3468 state->abm_level = cur->abm_level;
@@ -3862,7 +3887,20 @@ static void dm_crtc_helper_disable(struct drm_crtc *crtc)
3862{ 3887{
3863} 3888}
3864 3889
3865static bool does_crtc_have_active_plane(struct drm_crtc_state *new_crtc_state) 3890static bool does_crtc_have_active_cursor(struct drm_crtc_state *new_crtc_state)
3891{
3892 struct drm_device *dev = new_crtc_state->crtc->dev;
3893 struct drm_plane *plane;
3894
3895 drm_for_each_plane_mask(plane, dev, new_crtc_state->plane_mask) {
3896 if (plane->type == DRM_PLANE_TYPE_CURSOR)
3897 return true;
3898 }
3899
3900 return false;
3901}
3902
3903static int count_crtc_active_planes(struct drm_crtc_state *new_crtc_state)
3866{ 3904{
3867 struct drm_atomic_state *state = new_crtc_state->state; 3905 struct drm_atomic_state *state = new_crtc_state->state;
3868 struct drm_plane *plane; 3906 struct drm_plane *plane;
@@ -3891,7 +3929,32 @@ static bool does_crtc_have_active_plane(struct drm_crtc_state *new_crtc_state)
3891 num_active += (new_plane_state->fb != NULL); 3929 num_active += (new_plane_state->fb != NULL);
3892 } 3930 }
3893 3931
3894 return num_active > 0; 3932 return num_active;
3933}
3934
3935/*
3936 * Sets whether interrupts should be enabled on a specific CRTC.
3937 * We require that the stream be enabled and that there exist active
3938 * DC planes on the stream.
3939 */
3940static void
3941dm_update_crtc_interrupt_state(struct drm_crtc *crtc,
3942 struct drm_crtc_state *new_crtc_state)
3943{
3944 struct dm_crtc_state *dm_new_crtc_state =
3945 to_dm_crtc_state(new_crtc_state);
3946
3947 dm_new_crtc_state->active_planes = 0;
3948 dm_new_crtc_state->interrupts_enabled = false;
3949
3950 if (!dm_new_crtc_state->stream)
3951 return;
3952
3953 dm_new_crtc_state->active_planes =
3954 count_crtc_active_planes(new_crtc_state);
3955
3956 dm_new_crtc_state->interrupts_enabled =
3957 dm_new_crtc_state->active_planes > 0;
3895} 3958}
3896 3959
3897static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, 3960static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
@@ -3902,6 +3965,14 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
3902 struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(state); 3965 struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(state);
3903 int ret = -EINVAL; 3966 int ret = -EINVAL;
3904 3967
3968 /*
3969 * Update interrupt state for the CRTC. This needs to happen whenever
3970 * the CRTC has changed or whenever any of its planes have changed.
3971 * Atomic check satisfies both of these requirements since the CRTC
3972 * is added to the state by DRM during drm_atomic_helper_check_planes.
3973 */
3974 dm_update_crtc_interrupt_state(crtc, state);
3975
3905 if (unlikely(!dm_crtc_state->stream && 3976 if (unlikely(!dm_crtc_state->stream &&
3906 modeset_required(state, NULL, dm_crtc_state->stream))) { 3977 modeset_required(state, NULL, dm_crtc_state->stream))) {
3907 WARN_ON(1); 3978 WARN_ON(1);
@@ -3912,9 +3983,13 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
3912 if (!dm_crtc_state->stream) 3983 if (!dm_crtc_state->stream)
3913 return 0; 3984 return 0;
3914 3985
3915 /* We want at least one hardware plane enabled to use the stream. */ 3986 /*
3987 * We want at least one hardware plane enabled to use
3988 * the stream with a cursor enabled.
3989 */
3916 if (state->enable && state->active && 3990 if (state->enable && state->active &&
3917 !does_crtc_have_active_plane(state)) 3991 does_crtc_have_active_cursor(state) &&
3992 dm_crtc_state->active_planes == 0)
3918 return -EINVAL; 3993 return -EINVAL;
3919 3994
3920 if (dc_validate_stream(dc, dm_crtc_state->stream) == DC_OK) 3995 if (dc_validate_stream(dc, dm_crtc_state->stream) == DC_OK)
@@ -4188,6 +4263,7 @@ static const uint32_t rgb_formats[] = {
4188 DRM_FORMAT_ABGR2101010, 4263 DRM_FORMAT_ABGR2101010,
4189 DRM_FORMAT_XBGR8888, 4264 DRM_FORMAT_XBGR8888,
4190 DRM_FORMAT_ABGR8888, 4265 DRM_FORMAT_ABGR8888,
4266 DRM_FORMAT_RGB565,
4191}; 4267};
4192 4268
4193static const uint32_t overlay_formats[] = { 4269static const uint32_t overlay_formats[] = {
@@ -4196,6 +4272,7 @@ static const uint32_t overlay_formats[] = {
4196 DRM_FORMAT_RGBA8888, 4272 DRM_FORMAT_RGBA8888,
4197 DRM_FORMAT_XBGR8888, 4273 DRM_FORMAT_XBGR8888,
4198 DRM_FORMAT_ABGR8888, 4274 DRM_FORMAT_ABGR8888,
4275 DRM_FORMAT_RGB565
4199}; 4276};
4200 4277
4201static const u32 cursor_formats[] = { 4278static const u32 cursor_formats[] = {
@@ -4999,8 +5076,10 @@ static void update_freesync_state_on_stream(
4999 struct dc_plane_state *surface, 5076 struct dc_plane_state *surface,
5000 u32 flip_timestamp_in_us) 5077 u32 flip_timestamp_in_us)
5001{ 5078{
5002 struct mod_vrr_params vrr_params = new_crtc_state->vrr_params; 5079 struct mod_vrr_params vrr_params;
5003 struct dc_info_packet vrr_infopacket = {0}; 5080 struct dc_info_packet vrr_infopacket = {0};
5081 struct amdgpu_device *adev = dm->adev;
5082 unsigned long flags;
5004 5083
5005 if (!new_stream) 5084 if (!new_stream)
5006 return; 5085 return;
@@ -5013,6 +5092,9 @@ static void update_freesync_state_on_stream(
5013 if (!new_stream->timing.h_total || !new_stream->timing.v_total) 5092 if (!new_stream->timing.h_total || !new_stream->timing.v_total)
5014 return; 5093 return;
5015 5094
5095 spin_lock_irqsave(&adev->ddev->event_lock, flags);
5096 vrr_params = new_crtc_state->vrr_params;
5097
5016 if (surface) { 5098 if (surface) {
5017 mod_freesync_handle_preflip( 5099 mod_freesync_handle_preflip(
5018 dm->freesync_module, 5100 dm->freesync_module,
@@ -5020,6 +5102,12 @@ static void update_freesync_state_on_stream(
5020 new_stream, 5102 new_stream,
5021 flip_timestamp_in_us, 5103 flip_timestamp_in_us,
5022 &vrr_params); 5104 &vrr_params);
5105
5106 if (adev->family < AMDGPU_FAMILY_AI &&
5107 amdgpu_dm_vrr_active(new_crtc_state)) {
5108 mod_freesync_handle_v_update(dm->freesync_module,
5109 new_stream, &vrr_params);
5110 }
5023 } 5111 }
5024 5112
5025 mod_freesync_build_vrr_infopacket( 5113 mod_freesync_build_vrr_infopacket(
@@ -5051,6 +5139,8 @@ static void update_freesync_state_on_stream(
5051 new_crtc_state->base.crtc->base.id, 5139 new_crtc_state->base.crtc->base.id,
5052 (int)new_crtc_state->base.vrr_enabled, 5140 (int)new_crtc_state->base.vrr_enabled,
5053 (int)vrr_params.state); 5141 (int)vrr_params.state);
5142
5143 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
5054} 5144}
5055 5145
5056static void pre_update_freesync_state_on_stream( 5146static void pre_update_freesync_state_on_stream(
@@ -5058,8 +5148,10 @@ static void pre_update_freesync_state_on_stream(
5058 struct dm_crtc_state *new_crtc_state) 5148 struct dm_crtc_state *new_crtc_state)
5059{ 5149{
5060 struct dc_stream_state *new_stream = new_crtc_state->stream; 5150 struct dc_stream_state *new_stream = new_crtc_state->stream;
5061 struct mod_vrr_params vrr_params = new_crtc_state->vrr_params; 5151 struct mod_vrr_params vrr_params;
5062 struct mod_freesync_config config = new_crtc_state->freesync_config; 5152 struct mod_freesync_config config = new_crtc_state->freesync_config;
5153 struct amdgpu_device *adev = dm->adev;
5154 unsigned long flags;
5063 5155
5064 if (!new_stream) 5156 if (!new_stream)
5065 return; 5157 return;
@@ -5071,6 +5163,9 @@ static void pre_update_freesync_state_on_stream(
5071 if (!new_stream->timing.h_total || !new_stream->timing.v_total) 5163 if (!new_stream->timing.h_total || !new_stream->timing.v_total)
5072 return; 5164 return;
5073 5165
5166 spin_lock_irqsave(&adev->ddev->event_lock, flags);
5167 vrr_params = new_crtc_state->vrr_params;
5168
5074 if (new_crtc_state->vrr_supported && 5169 if (new_crtc_state->vrr_supported &&
5075 config.min_refresh_in_uhz && 5170 config.min_refresh_in_uhz &&
5076 config.max_refresh_in_uhz) { 5171 config.max_refresh_in_uhz) {
@@ -5091,6 +5186,7 @@ static void pre_update_freesync_state_on_stream(
5091 sizeof(vrr_params.adjust)) != 0); 5186 sizeof(vrr_params.adjust)) != 0);
5092 5187
5093 new_crtc_state->vrr_params = vrr_params; 5188 new_crtc_state->vrr_params = vrr_params;
5189 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
5094} 5190}
5095 5191
5096static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state, 5192static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
@@ -5123,6 +5219,22 @@ static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
5123 } 5219 }
5124} 5220}
5125 5221
5222static void amdgpu_dm_commit_cursors(struct drm_atomic_state *state)
5223{
5224 struct drm_plane *plane;
5225 struct drm_plane_state *old_plane_state, *new_plane_state;
5226 int i;
5227
5228 /*
5229 * TODO: Make this per-stream so we don't issue redundant updates for
5230 * commits with multiple streams.
5231 */
5232 for_each_oldnew_plane_in_state(state, plane, old_plane_state,
5233 new_plane_state, i)
5234 if (plane->type == DRM_PLANE_TYPE_CURSOR)
5235 handle_cursor_update(plane, old_plane_state);
5236}
5237
5126static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, 5238static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
5127 struct dc_state *dc_state, 5239 struct dc_state *dc_state,
5128 struct drm_device *dev, 5240 struct drm_device *dev,
@@ -5162,6 +5274,14 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
5162 goto cleanup; 5274 goto cleanup;
5163 } 5275 }
5164 5276
5277 /*
5278 * Disable the cursor first if we're disabling all the planes.
5279 * It'll remain on the screen after the planes are re-enabled
5280 * if we don't.
5281 */
5282 if (acrtc_state->active_planes == 0)
5283 amdgpu_dm_commit_cursors(state);
5284
5165 /* update planes when needed */ 5285 /* update planes when needed */
5166 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) { 5286 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
5167 struct drm_crtc *crtc = new_plane_state->crtc; 5287 struct drm_crtc *crtc = new_plane_state->crtc;
@@ -5205,22 +5325,28 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
5205 continue; 5325 continue;
5206 } 5326 }
5207 5327
5328 abo = gem_to_amdgpu_bo(fb->obj[0]);
5329
5330 /*
5331 * Wait for all fences on this FB. Do limited wait to avoid
5332 * deadlock during GPU reset when this fence will not signal
5333 * but we hold reservation lock for the BO.
5334 */
5335 r = reservation_object_wait_timeout_rcu(abo->tbo.resv, true,
5336 false,
5337 msecs_to_jiffies(5000));
5338 if (unlikely(r <= 0))
5339 DRM_ERROR("Waiting for fences timed out or interrupted!");
5340
5208 /* 5341 /*
5209 * TODO This might fail and hence better not used, wait 5342 * TODO This might fail and hence better not used, wait
5210 * explicitly on fences instead 5343 * explicitly on fences instead
5211 * and in general should be called for 5344 * and in general should be called for
5212 * blocking commit to as per framework helpers 5345 * blocking commit to as per framework helpers
5213 */ 5346 */
5214 abo = gem_to_amdgpu_bo(fb->obj[0]);
5215 r = amdgpu_bo_reserve(abo, true); 5347 r = amdgpu_bo_reserve(abo, true);
5216 if (unlikely(r != 0)) { 5348 if (unlikely(r != 0))
5217 DRM_ERROR("failed to reserve buffer before flip\n"); 5349 DRM_ERROR("failed to reserve buffer before flip\n");
5218 WARN_ON(1);
5219 }
5220
5221 /* Wait for all fences on this FB */
5222 WARN_ON(reservation_object_wait_timeout_rcu(abo->tbo.resv, true, false,
5223 MAX_SCHEDULE_TIMEOUT) < 0);
5224 5350
5225 amdgpu_bo_get_tiling_flags(abo, &tiling_flags); 5351 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
5226 5352
@@ -5329,7 +5455,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
5329 } 5455 }
5330 } 5456 }
5331 5457
5332 if (planes_count) { 5458 /* Update the planes if changed or disable if we don't have any. */
5459 if (planes_count || acrtc_state->active_planes == 0) {
5333 if (new_pcrtc_state->mode_changed) { 5460 if (new_pcrtc_state->mode_changed) {
5334 bundle->stream_update.src = acrtc_state->stream->src; 5461 bundle->stream_update.src = acrtc_state->stream->src;
5335 bundle->stream_update.dst = acrtc_state->stream->dst; 5462 bundle->stream_update.dst = acrtc_state->stream->dst;
@@ -5352,15 +5479,72 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
5352 mutex_unlock(&dm->dc_lock); 5479 mutex_unlock(&dm->dc_lock);
5353 } 5480 }
5354 5481
5355 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) 5482 /*
5356 if (plane->type == DRM_PLANE_TYPE_CURSOR) 5483 * Update cursor state *after* programming all the planes.
5357 handle_cursor_update(plane, old_plane_state); 5484 * This avoids redundant programming in the case where we're going
5485 * to be disabling a single plane - those pipes are being disabled.
5486 */
5487 if (acrtc_state->active_planes)
5488 amdgpu_dm_commit_cursors(state);
5358 5489
5359cleanup: 5490cleanup:
5360 kfree(bundle); 5491 kfree(bundle);
5361} 5492}
5362 5493
5363/* 5494/*
5495 * Enable interrupts on CRTCs that are newly active, undergone
5496 * a modeset, or have active planes again.
5497 *
5498 * Done in two passes, based on the for_modeset flag:
5499 * Pass 1: For CRTCs going through modeset
5500 * Pass 2: For CRTCs going from 0 to n active planes
5501 *
5502 * Interrupts can only be enabled after the planes are programmed,
5503 * so this requires a two-pass approach since we don't want to
5504 * just defer the interrupts until after commit planes every time.
5505 */
5506static void amdgpu_dm_enable_crtc_interrupts(struct drm_device *dev,
5507 struct drm_atomic_state *state,
5508 bool for_modeset)
5509{
5510 struct amdgpu_device *adev = dev->dev_private;
5511 struct drm_crtc *crtc;
5512 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
5513 int i;
5514
5515 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
5516 new_crtc_state, i) {
5517 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
5518 struct dm_crtc_state *dm_new_crtc_state =
5519 to_dm_crtc_state(new_crtc_state);
5520 struct dm_crtc_state *dm_old_crtc_state =
5521 to_dm_crtc_state(old_crtc_state);
5522 bool modeset = drm_atomic_crtc_needs_modeset(new_crtc_state);
5523 bool run_pass;
5524
5525 run_pass = (for_modeset && modeset) ||
5526 (!for_modeset && !modeset &&
5527 !dm_old_crtc_state->interrupts_enabled);
5528
5529 if (!run_pass)
5530 continue;
5531
5532 if (!dm_new_crtc_state->interrupts_enabled)
5533 continue;
5534
5535 manage_dm_interrupts(adev, acrtc, true);
5536
5537#ifdef CONFIG_DEBUG_FS
5538 /* The stream has changed so CRC capture needs to re-enabled. */
5539 if (dm_new_crtc_state->crc_enabled) {
5540 dm_new_crtc_state->crc_enabled = false;
5541 amdgpu_dm_crtc_set_crc_source(crtc, "auto");
5542 }
5543#endif
5544 }
5545}
5546
5547/*
5364 * amdgpu_dm_crtc_copy_transient_flags - copy mirrored flags from DRM to DC 5548 * amdgpu_dm_crtc_copy_transient_flags - copy mirrored flags from DRM to DC
5365 * @crtc_state: the DRM CRTC state 5549 * @crtc_state: the DRM CRTC state
5366 * @stream_state: the DC stream state. 5550 * @stream_state: the DC stream state.
@@ -5384,30 +5568,41 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev,
5384 int i; 5568 int i;
5385 5569
5386 /* 5570 /*
5387 * We evade vblanks and pflips on crtc that 5571 * We evade vblank and pflip interrupts on CRTCs that are undergoing
5388 * should be changed. We do it here to flush & disable 5572 * a modeset, being disabled, or have no active planes.
5389 * interrupts before drm_swap_state is called in drm_atomic_helper_commit 5573 *
5390 * it will update crtc->dm_crtc_state->stream pointer which is used in 5574 * It's done in atomic commit rather than commit tail for now since
5391 * the ISRs. 5575 * some of these interrupt handlers access the current CRTC state and
5576 * potentially the stream pointer itself.
5577 *
5578 * Since the atomic state is swapped within atomic commit and not within
5579 * commit tail this would leave to new state (that hasn't been committed yet)
5580 * being accesssed from within the handlers.
5581 *
5582 * TODO: Fix this so we can do this in commit tail and not have to block
5583 * in atomic check.
5392 */ 5584 */
5393 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 5585 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
5394 struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); 5586 struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
5395 struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); 5587 struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
5396 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); 5588 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
5397 5589
5398 if (drm_atomic_crtc_needs_modeset(new_crtc_state) 5590 if (dm_old_crtc_state->interrupts_enabled &&
5399 && dm_old_crtc_state->stream) { 5591 (!dm_new_crtc_state->interrupts_enabled ||
5592 drm_atomic_crtc_needs_modeset(new_crtc_state))) {
5400 /* 5593 /*
5401 * If the stream is removed and CRC capture was 5594 * Drop the extra vblank reference added by CRC
5402 * enabled on the CRTC the extra vblank reference 5595 * capture if applicable.
5403 * needs to be dropped since CRC capture will be
5404 * disabled.
5405 */ 5596 */
5406 if (!dm_new_crtc_state->stream 5597 if (dm_new_crtc_state->crc_enabled)
5407 && dm_new_crtc_state->crc_enabled) {
5408 drm_crtc_vblank_put(crtc); 5598 drm_crtc_vblank_put(crtc);
5599
5600 /*
5601 * Only keep CRC capture enabled if there's
5602 * still a stream for the CRTC.
5603 */
5604 if (!dm_new_crtc_state->stream)
5409 dm_new_crtc_state->crc_enabled = false; 5605 dm_new_crtc_state->crc_enabled = false;
5410 }
5411 5606
5412 manage_dm_interrupts(adev, acrtc, false); 5607 manage_dm_interrupts(adev, acrtc, false);
5413 } 5608 }
@@ -5623,47 +5818,26 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
5623 mutex_unlock(&dm->dc_lock); 5818 mutex_unlock(&dm->dc_lock);
5624 } 5819 }
5625 5820
5626 /* Update freesync state before amdgpu_dm_handle_vrr_transition(). */ 5821 /* Count number of newly disabled CRTCs for dropping PM refs later. */
5627 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
5628 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
5629 pre_update_freesync_state_on_stream(dm, dm_new_crtc_state);
5630 }
5631
5632 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, 5822 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
5633 new_crtc_state, i) { 5823 new_crtc_state, i) {
5634 /*
5635 * loop to enable interrupts on newly arrived crtc
5636 */
5637 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
5638 bool modeset_needed;
5639
5640 if (old_crtc_state->active && !new_crtc_state->active) 5824 if (old_crtc_state->active && !new_crtc_state->active)
5641 crtc_disable_count++; 5825 crtc_disable_count++;
5642 5826
5643 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); 5827 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
5644 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); 5828 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
5645 5829
5830 /* Update freesync active state. */
5831 pre_update_freesync_state_on_stream(dm, dm_new_crtc_state);
5832
5646 /* Handle vrr on->off / off->on transitions */ 5833 /* Handle vrr on->off / off->on transitions */
5647 amdgpu_dm_handle_vrr_transition(dm_old_crtc_state, 5834 amdgpu_dm_handle_vrr_transition(dm_old_crtc_state,
5648 dm_new_crtc_state); 5835 dm_new_crtc_state);
5649
5650 modeset_needed = modeset_required(
5651 new_crtc_state,
5652 dm_new_crtc_state->stream,
5653 dm_old_crtc_state->stream);
5654
5655 if (dm_new_crtc_state->stream == NULL || !modeset_needed)
5656 continue;
5657
5658 manage_dm_interrupts(adev, acrtc, true);
5659
5660#ifdef CONFIG_DEBUG_FS
5661 /* The stream has changed so CRC capture needs to re-enabled. */
5662 if (dm_new_crtc_state->crc_enabled)
5663 amdgpu_dm_crtc_set_crc_source(crtc, "auto");
5664#endif
5665 } 5836 }
5666 5837
5838 /* Enable interrupts for CRTCs going through a modeset. */
5839 amdgpu_dm_enable_crtc_interrupts(dev, state, true);
5840
5667 for_each_new_crtc_in_state(state, crtc, new_crtc_state, j) 5841 for_each_new_crtc_in_state(state, crtc, new_crtc_state, j)
5668 if (new_crtc_state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC) 5842 if (new_crtc_state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC)
5669 wait_for_vblank = false; 5843 wait_for_vblank = false;
@@ -5677,6 +5851,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
5677 dm, crtc, wait_for_vblank); 5851 dm, crtc, wait_for_vblank);
5678 } 5852 }
5679 5853
5854 /* Enable interrupts for CRTCs going from 0 to n active planes. */
5855 amdgpu_dm_enable_crtc_interrupts(dev, state, false);
5680 5856
5681 /* 5857 /*
5682 * send vblank event on all events not handled in flip and 5858 * send vblank event on all events not handled in flip and
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 3a0b6164c755..978ff14a7d45 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -271,6 +271,9 @@ struct dm_crtc_state {
271 struct drm_crtc_state base; 271 struct drm_crtc_state base;
272 struct dc_stream_state *stream; 272 struct dc_stream_state *stream;
273 273
274 int active_planes;
275 bool interrupts_enabled;
276
274 int crc_skip_count; 277 int crc_skip_count;
275 bool crc_enabled; 278 bool crc_enabled;
276 279
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 3ef68a249f4d..b37ecc3ede61 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -514,6 +514,40 @@ static void link_disconnect_remap(struct dc_sink *prev_sink, struct dc_link *lin
514} 514}
515 515
516 516
517static void read_edp_current_link_settings_on_detect(struct dc_link *link)
518{
519 union lane_count_set lane_count_set = { {0} };
520 uint8_t link_bw_set;
521 uint8_t link_rate_set;
522
523 // Read DPCD 00101h to find out the number of lanes currently set
524 core_link_read_dpcd(link, DP_LANE_COUNT_SET,
525 &lane_count_set.raw, sizeof(lane_count_set));
526 link->cur_link_settings.lane_count = lane_count_set.bits.LANE_COUNT_SET;
527
528 // Read DPCD 00100h to find if standard link rates are set
529 core_link_read_dpcd(link, DP_LINK_BW_SET,
530 &link_bw_set, sizeof(link_bw_set));
531
532 if (link_bw_set == 0) {
533 /* If standard link rates are not being used,
534 * Read DPCD 00115h to find the link rate set used
535 */
536 core_link_read_dpcd(link, DP_LINK_RATE_SET,
537 &link_rate_set, sizeof(link_rate_set));
538
539 if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) {
540 link->cur_link_settings.link_rate =
541 link->dpcd_caps.edp_supported_link_rates[link_rate_set];
542 link->cur_link_settings.link_rate_set = link_rate_set;
543 link->cur_link_settings.use_link_rate_set = true;
544 }
545 } else {
546 link->cur_link_settings.link_rate = link_bw_set;
547 link->cur_link_settings.use_link_rate_set = false;
548 }
549}
550
517static bool detect_dp( 551static bool detect_dp(
518 struct dc_link *link, 552 struct dc_link *link,
519 struct display_sink_capability *sink_caps, 553 struct display_sink_capability *sink_caps,
@@ -648,9 +682,14 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
648 return false; 682 return false;
649 } 683 }
650 684
651 if (link->connector_signal == SIGNAL_TYPE_EDP && 685 if (link->connector_signal == SIGNAL_TYPE_EDP) {
652 link->local_sink) 686 /* On detect, we want to make sure current link settings are
653 return true; 687 * up to date, especially if link was powered on by GOP.
688 */
689 read_edp_current_link_settings_on_detect(link);
690 if (link->local_sink)
691 return true;
692 }
654 693
655 if (link->connector_signal == SIGNAL_TYPE_LVDS && 694 if (link->connector_signal == SIGNAL_TYPE_LVDS &&
656 link->local_sink) 695 link->local_sink)
@@ -1396,13 +1435,19 @@ static enum dc_status enable_link_dp(
1396 /* get link settings for video mode timing */ 1435 /* get link settings for video mode timing */
1397 decide_link_settings(stream, &link_settings); 1436 decide_link_settings(stream, &link_settings);
1398 1437
1399 /* If link settings are different than current and link already enabled 1438 if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP) {
1400 * then need to disable before programming to new rate. 1439 /* If link settings are different than current and link already enabled
1401 */ 1440 * then need to disable before programming to new rate.
1402 if (link->link_status.link_active && 1441 */
1403 (link->cur_link_settings.lane_count != link_settings.lane_count || 1442 if (link->link_status.link_active &&
1404 link->cur_link_settings.link_rate != link_settings.link_rate)) { 1443 (link->cur_link_settings.lane_count != link_settings.lane_count ||
1405 dp_disable_link_phy(link, pipe_ctx->stream->signal); 1444 link->cur_link_settings.link_rate != link_settings.link_rate)) {
1445 dp_disable_link_phy(link, pipe_ctx->stream->signal);
1446 }
1447
1448 /*in case it is not on*/
1449 link->dc->hwss.edp_power_control(link, true);
1450 link->dc->hwss.edp_wait_for_hpd_ready(link, true);
1406 } 1451 }
1407 1452
1408 pipe_ctx->stream_res.pix_clk_params.requested_sym_clk = 1453 pipe_ctx->stream_res.pix_clk_params.requested_sym_clk =
@@ -1448,15 +1493,9 @@ static enum dc_status enable_link_edp(
1448 struct pipe_ctx *pipe_ctx) 1493 struct pipe_ctx *pipe_ctx)
1449{ 1494{
1450 enum dc_status status; 1495 enum dc_status status;
1451 struct dc_stream_state *stream = pipe_ctx->stream;
1452 struct dc_link *link = stream->link;
1453 /*in case it is not on*/
1454 link->dc->hwss.edp_power_control(link, true);
1455 link->dc->hwss.edp_wait_for_hpd_ready(link, true);
1456 1496
1457 status = enable_link_dp(state, pipe_ctx); 1497 status = enable_link_dp(state, pipe_ctx);
1458 1498
1459
1460 return status; 1499 return status;
1461} 1500}
1462 1501
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index a6424c70f4c5..1ee544a32ebb 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -2185,6 +2185,30 @@ static int translate_dpcd_max_bpc(enum dpcd_downstream_port_max_bpc bpc)
2185 return -1; 2185 return -1;
2186} 2186}
2187 2187
2188static void read_dp_device_vendor_id(struct dc_link *link)
2189{
2190 struct dp_device_vendor_id dp_id;
2191
2192 /* read IEEE branch device id */
2193 core_link_read_dpcd(
2194 link,
2195 DP_BRANCH_OUI,
2196 (uint8_t *)&dp_id,
2197 sizeof(dp_id));
2198
2199 link->dpcd_caps.branch_dev_id =
2200 (dp_id.ieee_oui[0] << 16) +
2201 (dp_id.ieee_oui[1] << 8) +
2202 dp_id.ieee_oui[2];
2203
2204 memmove(
2205 link->dpcd_caps.branch_dev_name,
2206 dp_id.ieee_device_id,
2207 sizeof(dp_id.ieee_device_id));
2208}
2209
2210
2211
2188static void get_active_converter_info( 2212static void get_active_converter_info(
2189 uint8_t data, struct dc_link *link) 2213 uint8_t data, struct dc_link *link)
2190{ 2214{
@@ -2271,27 +2295,6 @@ static void get_active_converter_info(
2271 ddc_service_set_dongle_type(link->ddc, link->dpcd_caps.dongle_type); 2295 ddc_service_set_dongle_type(link->ddc, link->dpcd_caps.dongle_type);
2272 2296
2273 { 2297 {
2274 struct dp_device_vendor_id dp_id;
2275
2276 /* read IEEE branch device id */
2277 core_link_read_dpcd(
2278 link,
2279 DP_BRANCH_OUI,
2280 (uint8_t *)&dp_id,
2281 sizeof(dp_id));
2282
2283 link->dpcd_caps.branch_dev_id =
2284 (dp_id.ieee_oui[0] << 16) +
2285 (dp_id.ieee_oui[1] << 8) +
2286 dp_id.ieee_oui[2];
2287
2288 memmove(
2289 link->dpcd_caps.branch_dev_name,
2290 dp_id.ieee_device_id,
2291 sizeof(dp_id.ieee_device_id));
2292 }
2293
2294 {
2295 struct dp_sink_hw_fw_revision dp_hw_fw_revision; 2298 struct dp_sink_hw_fw_revision dp_hw_fw_revision;
2296 2299
2297 core_link_read_dpcd( 2300 core_link_read_dpcd(
@@ -2455,6 +2458,8 @@ static bool retrieve_link_cap(struct dc_link *link)
2455 ds_port.byte = dpcd_data[DP_DOWNSTREAMPORT_PRESENT - 2458 ds_port.byte = dpcd_data[DP_DOWNSTREAMPORT_PRESENT -
2456 DP_DPCD_REV]; 2459 DP_DPCD_REV];
2457 2460
2461 read_dp_device_vendor_id(link);
2462
2458 get_active_converter_info(ds_port.byte, link); 2463 get_active_converter_info(ds_port.byte, link);
2459 2464
2460 dp_wa_power_up_0010FA(link, dpcd_data, sizeof(dpcd_data)); 2465 dp_wa_power_up_0010FA(link, dpcd_data, sizeof(dpcd_data));
@@ -2586,9 +2591,6 @@ void detect_edp_sink_caps(struct dc_link *link)
2586 uint32_t entry; 2591 uint32_t entry;
2587 uint32_t link_rate_in_khz; 2592 uint32_t link_rate_in_khz;
2588 enum dc_link_rate link_rate = LINK_RATE_UNKNOWN; 2593 enum dc_link_rate link_rate = LINK_RATE_UNKNOWN;
2589 union lane_count_set lane_count_set = { {0} };
2590 uint8_t link_bw_set;
2591 uint8_t link_rate_set;
2592 2594
2593 retrieve_link_cap(link); 2595 retrieve_link_cap(link);
2594 link->dpcd_caps.edp_supported_link_rates_count = 0; 2596 link->dpcd_caps.edp_supported_link_rates_count = 0;
@@ -2614,33 +2616,6 @@ void detect_edp_sink_caps(struct dc_link *link)
2614 } 2616 }
2615 } 2617 }
2616 link->verified_link_cap = link->reported_link_cap; 2618 link->verified_link_cap = link->reported_link_cap;
2617
2618 // Read DPCD 00101h to find out the number of lanes currently set
2619 core_link_read_dpcd(link, DP_LANE_COUNT_SET,
2620 &lane_count_set.raw, sizeof(lane_count_set));
2621 link->cur_link_settings.lane_count = lane_count_set.bits.LANE_COUNT_SET;
2622
2623 // Read DPCD 00100h to find if standard link rates are set
2624 core_link_read_dpcd(link, DP_LINK_BW_SET,
2625 &link_bw_set, sizeof(link_bw_set));
2626
2627 if (link_bw_set == 0) {
2628 /* If standard link rates are not being used,
2629 * Read DPCD 00115h to find the link rate set used
2630 */
2631 core_link_read_dpcd(link, DP_LINK_RATE_SET,
2632 &link_rate_set, sizeof(link_rate_set));
2633
2634 if (link_rate_set < link->dpcd_caps.edp_supported_link_rates_count) {
2635 link->cur_link_settings.link_rate =
2636 link->dpcd_caps.edp_supported_link_rates[link_rate_set];
2637 link->cur_link_settings.link_rate_set = link_rate_set;
2638 link->cur_link_settings.use_link_rate_set = true;
2639 }
2640 } else {
2641 link->cur_link_settings.link_rate = link_bw_set;
2642 link->cur_link_settings.use_link_rate_set = false;
2643 }
2644} 2619}
2645 2620
2646void dc_link_dp_enable_hpd(const struct dc_link *link) 2621void dc_link_dp_enable_hpd(const struct dc_link *link)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
index f7f7515f65f4..b0dea759cd86 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
@@ -58,6 +58,8 @@ void dp_enable_link_phy(
58 const struct dc_link_settings *link_settings) 58 const struct dc_link_settings *link_settings)
59{ 59{
60 struct link_encoder *link_enc = link->link_enc; 60 struct link_encoder *link_enc = link->link_enc;
61 struct dc *core_dc = link->ctx->dc;
62 struct dmcu *dmcu = core_dc->res_pool->dmcu;
61 63
62 struct pipe_ctx *pipes = 64 struct pipe_ctx *pipes =
63 link->dc->current_state->res_ctx.pipe_ctx; 65 link->dc->current_state->res_ctx.pipe_ctx;
@@ -84,6 +86,9 @@ void dp_enable_link_phy(
84 } 86 }
85 } 87 }
86 88
89 if (dmcu != NULL && dmcu->funcs->lock_phy)
90 dmcu->funcs->lock_phy(dmcu);
91
87 if (dc_is_dp_sst_signal(signal)) { 92 if (dc_is_dp_sst_signal(signal)) {
88 link_enc->funcs->enable_dp_output( 93 link_enc->funcs->enable_dp_output(
89 link_enc, 94 link_enc,
@@ -95,6 +100,10 @@ void dp_enable_link_phy(
95 link_settings, 100 link_settings,
96 clock_source); 101 clock_source);
97 } 102 }
103
104 if (dmcu != NULL && dmcu->funcs->unlock_phy)
105 dmcu->funcs->unlock_phy(dmcu);
106
98 link->cur_link_settings = *link_settings; 107 link->cur_link_settings = *link_settings;
99 108
100 dp_receiver_power_ctrl(link, true); 109 dp_receiver_power_ctrl(link, true);
@@ -150,15 +159,25 @@ bool edp_receiver_ready_T7(struct dc_link *link)
150 159
151void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) 160void dp_disable_link_phy(struct dc_link *link, enum signal_type signal)
152{ 161{
162 struct dc *core_dc = link->ctx->dc;
163 struct dmcu *dmcu = core_dc->res_pool->dmcu;
164
153 if (!link->wa_flags.dp_keep_receiver_powered) 165 if (!link->wa_flags.dp_keep_receiver_powered)
154 dp_receiver_power_ctrl(link, false); 166 dp_receiver_power_ctrl(link, false);
155 167
156 if (signal == SIGNAL_TYPE_EDP) { 168 if (signal == SIGNAL_TYPE_EDP) {
157 link->link_enc->funcs->disable_output(link->link_enc, signal); 169 link->link_enc->funcs->disable_output(link->link_enc, signal);
158 link->dc->hwss.edp_power_control(link, false); 170 link->dc->hwss.edp_power_control(link, false);
159 } else 171 } else {
172 if (dmcu != NULL && dmcu->funcs->lock_phy)
173 dmcu->funcs->lock_phy(dmcu);
174
160 link->link_enc->funcs->disable_output(link->link_enc, signal); 175 link->link_enc->funcs->disable_output(link->link_enc, signal);
161 176
177 if (dmcu != NULL && dmcu->funcs->unlock_phy)
178 dmcu->funcs->unlock_phy(dmcu);
179 }
180
162 /* Clear current link setting.*/ 181 /* Clear current link setting.*/
163 memset(&link->cur_link_settings, 0, 182 memset(&link->cur_link_settings, 0,
164 sizeof(link->cur_link_settings)); 183 sizeof(link->cur_link_settings));
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index e10479d58c11..96e97d25d639 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -163,6 +163,27 @@ struct dc_stream_state *dc_create_stream_for_sink(
163 return stream; 163 return stream;
164} 164}
165 165
166struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream)
167{
168 struct dc_stream_state *new_stream;
169
170 new_stream = kzalloc(sizeof(struct dc_stream_state), GFP_KERNEL);
171 if (!new_stream)
172 return NULL;
173
174 memcpy(new_stream, stream, sizeof(struct dc_stream_state));
175
176 if (new_stream->sink)
177 dc_sink_retain(new_stream->sink);
178
179 if (new_stream->out_transfer_func)
180 dc_transfer_func_retain(new_stream->out_transfer_func);
181
182 kref_init(&new_stream->refcount);
183
184 return new_stream;
185}
186
166/** 187/**
167 * dc_stream_get_status_from_state - Get stream status from given dc state 188 * dc_stream_get_status_from_state - Get stream status from given dc state
168 * @state: DC state to find the stream status in 189 * @state: DC state to find the stream status in
@@ -312,7 +333,7 @@ bool dc_stream_set_cursor_position(
312 (!pipe_ctx->plane_res.mi && !pipe_ctx->plane_res.hubp) || 333 (!pipe_ctx->plane_res.mi && !pipe_ctx->plane_res.hubp) ||
313 !pipe_ctx->plane_state || 334 !pipe_ctx->plane_state ||
314 (!pipe_ctx->plane_res.xfm && !pipe_ctx->plane_res.dpp) || 335 (!pipe_ctx->plane_res.xfm && !pipe_ctx->plane_res.dpp) ||
315 !pipe_ctx->plane_res.ipp) 336 (!pipe_ctx->plane_res.ipp && !pipe_ctx->plane_res.dpp))
316 continue; 337 continue;
317 338
318 if (!pipe_to_program) { 339 if (!pipe_to_program) {
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index 3459e39714bc..70edd9ea5afe 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -39,7 +39,7 @@
39#include "inc/hw/dmcu.h" 39#include "inc/hw/dmcu.h"
40#include "dml/display_mode_lib.h" 40#include "dml/display_mode_lib.h"
41 41
42#define DC_VER "3.2.26" 42#define DC_VER "3.2.27"
43 43
44#define MAX_SURFACES 3 44#define MAX_SURFACES 3
45#define MAX_PLANES 6 45#define MAX_PLANES 6
@@ -204,6 +204,7 @@ struct dc_config {
204 bool optimize_edp_link_rate; 204 bool optimize_edp_link_rate;
205 bool disable_fractional_pwm; 205 bool disable_fractional_pwm;
206 bool allow_seamless_boot_optimization; 206 bool allow_seamless_boot_optimization;
207 bool power_down_display_on_boot;
207}; 208};
208 209
209enum visual_confirm { 210enum visual_confirm {
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index cc7ffac64c96..7b9429e30d82 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -120,6 +120,7 @@ struct dc_link {
120 /* MST record stream using this link */ 120 /* MST record stream using this link */
121 struct link_flags { 121 struct link_flags {
122 bool dp_keep_receiver_powered; 122 bool dp_keep_receiver_powered;
123 bool dp_skip_DID2;
123 } wa_flags; 124 } wa_flags;
124 struct link_mst_stream_allocation_table mst_stream_alloc_table; 125 struct link_mst_stream_allocation_table mst_stream_alloc_table;
125 126
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
index 17fa3bf6cf7b..189bdab929a5 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
@@ -307,6 +307,8 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
307 */ 307 */
308struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink); 308struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink);
309 309
310struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream);
311
310void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink); 312void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink);
311 313
312void dc_stream_retain(struct dc_stream_state *dc_stream); 314void dc_stream_retain(struct dc_stream_state *dc_stream);
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
index 855360b1414f..da96229db53a 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
@@ -50,7 +50,6 @@
50#define MCP_ABM_LEVEL_SET 0x65 50#define MCP_ABM_LEVEL_SET 0x65
51#define MCP_ABM_PIPE_SET 0x66 51#define MCP_ABM_PIPE_SET 0x66
52#define MCP_BL_SET 0x67 52#define MCP_BL_SET 0x67
53#define MCP_BL_SET_PWM_FRAC 0x6A /* Enable or disable Fractional PWM */
54 53
55#define MCP_DISABLE_ABM_IMMEDIATELY 255 54#define MCP_DISABLE_ABM_IMMEDIATELY 255
56 55
@@ -391,23 +390,6 @@ static bool dce_abm_init_backlight(struct abm *abm)
391 REG_UPDATE(BL_PWM_GRP1_REG_LOCK, 390 REG_UPDATE(BL_PWM_GRP1_REG_LOCK,
392 BL_PWM_GRP1_REG_LOCK, 0); 391 BL_PWM_GRP1_REG_LOCK, 0);
393 392
394 /* Wait until microcontroller is ready to process interrupt */
395 REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 100, 800);
396
397 /* Set PWM fractional enable/disable */
398 value = (abm->ctx->dc->config.disable_fractional_pwm == false) ? 1 : 0;
399 REG_WRITE(MASTER_COMM_DATA_REG1, value);
400
401 /* Set command to enable or disable fractional PWM microcontroller */
402 REG_UPDATE(MASTER_COMM_CMD_REG, MASTER_COMM_CMD_REG_BYTE0,
403 MCP_BL_SET_PWM_FRAC);
404
405 /* Notify microcontroller of new command */
406 REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1);
407
408 /* Ensure command has been executed before continuing */
409 REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 100, 800);
410
411 return true; 393 return true;
412} 394}
413 395
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c
index aa586672e8cd..818536eea00a 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c
@@ -51,6 +51,9 @@
51#define PSR_SET_WAITLOOP 0x31 51#define PSR_SET_WAITLOOP 0x31
52#define MCP_INIT_DMCU 0x88 52#define MCP_INIT_DMCU 0x88
53#define MCP_INIT_IRAM 0x89 53#define MCP_INIT_IRAM 0x89
54#define MCP_SYNC_PHY_LOCK 0x90
55#define MCP_SYNC_PHY_UNLOCK 0x91
56#define MCP_BL_SET_PWM_FRAC 0x6A /* Enable or disable Fractional PWM */
54#define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT_MASK 0x00000001L 57#define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT_MASK 0x00000001L
55 58
56static bool dce_dmcu_init(struct dmcu *dmcu) 59static bool dce_dmcu_init(struct dmcu *dmcu)
@@ -339,9 +342,32 @@ static void dcn10_get_dmcu_version(struct dmcu *dmcu)
339 IRAM_RD_ADDR_AUTO_INC, 0); 342 IRAM_RD_ADDR_AUTO_INC, 0);
340} 343}
341 344
345static void dcn10_dmcu_enable_fractional_pwm(struct dmcu *dmcu,
346 uint32_t fractional_pwm)
347{
348 struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
349
350 /* Wait until microcontroller is ready to process interrupt */
351 REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 100, 800);
352
353 /* Set PWM fractional enable/disable */
354 REG_WRITE(MASTER_COMM_DATA_REG1, fractional_pwm);
355
356 /* Set command to enable or disable fractional PWM microcontroller */
357 REG_UPDATE(MASTER_COMM_CMD_REG, MASTER_COMM_CMD_REG_BYTE0,
358 MCP_BL_SET_PWM_FRAC);
359
360 /* Notify microcontroller of new command */
361 REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1);
362
363 /* Ensure command has been executed before continuing */
364 REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 100, 800);
365}
366
342static bool dcn10_dmcu_init(struct dmcu *dmcu) 367static bool dcn10_dmcu_init(struct dmcu *dmcu)
343{ 368{
344 struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu); 369 struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
370 const struct dc_config *config = &dmcu->ctx->dc->config;
345 bool status = false; 371 bool status = false;
346 372
347 /* Definition of DC_DMCU_SCRATCH 373 /* Definition of DC_DMCU_SCRATCH
@@ -379,9 +405,14 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
379 if (dmcu->dmcu_state == DMCU_RUNNING) { 405 if (dmcu->dmcu_state == DMCU_RUNNING) {
380 /* Retrieve and cache the DMCU firmware version. */ 406 /* Retrieve and cache the DMCU firmware version. */
381 dcn10_get_dmcu_version(dmcu); 407 dcn10_get_dmcu_version(dmcu);
408
409 /* Initialize DMCU to use fractional PWM or not */
410 dcn10_dmcu_enable_fractional_pwm(dmcu,
411 (config->disable_fractional_pwm == false) ? 1 : 0);
382 status = true; 412 status = true;
383 } else 413 } else {
384 status = false; 414 status = false;
415 }
385 416
386 break; 417 break;
387 case DMCU_RUNNING: 418 case DMCU_RUNNING:
@@ -690,7 +721,7 @@ static bool dcn10_is_dmcu_initialized(struct dmcu *dmcu)
690 return true; 721 return true;
691} 722}
692 723
693#endif 724#endif //(CONFIG_DRM_AMD_DC_DCN1_0)
694 725
695static const struct dmcu_funcs dce_funcs = { 726static const struct dmcu_funcs dce_funcs = {
696 .dmcu_init = dce_dmcu_init, 727 .dmcu_init = dce_dmcu_init,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
index 0d9bee8d5ab9..2b2de1d913c9 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
@@ -151,9 +151,6 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
151 struct dc *dc = clk_mgr->ctx->dc; 151 struct dc *dc = clk_mgr->ctx->dc;
152 struct dc_debug_options *debug = &dc->debug; 152 struct dc_debug_options *debug = &dc->debug;
153 struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk; 153 struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk;
154 struct pp_smu_display_requirement_rv *smu_req_cur =
155 &dc->res_pool->pp_smu_req;
156 struct pp_smu_display_requirement_rv smu_req = *smu_req_cur;
157 struct pp_smu_funcs_rv *pp_smu = NULL; 154 struct pp_smu_funcs_rv *pp_smu = NULL;
158 bool send_request_to_increase = false; 155 bool send_request_to_increase = false;
159 bool send_request_to_lower = false; 156 bool send_request_to_lower = false;
@@ -175,8 +172,6 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
175 */ 172 */
176 if (pp_smu && pp_smu->set_display_count) 173 if (pp_smu && pp_smu->set_display_count)
177 pp_smu->set_display_count(&pp_smu->pp_smu, display_count); 174 pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
178
179 smu_req.display_count = display_count;
180 } 175 }
181 176
182 if (new_clocks->dispclk_khz > clk_mgr->clks.dispclk_khz 177 if (new_clocks->dispclk_khz > clk_mgr->clks.dispclk_khz
@@ -187,7 +182,6 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
187 182
188 if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, clk_mgr->clks.phyclk_khz)) { 183 if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, clk_mgr->clks.phyclk_khz)) {
189 clk_mgr->clks.phyclk_khz = new_clocks->phyclk_khz; 184 clk_mgr->clks.phyclk_khz = new_clocks->phyclk_khz;
190
191 send_request_to_lower = true; 185 send_request_to_lower = true;
192 } 186 }
193 187
@@ -197,24 +191,18 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
197 191
198 if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, clk_mgr->clks.fclk_khz)) { 192 if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, clk_mgr->clks.fclk_khz)) {
199 clk_mgr->clks.fclk_khz = new_clocks->fclk_khz; 193 clk_mgr->clks.fclk_khz = new_clocks->fclk_khz;
200 smu_req.hard_min_fclk_mhz = new_clocks->fclk_khz / 1000;
201
202 send_request_to_lower = true; 194 send_request_to_lower = true;
203 } 195 }
204 196
205 //DCF Clock 197 //DCF Clock
206 if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr->clks.dcfclk_khz)) { 198 if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr->clks.dcfclk_khz)) {
207 clk_mgr->clks.dcfclk_khz = new_clocks->dcfclk_khz; 199 clk_mgr->clks.dcfclk_khz = new_clocks->dcfclk_khz;
208 smu_req.hard_min_dcefclk_mhz = new_clocks->dcfclk_khz / 1000;
209
210 send_request_to_lower = true; 200 send_request_to_lower = true;
211 } 201 }
212 202
213 if (should_set_clock(safe_to_lower, 203 if (should_set_clock(safe_to_lower,
214 new_clocks->dcfclk_deep_sleep_khz, clk_mgr->clks.dcfclk_deep_sleep_khz)) { 204 new_clocks->dcfclk_deep_sleep_khz, clk_mgr->clks.dcfclk_deep_sleep_khz)) {
215 clk_mgr->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz; 205 clk_mgr->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
216 smu_req.min_deep_sleep_dcefclk_mhz = (new_clocks->dcfclk_deep_sleep_khz + 999) / 1000;
217
218 send_request_to_lower = true; 206 send_request_to_lower = true;
219 } 207 }
220 208
@@ -227,9 +215,9 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
227 pp_smu->set_hard_min_dcfclk_by_freq && 215 pp_smu->set_hard_min_dcfclk_by_freq &&
228 pp_smu->set_min_deep_sleep_dcfclk) { 216 pp_smu->set_min_deep_sleep_dcfclk) {
229 217
230 pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_fclk_mhz); 218 pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, new_clocks->fclk_khz / 1000);
231 pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_dcefclk_mhz); 219 pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, new_clocks->dcfclk_khz / 1000);
232 pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, smu_req.min_deep_sleep_dcefclk_mhz); 220 pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, (new_clocks->dcfclk_deep_sleep_khz + 999) / 1000);
233 } 221 }
234 } 222 }
235 223
@@ -239,7 +227,6 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
239 || new_clocks->dispclk_khz == clk_mgr->clks.dispclk_khz) { 227 || new_clocks->dispclk_khz == clk_mgr->clks.dispclk_khz) {
240 dcn1_ramp_up_dispclk_with_dpp(clk_mgr, new_clocks); 228 dcn1_ramp_up_dispclk_with_dpp(clk_mgr, new_clocks);
241 clk_mgr->clks.dispclk_khz = new_clocks->dispclk_khz; 229 clk_mgr->clks.dispclk_khz = new_clocks->dispclk_khz;
242
243 send_request_to_lower = true; 230 send_request_to_lower = true;
244 } 231 }
245 232
@@ -249,13 +236,11 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
249 pp_smu->set_hard_min_dcfclk_by_freq && 236 pp_smu->set_hard_min_dcfclk_by_freq &&
250 pp_smu->set_min_deep_sleep_dcfclk) { 237 pp_smu->set_min_deep_sleep_dcfclk) {
251 238
252 pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_fclk_mhz); 239 pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, new_clocks->fclk_khz / 1000);
253 pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_dcefclk_mhz); 240 pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, new_clocks->dcfclk_khz / 1000);
254 pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, smu_req.min_deep_sleep_dcefclk_mhz); 241 pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, (new_clocks->dcfclk_deep_sleep_khz + 999) / 1000);
255 } 242 }
256 } 243 }
257
258 *smu_req_cur = smu_req;
259} 244}
260static const struct clk_mgr_funcs dcn1_funcs = { 245static const struct clk_mgr_funcs dcn1_funcs = {
261 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz, 246 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
index 295cbd5b843f..0db2a6e96fc0 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
@@ -283,7 +283,8 @@ void hubbub1_program_watermarks(
283 hubbub1->watermarks.a.urgent_ns = watermarks->a.urgent_ns; 283 hubbub1->watermarks.a.urgent_ns = watermarks->a.urgent_ns;
284 prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, 284 prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns,
285 refclk_mhz, 0x1fffff); 285 refclk_mhz, 0x1fffff);
286 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); 286 REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, 0,
287 DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
287 288
288 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n" 289 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n"
289 "HW register value = 0x%x\n", 290 "HW register value = 0x%x\n",
@@ -310,7 +311,8 @@ void hubbub1_program_watermarks(
310 prog_wm_value = convert_and_clamp( 311 prog_wm_value = convert_and_clamp(
311 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, 312 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns,
312 refclk_mhz, 0x1fffff); 313 refclk_mhz, 0x1fffff);
313 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); 314 REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, 0,
315 DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value);
314 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" 316 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n"
315 "HW register value = 0x%x\n", 317 "HW register value = 0x%x\n",
316 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 318 watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
@@ -323,7 +325,8 @@ void hubbub1_program_watermarks(
323 prog_wm_value = convert_and_clamp( 325 prog_wm_value = convert_and_clamp(
324 watermarks->a.cstate_pstate.cstate_exit_ns, 326 watermarks->a.cstate_pstate.cstate_exit_ns,
325 refclk_mhz, 0x1fffff); 327 refclk_mhz, 0x1fffff);
326 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); 328 REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, 0,
329 DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value);
327 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n" 330 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n"
328 "HW register value = 0x%x\n", 331 "HW register value = 0x%x\n",
329 watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value); 332 watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value);
@@ -337,7 +340,8 @@ void hubbub1_program_watermarks(
337 prog_wm_value = convert_and_clamp( 340 prog_wm_value = convert_and_clamp(
338 watermarks->a.cstate_pstate.pstate_change_ns, 341 watermarks->a.cstate_pstate.pstate_change_ns,
339 refclk_mhz, 0x1fffff); 342 refclk_mhz, 0x1fffff);
340 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); 343 REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, 0,
344 DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value);
341 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" 345 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n"
342 "HW register value = 0x%x\n\n", 346 "HW register value = 0x%x\n\n",
343 watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value); 347 watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value);
@@ -348,7 +352,8 @@ void hubbub1_program_watermarks(
348 hubbub1->watermarks.b.urgent_ns = watermarks->b.urgent_ns; 352 hubbub1->watermarks.b.urgent_ns = watermarks->b.urgent_ns;
349 prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns, 353 prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns,
350 refclk_mhz, 0x1fffff); 354 refclk_mhz, 0x1fffff);
351 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); 355 REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, 0,
356 DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value);
352 357
353 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n" 358 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n"
354 "HW register value = 0x%x\n", 359 "HW register value = 0x%x\n",
@@ -375,7 +380,8 @@ void hubbub1_program_watermarks(
375 prog_wm_value = convert_and_clamp( 380 prog_wm_value = convert_and_clamp(
376 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, 381 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns,
377 refclk_mhz, 0x1fffff); 382 refclk_mhz, 0x1fffff);
378 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); 383 REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, 0,
384 DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value);
379 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_B calculated =%d\n" 385 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_B calculated =%d\n"
380 "HW register value = 0x%x\n", 386 "HW register value = 0x%x\n",
381 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 387 watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
@@ -388,7 +394,8 @@ void hubbub1_program_watermarks(
388 prog_wm_value = convert_and_clamp( 394 prog_wm_value = convert_and_clamp(
389 watermarks->b.cstate_pstate.cstate_exit_ns, 395 watermarks->b.cstate_pstate.cstate_exit_ns,
390 refclk_mhz, 0x1fffff); 396 refclk_mhz, 0x1fffff);
391 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); 397 REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, 0,
398 DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value);
392 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n" 399 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n"
393 "HW register value = 0x%x\n", 400 "HW register value = 0x%x\n",
394 watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value); 401 watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value);
@@ -402,7 +409,8 @@ void hubbub1_program_watermarks(
402 prog_wm_value = convert_and_clamp( 409 prog_wm_value = convert_and_clamp(
403 watermarks->b.cstate_pstate.pstate_change_ns, 410 watermarks->b.cstate_pstate.pstate_change_ns,
404 refclk_mhz, 0x1fffff); 411 refclk_mhz, 0x1fffff);
405 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); 412 REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, 0,
413 DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value);
406 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n" 414 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n"
407 "HW register value = 0x%x\n\n", 415 "HW register value = 0x%x\n\n",
408 watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value); 416 watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value);
@@ -413,7 +421,8 @@ void hubbub1_program_watermarks(
413 hubbub1->watermarks.c.urgent_ns = watermarks->c.urgent_ns; 421 hubbub1->watermarks.c.urgent_ns = watermarks->c.urgent_ns;
414 prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns, 422 prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns,
415 refclk_mhz, 0x1fffff); 423 refclk_mhz, 0x1fffff);
416 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); 424 REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, 0,
425 DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value);
417 426
418 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n" 427 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n"
419 "HW register value = 0x%x\n", 428 "HW register value = 0x%x\n",
@@ -440,7 +449,8 @@ void hubbub1_program_watermarks(
440 prog_wm_value = convert_and_clamp( 449 prog_wm_value = convert_and_clamp(
441 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, 450 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns,
442 refclk_mhz, 0x1fffff); 451 refclk_mhz, 0x1fffff);
443 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); 452 REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, 0,
453 DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value);
444 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_C calculated =%d\n" 454 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_C calculated =%d\n"
445 "HW register value = 0x%x\n", 455 "HW register value = 0x%x\n",
446 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 456 watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
@@ -453,7 +463,8 @@ void hubbub1_program_watermarks(
453 prog_wm_value = convert_and_clamp( 463 prog_wm_value = convert_and_clamp(
454 watermarks->c.cstate_pstate.cstate_exit_ns, 464 watermarks->c.cstate_pstate.cstate_exit_ns,
455 refclk_mhz, 0x1fffff); 465 refclk_mhz, 0x1fffff);
456 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); 466 REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, 0,
467 DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value);
457 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n" 468 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n"
458 "HW register value = 0x%x\n", 469 "HW register value = 0x%x\n",
459 watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value); 470 watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value);
@@ -467,7 +478,8 @@ void hubbub1_program_watermarks(
467 prog_wm_value = convert_and_clamp( 478 prog_wm_value = convert_and_clamp(
468 watermarks->c.cstate_pstate.pstate_change_ns, 479 watermarks->c.cstate_pstate.pstate_change_ns,
469 refclk_mhz, 0x1fffff); 480 refclk_mhz, 0x1fffff);
470 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); 481 REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, 0,
482 DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value);
471 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n" 483 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n"
472 "HW register value = 0x%x\n\n", 484 "HW register value = 0x%x\n\n",
473 watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value); 485 watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value);
@@ -478,7 +490,8 @@ void hubbub1_program_watermarks(
478 hubbub1->watermarks.d.urgent_ns = watermarks->d.urgent_ns; 490 hubbub1->watermarks.d.urgent_ns = watermarks->d.urgent_ns;
479 prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns, 491 prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns,
480 refclk_mhz, 0x1fffff); 492 refclk_mhz, 0x1fffff);
481 REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); 493 REG_SET(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, 0,
494 DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value);
482 495
483 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n" 496 DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n"
484 "HW register value = 0x%x\n", 497 "HW register value = 0x%x\n",
@@ -505,7 +518,8 @@ void hubbub1_program_watermarks(
505 prog_wm_value = convert_and_clamp( 518 prog_wm_value = convert_and_clamp(
506 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, 519 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns,
507 refclk_mhz, 0x1fffff); 520 refclk_mhz, 0x1fffff);
508 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); 521 REG_SET(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, 0,
522 DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value);
509 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_D calculated =%d\n" 523 DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_D calculated =%d\n"
510 "HW register value = 0x%x\n", 524 "HW register value = 0x%x\n",
511 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 525 watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
@@ -518,7 +532,8 @@ void hubbub1_program_watermarks(
518 prog_wm_value = convert_and_clamp( 532 prog_wm_value = convert_and_clamp(
519 watermarks->d.cstate_pstate.cstate_exit_ns, 533 watermarks->d.cstate_pstate.cstate_exit_ns,
520 refclk_mhz, 0x1fffff); 534 refclk_mhz, 0x1fffff);
521 REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); 535 REG_SET(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, 0,
536 DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value);
522 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n" 537 DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n"
523 "HW register value = 0x%x\n", 538 "HW register value = 0x%x\n",
524 watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value); 539 watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value);
@@ -532,7 +547,8 @@ void hubbub1_program_watermarks(
532 prog_wm_value = convert_and_clamp( 547 prog_wm_value = convert_and_clamp(
533 watermarks->d.cstate_pstate.pstate_change_ns, 548 watermarks->d.cstate_pstate.pstate_change_ns,
534 refclk_mhz, 0x1fffff); 549 refclk_mhz, 0x1fffff);
535 REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); 550 REG_SET(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, 0,
551 DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value);
536 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" 552 DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n"
537 "HW register value = 0x%x\n\n", 553 "HW register value = 0x%x\n\n",
538 watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value); 554 watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value);
@@ -867,6 +883,7 @@ static const struct hubbub_funcs hubbub1_funcs = {
867 .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format, 883 .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format,
868 .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap, 884 .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap,
869 .wm_read_state = hubbub1_wm_read_state, 885 .wm_read_state = hubbub1_wm_read_state,
886 .program_watermarks = hubbub1_program_watermarks,
870}; 887};
871 888
872void hubbub1_construct(struct hubbub *hubbub, 889void hubbub1_construct(struct hubbub *hubbub,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
index 9cd4a5194154..85811b24a497 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
@@ -32,18 +32,14 @@
32#define TO_DCN10_HUBBUB(hubbub)\ 32#define TO_DCN10_HUBBUB(hubbub)\
33 container_of(hubbub, struct dcn10_hubbub, base) 33 container_of(hubbub, struct dcn10_hubbub, base)
34 34
35#define HUBHUB_REG_LIST_DCN()\ 35#define HUBBUB_REG_LIST_DCN_COMMON()\
36 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),\ 36 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),\
37 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A),\
38 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A),\ 37 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A),\
39 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),\ 38 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),\
40 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B),\
41 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B),\ 39 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B),\
42 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),\ 40 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),\
43 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C),\
44 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C),\ 41 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C),\
45 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),\ 42 SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),\
46 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D),\
47 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D),\ 43 SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D),\
48 SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),\ 44 SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),\
49 SR(DCHUBBUB_ARB_DRAM_STATE_CNTL),\ 45 SR(DCHUBBUB_ARB_DRAM_STATE_CNTL),\
@@ -54,6 +50,12 @@
54 SR(DCHUBBUB_TEST_DEBUG_DATA),\ 50 SR(DCHUBBUB_TEST_DEBUG_DATA),\
55 SR(DCHUBBUB_SOFT_RESET) 51 SR(DCHUBBUB_SOFT_RESET)
56 52
53#define HUBBUB_VM_REG_LIST() \
54 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A),\
55 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B),\
56 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C),\
57 SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D)
58
57#define HUBBUB_SR_WATERMARK_REG_LIST()\ 59#define HUBBUB_SR_WATERMARK_REG_LIST()\
58 SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A),\ 60 SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A),\
59 SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A),\ 61 SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A),\
@@ -65,7 +67,8 @@
65 SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D) 67 SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D)
66 68
67#define HUBBUB_REG_LIST_DCN10(id)\ 69#define HUBBUB_REG_LIST_DCN10(id)\
68 HUBHUB_REG_LIST_DCN(), \ 70 HUBBUB_REG_LIST_DCN_COMMON(), \
71 HUBBUB_VM_REG_LIST(), \
69 HUBBUB_SR_WATERMARK_REG_LIST(), \ 72 HUBBUB_SR_WATERMARK_REG_LIST(), \
70 SR(DCHUBBUB_SDPIF_FB_TOP),\ 73 SR(DCHUBBUB_SDPIF_FB_TOP),\
71 SR(DCHUBBUB_SDPIF_FB_BASE),\ 74 SR(DCHUBBUB_SDPIF_FB_BASE),\
@@ -122,8 +125,7 @@ struct dcn_hubbub_registers {
122#define HUBBUB_SF(reg_name, field_name, post_fix)\ 125#define HUBBUB_SF(reg_name, field_name, post_fix)\
123 .field_name = reg_name ## __ ## field_name ## post_fix 126 .field_name = reg_name ## __ ## field_name ## post_fix
124 127
125 128#define HUBBUB_MASK_SH_LIST_DCN_COMMON(mask_sh)\
126#define HUBBUB_MASK_SH_LIST_DCN(mask_sh)\
127 HUBBUB_SF(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, mask_sh), \ 129 HUBBUB_SF(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, mask_sh), \
128 HUBBUB_SF(DCHUBBUB_SOFT_RESET, DCHUBBUB_GLOBAL_SOFT_RESET, mask_sh), \ 130 HUBBUB_SF(DCHUBBUB_SOFT_RESET, DCHUBBUB_GLOBAL_SOFT_RESET, mask_sh), \
129 HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh), \ 131 HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh), \
@@ -133,10 +135,29 @@ struct dcn_hubbub_registers {
133 HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, mask_sh), \ 135 HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, mask_sh), \
134 HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, mask_sh), \ 136 HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, mask_sh), \
135 HUBBUB_SF(DCHUBBUB_ARB_SAT_LEVEL, DCHUBBUB_ARB_SAT_LEVEL, mask_sh), \ 137 HUBBUB_SF(DCHUBBUB_ARB_SAT_LEVEL, DCHUBBUB_ARB_SAT_LEVEL, mask_sh), \
136 HUBBUB_SF(DCHUBBUB_ARB_DF_REQ_OUTSTAND, DCHUBBUB_ARB_MIN_REQ_OUTSTAND, mask_sh) 138 HUBBUB_SF(DCHUBBUB_ARB_DF_REQ_OUTSTAND, DCHUBBUB_ARB_MIN_REQ_OUTSTAND, mask_sh), \
139 HUBBUB_SF(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, mask_sh), \
140 HUBBUB_SF(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, mask_sh), \
141 HUBBUB_SF(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, mask_sh), \
142 HUBBUB_SF(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, mask_sh), \
143 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, mask_sh), \
144 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, mask_sh), \
145 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, mask_sh), \
146 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, mask_sh)
147
148#define HUBBUB_MASK_SH_LIST_STUTTER(mask_sh) \
149 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, mask_sh), \
150 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, mask_sh), \
151 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, mask_sh), \
152 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, mask_sh), \
153 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, mask_sh), \
154 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, mask_sh), \
155 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, mask_sh), \
156 HUBBUB_SF(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, mask_sh)
137 157
138#define HUBBUB_MASK_SH_LIST_DCN10(mask_sh)\ 158#define HUBBUB_MASK_SH_LIST_DCN10(mask_sh)\
139 HUBBUB_MASK_SH_LIST_DCN(mask_sh), \ 159 HUBBUB_MASK_SH_LIST_DCN_COMMON(mask_sh), \
160 HUBBUB_MASK_SH_LIST_STUTTER(mask_sh), \
140 HUBBUB_SF(DCHUBBUB_SDPIF_FB_TOP, SDPIF_FB_TOP, mask_sh), \ 161 HUBBUB_SF(DCHUBBUB_SDPIF_FB_TOP, SDPIF_FB_TOP, mask_sh), \
141 HUBBUB_SF(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, mask_sh), \ 162 HUBBUB_SF(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, mask_sh), \
142 HUBBUB_SF(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, mask_sh), \ 163 HUBBUB_SF(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, mask_sh), \
@@ -167,15 +188,35 @@ struct dcn_hubbub_registers {
167 type FB_OFFSET;\ 188 type FB_OFFSET;\
168 type AGP_BOT;\ 189 type AGP_BOT;\
169 type AGP_TOP;\ 190 type AGP_TOP;\
170 type AGP_BASE 191 type AGP_BASE;\
192 type DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A;\
193 type DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B;\
194 type DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C;\
195 type DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D;\
196 type DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A;\
197 type DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B;\
198 type DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C;\
199 type DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D
200
201#define HUBBUB_STUTTER_REG_FIELD_LIST(type) \
202 type DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A;\
203 type DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B;\
204 type DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C;\
205 type DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D;\
206 type DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A;\
207 type DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B;\
208 type DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C;\
209 type DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D
171 210
172 211
173struct dcn_hubbub_shift { 212struct dcn_hubbub_shift {
174 DCN_HUBBUB_REG_FIELD_LIST(uint8_t); 213 DCN_HUBBUB_REG_FIELD_LIST(uint8_t);
214 HUBBUB_STUTTER_REG_FIELD_LIST(uint8_t);
175}; 215};
176 216
177struct dcn_hubbub_mask { 217struct dcn_hubbub_mask {
178 DCN_HUBBUB_REG_FIELD_LIST(uint32_t); 218 DCN_HUBBUB_REG_FIELD_LIST(uint32_t);
219 HUBBUB_STUTTER_REG_FIELD_LIST(uint32_t);
179}; 220};
180 221
181struct dc; 222struct dc;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
index 0ba68d41b9c3..54b219a710d8 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
@@ -1178,6 +1178,10 @@ void hubp1_vtg_sel(struct hubp *hubp, uint32_t otg_inst)
1178 REG_UPDATE(DCHUBP_CNTL, HUBP_VTG_SEL, otg_inst); 1178 REG_UPDATE(DCHUBP_CNTL, HUBP_VTG_SEL, otg_inst);
1179} 1179}
1180 1180
1181void hubp1_init(struct hubp *hubp)
1182{
1183 //do nothing
1184}
1181static const struct hubp_funcs dcn10_hubp_funcs = { 1185static const struct hubp_funcs dcn10_hubp_funcs = {
1182 .hubp_program_surface_flip_and_addr = 1186 .hubp_program_surface_flip_and_addr =
1183 hubp1_program_surface_flip_and_addr, 1187 hubp1_program_surface_flip_and_addr,
@@ -1201,7 +1205,7 @@ static const struct hubp_funcs dcn10_hubp_funcs = {
1201 .hubp_clear_underflow = hubp1_clear_underflow, 1205 .hubp_clear_underflow = hubp1_clear_underflow,
1202 .hubp_disable_control = hubp1_disable_control, 1206 .hubp_disable_control = hubp1_disable_control,
1203 .hubp_get_underflow_status = hubp1_get_underflow_status, 1207 .hubp_get_underflow_status = hubp1_get_underflow_status,
1204 1208 .hubp_init = hubp1_init,
1205}; 1209};
1206 1210
1207/*****************************************/ 1211/*****************************************/
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
index db98ba361686..99d2b7e2a578 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
@@ -34,6 +34,7 @@
34#define HUBP_REG_LIST_DCN(id)\ 34#define HUBP_REG_LIST_DCN(id)\
35 SRI(DCHUBP_CNTL, HUBP, id),\ 35 SRI(DCHUBP_CNTL, HUBP, id),\
36 SRI(HUBPREQ_DEBUG_DB, HUBP, id),\ 36 SRI(HUBPREQ_DEBUG_DB, HUBP, id),\
37 SRI(HUBPREQ_DEBUG, HUBP, id),\
37 SRI(DCSURF_ADDR_CONFIG, HUBP, id),\ 38 SRI(DCSURF_ADDR_CONFIG, HUBP, id),\
38 SRI(DCSURF_TILING_CONFIG, HUBP, id),\ 39 SRI(DCSURF_TILING_CONFIG, HUBP, id),\
39 SRI(DCSURF_SURFACE_PITCH, HUBPREQ, id),\ 40 SRI(DCSURF_SURFACE_PITCH, HUBPREQ, id),\
@@ -138,6 +139,7 @@
138#define HUBP_COMMON_REG_VARIABLE_LIST \ 139#define HUBP_COMMON_REG_VARIABLE_LIST \
139 uint32_t DCHUBP_CNTL; \ 140 uint32_t DCHUBP_CNTL; \
140 uint32_t HUBPREQ_DEBUG_DB; \ 141 uint32_t HUBPREQ_DEBUG_DB; \
142 uint32_t HUBPREQ_DEBUG; \
141 uint32_t DCSURF_ADDR_CONFIG; \ 143 uint32_t DCSURF_ADDR_CONFIG; \
142 uint32_t DCSURF_TILING_CONFIG; \ 144 uint32_t DCSURF_TILING_CONFIG; \
143 uint32_t DCSURF_SURFACE_PITCH; \ 145 uint32_t DCSURF_SURFACE_PITCH; \
@@ -749,4 +751,6 @@ enum cursor_pitch hubp1_get_cursor_pitch(unsigned int pitch);
749void hubp1_vready_workaround(struct hubp *hubp, 751void hubp1_vready_workaround(struct hubp *hubp,
750 struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest); 752 struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest);
751 753
754void hubp1_init(struct hubp *hubp);
755
752#endif 756#endif
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index dab370676bfa..33d311cea28c 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1118,14 +1118,17 @@ static void dcn10_init_hw(struct dc *dc)
1118 * Otherwise, if taking control is not possible, we need to power 1118 * Otherwise, if taking control is not possible, we need to power
1119 * everything down. 1119 * everything down.
1120 */ 1120 */
1121 if (dcb->funcs->is_accelerated_mode(dcb)) { 1121 if (dcb->funcs->is_accelerated_mode(dcb) || dc->config.power_down_display_on_boot) {
1122 for (i = 0; i < dc->res_pool->pipe_count; i++) { 1122 for (i = 0; i < dc->res_pool->pipe_count; i++) {
1123 struct hubp *hubp = dc->res_pool->hubps[i]; 1123 struct hubp *hubp = dc->res_pool->hubps[i];
1124 struct dpp *dpp = dc->res_pool->dpps[i]; 1124 struct dpp *dpp = dc->res_pool->dpps[i];
1125 1125
1126 hubp->funcs->hubp_init(hubp);
1126 dc->res_pool->opps[i]->mpc_tree_params.opp_id = dc->res_pool->opps[i]->inst; 1127 dc->res_pool->opps[i]->mpc_tree_params.opp_id = dc->res_pool->opps[i]->inst;
1127 plane_atomic_power_down(dc, dpp, hubp); 1128 plane_atomic_power_down(dc, dpp, hubp);
1128 } 1129 }
1130
1131 apply_DEGVIDCN10_253_wa(dc);
1129 } 1132 }
1130 1133
1131 for (i = 0; i < dc->res_pool->audio_count; i++) { 1134 for (i = 0; i < dc->res_pool->audio_count; i++) {
@@ -2436,6 +2439,8 @@ static void dcn10_prepare_bandwidth(
2436 struct dc *dc, 2439 struct dc *dc,
2437 struct dc_state *context) 2440 struct dc_state *context)
2438{ 2441{
2442 struct hubbub *hubbub = dc->res_pool->hubbub;
2443
2439 if (dc->debug.sanity_checks) 2444 if (dc->debug.sanity_checks)
2440 dcn10_verify_allow_pstate_change_high(dc); 2445 dcn10_verify_allow_pstate_change_high(dc);
2441 2446
@@ -2449,7 +2454,7 @@ static void dcn10_prepare_bandwidth(
2449 false); 2454 false);
2450 } 2455 }
2451 2456
2452 hubbub1_program_watermarks(dc->res_pool->hubbub, 2457 hubbub->funcs->program_watermarks(hubbub,
2453 &context->bw_ctx.bw.dcn.watermarks, 2458 &context->bw_ctx.bw.dcn.watermarks,
2454 dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000, 2459 dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000,
2455 true); 2460 true);
@@ -2466,6 +2471,8 @@ static void dcn10_optimize_bandwidth(
2466 struct dc *dc, 2471 struct dc *dc,
2467 struct dc_state *context) 2472 struct dc_state *context)
2468{ 2473{
2474 struct hubbub *hubbub = dc->res_pool->hubbub;
2475
2469 if (dc->debug.sanity_checks) 2476 if (dc->debug.sanity_checks)
2470 dcn10_verify_allow_pstate_change_high(dc); 2477 dcn10_verify_allow_pstate_change_high(dc);
2471 2478
@@ -2479,7 +2486,7 @@ static void dcn10_optimize_bandwidth(
2479 true); 2486 true);
2480 } 2487 }
2481 2488
2482 hubbub1_program_watermarks(dc->res_pool->hubbub, 2489 hubbub->funcs->program_watermarks(hubbub,
2483 &context->bw_ctx.bw.dcn.watermarks, 2490 &context->bw_ctx.bw.dcn.watermarks,
2484 dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000, 2491 dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000,
2485 true); 2492 true);
diff --git a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
index cc6891b8ea69..4fc4208d1472 100644
--- a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
+++ b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
@@ -74,29 +74,6 @@ struct pp_smu_wm_range_sets {
74 struct pp_smu_wm_set_range writer_wm_sets[MAX_WATERMARK_SETS]; 74 struct pp_smu_wm_set_range writer_wm_sets[MAX_WATERMARK_SETS];
75}; 75};
76 76
77struct pp_smu_display_requirement_rv {
78 /* PPSMC_MSG_SetDisplayCount: count
79 * 0 triggers S0i2 optimization
80 */
81 unsigned int display_count;
82
83 /* PPSMC_MSG_SetHardMinFclkByFreq: mhz
84 * FCLK will vary with DPM, but never below requested hard min
85 */
86 unsigned int hard_min_fclk_mhz;
87
88 /* PPSMC_MSG_SetHardMinDcefclkByFreq: mhz
89 * fixed clock at requested freq, either from FCH bypass or DFS
90 */
91 unsigned int hard_min_dcefclk_mhz;
92
93 /* PPSMC_MSG_SetMinDeepSleepDcefclk: mhz
94 * when DF is in cstate, dcf clock is further divided down
95 * to just above given frequency
96 */
97 unsigned int min_deep_sleep_dcefclk_mhz;
98};
99
100struct pp_smu_funcs_rv { 77struct pp_smu_funcs_rv {
101 struct pp_smu pp_smu; 78 struct pp_smu pp_smu;
102 79
diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
index 88a82a23d259..6f5ab05d6467 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
@@ -145,7 +145,6 @@ struct resource_pool {
145 struct hubbub *hubbub; 145 struct hubbub *hubbub;
146 struct mpc *mpc; 146 struct mpc *mpc;
147 struct pp_smu_funcs *pp_smu; 147 struct pp_smu_funcs *pp_smu;
148 struct pp_smu_display_requirement_rv pp_smu_req;
149 struct dce_aux *engines[MAX_PIPES]; 148 struct dce_aux *engines[MAX_PIPES];
150 struct dce_i2c_hw *hw_i2cs[MAX_PIPES]; 149 struct dce_i2c_hw *hw_i2cs[MAX_PIPES];
151 struct dce_i2c_sw *sw_i2cs[MAX_PIPES]; 150 struct dce_i2c_sw *sw_i2cs[MAX_PIPES];
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
index 5e8fead3c09a..93667e8b23b3 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
@@ -77,6 +77,12 @@ struct hubbub_funcs {
77 void (*get_dchub_ref_freq)(struct hubbub *hubbub, 77 void (*get_dchub_ref_freq)(struct hubbub *hubbub,
78 unsigned int dccg_ref_freq_inKhz, 78 unsigned int dccg_ref_freq_inKhz,
79 unsigned int *dchub_ref_freq_inKhz); 79 unsigned int *dchub_ref_freq_inKhz);
80
81 void (*program_watermarks)(
82 struct hubbub *hubbub,
83 struct dcn_watermark_set *watermarks,
84 unsigned int refclk_mhz,
85 bool safe_to_lower);
80}; 86};
81 87
82struct hubbub { 88struct hubbub {
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h
index cbaa43853611..c68f0ce346c7 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h
@@ -70,6 +70,8 @@ struct dmcu_funcs {
70 void (*get_psr_wait_loop)(struct dmcu *dmcu, 70 void (*get_psr_wait_loop)(struct dmcu *dmcu,
71 unsigned int *psr_wait_loop_number); 71 unsigned int *psr_wait_loop_number);
72 bool (*is_dmcu_initialized)(struct dmcu *dmcu); 72 bool (*is_dmcu_initialized)(struct dmcu *dmcu);
73 bool (*lock_phy)(struct dmcu *dmcu);
74 bool (*unlock_phy)(struct dmcu *dmcu);
73}; 75};
74 76
75#endif 77#endif
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
index 1cd07e94ee63..455df4999797 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
@@ -130,6 +130,7 @@ struct hubp_funcs {
130 void (*hubp_clear_underflow)(struct hubp *hubp); 130 void (*hubp_clear_underflow)(struct hubp *hubp);
131 void (*hubp_disable_control)(struct hubp *hubp, bool disable_hubp); 131 void (*hubp_disable_control)(struct hubp *hubp, bool disable_hubp);
132 unsigned int (*hubp_get_underflow_status)(struct hubp *hubp); 132 unsigned int (*hubp_get_underflow_status)(struct hubp *hubp);
133 void (*hubp_init)(struct hubp *hubp);
133 134
134}; 135};
135 136
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 3d867e34f8b3..19b1eaebe484 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -437,10 +437,8 @@ static void apply_below_the_range(struct core_freesync *core_freesync,
437 inserted_frame_duration_in_us = last_render_time_in_us / 437 inserted_frame_duration_in_us = last_render_time_in_us /
438 frames_to_insert; 438 frames_to_insert;
439 439
440 if (inserted_frame_duration_in_us < 440 if (inserted_frame_duration_in_us < in_out_vrr->min_duration_in_us)
441 (1000000 / in_out_vrr->max_refresh_in_uhz)) 441 inserted_frame_duration_in_us = in_out_vrr->min_duration_in_us;
442 inserted_frame_duration_in_us =
443 (1000000 / in_out_vrr->max_refresh_in_uhz);
444 442
445 /* Cache the calculated variables */ 443 /* Cache the calculated variables */
446 in_out_vrr->btr.inserted_duration_in_us = 444 in_out_vrr->btr.inserted_duration_in_us =
diff --git a/drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h
index 721c61171045..5a44e614ab7e 100644
--- a/drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h
+++ b/drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h
@@ -2347,6 +2347,8 @@
2347#define mmHUBP0_DCHUBP_VMPG_CONFIG_BASE_IDX 2 2347#define mmHUBP0_DCHUBP_VMPG_CONFIG_BASE_IDX 2
2348#define mmHUBP0_HUBPREQ_DEBUG_DB 0x0569 2348#define mmHUBP0_HUBPREQ_DEBUG_DB 0x0569
2349#define mmHUBP0_HUBPREQ_DEBUG_DB_BASE_IDX 2 2349#define mmHUBP0_HUBPREQ_DEBUG_DB_BASE_IDX 2
2350#define mmHUBP0_HUBPREQ_DEBUG 0x056a
2351#define mmHUBP0_HUBPREQ_DEBUG_BASE_IDX 2
2350#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x056e 2352#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x056e
2351#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2 2353#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2
2352#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x056f 2354#define mmHUBP0_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x056f
@@ -2631,6 +2633,8 @@
2631#define mmHUBP1_DCHUBP_VMPG_CONFIG_BASE_IDX 2 2633#define mmHUBP1_DCHUBP_VMPG_CONFIG_BASE_IDX 2
2632#define mmHUBP1_HUBPREQ_DEBUG_DB 0x062d 2634#define mmHUBP1_HUBPREQ_DEBUG_DB 0x062d
2633#define mmHUBP1_HUBPREQ_DEBUG_DB_BASE_IDX 2 2635#define mmHUBP1_HUBPREQ_DEBUG_DB_BASE_IDX 2
2636#define mmHUBP1_HUBPREQ_DEBUG 0x062e
2637#define mmHUBP1_HUBPREQ_DEBUG_BASE_IDX 2
2634#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x0632 2638#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x0632
2635#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2 2639#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2
2636#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x0633 2640#define mmHUBP1_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x0633
@@ -2915,6 +2919,8 @@
2915#define mmHUBP2_DCHUBP_VMPG_CONFIG_BASE_IDX 2 2919#define mmHUBP2_DCHUBP_VMPG_CONFIG_BASE_IDX 2
2916#define mmHUBP2_HUBPREQ_DEBUG_DB 0x06f1 2920#define mmHUBP2_HUBPREQ_DEBUG_DB 0x06f1
2917#define mmHUBP2_HUBPREQ_DEBUG_DB_BASE_IDX 2 2921#define mmHUBP2_HUBPREQ_DEBUG_DB_BASE_IDX 2
2922#define mmHUBP2_HUBPREQ_DEBUG 0x06f2
2923#define mmHUBP2_HUBPREQ_DEBUG_BASE_IDX 2
2918#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x06f6 2924#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x06f6
2919#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2 2925#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2
2920#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x06f7 2926#define mmHUBP2_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x06f7
@@ -3199,6 +3205,8 @@
3199#define mmHUBP3_DCHUBP_VMPG_CONFIG_BASE_IDX 2 3205#define mmHUBP3_DCHUBP_VMPG_CONFIG_BASE_IDX 2
3200#define mmHUBP3_HUBPREQ_DEBUG_DB 0x07b5 3206#define mmHUBP3_HUBPREQ_DEBUG_DB 0x07b5
3201#define mmHUBP3_HUBPREQ_DEBUG_DB_BASE_IDX 2 3207#define mmHUBP3_HUBPREQ_DEBUG_DB_BASE_IDX 2
3208#define mmHUBP3_HUBPREQ_DEBUG 0x07b6
3209#define mmHUBP3_HUBPREQ_DEBUG_BASE_IDX 2
3202#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x07ba 3210#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DCFCLK 0x07ba
3203#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2 3211#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DCFCLK_BASE_IDX 2
3204#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x07bb 3212#define mmHUBP3_HUBP_MEASURE_WIN_CTRL_DPPCLK 0x07bb
diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h
index 08769b4b7a74..d3075adb3297 100644
--- a/drivers/gpu/drm/amd/include/atomfirmware.h
+++ b/drivers/gpu/drm/amd/include/atomfirmware.h
@@ -718,6 +718,7 @@ enum atom_encoder_caps_def
718 ATOM_ENCODER_CAP_RECORD_HBR2_EN =0x02, // DP1.2 HBR2 setting is qualified and HBR2 can be enabled 718 ATOM_ENCODER_CAP_RECORD_HBR2_EN =0x02, // DP1.2 HBR2 setting is qualified and HBR2 can be enabled
719 ATOM_ENCODER_CAP_RECORD_HDMI6Gbps_EN =0x04, // HDMI2.0 6Gbps enable or not. 719 ATOM_ENCODER_CAP_RECORD_HDMI6Gbps_EN =0x04, // HDMI2.0 6Gbps enable or not.
720 ATOM_ENCODER_CAP_RECORD_HBR3_EN =0x08, // DP1.3 HBR3 is supported by board. 720 ATOM_ENCODER_CAP_RECORD_HBR3_EN =0x08, // DP1.3 HBR3 is supported by board.
721 ATOM_ENCODER_CAP_RECORD_USB_C_TYPE =0x100, // the DP connector is a USB-C type.
721}; 722};
722 723
723struct atom_encoder_caps_record 724struct atom_encoder_caps_record
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 5f3c10ebff08..b897aca9b4c9 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -85,18 +85,6 @@ enum kgd_memory_pool {
85 KGD_POOL_FRAMEBUFFER = 3, 85 KGD_POOL_FRAMEBUFFER = 3,
86}; 86};
87 87
88enum kgd_engine_type {
89 KGD_ENGINE_PFP = 1,
90 KGD_ENGINE_ME,
91 KGD_ENGINE_CE,
92 KGD_ENGINE_MEC1,
93 KGD_ENGINE_MEC2,
94 KGD_ENGINE_RLC,
95 KGD_ENGINE_SDMA1,
96 KGD_ENGINE_SDMA2,
97 KGD_ENGINE_MAX
98};
99
100/** 88/**
101 * enum kfd_sched_policy 89 * enum kfd_sched_policy
102 * 90 *
@@ -230,8 +218,6 @@ struct tile_config {
230 * @hqd_sdma_destroy: Destructs and preempts the SDMA queue assigned to that 218 * @hqd_sdma_destroy: Destructs and preempts the SDMA queue assigned to that
231 * SDMA hqd slot. 219 * SDMA hqd slot.
232 * 220 *
233 * @get_fw_version: Returns FW versions from the header
234 *
235 * @set_scratch_backing_va: Sets VA for scratch backing memory of a VMID. 221 * @set_scratch_backing_va: Sets VA for scratch backing memory of a VMID.
236 * Only used for no cp scheduling mode 222 * Only used for no cp scheduling mode
237 * 223 *
@@ -311,8 +297,6 @@ struct kfd2kgd_calls {
311 struct kgd_dev *kgd, 297 struct kgd_dev *kgd,
312 uint8_t vmid); 298 uint8_t vmid);
313 299
314 uint16_t (*get_fw_version)(struct kgd_dev *kgd,
315 enum kgd_engine_type type);
316 void (*set_scratch_backing_va)(struct kgd_dev *kgd, 300 void (*set_scratch_backing_va)(struct kgd_dev *kgd,
317 uint64_t va, uint32_t vmid); 301 uint64_t va, uint32_t vmid);
318 int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config); 302 int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config);
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
index f32e3d0aaea6..9a595f7525e6 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
@@ -35,6 +35,7 @@
35#include "smu10_hwmgr.h" 35#include "smu10_hwmgr.h"
36#include "power_state.h" 36#include "power_state.h"
37#include "soc15_common.h" 37#include "soc15_common.h"
38#include "smu10.h"
38 39
39#define SMU10_MAX_DEEPSLEEP_DIVIDER_ID 5 40#define SMU10_MAX_DEEPSLEEP_DIVIDER_ID 5
40#define SMU10_MINIMUM_ENGINE_CLOCK 800 /* 8Mhz, the low boundary of engine clock allowed on this chip */ 41#define SMU10_MINIMUM_ENGINE_CLOCK 800 /* 8Mhz, the low boundary of engine clock allowed on this chip */
@@ -204,18 +205,13 @@ static int smu10_set_clock_limit(struct pp_hwmgr *hwmgr, const void *input)
204 return 0; 205 return 0;
205} 206}
206 207
207static inline uint32_t convert_10k_to_mhz(uint32_t clock)
208{
209 return (clock + 99) / 100;
210}
211
212static int smu10_set_min_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock) 208static int smu10_set_min_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
213{ 209{
214 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 210 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
215 211
216 if (smu10_data->need_min_deep_sleep_dcefclk && 212 if (smu10_data->need_min_deep_sleep_dcefclk &&
217 smu10_data->deep_sleep_dcefclk != convert_10k_to_mhz(clock)) { 213 smu10_data->deep_sleep_dcefclk != clock) {
218 smu10_data->deep_sleep_dcefclk = convert_10k_to_mhz(clock); 214 smu10_data->deep_sleep_dcefclk = clock;
219 smum_send_msg_to_smc_with_parameter(hwmgr, 215 smum_send_msg_to_smc_with_parameter(hwmgr,
220 PPSMC_MSG_SetMinDeepSleepDcefclk, 216 PPSMC_MSG_SetMinDeepSleepDcefclk,
221 smu10_data->deep_sleep_dcefclk); 217 smu10_data->deep_sleep_dcefclk);
@@ -228,8 +224,8 @@ static int smu10_set_hard_min_dcefclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t c
228 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 224 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
229 225
230 if (smu10_data->dcf_actual_hard_min_freq && 226 if (smu10_data->dcf_actual_hard_min_freq &&
231 smu10_data->dcf_actual_hard_min_freq != convert_10k_to_mhz(clock)) { 227 smu10_data->dcf_actual_hard_min_freq != clock) {
232 smu10_data->dcf_actual_hard_min_freq = convert_10k_to_mhz(clock); 228 smu10_data->dcf_actual_hard_min_freq = clock;
233 smum_send_msg_to_smc_with_parameter(hwmgr, 229 smum_send_msg_to_smc_with_parameter(hwmgr,
234 PPSMC_MSG_SetHardMinDcefclkByFreq, 230 PPSMC_MSG_SetHardMinDcefclkByFreq,
235 smu10_data->dcf_actual_hard_min_freq); 231 smu10_data->dcf_actual_hard_min_freq);
@@ -242,8 +238,8 @@ static int smu10_set_hard_min_fclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t cloc
242 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 238 struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
243 239
244 if (smu10_data->f_actual_hard_min_freq && 240 if (smu10_data->f_actual_hard_min_freq &&
245 smu10_data->f_actual_hard_min_freq != convert_10k_to_mhz(clock)) { 241 smu10_data->f_actual_hard_min_freq != clock) {
246 smu10_data->f_actual_hard_min_freq = convert_10k_to_mhz(clock); 242 smu10_data->f_actual_hard_min_freq = clock;
247 smum_send_msg_to_smc_with_parameter(hwmgr, 243 smum_send_msg_to_smc_with_parameter(hwmgr,
248 PPSMC_MSG_SetHardMinFclkByFreq, 244 PPSMC_MSG_SetHardMinFclkByFreq,
249 smu10_data->f_actual_hard_min_freq); 245 smu10_data->f_actual_hard_min_freq);
@@ -572,7 +568,6 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
572 enum amd_dpm_forced_level level) 568 enum amd_dpm_forced_level level)
573{ 569{
574 struct smu10_hwmgr *data = hwmgr->backend; 570 struct smu10_hwmgr *data = hwmgr->backend;
575 struct amdgpu_device *adev = hwmgr->adev;
576 uint32_t min_sclk = hwmgr->display_config->min_core_set_clock; 571 uint32_t min_sclk = hwmgr->display_config->min_core_set_clock;
577 uint32_t min_mclk = hwmgr->display_config->min_mem_set_clock/100; 572 uint32_t min_mclk = hwmgr->display_config->min_mem_set_clock/100;
578 573
@@ -581,11 +576,6 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
581 return 0; 576 return 0;
582 } 577 }
583 578
584 /* Disable UMDPSTATE support on rv2 temporarily */
585 if ((adev->asic_type == CHIP_RAVEN) &&
586 (adev->rev_id >= 8))
587 return 0;
588
589 if (min_sclk < data->gfx_min_freq_limit) 579 if (min_sclk < data->gfx_min_freq_limit)
590 min_sclk = data->gfx_min_freq_limit; 580 min_sclk = data->gfx_min_freq_limit;
591 581
@@ -1200,6 +1190,94 @@ static void smu10_powergate_vcn(struct pp_hwmgr *hwmgr, bool bgate)
1200 } 1190 }
1201} 1191}
1202 1192
1193static int conv_power_profile_to_pplib_workload(int power_profile)
1194{
1195 int pplib_workload = 0;
1196
1197 switch (power_profile) {
1198 case PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT:
1199 pplib_workload = WORKLOAD_DEFAULT_BIT;
1200 break;
1201 case PP_SMC_POWER_PROFILE_FULLSCREEN3D:
1202 pplib_workload = WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT;
1203 break;
1204 case PP_SMC_POWER_PROFILE_POWERSAVING:
1205 pplib_workload = WORKLOAD_PPLIB_POWER_SAVING_BIT;
1206 break;
1207 case PP_SMC_POWER_PROFILE_VIDEO:
1208 pplib_workload = WORKLOAD_PPLIB_VIDEO_BIT;
1209 break;
1210 case PP_SMC_POWER_PROFILE_VR:
1211 pplib_workload = WORKLOAD_PPLIB_VR_BIT;
1212 break;
1213 case PP_SMC_POWER_PROFILE_COMPUTE:
1214 pplib_workload = WORKLOAD_PPLIB_COMPUTE_BIT;
1215 break;
1216 }
1217
1218 return pplib_workload;
1219}
1220
1221static int smu10_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf)
1222{
1223 uint32_t i, size = 0;
1224 static const uint8_t
1225 profile_mode_setting[6][4] = {{70, 60, 0, 0,},
1226 {70, 60, 1, 3,},
1227 {90, 60, 0, 0,},
1228 {70, 60, 0, 0,},
1229 {70, 90, 0, 0,},
1230 {30, 60, 0, 6,},
1231 };
1232 static const char *profile_name[6] = {
1233 "BOOTUP_DEFAULT",
1234 "3D_FULL_SCREEN",
1235 "POWER_SAVING",
1236 "VIDEO",
1237 "VR",
1238 "COMPUTE"};
1239 static const char *title[6] = {"NUM",
1240 "MODE_NAME",
1241 "BUSY_SET_POINT",
1242 "FPS",
1243 "USE_RLC_BUSY",
1244 "MIN_ACTIVE_LEVEL"};
1245
1246 if (!buf)
1247 return -EINVAL;
1248
1249 size += sprintf(buf + size, "%s %16s %s %s %s %s\n",title[0],
1250 title[1], title[2], title[3], title[4], title[5]);
1251
1252 for (i = 0; i <= PP_SMC_POWER_PROFILE_COMPUTE; i++)
1253 size += sprintf(buf + size, "%3d %14s%s: %14d %3d %10d %14d\n",
1254 i, profile_name[i], (i == hwmgr->power_profile_mode) ? "*" : " ",
1255 profile_mode_setting[i][0], profile_mode_setting[i][1],
1256 profile_mode_setting[i][2], profile_mode_setting[i][3]);
1257
1258 return size;
1259}
1260
1261static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size)
1262{
1263 int workload_type = 0;
1264
1265 if (input[size] > PP_SMC_POWER_PROFILE_COMPUTE) {
1266 pr_err("Invalid power profile mode %ld\n", input[size]);
1267 return -EINVAL;
1268 }
1269 hwmgr->power_profile_mode = input[size];
1270
1271 /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */
1272 workload_type =
1273 conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode);
1274 smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify,
1275 1 << workload_type);
1276
1277 return 0;
1278}
1279
1280
1203static const struct pp_hwmgr_func smu10_hwmgr_funcs = { 1281static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
1204 .backend_init = smu10_hwmgr_backend_init, 1282 .backend_init = smu10_hwmgr_backend_init,
1205 .backend_fini = smu10_hwmgr_backend_fini, 1283 .backend_fini = smu10_hwmgr_backend_fini,
@@ -1241,6 +1319,8 @@ static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
1241 .powergate_sdma = smu10_powergate_sdma, 1319 .powergate_sdma = smu10_powergate_sdma,
1242 .set_hard_min_dcefclk_by_freq = smu10_set_hard_min_dcefclk_by_freq, 1320 .set_hard_min_dcefclk_by_freq = smu10_set_hard_min_dcefclk_by_freq,
1243 .set_hard_min_fclk_by_freq = smu10_set_hard_min_fclk_by_freq, 1321 .set_hard_min_fclk_by_freq = smu10_set_hard_min_fclk_by_freq,
1322 .get_power_profile_mode = smu10_get_power_profile_mode,
1323 .set_power_profile_mode = smu10_set_power_profile_mode,
1244}; 1324};
1245 1325
1246int smu10_init_function_pointers(struct pp_hwmgr *hwmgr) 1326int smu10_init_function_pointers(struct pp_hwmgr *hwmgr)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
index 39a547084e90..9b9f87b84910 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
@@ -3460,7 +3460,18 @@ static void vega20_power_gate_vce(struct pp_hwmgr *hwmgr, bool bgate)
3460 return ; 3460 return ;
3461 3461
3462 data->vce_power_gated = bgate; 3462 data->vce_power_gated = bgate;
3463 vega20_enable_disable_vce_dpm(hwmgr, !bgate); 3463 if (bgate) {
3464 vega20_enable_disable_vce_dpm(hwmgr, !bgate);
3465 amdgpu_device_ip_set_powergating_state(hwmgr->adev,
3466 AMD_IP_BLOCK_TYPE_VCE,
3467 AMD_PG_STATE_GATE);
3468 } else {
3469 amdgpu_device_ip_set_powergating_state(hwmgr->adev,
3470 AMD_IP_BLOCK_TYPE_VCE,
3471 AMD_PG_STATE_UNGATE);
3472 vega20_enable_disable_vce_dpm(hwmgr, !bgate);
3473 }
3474
3464} 3475}
3465 3476
3466static void vega20_power_gate_uvd(struct pp_hwmgr *hwmgr, bool bgate) 3477static void vega20_power_gate_uvd(struct pp_hwmgr *hwmgr, bool bgate)
diff --git a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
index a2991fa2e6f8..90879e4092a3 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
@@ -85,7 +85,6 @@
85#define PPSMC_MSG_SetRccPfcPmeRestoreRegister 0x36 85#define PPSMC_MSG_SetRccPfcPmeRestoreRegister 0x36
86#define PPSMC_Message_Count 0x37 86#define PPSMC_Message_Count 0x37
87 87
88
89typedef uint16_t PPSMC_Result; 88typedef uint16_t PPSMC_Result;
90typedef int PPSMC_Msg; 89typedef int PPSMC_Msg;
91 90
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu10.h b/drivers/gpu/drm/amd/powerplay/inc/smu10.h
index 9e837a5014c5..b96520528240 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu10.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu10.h
@@ -136,12 +136,14 @@
136#define FEATURE_CORE_CSTATES_MASK (1 << FEATURE_CORE_CSTATES_BIT) 136#define FEATURE_CORE_CSTATES_MASK (1 << FEATURE_CORE_CSTATES_BIT)
137 137
138/* Workload bits */ 138/* Workload bits */
139#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 0 139#define WORKLOAD_DEFAULT_BIT 0
140#define WORKLOAD_PPLIB_VIDEO_BIT 2 140#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 1
141#define WORKLOAD_PPLIB_VR_BIT 3 141#define WORKLOAD_PPLIB_POWER_SAVING_BIT 2
142#define WORKLOAD_PPLIB_COMPUTE_BIT 4 142#define WORKLOAD_PPLIB_VIDEO_BIT 3
143#define WORKLOAD_PPLIB_CUSTOM_BIT 5 143#define WORKLOAD_PPLIB_VR_BIT 4
144#define WORKLOAD_PPLIB_COUNT 6 144#define WORKLOAD_PPLIB_COMPUTE_BIT 5
145#define WORKLOAD_PPLIB_CUSTOM_BIT 6
146#define WORKLOAD_PPLIB_COUNT 7
145 147
146typedef struct { 148typedef struct {
147 /* MP1_EXT_SCRATCH0 */ 149 /* MP1_EXT_SCRATCH0 */
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index c478b38662d0..92903a4cc4d8 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1896,8 +1896,13 @@ set_fan_speed_rpm_failed:
1896static int smu_v11_0_set_xgmi_pstate(struct smu_context *smu, 1896static int smu_v11_0_set_xgmi_pstate(struct smu_context *smu,
1897 uint32_t pstate) 1897 uint32_t pstate)
1898{ 1898{
1899 /* send msg to SMU to set pstate */ 1899 int ret = 0;
1900 return 0; 1900 mutex_lock(&(smu->mutex));
1901 ret = smu_send_smc_msg_with_param(smu,
1902 SMU_MSG_SetXgmiMode,
1903 pstate ? XGMI_STATE_D0 : XGMI_STATE_D3);
1904 mutex_unlock(&(smu->mutex));
1905 return ret;
1901} 1906}
1902 1907
1903static const struct smu_funcs smu_v11_0_funcs = { 1908static const struct smu_funcs smu_v11_0_funcs = {