diff options
author | Dave Airlie <airlied@redhat.com> | 2019-05-02 20:00:42 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2019-05-02 20:31:07 -0400 |
commit | 422449238e9853458283beffed77562d4b40a2fa (patch) | |
tree | 2eec3947c77dcdced46a7e391b49b326c2dc18f5 | |
parent | 9f17847d853bbaa6d06510a31bff70716cbb73ab (diff) | |
parent | b0fc850fd95f8ecceb601bbb40624da0a8c220a0 (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
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 | ||
338 | uint32_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 | |||
338 | void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, | 375 | void 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 | ||
84 | enum 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 | |||
84 | struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, | 96 | struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, |
85 | struct mm_struct *mm); | 97 | struct mm_struct *mm); |
86 | bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm); | 98 | bool 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); |
144 | void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); | 156 | void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); |
157 | uint32_t amdgpu_amdkfd_get_fw_version(struct kgd_dev *kgd, | ||
158 | enum kgd_engine_type type); | ||
145 | void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, | 159 | void 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); |
147 | uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd); | 161 | uint64_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); | |||
139 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, | 137 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, |
140 | uint8_t vmid); | 138 | uint8_t vmid); |
141 | 139 | ||
142 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); | ||
143 | static void set_scratch_backing_va(struct kgd_dev *kgd, | 140 | static void set_scratch_backing_va(struct kgd_dev *kgd, |
144 | uint64_t va, uint32_t vmid); | 141 | uint64_t va, uint32_t vmid); |
145 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 142 | static 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 | ||
795 | static 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 | |||
852 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 791 | static 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); |
96 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, | 94 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, |
97 | uint8_t vmid); | 95 | uint8_t vmid); |
98 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); | ||
99 | static void set_scratch_backing_va(struct kgd_dev *kgd, | 96 | static void set_scratch_backing_va(struct kgd_dev *kgd, |
100 | uint64_t va, uint32_t vmid); | 97 | uint64_t va, uint32_t vmid); |
101 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 98 | static 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 | ||
754 | static 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 | |||
811 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 750 | static 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); |
112 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 110 | static 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); |
114 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); | ||
115 | static void set_scratch_backing_va(struct kgd_dev *kgd, | 112 | static void set_scratch_backing_va(struct kgd_dev *kgd, |
116 | uint64_t va, uint32_t vmid); | 113 | uint64_t va, uint32_t vmid); |
117 | static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); | 114 | static 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? */ | ||
878 | static 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 | |||
927 | static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, | 873 | static 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 | ||
162 | static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { | 161 | static 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 | ||
192 | static const struct soc15_reg_golden golden_settings_sdma_rv1[] = | 190 | static 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) | |||
382 | static int vce_v4_0_stop(struct amdgpu_device *adev) | 382 | static 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 | ||
926 | static int vce_v4_0_set_powergating_state(void *handle, | 928 | static 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 | ||
949 | static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job, | 946 | static 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 | ||
1065 | static const struct amdgpu_ring_funcs vce_v4_0_ring_vm_funcs = { | 1062 | static 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 | ||
3865 | static bool does_crtc_have_active_plane(struct drm_crtc_state *new_crtc_state) | 3890 | static 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 | |||
3903 | static 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 | */ | ||
3940 | static void | ||
3941 | dm_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 | ||
3897 | static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, | 3960 | static 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 | ||
4193 | static const uint32_t overlay_formats[] = { | 4269 | static 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 | ||
4201 | static const u32 cursor_formats[] = { | 4278 | static 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 | ||
5056 | static void pre_update_freesync_state_on_stream( | 5146 | static 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 | ||
5096 | static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state, | 5192 | static 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 | ||
5222 | static 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 | |||
5126 | static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, | 5238 | static 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 | ||
5359 | cleanup: | 5490 | cleanup: |
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 | */ | ||
5506 | static 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 | ||
517 | static 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 | |||
517 | static bool detect_dp( | 551 | static 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 | ||
2188 | static 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 | |||
2188 | static void get_active_converter_info( | 2212 | static 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 | ||
2646 | void dc_link_dp_enable_hpd(const struct dc_link *link) | 2621 | void 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 | ||
151 | void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) | 160 | void 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 | ||
166 | struct 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 | ||
209 | enum visual_confirm { | 210 | enum 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 | */ |
308 | struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink); | 308 | struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink); |
309 | 309 | ||
310 | struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream); | ||
311 | |||
310 | void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink); | 312 | void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink); |
311 | 313 | ||
312 | void dc_stream_retain(struct dc_stream_state *dc_stream); | 314 | void 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 | ||
56 | static bool dce_dmcu_init(struct dmcu *dmcu) | 59 | static 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 | ||
345 | static 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 | |||
342 | static bool dcn10_dmcu_init(struct dmcu *dmcu) | 367 | static 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 | ||
695 | static const struct dmcu_funcs dce_funcs = { | 726 | static 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 | } |
260 | static const struct clk_mgr_funcs dcn1_funcs = { | 245 | static 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 | ||
872 | void hubbub1_construct(struct hubbub *hubbub, | 889 | void 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 | ||
173 | struct dcn_hubbub_shift { | 212 | struct 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 | ||
177 | struct dcn_hubbub_mask { | 217 | struct 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 | ||
181 | struct dc; | 222 | struct 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 | ||
1181 | void hubp1_init(struct hubp *hubp) | ||
1182 | { | ||
1183 | //do nothing | ||
1184 | } | ||
1181 | static const struct hubp_funcs dcn10_hubp_funcs = { | 1185 | static 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); | |||
749 | void hubp1_vready_workaround(struct hubp *hubp, | 751 | void 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 | ||
754 | void 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 | ||
77 | struct 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 | |||
100 | struct pp_smu_funcs_rv { | 77 | struct 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 | ||
82 | struct hubbub { | 88 | struct 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 | ||
723 | struct atom_encoder_caps_record | 724 | struct 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 | ||
88 | enum 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 | ||
207 | static inline uint32_t convert_10k_to_mhz(uint32_t clock) | ||
208 | { | ||
209 | return (clock + 99) / 100; | ||
210 | } | ||
211 | |||
212 | static int smu10_set_min_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock) | 208 | static 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 | ||
1193 | static 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 | |||
1221 | static 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 | |||
1261 | static 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 | |||
1203 | static const struct pp_hwmgr_func smu10_hwmgr_funcs = { | 1281 | static 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 | ||
1246 | int smu10_init_function_pointers(struct pp_hwmgr *hwmgr) | 1326 | int 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 | ||
3466 | static void vega20_power_gate_uvd(struct pp_hwmgr *hwmgr, bool bgate) | 3477 | static 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 | |||
89 | typedef uint16_t PPSMC_Result; | 88 | typedef uint16_t PPSMC_Result; |
90 | typedef int PPSMC_Msg; | 89 | typedef 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 | ||
146 | typedef struct { | 148 | typedef 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: | |||
1896 | static int smu_v11_0_set_xgmi_pstate(struct smu_context *smu, | 1896 | static 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 | ||
1903 | static const struct smu_funcs smu_v11_0_funcs = { | 1908 | static const struct smu_funcs smu_v11_0_funcs = { |