Author: kallisti5 Date: 2011-08-03 23:42:28 +0200 (Wed, 03 Aug 2011) New Revision: 42558 Changeset: https://dev.haiku-os.org/changeset/42558 Modified: haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h Log: * don't trample PCI rom config * better error checking * the driver can now locate the AtomBIOS on real hw! Modified: haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp 2011-08-03 20:48:23 UTC (rev 42557) +++ haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp 2011-08-03 21:42:28 UTC (rev 42558) @@ -42,13 +42,25 @@ #define RHD_MMIO_BAR 2 +inline bool +isAtomBIOS(uint8* bios) +{ + uint16 bios_header = RADEON_BIOS16(bios, 0x48); + + return !memcmp(&bios[bios_header + 4], "ATOM", 4) || + !memcmp(&bios[bios_header + 4], "MOTA", 4); +} + + status_t radeon_hd_getbios(radeon_info &info) { TRACE("card(%ld): %s: called\n", info.id, __func__); - uint32 backuprom = get_pci_config(info.pci, PCI_rom_base, 4); - set_pci_config(info.pci, PCI_rom_base, 4, 0xffffffff); + // Enable ROM decoding + uint32 rom_config = get_pci_config(info.pci, PCI_rom_base, 4); + rom_config |= PCI_rom_enable; + set_pci_config(info.pci, PCI_rom_base, 4, rom_config); uint32 flags = get_pci_config(info.pci, PCI_rom_base, 4); if (flags & PCI_rom_enable) @@ -91,27 +103,35 @@ if (info.rom_area < B_OK) { dprintf(DEVICE_NAME ": failed to map rom\n"); result = B_ERROR; - } else - result = B_OK; - - if (result == B_OK && (bios[0] != 0x55 || bios[1] != 0xAA)) { - uint16 id = bios[0] + (bios[1] << 8); - dprintf(DEVICE_NAME ": not a PCI rom (%X)!\n", id); - result = B_OK; } else { - info.shared_info->rom = (uint8*)malloc(rom_size); - if (info.shared_info->rom == NULL) { - dprintf(DEVICE_NAME ": failed to clone atombios!\n"); + if (bios[0] != 0x55 || bios[1] != 0xAA) { + uint16 id = bios[0] + (bios[1] << 8); + dprintf(DEVICE_NAME ": not a PCI rom (%X)!\n", id); result = B_ERROR; } else { - memcpy(info.shared_info->rom, (void *)bios, rom_size); - result = B_OK; + TRACE("%s: found a valid VGA bios!\n", __func__); + info.shared_info->rom = (uint8*)malloc(rom_size); + if (info.shared_info->rom == NULL) { + dprintf(DEVICE_NAME ": failed to clone atombios!\n"); + result = B_ERROR; + } else { + memcpy(info.shared_info->rom, (void *)bios, rom_size); + if (isAtomBIOS(info.shared_info->rom)) { + dprintf(DEVICE_NAME ": AtomBIOS found and mapped!\n"); + result = B_OK; + } else { + dprintf(DEVICE_NAME ": AtomBIOS not mapped!\n"); + result = B_ERROR; + } + } } + delete_area(rom_area); } - delete_area(rom_area); } - set_pci_config(info.pci, PCI_rom_base, 4, backuprom); + // Disable ROM decoding + rom_config &= ~PCI_rom_enable; + set_pci_config(info.pci, PCI_rom_base, 4, rom_config); info.shared_info->rom_phys = rom_base; info.shared_info->rom_size = rom_size; Modified: haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h 2011-08-03 20:48:23 UTC (rev 42557) +++ haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h 2011-08-03 21:42:28 UTC (rev 42558) @@ -19,6 +19,12 @@ #include "lock.h" +#define RADEON_BIOS8(adr, v) (adr[v]) +#define RADEON_BIOS16(adr, v) ((adr[v]) | (adr[(v) + 1] << 8)) +#define RADEON_BIOS32(adr, v) \ + ((RADEON_BIOS16(adr, v) | RADEON_BIOS16(adr, v + 2) << 16)) + + struct radeon_info { int32 open_count; status_t init_status;