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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/5/2025 17:04, Alex Deucher wrote:
On Wed, Mar 5, 2025 at 4:53 PM Mario Limonciello
<mario.limonciello@xxxxxxx> 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@xxxxxxx>
---
   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;
   }






[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux