From: Matthew Stewart Date: Mon, 4 May 2026 21:04:54 +0000 (-0400) Subject: drm/amd/display: Enable DCN 4.2.1 in amdgpu_dm X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=14b7d1291d7c7fed911c61e82bfd7bceabf3034e;p=thirdparty%2Flinux.git drm/amd/display: Enable DCN 4.2.1 in amdgpu_dm [Why & How] Add checks for IP version 4.2.1. Reviewed-by: Harry Wentland Signed-off-by: Matthew Stewart Signed-off-by: Ray Wu Tested-by: Daniel Wheeler Signed-off-by: Alex Deucher --- 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 c5a5e6ca4958a..94da226513c0a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -158,6 +158,9 @@ MODULE_FIRMWARE(FIRMWARE_DCN_401_DMUB); #define FIRMWARE_DCN_42_DMUB "amdgpu/dcn_4_2_dmcub.bin" MODULE_FIRMWARE(FIRMWARE_DCN_42_DMUB); +#define FIRMWARE_DCN_42B_DMUB "amdgpu/dcn_4_2_1_dmcub.bin" +MODULE_FIRMWARE(FIRMWARE_DCN_42B_DMUB); + /** * DOC: overview * @@ -1375,6 +1378,7 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev) case IP_VERSION(3, 5, 1): case IP_VERSION(3, 6, 0): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): hw_params.ips_sequential_ono = adev->external_rev_id > 0x10; hw_params.lower_hbr3_phy_ssc = true; break; @@ -1823,6 +1827,7 @@ static void *dm_dmub_get_vbios_bounding_box(struct amdgpu_device *adev) bb_size = sizeof(struct dml2_soc_bb); break; case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): bb_size = sizeof(struct dml2_soc_bb); break; default: @@ -1870,6 +1875,7 @@ static enum dmub_ips_disable_type dm_get_default_ips_mode( ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; break; case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): ret = DMUB_IPS_ENABLE; break; default: @@ -2483,6 +2489,7 @@ static int load_dmcu_fw(struct amdgpu_device *adev) case IP_VERSION(3, 6, 0): case IP_VERSION(4, 0, 1): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): return 0; default: break; @@ -2621,6 +2628,9 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev) case IP_VERSION(4, 2, 0): dmub_asic = DMUB_ASIC_DCN42; break; + case IP_VERSION(4, 2, 1): + dmub_asic = DMUB_ASIC_DCN42B; + break; default: /* ASIC doesn't support DMUB. */ return 0; @@ -5741,6 +5751,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) case IP_VERSION(3, 6, 0): case IP_VERSION(4, 0, 1): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): if (register_outbox_irq_handlers(dm->adev)) { drm_err(adev_to_drm(adev), "DM: Failed to initialize IRQ\n"); goto fail; @@ -5766,6 +5777,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) case IP_VERSION(3, 6, 0): case IP_VERSION(4, 0, 1): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): psr_feature_enabled = true; break; default: @@ -5784,6 +5796,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) case IP_VERSION(3, 5, 1): case IP_VERSION(3, 6, 0): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): replay_feature_enabled = true; break; @@ -5945,6 +5958,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) case IP_VERSION(3, 6, 0): case IP_VERSION(4, 0, 1): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): if (dcn10_register_irq_handlers(dm->adev)) { drm_err(adev_to_drm(adev), "DM: Failed to initialize IRQ\n"); goto fail; @@ -6096,6 +6110,9 @@ static int dm_init_microcode(struct amdgpu_device *adev) case IP_VERSION(4, 2, 0): fw_name_dmub = FIRMWARE_DCN_42_DMUB; break; + case IP_VERSION(4, 2, 1): + fw_name_dmub = FIRMWARE_DCN_42B_DMUB; + break; default: /* ASIC doesn't support DMUB. */ return 0; @@ -6224,6 +6241,7 @@ static int dm_early_init(struct amdgpu_ip_block *ip_block) case IP_VERSION(3, 6, 0): case IP_VERSION(4, 0, 1): case IP_VERSION(4, 2, 0): + case IP_VERSION(4, 2, 1): adev->mode_info.num_crtc = 4; adev->mode_info.num_hpd = 4; adev->mode_info.num_dig = 4; @@ -12655,7 +12673,8 @@ static int dm_crtc_get_cursor_mode(struct amdgpu_device *adev, * as previous DCN generations, so enable native mode on DCN401/420 */ if (amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 0, 1) || - amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 0)) { + amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 0) || + amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 1)) { *cursor_mode = DM_CURSOR_NATIVE_MODE; return 0; } @@ -13091,9 +13110,11 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, continue; /* Check if rotation or scaling is enabled on DCN401 */ - if ((drm_plane_mask(crtc->cursor) & new_crtc_state->plane_mask) && - (amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 0) || - amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 0, 1))) { + if ((drm_plane_mask(crtc->cursor) & + new_crtc_state->plane_mask) && + (amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 1) || + amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 0) || + amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 0, 1))) { new_cursor_state = drm_atomic_get_new_plane_state(state, crtc->cursor); is_rotated = new_cursor_state &&