amdgpu: detect if we are using atomfirmware or atombios for vbios (v2)
authorAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Feb 2017 21:01:58 +0000 (16:01 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Mar 2017 03:54:16 +0000 (23:54 -0400)
Supposedly atomfirmware rom header is 3.3 atombios is 1.1.

v2: rebased on newer kernel

Acked-by: Christian König <christian.koenig@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

index a17a54f..2790129 100644 (file)
@@ -1308,6 +1308,7 @@ struct amdgpu_device {
        bool                            have_disp_power_ref;
 
        /* BIOS */
+       bool                            is_atom_fw;
        uint8_t                         *bios;
        uint32_t                        bios_size;
        struct amdgpu_bo                *stollen_vga_memory;
index 821f7cc..365e735 100644 (file)
@@ -86,6 +86,18 @@ static bool check_atom_bios(uint8_t *bios, size_t size)
        return false;
 }
 
+static bool is_atom_fw(uint8_t *bios)
+{
+       uint16_t bios_header_start = bios[0x48] | (bios[0x49] << 8);
+       uint8_t frev = bios[bios_header_start + 2];
+       uint8_t crev = bios[bios_header_start + 3];
+
+       if ((frev < 3) ||
+           ((frev == 3) && (crev < 3)))
+               return false;
+
+       return true;
+}
 
 /* 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
@@ -419,26 +431,30 @@ static inline bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
 bool amdgpu_get_bios(struct amdgpu_device *adev)
 {
        if (amdgpu_atrm_get_bios(adev))
-               return true;
+               goto success;
 
        if (amdgpu_acpi_vfct_bios(adev))
-               return true;
+               goto success;
 
        if (igp_read_bios_from_vram(adev))
-               return true;
+               goto success;
 
        if (amdgpu_read_bios(adev))
-               return true;
+               goto success;
 
        if (amdgpu_read_bios_from_rom(adev))
-               return true;
+               goto success;
 
        if (amdgpu_read_disabled_bios(adev))
-               return true;
+               goto success;
 
        if (amdgpu_read_platform_bios(adev))
-               return true;
+               goto success;
 
        DRM_ERROR("Unable to locate a BIOS ROM\n");
        return false;
+
+success:
+       adev->is_atom_fw = is_atom_fw(adev->bios);
+       return true;
 }