drm/amdgpu: Add wrapper for freeing vbios memory
authorLijo Lazar <lijo.lazar@amd.com>
Wed, 5 Feb 2025 06:54:17 +0000 (12:24 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 13 Feb 2025 02:04:08 +0000 (21:04 -0500)
Use bios_release wrapper to release memory allocated for vbios image and
reset the variables.

v2:
Use the same wrapper for clean up in sw_fini (Alex Deucher)

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index 69895fccb474aefae082fee2f6db916f4afd41ab..f86daad4c77eb7ede782d848e809b6328651dd01 100644 (file)
@@ -415,6 +415,7 @@ bool amdgpu_get_bios(struct amdgpu_device *adev);
 bool amdgpu_read_bios(struct amdgpu_device *adev);
 bool amdgpu_soc15_read_bios_from_rom(struct amdgpu_device *adev,
                                     u8 *bios, u32 length_bytes);
+void amdgpu_bios_release(struct amdgpu_device *adev);
 /*
  * Clocks
  */
index 423fd2eebe1e05a40ebed53316447501eda81249..75fcc521c171c152208390b3c4a9068bb6d6fe44 100644 (file)
@@ -84,6 +84,13 @@ static bool check_atom_bios(struct amdgpu_device *adev, size_t size)
        return false;
 }
 
+void amdgpu_bios_release(struct amdgpu_device *adev)
+{
+       kfree(adev->bios);
+       adev->bios = NULL;
+       adev->bios_size = 0;
+}
+
 /* If you boot an IGP board with a discrete card as the primary,
  * the IGP rom is not accessible via the rom bar as the IGP rom is
  * part of the system bios.  On boot, the system bios puts a
@@ -121,7 +128,7 @@ static bool amdgpu_read_bios_from_vram(struct amdgpu_device *adev)
        iounmap(bios);
 
        if (!check_atom_bios(adev, size)) {
-               kfree(adev->bios);
+               amdgpu_bios_release(adev);
                return false;
        }
 
@@ -149,7 +156,7 @@ bool amdgpu_read_bios(struct amdgpu_device *adev)
        pci_unmap_rom(adev->pdev, bios);
 
        if (!check_atom_bios(adev, size)) {
-               kfree(adev->bios);
+               amdgpu_bios_release(adev);
                return false;
        }
 
@@ -189,7 +196,7 @@ static bool amdgpu_read_bios_from_rom(struct amdgpu_device *adev)
        amdgpu_asic_read_bios_from_rom(adev, adev->bios, len);
 
        if (!check_atom_bios(adev, len)) {
-               kfree(adev->bios);
+               amdgpu_bios_release(adev);
                return false;
        }
 
@@ -225,7 +232,8 @@ static bool amdgpu_read_platform_bios(struct amdgpu_device *adev)
 
        return true;
 free_bios:
-       kfree(adev->bios);
+       amdgpu_bios_release(adev);
+
        return false;
 }
 
@@ -327,7 +335,7 @@ static bool amdgpu_atrm_get_bios(struct amdgpu_device *adev)
        }
 
        if (!check_atom_bios(adev, size)) {
-               kfree(adev->bios);
+               amdgpu_bios_release(adev);
                return false;
        }
        adev->bios_size = size;
@@ -392,7 +400,7 @@ static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
                                             GFP_KERNEL);
 
                        if (!check_atom_bios(adev, vhdr->ImageLength)) {
-                               kfree(adev->bios);
+                               amdgpu_bios_release(adev);
                                return false;
                        }
                        adev->bios_size = vhdr->ImageLength;
index 4a9580fb062803a73b593b8f1ece48ba4f6ff5e5..947289eb1b2fb5a244ad857da29f1d0bb25a549d 100644 (file)
@@ -4739,8 +4739,7 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)
        if (amdgpu_emu_mode != 1)
                amdgpu_atombios_fini(adev);
 
-       kfree(adev->bios);
-       adev->bios = NULL;
+       amdgpu_bios_release(adev);
 
        kfree(adev->fru_info);
        adev->fru_info = NULL;