[PATCH v2] drm/amd: Fail initialization earlier when DC is disabled

Mario Limonciello mario.limonciello at amd.com
Thu Mar 6 19:31:07 UTC 2025


On 3/6/2025 13:19, Alex Deucher wrote:
> On Thu, Mar 6, 2025 at 1:58 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.
> 
> I think there are a couple of corner cases we need to handle:
> 1. if adev->enable_virtual_display is set.  The user has configured
> virtual displays and hence they want to use them rather than the
> actual physical displays.  This is useful with GPUs in servers or for
> early bring up.
 > 2. If the board supports DCN IP, but all it's been fused off due to> 
silicon flaws (e.g., adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK).
> In that case, we don't want to fail.

In that case I wonder if it's better to use 
amdgpu_device_asic_has_dc_support() instead of 
amdgpu_device_has_dc_support() which should cover both of those concerns.

> 
> Alex
> 
>>
>> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
>> ---
>> v2:
>>   * Update commit message justification
>>   * Add correct "default" handling
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 46 +++++++++++++------
>>   1 file changed, 33 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
>> index a4258127083d..24f532de6322 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
>> @@ -2139,10 +2139,6 @@ static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev)
>>                  return 0;
>>          }
>>
>> -       if (!amdgpu_device_has_dc_support(adev))
>> -               return 0;
>> -
>> -#if defined(CONFIG_DRM_AMD_DC)
>>          if (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
>>                  switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
>>                  case IP_VERSION(1, 0, 0):
>> @@ -2166,39 +2162,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 (!amdgpu_device_has_dc_support(adev)) {
>> +                               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 (amdgpu_device_has_dc_support(adev)) {
>> +                               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 (!amdgpu_device_has_dc_support(adev)) {
>> +                       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 (amdgpu_device_has_dc_support(adev)) {
>> +                               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.48.1
>>



More information about the amd-gfx mailing list