[PATCH v3] drm/amd: Fail initialization earlier when DC is disabled
Alex Deucher
alexdeucher at gmail.com
Fri Mar 7 15:47:40 UTC 2025
On Thu, Mar 6, 2025 at 3:51 PM Mario Limonciello
<mario.limonciello at amd.com> wrote:
>
> 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.limonciello at 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;
> }
I think this will break for chips with harvested DCN blocks. I think
you need to return early here in that case. E.g.,
if (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK)
return 0;
Alex
>
> - 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
>
More information about the amd-gfx
mailing list