diff options
| author | Ingo Molnar <mingo@kernel.org> | 2018-12-03 04:47:53 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2018-12-03 04:47:53 -0500 |
| commit | df60673198ae678f68af54873b8904ba93fe13a0 (patch) | |
| tree | 6e9a3393d0be7b68a69c2bbc58f4325ceb6fd853 /drivers/gpu/drm/amd | |
| parent | 89f579ce99f7e028e81885d3965f973c0f787611 (diff) | |
| parent | 2595646791c319cadfdbf271563aac97d0843dc7 (diff) | |
Merge tag 'v4.20-rc5' into x86/cleanups, to sync up the tree
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/gpu/drm/amd')
30 files changed, 246 insertions, 220 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index d0102cfc8efb..104b2e0d893b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe; | |||
| 151 | extern int amdgpu_gpu_recovery; | 151 | extern int amdgpu_gpu_recovery; |
| 152 | extern int amdgpu_emu_mode; | 152 | extern int amdgpu_emu_mode; |
| 153 | extern uint amdgpu_smu_memory_pool_size; | 153 | extern uint amdgpu_smu_memory_pool_size; |
| 154 | extern uint amdgpu_dc_feature_mask; | ||
| 154 | extern struct amdgpu_mgpu_info mgpu_info; | 155 | extern struct amdgpu_mgpu_info mgpu_info; |
| 155 | 156 | ||
| 156 | #ifdef CONFIG_DRM_AMDGPU_SI | 157 | #ifdef CONFIG_DRM_AMDGPU_SI |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index c31a8849e9f8..1580ec60b89f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
| @@ -501,8 +501,11 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle) | |||
| 501 | { | 501 | { |
| 502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; | 502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; |
| 503 | 503 | ||
| 504 | amdgpu_dpm_switch_power_profile(adev, | 504 | if (adev->powerplay.pp_funcs && |
| 505 | PP_SMC_POWER_PROFILE_COMPUTE, !idle); | 505 | adev->powerplay.pp_funcs->switch_power_profile) |
| 506 | amdgpu_dpm_switch_power_profile(adev, | ||
| 507 | PP_SMC_POWER_PROFILE_COMPUTE, | ||
| 508 | !idle); | ||
| 506 | } | 509 | } |
| 507 | 510 | ||
| 508 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) | 511 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 6748cd7fc129..686a26de50f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |||
| @@ -626,6 +626,13 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev) | |||
| 626 | "dither", | 626 | "dither", |
| 627 | amdgpu_dither_enum_list, sz); | 627 | amdgpu_dither_enum_list, sz); |
| 628 | 628 | ||
| 629 | if (amdgpu_device_has_dc_support(adev)) { | ||
| 630 | adev->mode_info.max_bpc_property = | ||
| 631 | drm_property_create_range(adev->ddev, 0, "max bpc", 8, 16); | ||
| 632 | if (!adev->mode_info.max_bpc_property) | ||
| 633 | return -ENOMEM; | ||
| 634 | } | ||
| 635 | |||
| 629 | return 0; | 636 | return 0; |
| 630 | } | 637 | } |
| 631 | 638 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 943dbf3c5da1..8de55f7f1a3a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
| @@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1; | |||
| 127 | int amdgpu_gpu_recovery = -1; /* auto */ | 127 | int amdgpu_gpu_recovery = -1; /* auto */ |
| 128 | int amdgpu_emu_mode = 0; | 128 | int amdgpu_emu_mode = 0; |
| 129 | uint amdgpu_smu_memory_pool_size = 0; | 129 | uint amdgpu_smu_memory_pool_size = 0; |
| 130 | /* FBC (bit 0) disabled by default*/ | ||
| 131 | uint amdgpu_dc_feature_mask = 0; | ||
| 132 | |||
| 130 | struct amdgpu_mgpu_info mgpu_info = { | 133 | struct amdgpu_mgpu_info mgpu_info = { |
| 131 | .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), | 134 | .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), |
| 132 | }; | 135 | }; |
| @@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644); | |||
| 631 | MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)"); | 634 | MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)"); |
| 632 | #endif | 635 | #endif |
| 633 | 636 | ||
| 637 | /** | ||
| 638 | * DOC: dcfeaturemask (uint) | ||
| 639 | * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h. | ||
| 640 | * The default is the current set of stable display features. | ||
| 641 | */ | ||
| 642 | MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))"); | ||
| 643 | module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444); | ||
| 644 | |||
| 634 | static const struct pci_device_id pciidlist[] = { | 645 | static const struct pci_device_id pciidlist[] = { |
| 635 | #ifdef CONFIG_DRM_AMDGPU_SI | 646 | #ifdef CONFIG_DRM_AMDGPU_SI |
| 636 | {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, | 647 | {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index b9e9e8b02fb7..d1b4d9b6aae0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | |||
| @@ -339,6 +339,8 @@ struct amdgpu_mode_info { | |||
| 339 | struct drm_property *audio_property; | 339 | struct drm_property *audio_property; |
| 340 | /* FMT dithering */ | 340 | /* FMT dithering */ |
| 341 | struct drm_property *dither_property; | 341 | struct drm_property *dither_property; |
| 342 | /* maximum number of bits per channel for monitor color */ | ||
| 343 | struct drm_property *max_bpc_property; | ||
| 342 | /* hardcoded DFP edid from BIOS */ | 344 | /* hardcoded DFP edid from BIOS */ |
| 343 | struct edid *bios_hardcoded_edid; | 345 | struct edid *bios_hardcoded_edid; |
| 344 | int bios_hardcoded_edid_size; | 346 | int bios_hardcoded_edid_size; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 352b30409060..0877ff9a9594 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
| @@ -181,7 +181,7 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev, | |||
| 181 | 181 | ||
| 182 | if (level == adev->vm_manager.root_level) | 182 | if (level == adev->vm_manager.root_level) |
| 183 | /* For the root directory */ | 183 | /* For the root directory */ |
| 184 | return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift; | 184 | return round_up(adev->vm_manager.max_pfn, 1ULL << shift) >> shift; |
| 185 | else if (level != AMDGPU_VM_PTB) | 185 | else if (level != AMDGPU_VM_PTB) |
| 186 | /* Everything in between */ | 186 | /* Everything in between */ |
| 187 | return 512; | 187 | return 512; |
| @@ -1632,13 +1632,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
| 1632 | continue; | 1632 | continue; |
| 1633 | } | 1633 | } |
| 1634 | 1634 | ||
| 1635 | /* First check if the entry is already handled */ | ||
| 1636 | if (cursor.pfn < frag_start) { | ||
| 1637 | cursor.entry->huge = true; | ||
| 1638 | amdgpu_vm_pt_next(adev, &cursor); | ||
| 1639 | continue; | ||
| 1640 | } | ||
| 1641 | |||
| 1642 | /* If it isn't already handled it can't be a huge page */ | 1635 | /* If it isn't already handled it can't be a huge page */ |
| 1643 | if (cursor.entry->huge) { | 1636 | if (cursor.entry->huge) { |
| 1644 | /* Add the entry to the relocated list to update it. */ | 1637 | /* Add the entry to the relocated list to update it. */ |
| @@ -1663,9 +1656,11 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
| 1663 | if (!amdgpu_vm_pt_descendant(adev, &cursor)) | 1656 | if (!amdgpu_vm_pt_descendant(adev, &cursor)) |
| 1664 | return -ENOENT; | 1657 | return -ENOENT; |
| 1665 | continue; | 1658 | continue; |
| 1666 | } else if (frag >= parent_shift) { | 1659 | } else if (frag >= parent_shift && |
| 1660 | cursor.level - 1 != adev->vm_manager.root_level) { | ||
| 1667 | /* If the fragment size is even larger than the parent | 1661 | /* If the fragment size is even larger than the parent |
| 1668 | * shift we should go up one level and check it again. | 1662 | * shift we should go up one level and check it again |
| 1663 | * unless one level up is the root level. | ||
| 1669 | */ | 1664 | */ |
| 1670 | if (!amdgpu_vm_pt_ancestor(&cursor)) | 1665 | if (!amdgpu_vm_pt_ancestor(&cursor)) |
| 1671 | return -ENOENT; | 1666 | return -ENOENT; |
| @@ -1673,10 +1668,10 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
| 1673 | } | 1668 | } |
| 1674 | 1669 | ||
| 1675 | /* Looks good so far, calculate parameters for the update */ | 1670 | /* Looks good so far, calculate parameters for the update */ |
| 1676 | incr = AMDGPU_GPU_PAGE_SIZE << shift; | 1671 | incr = (uint64_t)AMDGPU_GPU_PAGE_SIZE << shift; |
| 1677 | mask = amdgpu_vm_entries_mask(adev, cursor.level); | 1672 | mask = amdgpu_vm_entries_mask(adev, cursor.level); |
| 1678 | pe_start = ((cursor.pfn >> shift) & mask) * 8; | 1673 | pe_start = ((cursor.pfn >> shift) & mask) * 8; |
| 1679 | entry_end = (mask + 1) << shift; | 1674 | entry_end = (uint64_t)(mask + 1) << shift; |
| 1680 | entry_end += cursor.pfn & ~(entry_end - 1); | 1675 | entry_end += cursor.pfn & ~(entry_end - 1); |
| 1681 | entry_end = min(entry_end, end); | 1676 | entry_end = min(entry_end, end); |
| 1682 | 1677 | ||
| @@ -1689,7 +1684,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
| 1689 | flags | AMDGPU_PTE_FRAG(frag)); | 1684 | flags | AMDGPU_PTE_FRAG(frag)); |
| 1690 | 1685 | ||
| 1691 | pe_start += nptes * 8; | 1686 | pe_start += nptes * 8; |
| 1692 | dst += nptes * AMDGPU_GPU_PAGE_SIZE << shift; | 1687 | dst += (uint64_t)nptes * AMDGPU_GPU_PAGE_SIZE << shift; |
| 1693 | 1688 | ||
| 1694 | frag_start = upd_end; | 1689 | frag_start = upd_end; |
| 1695 | if (frag_start >= frag_end) { | 1690 | if (frag_start >= frag_end) { |
| @@ -1701,8 +1696,17 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
| 1701 | } | 1696 | } |
| 1702 | } while (frag_start < entry_end); | 1697 | } while (frag_start < entry_end); |
| 1703 | 1698 | ||
| 1704 | if (frag >= shift) | 1699 | if (amdgpu_vm_pt_descendant(adev, &cursor)) { |
| 1700 | /* Mark all child entries as huge */ | ||
| 1701 | while (cursor.pfn < frag_start) { | ||
| 1702 | cursor.entry->huge = true; | ||
| 1703 | amdgpu_vm_pt_next(adev, &cursor); | ||
| 1704 | } | ||
| 1705 | |||
| 1706 | } else if (frag >= shift) { | ||
| 1707 | /* or just move on to the next on the same level. */ | ||
| 1705 | amdgpu_vm_pt_next(adev, &cursor); | 1708 | amdgpu_vm_pt_next(adev, &cursor); |
| 1709 | } | ||
| 1706 | } | 1710 | } |
| 1707 | 1711 | ||
| 1708 | return 0; | 1712 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 6d7baf59d6e1..21363b2b2ee5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
| @@ -2440,12 +2440,13 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev) | |||
| 2440 | #endif | 2440 | #endif |
| 2441 | 2441 | ||
| 2442 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); | 2442 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); |
| 2443 | udelay(50); | ||
| 2443 | 2444 | ||
| 2444 | /* carrizo do enable cp interrupt after cp inited */ | 2445 | /* carrizo do enable cp interrupt after cp inited */ |
| 2445 | if (!(adev->flags & AMD_IS_APU)) | 2446 | if (!(adev->flags & AMD_IS_APU)) { |
| 2446 | gfx_v9_0_enable_gui_idle_interrupt(adev, true); | 2447 | gfx_v9_0_enable_gui_idle_interrupt(adev, true); |
| 2447 | 2448 | udelay(50); | |
| 2448 | udelay(50); | 2449 | } |
| 2449 | 2450 | ||
| 2450 | #ifdef AMDGPU_RLC_DEBUG_RETRY | 2451 | #ifdef AMDGPU_RLC_DEBUG_RETRY |
| 2451 | /* RLC_GPM_GENERAL_6 : RLC Ucode version */ | 2452 | /* RLC_GPM_GENERAL_6 : RLC Ucode version */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index ceb7847b504f..bfa317ad20a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | |||
| @@ -72,7 +72,7 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev) | |||
| 72 | 72 | ||
| 73 | /* Program the system aperture low logical page number. */ | 73 | /* Program the system aperture low logical page number. */ |
| 74 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, | 74 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, |
| 75 | min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); | 75 | min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); |
| 76 | 76 | ||
| 77 | if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) | 77 | if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) |
| 78 | /* | 78 | /* |
| @@ -82,11 +82,11 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev) | |||
| 82 | * to get rid of the VM fault and hardware hang. | 82 | * to get rid of the VM fault and hardware hang. |
| 83 | */ | 83 | */ |
| 84 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, | 84 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
| 85 | max((adev->gmc.vram_end >> 18) + 0x1, | 85 | max((adev->gmc.fb_end >> 18) + 0x1, |
| 86 | adev->gmc.agp_end >> 18)); | 86 | adev->gmc.agp_end >> 18)); |
| 87 | else | 87 | else |
| 88 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, | 88 | WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
| 89 | max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); | 89 | max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); |
| 90 | 90 | ||
| 91 | /* Set default page address. */ | 91 | /* Set default page address. */ |
| 92 | value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start | 92 | value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index e1c2b4e9c7b2..73ad02aea2b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
| @@ -46,6 +46,7 @@ MODULE_FIRMWARE("amdgpu/tahiti_mc.bin"); | |||
| 46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); | 46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); |
| 47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); | 47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); |
| 48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); | 48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); |
| 49 | MODULE_FIRMWARE("amdgpu/hainan_mc.bin"); | ||
| 49 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); | 50 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); |
| 50 | 51 | ||
| 51 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 | 52 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index fd23ba1226a5..a0db67adc34c 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | |||
| @@ -90,7 +90,7 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev) | |||
| 90 | 90 | ||
| 91 | /* Program the system aperture low logical page number. */ | 91 | /* Program the system aperture low logical page number. */ |
| 92 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, | 92 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, |
| 93 | min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); | 93 | min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); |
| 94 | 94 | ||
| 95 | if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) | 95 | if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) |
| 96 | /* | 96 | /* |
| @@ -100,11 +100,11 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev) | |||
| 100 | * to get rid of the VM fault and hardware hang. | 100 | * to get rid of the VM fault and hardware hang. |
| 101 | */ | 101 | */ |
| 102 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, | 102 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
| 103 | max((adev->gmc.vram_end >> 18) + 0x1, | 103 | max((adev->gmc.fb_end >> 18) + 0x1, |
| 104 | adev->gmc.agp_end >> 18)); | 104 | adev->gmc.agp_end >> 18)); |
| 105 | else | 105 | else |
| 106 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, | 106 | WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
| 107 | max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); | 107 | max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); |
| 108 | 108 | ||
| 109 | /* Set default page address. */ | 109 | /* Set default page address. */ |
| 110 | value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start + | 110 | value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start + |
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index bf5e6a413dee..4cc0dcb1a187 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
| @@ -65,6 +65,13 @@ | |||
| 65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba | 65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba |
| 66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 | 66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 |
| 67 | 67 | ||
| 68 | /* for Vega20 register name change */ | ||
| 69 | #define mmHDP_MEM_POWER_CTRL 0x00d4 | ||
| 70 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK 0x00000001L | ||
| 71 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK 0x00000002L | ||
| 72 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L | ||
| 73 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L | ||
| 74 | #define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 | ||
| 68 | /* | 75 | /* |
| 69 | * Indirect registers accessor | 76 | * Indirect registers accessor |
| 70 | */ | 77 | */ |
| @@ -870,15 +877,33 @@ static void soc15_update_hdp_light_sleep(struct amdgpu_device *adev, bool enable | |||
| 870 | { | 877 | { |
| 871 | uint32_t def, data; | 878 | uint32_t def, data; |
| 872 | 879 | ||
| 873 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | 880 | if (adev->asic_type == CHIP_VEGA20) { |
| 881 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL)); | ||
| 874 | 882 | ||
| 875 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | 883 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) |
| 876 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 884 | data |= HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | |
| 877 | else | 885 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | |
| 878 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 886 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | |
| 887 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK; | ||
| 888 | else | ||
| 889 | data &= ~(HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | | ||
| 890 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | | ||
| 891 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | | ||
| 892 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK); | ||
| 879 | 893 | ||
| 880 | if (def != data) | 894 | if (def != data) |
| 881 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | 895 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL), data); |
| 896 | } else { | ||
| 897 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | ||
| 898 | |||
| 899 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | ||
| 900 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
| 901 | else | ||
| 902 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
| 903 | |||
| 904 | if (def != data) | ||
| 905 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | ||
| 906 | } | ||
| 882 | } | 907 | } |
| 883 | 908 | ||
| 884 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) | 909 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) |
diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c index a99f71797aa3..a0fda6f9252a 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c | |||
| @@ -129,7 +129,7 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev) | |||
| 129 | else | 129 | else |
| 130 | wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4); | 130 | wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4); |
| 131 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off)); | 131 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off)); |
| 132 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFF); | 132 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFFFF); |
| 133 | 133 | ||
| 134 | /* set rptr, wptr to 0 */ | 134 | /* set rptr, wptr to 0 */ |
| 135 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); | 135 | WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); |
diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c index 2d4473557b0d..d13fc4fcb517 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c +++ b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | |||
| @@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev) | |||
| 49 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); | 49 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); |
| 50 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); | 50 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); |
| 51 | adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); | 51 | adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); |
| 52 | adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i])); | ||
| 52 | } | 53 | } |
| 53 | return 0; | 54 | return 0; |
| 54 | } | 55 | } |
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 b0df6dc9a775..ca925200fe09 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
| @@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) | |||
| 429 | adev->asic_type < CHIP_RAVEN) | 429 | adev->asic_type < CHIP_RAVEN) |
| 430 | init_data.flags.gpu_vm_support = true; | 430 | init_data.flags.gpu_vm_support = true; |
| 431 | 431 | ||
| 432 | if (amdgpu_dc_feature_mask & DC_FBC_MASK) | ||
| 433 | init_data.flags.fbc_support = true; | ||
| 434 | |||
| 432 | /* Display Core create. */ | 435 | /* Display Core create. */ |
| 433 | adev->dm.dc = dc_create(&init_data); | 436 | adev->dm.dc = dc_create(&init_data); |
| 434 | 437 | ||
| @@ -1524,13 +1527,6 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) | |||
| 1524 | { | 1527 | { |
| 1525 | struct amdgpu_display_manager *dm = bl_get_data(bd); | 1528 | struct amdgpu_display_manager *dm = bl_get_data(bd); |
| 1526 | 1529 | ||
| 1527 | /* | ||
| 1528 | * PWM interperts 0 as 100% rather than 0% because of HW | ||
| 1529 | * limitation for level 0.So limiting minimum brightness level | ||
| 1530 | * to 1. | ||
| 1531 | */ | ||
| 1532 | if (bd->props.brightness < 1) | ||
| 1533 | return 1; | ||
| 1534 | if (dc_link_set_backlight_level(dm->backlight_link, | 1530 | if (dc_link_set_backlight_level(dm->backlight_link, |
| 1535 | bd->props.brightness, 0, 0)) | 1531 | bd->props.brightness, 0, 0)) |
| 1536 | return 0; | 1532 | return 0; |
| @@ -2362,8 +2358,15 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode, | |||
| 2362 | static enum dc_color_depth | 2358 | static enum dc_color_depth |
| 2363 | convert_color_depth_from_display_info(const struct drm_connector *connector) | 2359 | convert_color_depth_from_display_info(const struct drm_connector *connector) |
| 2364 | { | 2360 | { |
| 2361 | struct dm_connector_state *dm_conn_state = | ||
| 2362 | to_dm_connector_state(connector->state); | ||
| 2365 | uint32_t bpc = connector->display_info.bpc; | 2363 | uint32_t bpc = connector->display_info.bpc; |
| 2366 | 2364 | ||
| 2365 | /* TODO: Remove this when there's support for max_bpc in drm */ | ||
| 2366 | if (dm_conn_state && bpc > dm_conn_state->max_bpc) | ||
| 2367 | /* Round down to nearest even number. */ | ||
| 2368 | bpc = dm_conn_state->max_bpc - (dm_conn_state->max_bpc & 1); | ||
| 2369 | |||
| 2367 | switch (bpc) { | 2370 | switch (bpc) { |
| 2368 | case 0: | 2371 | case 0: |
| 2369 | /* | 2372 | /* |
| @@ -2707,18 +2710,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, | |||
| 2707 | drm_connector = &aconnector->base; | 2710 | drm_connector = &aconnector->base; |
| 2708 | 2711 | ||
| 2709 | if (!aconnector->dc_sink) { | 2712 | if (!aconnector->dc_sink) { |
| 2710 | /* | 2713 | if (!aconnector->mst_port) { |
| 2711 | * Create dc_sink when necessary to MST | 2714 | sink = create_fake_sink(aconnector); |
| 2712 | * Don't apply fake_sink to MST | 2715 | if (!sink) |
| 2713 | */ | 2716 | return stream; |
| 2714 | if (aconnector->mst_port) { | ||
| 2715 | dm_dp_mst_dc_sink_create(drm_connector); | ||
| 2716 | return stream; | ||
| 2717 | } | 2717 | } |
| 2718 | |||
| 2719 | sink = create_fake_sink(aconnector); | ||
| 2720 | if (!sink) | ||
| 2721 | return stream; | ||
| 2722 | } else { | 2718 | } else { |
| 2723 | sink = aconnector->dc_sink; | 2719 | sink = aconnector->dc_sink; |
| 2724 | } | 2720 | } |
| @@ -2954,6 +2950,9 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector, | |||
| 2954 | } else if (property == adev->mode_info.underscan_property) { | 2950 | } else if (property == adev->mode_info.underscan_property) { |
| 2955 | dm_new_state->underscan_enable = val; | 2951 | dm_new_state->underscan_enable = val; |
| 2956 | ret = 0; | 2952 | ret = 0; |
| 2953 | } else if (property == adev->mode_info.max_bpc_property) { | ||
| 2954 | dm_new_state->max_bpc = val; | ||
| 2955 | ret = 0; | ||
| 2957 | } | 2956 | } |
| 2958 | 2957 | ||
| 2959 | return ret; | 2958 | return ret; |
| @@ -2996,6 +2995,9 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, | |||
| 2996 | } else if (property == adev->mode_info.underscan_property) { | 2995 | } else if (property == adev->mode_info.underscan_property) { |
| 2997 | *val = dm_state->underscan_enable; | 2996 | *val = dm_state->underscan_enable; |
| 2998 | ret = 0; | 2997 | ret = 0; |
| 2998 | } else if (property == adev->mode_info.max_bpc_property) { | ||
| 2999 | *val = dm_state->max_bpc; | ||
| 3000 | ret = 0; | ||
| 2999 | } | 3001 | } |
| 3000 | return ret; | 3002 | return ret; |
| 3001 | } | 3003 | } |
| @@ -3308,7 +3310,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane, | |||
| 3308 | static const struct drm_plane_funcs dm_plane_funcs = { | 3310 | static const struct drm_plane_funcs dm_plane_funcs = { |
| 3309 | .update_plane = drm_atomic_helper_update_plane, | 3311 | .update_plane = drm_atomic_helper_update_plane, |
| 3310 | .disable_plane = drm_atomic_helper_disable_plane, | 3312 | .disable_plane = drm_atomic_helper_disable_plane, |
| 3311 | .destroy = drm_plane_cleanup, | 3313 | .destroy = drm_primary_helper_destroy, |
| 3312 | .reset = dm_drm_plane_reset, | 3314 | .reset = dm_drm_plane_reset, |
| 3313 | .atomic_duplicate_state = dm_drm_plane_duplicate_state, | 3315 | .atomic_duplicate_state = dm_drm_plane_duplicate_state, |
| 3314 | .atomic_destroy_state = dm_drm_plane_destroy_state, | 3316 | .atomic_destroy_state = dm_drm_plane_destroy_state, |
| @@ -3806,6 +3808,9 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, | |||
| 3806 | drm_object_attach_property(&aconnector->base.base, | 3808 | drm_object_attach_property(&aconnector->base.base, |
| 3807 | adev->mode_info.underscan_vborder_property, | 3809 | adev->mode_info.underscan_vborder_property, |
| 3808 | 0); | 3810 | 0); |
| 3811 | drm_object_attach_property(&aconnector->base.base, | ||
| 3812 | adev->mode_info.max_bpc_property, | ||
| 3813 | 0); | ||
| 3809 | 3814 | ||
| 3810 | } | 3815 | } |
| 3811 | 3816 | ||
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 978b34a5011c..6e069d777ab2 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | |||
| @@ -160,8 +160,6 @@ struct amdgpu_dm_connector { | |||
| 160 | struct mutex hpd_lock; | 160 | struct mutex hpd_lock; |
| 161 | 161 | ||
| 162 | bool fake_enable; | 162 | bool fake_enable; |
| 163 | |||
| 164 | bool mst_connected; | ||
| 165 | }; | 163 | }; |
| 166 | 164 | ||
| 167 | #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) | 165 | #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) |
| @@ -206,6 +204,7 @@ struct dm_connector_state { | |||
| 206 | enum amdgpu_rmx_type scaling; | 204 | enum amdgpu_rmx_type scaling; |
| 207 | uint8_t underscan_vborder; | 205 | uint8_t underscan_vborder; |
| 208 | uint8_t underscan_hborder; | 206 | uint8_t underscan_hborder; |
| 207 | uint8_t max_bpc; | ||
| 209 | bool underscan_enable; | 208 | bool underscan_enable; |
| 210 | bool freesync_enable; | 209 | bool freesync_enable; |
| 211 | bool freesync_capable; | 210 | bool freesync_capable; |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 03601d717fed..1b0d209d8367 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | |||
| @@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { | |||
| 205 | .atomic_get_property = amdgpu_dm_connector_atomic_get_property | 205 | .atomic_get_property = amdgpu_dm_connector_atomic_get_property |
| 206 | }; | 206 | }; |
| 207 | 207 | ||
| 208 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector) | ||
| 209 | { | ||
| 210 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | ||
| 211 | struct dc_sink *dc_sink; | ||
| 212 | struct dc_sink_init_data init_params = { | ||
| 213 | .link = aconnector->dc_link, | ||
| 214 | .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; | ||
| 215 | |||
| 216 | /* FIXME none of this is safe. we shouldn't touch aconnector here in | ||
| 217 | * atomic_check | ||
| 218 | */ | ||
| 219 | |||
| 220 | /* | ||
| 221 | * TODO: Need to further figure out why ddc.algo is NULL while MST port exists | ||
| 222 | */ | ||
| 223 | if (!aconnector->port || !aconnector->port->aux.ddc.algo) | ||
| 224 | return; | ||
| 225 | |||
| 226 | ASSERT(aconnector->edid); | ||
| 227 | |||
| 228 | dc_sink = dc_link_add_remote_sink( | ||
| 229 | aconnector->dc_link, | ||
| 230 | (uint8_t *)aconnector->edid, | ||
| 231 | (aconnector->edid->extensions + 1) * EDID_LENGTH, | ||
| 232 | &init_params); | ||
| 233 | |||
| 234 | dc_sink->priv = aconnector; | ||
| 235 | aconnector->dc_sink = dc_sink; | ||
| 236 | |||
| 237 | if (aconnector->dc_sink) | ||
| 238 | amdgpu_dm_update_freesync_caps( | ||
| 239 | connector, aconnector->edid); | ||
| 240 | } | ||
| 241 | |||
| 242 | static int dm_dp_mst_get_modes(struct drm_connector *connector) | 208 | static int dm_dp_mst_get_modes(struct drm_connector *connector) |
| 243 | { | 209 | { |
| 244 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | 210 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); |
| @@ -319,12 +285,7 @@ dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector) | |||
| 319 | struct amdgpu_device *adev = dev->dev_private; | 285 | struct amdgpu_device *adev = dev->dev_private; |
| 320 | struct amdgpu_encoder *amdgpu_encoder; | 286 | struct amdgpu_encoder *amdgpu_encoder; |
| 321 | struct drm_encoder *encoder; | 287 | struct drm_encoder *encoder; |
| 322 | const struct drm_connector_helper_funcs *connector_funcs = | ||
| 323 | connector->base.helper_private; | ||
| 324 | struct drm_encoder *enc_master = | ||
| 325 | connector_funcs->best_encoder(&connector->base); | ||
| 326 | 288 | ||
| 327 | DRM_DEBUG_KMS("enc master is %p\n", enc_master); | ||
| 328 | amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL); | 289 | amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL); |
| 329 | if (!amdgpu_encoder) | 290 | if (!amdgpu_encoder) |
| 330 | return NULL; | 291 | return NULL; |
| @@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 354 | struct amdgpu_device *adev = dev->dev_private; | 315 | struct amdgpu_device *adev = dev->dev_private; |
| 355 | struct amdgpu_dm_connector *aconnector; | 316 | struct amdgpu_dm_connector *aconnector; |
| 356 | struct drm_connector *connector; | 317 | struct drm_connector *connector; |
| 357 | struct drm_connector_list_iter conn_iter; | ||
| 358 | |||
| 359 | drm_connector_list_iter_begin(dev, &conn_iter); | ||
| 360 | drm_for_each_connector_iter(connector, &conn_iter) { | ||
| 361 | aconnector = to_amdgpu_dm_connector(connector); | ||
| 362 | if (aconnector->mst_port == master | ||
| 363 | && !aconnector->port) { | ||
| 364 | DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n", | ||
| 365 | aconnector, connector->base.id, aconnector->mst_port); | ||
| 366 | |||
| 367 | aconnector->port = port; | ||
| 368 | drm_connector_set_path_property(connector, pathprop); | ||
| 369 | |||
| 370 | drm_connector_list_iter_end(&conn_iter); | ||
| 371 | aconnector->mst_connected = true; | ||
| 372 | return &aconnector->base; | ||
| 373 | } | ||
| 374 | } | ||
| 375 | drm_connector_list_iter_end(&conn_iter); | ||
| 376 | 318 | ||
| 377 | aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); | 319 | aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); |
| 378 | if (!aconnector) | 320 | if (!aconnector) |
| @@ -400,10 +342,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 400 | master->connector_id); | 342 | master->connector_id); |
| 401 | 343 | ||
| 402 | aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master); | 344 | aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master); |
| 345 | drm_connector_attach_encoder(&aconnector->base, | ||
| 346 | &aconnector->mst_encoder->base); | ||
| 403 | 347 | ||
| 404 | /* | ||
| 405 | * TODO: understand why this one is needed | ||
| 406 | */ | ||
| 407 | drm_object_attach_property( | 348 | drm_object_attach_property( |
| 408 | &connector->base, | 349 | &connector->base, |
| 409 | dev->mode_config.path_property, | 350 | dev->mode_config.path_property, |
| @@ -421,8 +362,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 421 | */ | 362 | */ |
| 422 | amdgpu_dm_connector_funcs_reset(connector); | 363 | amdgpu_dm_connector_funcs_reset(connector); |
| 423 | 364 | ||
| 424 | aconnector->mst_connected = true; | ||
| 425 | |||
| 426 | DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", | 365 | DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", |
| 427 | aconnector, connector->base.id, aconnector->mst_port); | 366 | aconnector, connector->base.id, aconnector->mst_port); |
| 428 | 367 | ||
| @@ -434,6 +373,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 434 | static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | 373 | static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, |
| 435 | struct drm_connector *connector) | 374 | struct drm_connector *connector) |
| 436 | { | 375 | { |
| 376 | struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr); | ||
| 377 | struct drm_device *dev = master->base.dev; | ||
| 378 | struct amdgpu_device *adev = dev->dev_private; | ||
| 437 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | 379 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); |
| 438 | 380 | ||
| 439 | DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n", | 381 | DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n", |
| @@ -447,7 +389,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
| 447 | aconnector->dc_sink = NULL; | 389 | aconnector->dc_sink = NULL; |
| 448 | } | 390 | } |
| 449 | 391 | ||
| 450 | aconnector->mst_connected = false; | 392 | drm_connector_unregister(connector); |
| 393 | if (adev->mode_info.rfbdev) | ||
| 394 | drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector); | ||
| 395 | drm_connector_put(connector); | ||
| 451 | } | 396 | } |
| 452 | 397 | ||
| 453 | static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | 398 | static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) |
| @@ -458,18 +403,10 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | |||
| 458 | drm_kms_helper_hotplug_event(dev); | 403 | drm_kms_helper_hotplug_event(dev); |
| 459 | } | 404 | } |
| 460 | 405 | ||
| 461 | static void dm_dp_mst_link_status_reset(struct drm_connector *connector) | ||
| 462 | { | ||
| 463 | mutex_lock(&connector->dev->mode_config.mutex); | ||
| 464 | drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD); | ||
| 465 | mutex_unlock(&connector->dev->mode_config.mutex); | ||
| 466 | } | ||
| 467 | |||
| 468 | static void dm_dp_mst_register_connector(struct drm_connector *connector) | 406 | static void dm_dp_mst_register_connector(struct drm_connector *connector) |
| 469 | { | 407 | { |
| 470 | struct drm_device *dev = connector->dev; | 408 | struct drm_device *dev = connector->dev; |
| 471 | struct amdgpu_device *adev = dev->dev_private; | 409 | struct amdgpu_device *adev = dev->dev_private; |
| 472 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | ||
| 473 | 410 | ||
| 474 | if (adev->mode_info.rfbdev) | 411 | if (adev->mode_info.rfbdev) |
| 475 | drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); | 412 | drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); |
| @@ -477,9 +414,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector) | |||
| 477 | DRM_ERROR("adev->mode_info.rfbdev is NULL\n"); | 414 | DRM_ERROR("adev->mode_info.rfbdev is NULL\n"); |
| 478 | 415 | ||
| 479 | drm_connector_register(connector); | 416 | drm_connector_register(connector); |
| 480 | |||
| 481 | if (aconnector->mst_connected) | ||
| 482 | dm_dp_mst_link_status_reset(connector); | ||
| 483 | } | 417 | } |
| 484 | 418 | ||
| 485 | static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { | 419 | static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h index 8cf51da26657..2da851b40042 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h | |||
| @@ -31,6 +31,5 @@ struct amdgpu_dm_connector; | |||
| 31 | 31 | ||
| 32 | void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, | 32 | void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, |
| 33 | struct amdgpu_dm_connector *aconnector); | 33 | struct amdgpu_dm_connector *aconnector); |
| 34 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector); | ||
| 35 | 34 | ||
| 36 | #endif | 35 | #endif |
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 fb04a4ad141f..5da2186b3615 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | |||
| @@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting( | |||
| 1722 | i2c_success = i2c_write(pipe_ctx, slave_address, | 1722 | i2c_success = i2c_write(pipe_ctx, slave_address, |
| 1723 | buffer, sizeof(buffer)); | 1723 | buffer, sizeof(buffer)); |
| 1724 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ | 1724 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ |
| 1725 | offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", | 1725 | offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n", |
| 1726 | slave_address, buffer[0], buffer[1], i2c_success?1:0); | 1726 | slave_address, buffer[0], buffer[1], i2c_success?1:0); |
| 1727 | if (!i2c_success) | 1727 | if (!i2c_success) |
| 1728 | /* Write failure */ | 1728 | /* Write failure */ |
| @@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting( | |||
| 1734 | i2c_success = i2c_write(pipe_ctx, slave_address, | 1734 | i2c_success = i2c_write(pipe_ctx, slave_address, |
| 1735 | buffer, sizeof(buffer)); | 1735 | buffer, sizeof(buffer)); |
| 1736 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ | 1736 | RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ |
| 1737 | offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", | 1737 | offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n", |
| 1738 | slave_address, buffer[0], buffer[1], i2c_success?1:0); | 1738 | slave_address, buffer[0], buffer[1], i2c_success?1:0); |
| 1739 | if (!i2c_success) | 1739 | if (!i2c_success) |
| 1740 | /* Write failure */ | 1740 | /* Write failure */ |
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 199527171100..b57fa61b3034 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h | |||
| @@ -169,6 +169,7 @@ struct link_training_settings; | |||
| 169 | struct dc_config { | 169 | struct dc_config { |
| 170 | bool gpu_vm_support; | 170 | bool gpu_vm_support; |
| 171 | bool disable_disp_pll_sharing; | 171 | bool disable_disp_pll_sharing; |
| 172 | bool fbc_support; | ||
| 172 | }; | 173 | }; |
| 173 | 174 | ||
| 174 | enum visual_confirm { | 175 | enum visual_confirm { |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index b75ede5f84f7..b459867a05b2 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | |||
| @@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx, | |||
| 1736 | if (events->force_trigger) | 1736 | if (events->force_trigger) |
| 1737 | value |= 0x1; | 1737 | value |= 0x1; |
| 1738 | 1738 | ||
| 1739 | value |= 0x84; | 1739 | if (num_pipes) { |
| 1740 | struct dc *dc = pipe_ctx[0]->stream->ctx->dc; | ||
| 1741 | |||
| 1742 | if (dc->fbc_compressor) | ||
| 1743 | value |= 0x84; | ||
| 1744 | } | ||
| 1740 | 1745 | ||
| 1741 | for (i = 0; i < num_pipes; i++) | 1746 | for (i = 0; i < num_pipes; i++) |
| 1742 | pipe_ctx[i]->stream_res.tg->funcs-> | 1747 | pipe_ctx[i]->stream_res.tg->funcs-> |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c index e3624ca24574..7c9fd9052ee2 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c | |||
| @@ -1362,7 +1362,8 @@ static bool construct( | |||
| 1362 | pool->base.sw_i2cs[i] = NULL; | 1362 | pool->base.sw_i2cs[i] = NULL; |
| 1363 | } | 1363 | } |
| 1364 | 1364 | ||
| 1365 | dc->fbc_compressor = dce110_compressor_create(ctx); | 1365 | if (dc->config.fbc_support) |
| 1366 | dc->fbc_compressor = dce110_compressor_create(ctx); | ||
| 1366 | 1367 | ||
| 1367 | if (!underlay_create(ctx, &pool->base)) | 1368 | if (!underlay_create(ctx, &pool->base)) |
| 1368 | goto res_create_fail; | 1369 | goto res_create_fail; |
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index 2083c308007c..470d7b89071a 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h | |||
| @@ -133,6 +133,10 @@ enum PP_FEATURE_MASK { | |||
| 133 | PP_AVFS_MASK = 0x40000, | 133 | PP_AVFS_MASK = 0x40000, |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | enum DC_FEATURE_MASK { | ||
| 137 | DC_FBC_MASK = 0x1, | ||
| 138 | }; | ||
| 139 | |||
| 136 | /** | 140 | /** |
| 137 | * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks | 141 | * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks |
| 138 | */ | 142 | */ |
diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h index d2e7c0fa96c2..8eb0bb241210 100644 --- a/drivers/gpu/drm/amd/include/atomfirmware.h +++ b/drivers/gpu/drm/amd/include/atomfirmware.h | |||
| @@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 { | |||
| 1325 | struct atom_common_table_header table_header; | 1325 | struct atom_common_table_header table_header; |
| 1326 | uint8_t smuip_min_ver; | 1326 | uint8_t smuip_min_ver; |
| 1327 | uint8_t smuip_max_ver; | 1327 | uint8_t smuip_max_ver; |
| 1328 | uint8_t smu_rsd1; | 1328 | uint8_t waflclk_ss_mode; |
| 1329 | uint8_t gpuclk_ss_mode; | 1329 | uint8_t gpuclk_ss_mode; |
| 1330 | uint16_t sclk_ss_percentage; | 1330 | uint16_t sclk_ss_percentage; |
| 1331 | uint16_t sclk_ss_rate_10hz; | 1331 | uint16_t sclk_ss_rate_10hz; |
| @@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 { | |||
| 1355 | uint32_t syspll3_1_vco_freq_10khz; | 1355 | uint32_t syspll3_1_vco_freq_10khz; |
| 1356 | uint32_t bootup_fclk_10khz; | 1356 | uint32_t bootup_fclk_10khz; |
| 1357 | uint32_t bootup_waflclk_10khz; | 1357 | uint32_t bootup_waflclk_10khz; |
| 1358 | uint32_t reserved[3]; | 1358 | uint32_t smu_info_caps; |
| 1359 | uint16_t waflclk_ss_percentage; // in unit of 0.001% | ||
| 1360 | uint16_t smuinitoffset; | ||
| 1361 | uint32_t reserved; | ||
| 1359 | }; | 1362 | }; |
| 1360 | 1363 | ||
| 1361 | /* | 1364 | /* |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index ed35ec0341e6..88f6b35ea6fe 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
| @@ -4525,12 +4525,12 @@ static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
| 4525 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); | 4525 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); |
| 4526 | struct smu7_single_dpm_table *golden_sclk_table = | 4526 | struct smu7_single_dpm_table *golden_sclk_table = |
| 4527 | &(data->golden_dpm_table.sclk_table); | 4527 | &(data->golden_dpm_table.sclk_table); |
| 4528 | int value; | 4528 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
| 4529 | int golden_value = golden_sclk_table->dpm_levels | ||
| 4530 | [golden_sclk_table->count - 1].value; | ||
| 4529 | 4531 | ||
| 4530 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 4532 | value -= golden_value; |
| 4531 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 4533 | value = DIV_ROUND_UP(value * 100, golden_value); |
| 4532 | 100 / | ||
| 4533 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
| 4534 | 4534 | ||
| 4535 | return value; | 4535 | return value; |
| 4536 | } | 4536 | } |
| @@ -4567,12 +4567,12 @@ static int smu7_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
| 4567 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); | 4567 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); |
| 4568 | struct smu7_single_dpm_table *golden_mclk_table = | 4568 | struct smu7_single_dpm_table *golden_mclk_table = |
| 4569 | &(data->golden_dpm_table.mclk_table); | 4569 | &(data->golden_dpm_table.mclk_table); |
| 4570 | int value; | 4570 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
| 4571 | int golden_value = golden_mclk_table->dpm_levels | ||
| 4572 | [golden_mclk_table->count - 1].value; | ||
| 4571 | 4573 | ||
| 4572 | value = (mclk_table->dpm_levels[mclk_table->count - 1].value - | 4574 | value -= golden_value; |
| 4573 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * | 4575 | value = DIV_ROUND_UP(value * 100, golden_value); |
| 4574 | 100 / | ||
| 4575 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value; | ||
| 4576 | 4576 | ||
| 4577 | return value; | 4577 | return value; |
| 4578 | } | 4578 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c index 99a33c33a32c..101c09b212ad 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c | |||
| @@ -713,20 +713,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table, | |||
| 713 | for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) { | 713 | for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) { |
| 714 | table->WatermarkRow[1][i].MinClock = | 714 | table->WatermarkRow[1][i].MinClock = |
| 715 | cpu_to_le16((uint16_t) | 715 | cpu_to_le16((uint16_t) |
| 716 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz) / | 716 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz / |
| 717 | 1000); | 717 | 1000)); |
| 718 | table->WatermarkRow[1][i].MaxClock = | 718 | table->WatermarkRow[1][i].MaxClock = |
| 719 | cpu_to_le16((uint16_t) | 719 | cpu_to_le16((uint16_t) |
| 720 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz) / | 720 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz / |
| 721 | 1000); | 721 | 1000)); |
| 722 | table->WatermarkRow[1][i].MinUclk = | 722 | table->WatermarkRow[1][i].MinUclk = |
| 723 | cpu_to_le16((uint16_t) | 723 | cpu_to_le16((uint16_t) |
| 724 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz) / | 724 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz / |
| 725 | 1000); | 725 | 1000)); |
| 726 | table->WatermarkRow[1][i].MaxUclk = | 726 | table->WatermarkRow[1][i].MaxUclk = |
| 727 | cpu_to_le16((uint16_t) | 727 | cpu_to_le16((uint16_t) |
| 728 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz) / | 728 | (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz / |
| 729 | 1000); | 729 | 1000)); |
| 730 | table->WatermarkRow[1][i].WmSetting = (uint8_t) | 730 | table->WatermarkRow[1][i].WmSetting = (uint8_t) |
| 731 | wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id; | 731 | wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id; |
| 732 | } | 732 | } |
| @@ -734,20 +734,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table, | |||
| 734 | for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) { | 734 | for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) { |
| 735 | table->WatermarkRow[0][i].MinClock = | 735 | table->WatermarkRow[0][i].MinClock = |
| 736 | cpu_to_le16((uint16_t) | 736 | cpu_to_le16((uint16_t) |
| 737 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz) / | 737 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz / |
| 738 | 1000); | 738 | 1000)); |
| 739 | table->WatermarkRow[0][i].MaxClock = | 739 | table->WatermarkRow[0][i].MaxClock = |
| 740 | cpu_to_le16((uint16_t) | 740 | cpu_to_le16((uint16_t) |
| 741 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz) / | 741 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz / |
| 742 | 1000); | 742 | 1000)); |
| 743 | table->WatermarkRow[0][i].MinUclk = | 743 | table->WatermarkRow[0][i].MinUclk = |
| 744 | cpu_to_le16((uint16_t) | 744 | cpu_to_le16((uint16_t) |
| 745 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz) / | 745 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz / |
| 746 | 1000); | 746 | 1000)); |
| 747 | table->WatermarkRow[0][i].MaxUclk = | 747 | table->WatermarkRow[0][i].MaxUclk = |
| 748 | cpu_to_le16((uint16_t) | 748 | cpu_to_le16((uint16_t) |
| 749 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz) / | 749 | (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz / |
| 750 | 1000); | 750 | 1000)); |
| 751 | table->WatermarkRow[0][i].WmSetting = (uint8_t) | 751 | table->WatermarkRow[0][i].WmSetting = (uint8_t) |
| 752 | wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; | 752 | wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; |
| 753 | } | 753 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 8c4db86bb4b7..e2bc6e0c229f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | |||
| @@ -4522,15 +4522,13 @@ static int vega10_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
| 4522 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 4522 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
| 4523 | struct vega10_single_dpm_table *golden_sclk_table = | 4523 | struct vega10_single_dpm_table *golden_sclk_table = |
| 4524 | &(data->golden_dpm_table.gfx_table); | 4524 | &(data->golden_dpm_table.gfx_table); |
| 4525 | int value; | 4525 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
| 4526 | 4526 | int golden_value = golden_sclk_table->dpm_levels | |
| 4527 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | ||
| 4528 | golden_sclk_table->dpm_levels | ||
| 4529 | [golden_sclk_table->count - 1].value) * | ||
| 4530 | 100 / | ||
| 4531 | golden_sclk_table->dpm_levels | ||
| 4532 | [golden_sclk_table->count - 1].value; | 4527 | [golden_sclk_table->count - 1].value; |
| 4533 | 4528 | ||
| 4529 | value -= golden_value; | ||
| 4530 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
| 4531 | |||
| 4534 | return value; | 4532 | return value; |
| 4535 | } | 4533 | } |
| 4536 | 4534 | ||
| @@ -4575,16 +4573,13 @@ static int vega10_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
| 4575 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 4573 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
| 4576 | struct vega10_single_dpm_table *golden_mclk_table = | 4574 | struct vega10_single_dpm_table *golden_mclk_table = |
| 4577 | &(data->golden_dpm_table.mem_table); | 4575 | &(data->golden_dpm_table.mem_table); |
| 4578 | int value; | 4576 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
| 4579 | 4577 | int golden_value = golden_mclk_table->dpm_levels | |
| 4580 | value = (mclk_table->dpm_levels | ||
| 4581 | [mclk_table->count - 1].value - | ||
| 4582 | golden_mclk_table->dpm_levels | ||
| 4583 | [golden_mclk_table->count - 1].value) * | ||
| 4584 | 100 / | ||
| 4585 | golden_mclk_table->dpm_levels | ||
| 4586 | [golden_mclk_table->count - 1].value; | 4578 | [golden_mclk_table->count - 1].value; |
| 4587 | 4579 | ||
| 4580 | value -= golden_value; | ||
| 4581 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
| 4582 | |||
| 4588 | return value; | 4583 | return value; |
| 4589 | } | 4584 | } |
| 4590 | 4585 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c index 74bc37308dc0..54364444ecd1 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | |||
| @@ -2243,12 +2243,12 @@ static int vega12_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
| 2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
| 2244 | struct vega12_single_dpm_table *golden_sclk_table = | 2244 | struct vega12_single_dpm_table *golden_sclk_table = |
| 2245 | &(data->golden_dpm_table.gfx_table); | 2245 | &(data->golden_dpm_table.gfx_table); |
| 2246 | int value; | 2246 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
| 2247 | int golden_value = golden_sclk_table->dpm_levels | ||
| 2248 | [golden_sclk_table->count - 1].value; | ||
| 2247 | 2249 | ||
| 2248 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 2250 | value -= golden_value; |
| 2249 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 2251 | value = DIV_ROUND_UP(value * 100, golden_value); |
| 2250 | 100 / | ||
| 2251 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
| 2252 | 2252 | ||
| 2253 | return value; | 2253 | return value; |
| 2254 | } | 2254 | } |
| @@ -2264,16 +2264,13 @@ static int vega12_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
| 2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
| 2265 | struct vega12_single_dpm_table *golden_mclk_table = | 2265 | struct vega12_single_dpm_table *golden_mclk_table = |
| 2266 | &(data->golden_dpm_table.mem_table); | 2266 | &(data->golden_dpm_table.mem_table); |
| 2267 | int value; | 2267 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
| 2268 | 2268 | int golden_value = golden_mclk_table->dpm_levels | |
| 2269 | value = (mclk_table->dpm_levels | ||
| 2270 | [mclk_table->count - 1].value - | ||
| 2271 | golden_mclk_table->dpm_levels | ||
| 2272 | [golden_mclk_table->count - 1].value) * | ||
| 2273 | 100 / | ||
| 2274 | golden_mclk_table->dpm_levels | ||
| 2275 | [golden_mclk_table->count - 1].value; | 2269 | [golden_mclk_table->count - 1].value; |
| 2276 | 2270 | ||
| 2271 | value -= golden_value; | ||
| 2272 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
| 2273 | |||
| 2277 | return value; | 2274 | return value; |
| 2278 | } | 2275 | } |
| 2279 | 2276 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 57143d51e3ee..b4eadd47f3a4 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
| @@ -75,7 +75,17 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
| 75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
| 76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
| 77 | 77 | ||
| 78 | data->registry_data.disallowed_features = 0x0; | 78 | /* |
| 79 | * Disable the following features for now: | ||
| 80 | * GFXCLK DS | ||
| 81 | * SOCLK DS | ||
| 82 | * LCLK DS | ||
| 83 | * DCEFCLK DS | ||
| 84 | * FCLK DS | ||
| 85 | * MP1CLK DS | ||
| 86 | * MP0CLK DS | ||
| 87 | */ | ||
| 88 | data->registry_data.disallowed_features = 0xE0041C00; | ||
| 79 | data->registry_data.od_state_in_dc_support = 0; | 89 | data->registry_data.od_state_in_dc_support = 0; |
| 80 | data->registry_data.thermal_support = 1; | 90 | data->registry_data.thermal_support = 1; |
| 81 | data->registry_data.skip_baco_hardware = 0; | 91 | data->registry_data.skip_baco_hardware = 0; |
| @@ -120,6 +130,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
| 120 | data->registry_data.disable_auto_wattman = 1; | 130 | data->registry_data.disable_auto_wattman = 1; |
| 121 | data->registry_data.auto_wattman_debug = 0; | 131 | data->registry_data.auto_wattman_debug = 0; |
| 122 | data->registry_data.auto_wattman_sample_period = 100; | 132 | data->registry_data.auto_wattman_sample_period = 100; |
| 133 | data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD; | ||
| 123 | data->registry_data.auto_wattman_threshold = 50; | 134 | data->registry_data.auto_wattman_threshold = 50; |
| 124 | data->registry_data.gfxoff_controlled_by_driver = 1; | 135 | data->registry_data.gfxoff_controlled_by_driver = 1; |
| 125 | data->gfxoff_allowed = false; | 136 | data->gfxoff_allowed = false; |
| @@ -829,6 +840,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr) | |||
| 829 | return 0; | 840 | return 0; |
| 830 | } | 841 | } |
| 831 | 842 | ||
| 843 | static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr) | ||
| 844 | { | ||
| 845 | struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 846 | |||
| 847 | if (data->smu_features[GNLD_DPM_UCLK].enabled) | ||
| 848 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 849 | PPSMC_MSG_SetUclkFastSwitch, | ||
| 850 | 1); | ||
| 851 | |||
| 852 | return 0; | ||
| 853 | } | ||
| 854 | |||
| 855 | static int vega20_send_clock_ratio(struct pp_hwmgr *hwmgr) | ||
| 856 | { | ||
| 857 | struct vega20_hwmgr *data = | ||
| 858 | (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 859 | |||
| 860 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 861 | PPSMC_MSG_SetFclkGfxClkRatio, | ||
| 862 | data->registry_data.fclk_gfxclk_ratio); | ||
| 863 | } | ||
| 864 | |||
| 832 | static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr) | 865 | static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr) |
| 833 | { | 866 | { |
| 834 | struct vega20_hwmgr *data = | 867 | struct vega20_hwmgr *data = |
| @@ -1290,12 +1323,13 @@ static int vega20_get_sclk_od( | |||
| 1290 | &(data->dpm_table.gfx_table); | 1323 | &(data->dpm_table.gfx_table); |
| 1291 | struct vega20_single_dpm_table *golden_sclk_table = | 1324 | struct vega20_single_dpm_table *golden_sclk_table = |
| 1292 | &(data->golden_dpm_table.gfx_table); | 1325 | &(data->golden_dpm_table.gfx_table); |
| 1293 | int value; | 1326 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
| 1327 | int golden_value = golden_sclk_table->dpm_levels | ||
| 1328 | [golden_sclk_table->count - 1].value; | ||
| 1294 | 1329 | ||
| 1295 | /* od percentage */ | 1330 | /* od percentage */ |
| 1296 | value = DIV_ROUND_UP((sclk_table->dpm_levels[sclk_table->count - 1].value - | 1331 | value -= golden_value; |
| 1297 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * 100, | 1332 | value = DIV_ROUND_UP(value * 100, golden_value); |
| 1298 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value); | ||
| 1299 | 1333 | ||
| 1300 | return value; | 1334 | return value; |
| 1301 | } | 1335 | } |
| @@ -1335,12 +1369,13 @@ static int vega20_get_mclk_od( | |||
| 1335 | &(data->dpm_table.mem_table); | 1369 | &(data->dpm_table.mem_table); |
| 1336 | struct vega20_single_dpm_table *golden_mclk_table = | 1370 | struct vega20_single_dpm_table *golden_mclk_table = |
| 1337 | &(data->golden_dpm_table.mem_table); | 1371 | &(data->golden_dpm_table.mem_table); |
| 1338 | int value; | 1372 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
| 1373 | int golden_value = golden_mclk_table->dpm_levels | ||
| 1374 | [golden_mclk_table->count - 1].value; | ||
| 1339 | 1375 | ||
| 1340 | /* od percentage */ | 1376 | /* od percentage */ |
| 1341 | value = DIV_ROUND_UP((mclk_table->dpm_levels[mclk_table->count - 1].value - | 1377 | value -= golden_value; |
| 1342 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * 100, | 1378 | value = DIV_ROUND_UP(value * 100, golden_value); |
| 1343 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value); | ||
| 1344 | 1379 | ||
| 1345 | return value; | 1380 | return value; |
| 1346 | } | 1381 | } |
| @@ -1532,6 +1567,16 @@ static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr) | |||
| 1532 | "[EnableDPMTasks] Failed to enable all smu features!", | 1567 | "[EnableDPMTasks] Failed to enable all smu features!", |
| 1533 | return result); | 1568 | return result); |
| 1534 | 1569 | ||
| 1570 | result = vega20_notify_smc_display_change(hwmgr); | ||
| 1571 | PP_ASSERT_WITH_CODE(!result, | ||
| 1572 | "[EnableDPMTasks] Failed to notify smc display change!", | ||
| 1573 | return result); | ||
| 1574 | |||
| 1575 | result = vega20_send_clock_ratio(hwmgr); | ||
| 1576 | PP_ASSERT_WITH_CODE(!result, | ||
| 1577 | "[EnableDPMTasks] Failed to send clock ratio!", | ||
| 1578 | return result); | ||
| 1579 | |||
| 1535 | /* Initialize UVD/VCE powergating state */ | 1580 | /* Initialize UVD/VCE powergating state */ |
| 1536 | vega20_init_powergate_state(hwmgr); | 1581 | vega20_init_powergate_state(hwmgr); |
| 1537 | 1582 | ||
| @@ -1972,19 +2017,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx, | |||
| 1972 | return ret; | 2017 | return ret; |
| 1973 | } | 2018 | } |
| 1974 | 2019 | ||
| 1975 | static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr, | ||
| 1976 | bool has_disp) | ||
| 1977 | { | ||
| 1978 | struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend); | ||
| 1979 | |||
| 1980 | if (data->smu_features[GNLD_DPM_UCLK].enabled) | ||
| 1981 | return smum_send_msg_to_smc_with_parameter(hwmgr, | ||
| 1982 | PPSMC_MSG_SetUclkFastSwitch, | ||
| 1983 | has_disp ? 1 : 0); | ||
| 1984 | |||
| 1985 | return 0; | ||
| 1986 | } | ||
| 1987 | |||
| 1988 | int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr, | 2020 | int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr, |
| 1989 | struct pp_display_clock_request *clock_req) | 2021 | struct pp_display_clock_request *clock_req) |
| 1990 | { | 2022 | { |
| @@ -2044,13 +2076,6 @@ static int vega20_notify_smc_display_config_after_ps_adjustment( | |||
| 2044 | struct pp_display_clock_request clock_req; | 2076 | struct pp_display_clock_request clock_req; |
| 2045 | int ret = 0; | 2077 | int ret = 0; |
| 2046 | 2078 | ||
| 2047 | if ((hwmgr->display_config->num_display > 1) && | ||
| 2048 | !hwmgr->display_config->multi_monitor_in_sync && | ||
| 2049 | !hwmgr->display_config->nb_pstate_switch_disable) | ||
| 2050 | vega20_notify_smc_display_change(hwmgr, false); | ||
| 2051 | else | ||
| 2052 | vega20_notify_smc_display_change(hwmgr, true); | ||
| 2053 | |||
| 2054 | min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk; | 2079 | min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk; |
| 2055 | min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk; | 2080 | min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk; |
| 2056 | min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock; | 2081 | min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h index 56fe6a0d42e8..25faaa5c5b10 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h | |||
| @@ -328,6 +328,7 @@ struct vega20_registry_data { | |||
| 328 | uint8_t disable_auto_wattman; | 328 | uint8_t disable_auto_wattman; |
| 329 | uint32_t auto_wattman_debug; | 329 | uint32_t auto_wattman_debug; |
| 330 | uint32_t auto_wattman_sample_period; | 330 | uint32_t auto_wattman_sample_period; |
| 331 | uint32_t fclk_gfxclk_ratio; | ||
| 331 | uint8_t auto_wattman_threshold; | 332 | uint8_t auto_wattman_threshold; |
| 332 | uint8_t log_avfs_param; | 333 | uint8_t log_avfs_param; |
| 333 | uint8_t enable_enginess; | 334 | uint8_t enable_enginess; |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h index 45d64a81e945..4f63a736ea0e 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h +++ b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h | |||
| @@ -105,7 +105,8 @@ | |||
| 105 | #define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B | 105 | #define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B |
| 106 | #define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C | 106 | #define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C |
| 107 | #define PPSMC_MSG_WaflTest 0x4D | 107 | #define PPSMC_MSG_WaflTest 0x4D |
| 108 | // Unused ID 0x4E to 0x50 | 108 | #define PPSMC_MSG_SetFclkGfxClkRatio 0x4E |
| 109 | // Unused ID 0x4F to 0x50 | ||
| 109 | #define PPSMC_MSG_AllowGfxOff 0x51 | 110 | #define PPSMC_MSG_AllowGfxOff 0x51 |
| 110 | #define PPSMC_MSG_DisallowGfxOff 0x52 | 111 | #define PPSMC_MSG_DisallowGfxOff 0x52 |
| 111 | #define PPSMC_MSG_GetPptLimit 0x53 | 112 | #define PPSMC_MSG_GetPptLimit 0x53 |
