|
@@ -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;
|
|
|
}
|