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

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

 



On Thu, Mar 6, 2025 at 2:31 PM Mario Limonciello
<mario.limonciello@xxxxxxx> wrote:
>
> On 3/6/2025 13:19, Alex Deucher wrote:
> > On Thu, Mar 6, 2025 at 1:58 PM Mario Limonciello
> > <mario.limonciello@xxxxxxx> 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.

That should work, or maybe just warn once in
amdgpu_device_asic_has_dc_support().  E.g., something like:

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 1b9b4f8daf531..c986e619dbe99 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3988,6 +3988,8 @@ bool amdgpu_device_asic_has_dc_support(enum
amd_asic_type asic_type)
                 */
                return amdgpu_dc > 0;
        default:
+               if (amdgpu_dc == 0)
+                       DRM_INFO_ONCE("Display Core has been disable
via kernel parameter, No display!\n");
                return amdgpu_dc != 0;
 #else
        default:


>
> >
> > Alex
> >
> >>
> >> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> >> ---
> >> 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
> >>
>




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

  Powered by Linux