Commit 0cdd5005 authored by Alex Deucher's avatar Alex Deucher

amdgpu: detect if we are using atomfirmware or atombios for vbios (v2)

Supposedly atomfirmware rom header is 3.3 atombios is 1.1.

v2: rebased on newer kernel
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1fadf42e
...@@ -1308,6 +1308,7 @@ struct amdgpu_device { ...@@ -1308,6 +1308,7 @@ struct amdgpu_device {
bool have_disp_power_ref; bool have_disp_power_ref;
/* BIOS */ /* BIOS */
bool is_atom_fw;
uint8_t *bios; uint8_t *bios;
uint32_t bios_size; uint32_t bios_size;
struct amdgpu_bo *stollen_vga_memory; struct amdgpu_bo *stollen_vga_memory;
......
...@@ -86,6 +86,18 @@ static bool check_atom_bios(uint8_t *bios, size_t size) ...@@ -86,6 +86,18 @@ static bool check_atom_bios(uint8_t *bios, size_t size)
return false; 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, /* 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 * 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) ...@@ -419,26 +431,30 @@ static inline bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
bool amdgpu_get_bios(struct amdgpu_device *adev) bool amdgpu_get_bios(struct amdgpu_device *adev)
{ {
if (amdgpu_atrm_get_bios(adev)) if (amdgpu_atrm_get_bios(adev))
return true; goto success;
if (amdgpu_acpi_vfct_bios(adev)) if (amdgpu_acpi_vfct_bios(adev))
return true; goto success;
if (igp_read_bios_from_vram(adev)) if (igp_read_bios_from_vram(adev))
return true; goto success;
if (amdgpu_read_bios(adev)) if (amdgpu_read_bios(adev))
return true; goto success;
if (amdgpu_read_bios_from_rom(adev)) if (amdgpu_read_bios_from_rom(adev))
return true; goto success;
if (amdgpu_read_disabled_bios(adev)) if (amdgpu_read_disabled_bios(adev))
return true; goto success;
if (amdgpu_read_platform_bios(adev)) if (amdgpu_read_platform_bios(adev))
return true; goto success;
DRM_ERROR("Unable to locate a BIOS ROM\n"); DRM_ERROR("Unable to locate a BIOS ROM\n");
return false; return false;
success:
adev->is_atom_fw = is_atom_fw(adev->bios);
return true;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment