Modern APU and dGPU require DC support to be able to light up the display. If DC support has been disabled either by kernel config or by kernel command line the screen will visibly freeze when the driver finishes early init.
As it's known before early init is done whether DC support is required detect this during discovery and bail if DC support was disabled for any reason. This will ensure that the existing framebuffer provided by efifb or simpledrm keeps working. Signed-off-by: Mario Limonciello <mario.limoncie...@amd.com> --- v3: * Use amdgpu_device_asic_has_dc_support() instead to cover virtual displays and bringup v2: * Update commit message justification * Add correct "default" handling --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index a4258127083d0..ddd10e6345601 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -2134,15 +2134,14 @@ static void amdgpu_discovery_set_sriov_display(struct amdgpu_device *adev) static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev) { + bool asic_support; + if (adev->enable_virtual_display) { amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block); return 0; } - if (!amdgpu_device_has_dc_support(adev)) - return 0; - -#if defined(CONFIG_DRM_AMD_DC) + asic_support = amdgpu_device_asic_has_dc_support(adev->asic_type); if (amdgpu_ip_version(adev, DCE_HWIP, 0)) { switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) { case IP_VERSION(1, 0, 0): @@ -2166,39 +2165,63 @@ static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev) case IP_VERSION(3, 5, 1): case IP_VERSION(3, 6, 0): case IP_VERSION(4, 1, 0): + if (!asic_support) { + dev_err(adev->dev, + "DC support is required for dm ip block(DCE_HWIP:0x%x)\n", + amdgpu_ip_version(adev, DCE_HWIP, 0)); + return -EINVAL; + } + /* TODO: Fix IP version. DC code expects version 4.0.1 */ if (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(4, 1, 0)) adev->ip_versions[DCE_HWIP][0] = IP_VERSION(4, 0, 1); +#if defined(CONFIG_DRM_AMD_DC) if (amdgpu_sriov_vf(adev)) amdgpu_discovery_set_sriov_display(adev); else amdgpu_device_ip_block_add(adev, &dm_ip_block); break; +#endif default: - dev_err(adev->dev, - "Failed to add dm ip block(DCE_HWIP:0x%x)\n", - amdgpu_ip_version(adev, DCE_HWIP, 0)); - return -EINVAL; + if (asic_support) { + dev_err(adev->dev, + "Failed to add dm ip block(DCE_HWIP:0x%x)\n", + amdgpu_ip_version(adev, DCE_HWIP, 0)); + return -EINVAL; + } + return 0; } } else if (amdgpu_ip_version(adev, DCI_HWIP, 0)) { switch (amdgpu_ip_version(adev, DCI_HWIP, 0)) { case IP_VERSION(12, 0, 0): case IP_VERSION(12, 0, 1): case IP_VERSION(12, 1, 0): + + if (!asic_support) { + dev_err(adev->dev, + "DC support is required for dm ip block(DCI_HWIP:0x%x)\n", + amdgpu_ip_version(adev, DCI_HWIP, 0)); + return -EINVAL; + } + +#if defined(CONFIG_DRM_AMD_DC) if (amdgpu_sriov_vf(adev)) amdgpu_discovery_set_sriov_display(adev); else amdgpu_device_ip_block_add(adev, &dm_ip_block); break; +#endif default: - dev_err(adev->dev, - "Failed to add dm ip block(DCI_HWIP:0x%x)\n", - amdgpu_ip_version(adev, DCI_HWIP, 0)); - return -EINVAL; + if (asic_support) { + dev_err(adev->dev, + "Failed to add dm ip block(DCI_HWIP:0x%x)\n", + amdgpu_ip_version(adev, DCI_HWIP, 0)); + return -EINVAL; + } + return 0; } } -#endif return 0; } -- 2.43.0