93,6 → 93,38 |
return true; |
} |
|
/* ATRM is used to get the BIOS on the discrete cards in |
* dual-gpu systems. |
*/ |
static bool radeon_atrm_get_bios(struct radeon_device *rdev) |
{ |
int ret; |
int size = 64 * 1024; |
int i; |
|
if (!radeon_atrm_supported(rdev->pdev)) |
return false; |
|
rdev->bios = kmalloc(size, GFP_KERNEL); |
if (!rdev->bios) { |
DRM_ERROR("Unable to allocate bios\n"); |
return false; |
} |
|
for (i = 0; i < size / ATRM_BIOS_PAGE; i++) { |
ret = radeon_atrm_get_bios_chunk(rdev->bios, |
(i * ATRM_BIOS_PAGE), |
ATRM_BIOS_PAGE); |
if (ret <= 0) |
break; |
} |
|
if (i == 0 || rdev->bios[0] != 0x55 || rdev->bios[1] != 0xaa) { |
kfree(rdev->bios); |
return false; |
} |
return true; |
} |
static bool r700_read_disabled_bios(struct radeon_device *rdev) |
{ |
uint32_t viph_control; |
388,17 → 420,17 |
return legacy_read_disabled_bios(rdev); |
} |
|
|
bool radeon_get_bios(struct radeon_device *rdev) |
{ |
bool r; |
uint16_t tmp; |
|
if (rdev->flags & RADEON_IS_IGP) { |
r = radeon_atrm_get_bios(rdev); |
if (r == false) |
r = igp_read_bios_from_vram(rdev); |
if (r == false) |
r = radeon_read_bios(rdev); |
} else |
r = radeon_read_bios(rdev); |
if (r == false) { |
r = radeon_read_disabled_bios(rdev); |
} |
408,9 → 440,16 |
return false; |
} |
if (rdev->bios[0] != 0x55 || rdev->bios[1] != 0xaa) { |
printk("BIOS signature incorrect %x %x\n", rdev->bios[0], rdev->bios[1]); |
goto free_bios; |
} |
|
tmp = RBIOS16(0x18); |
if (RBIOS8(tmp + 0x14) != 0x0) { |
DRM_INFO("Not an x86 BIOS ROM, not using.\n"); |
goto free_bios; |
} |
|
rdev->bios_header_start = RBIOS16(0x48); |
if (!rdev->bios_header_start) { |
goto free_bios; |