On Thu, Mar 6, 2025 at 3:51 PM Mario Limonciello <mario.limoncie...@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.limoncie...@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 >