[PATCH] drm/amd: Fail initialization earlier when DC is disabled
Mario Limonciello
mario.limonciello at amd.com
Thu Mar 6 03:50:22 UTC 2025
On 3/5/2025 17:04, Alex Deucher wrote:
> On Wed, Mar 5, 2025 at 4:53 PM Mario Limonciello
> <mario.limonciello at amd.com> wrote:
>>
>> On 3/5/2025 15:37, Mario Limonciello 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 fail init early so that the system won't
>>> freeze with a lack of display.
>>>
>>> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 24 +++++++++++++++----
>>> 1 file changed, 19 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
>>> index a4258127083d..c4e1505dcaac 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,15 +2162,24 @@ 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:
>>
>> Looking closer at this failure path I *think* this patch will cause
>> issues on GPU without DC support.
>>
>> In the 'default' case now I think it should do something like this:
>>
>> if (amdgpu_device_has_dc_support(adev))
>> //existing error flow
>> else
>> return 0;
>>
>> Agree?
>
> I think it would be better to just dump a warning in the log if the
> board supports displays but CONFIG_DRM_AMD_DC=n rather than failing to
> initialize the driver. The end result is pretty much the same and it
> wouldn't break users that want this scenario for some reason.
Actually it's a very different result with this patch vs a warning. By
failing to initialize then the existing efifb keeps working.
This means you can boot with amdgpu.dc=0 and rather than get a frozen
display you end up unaccelerated graphics.
>
> Alex
>
>>
>>> dev_err(adev->dev,
>>> "Failed to add dm ip block(DCE_HWIP:0x%x)\n",
>>> @@ -2186,11 +2191,21 @@ static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev)
>>> 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",
>>> @@ -2198,7 +2213,6 @@ static int amdgpu_discovery_set_display_ip_blocks(struct amdgpu_device *adev)
>>> return -EINVAL;
>>> }
>>> }
>>> -#endif
>>> return 0;
>>> }
>>>
>>
More information about the amd-gfx
mailing list