]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: Fix uninitialized variable use which breaks full LTO
authorCalvin Owens <calvin@wbinvd.org>
Thu, 12 Mar 2026 17:13:34 +0000 (10:13 -0700)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 17 Mar 2026 14:33:50 +0000 (10:33 -0400)
Commit e1b385726f7f ("drm/amd/display: Add additional checks for PSP
footer size") introduced a use of an uninitialized stack variable
in dm_dmub_sw_init() (region_params.bss_data_size).

Interestingly, this seems to cause no issue on normal kernels. But when
full LTO is enabled, it causes the compiler to "optimize" out huge
swaths of amdgpu initialization code, and the driver is unusable:

    amdgpu 0000:03:00.0: [drm] Loading DMUB firmware via PSP: version=0x07002F00
    amdgpu 0000:03:00.0: sw_init of IP block <dm> failed 5
    amdgpu 0000:03:00.0: amdgpu_device_ip_init failed
    amdgpu 0000:03:00.0: Fatal error during GPU init

It surprises me that neither gcc nor clang emit a warning about this: I
only found it by bisecting the LTO breakage.

Fix by using the bss_data_size field from fw_meta_info_params, as was
presumably intended.

Fixes: e1b385726f7f ("drm/amd/display: Add additional checks for PSP footer size")
Signed-off-by: Calvin Owens <calvin@wbinvd.org>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 65b256a7b6c4a80afabf44dea07d650c485ec20e..06a0dc67cb06463f065f0a3e2aeef00a3bceb4e2 100644 (file)
@@ -2577,7 +2577,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
        fw_meta_info_params.fw_inst_const = adev->dm.dmub_fw->data +
                                            le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
                                            PSP_HEADER_BYTES_256;
-       fw_meta_info_params.fw_bss_data = region_params.bss_data_size ? adev->dm.dmub_fw->data +
+       fw_meta_info_params.fw_bss_data = fw_meta_info_params.bss_data_size ? adev->dm.dmub_fw->data +
                                          le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
                                          le32_to_cpu(hdr->inst_const_bytes) : NULL;
        fw_meta_info_params.custom_psp_footer_size = 0;