* use create_area correctly
* AtomBIOS is now loaded and passed into the radeon_hd accelerant * correct pointer passing in bios_init * AtomBIOS is now read and initialized by AtomBIOS parser * feel free to start testing the driver again :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42564 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
01d68c9728
commit
f0b0d6cb37
@ -119,7 +119,7 @@ SYSTEM_ADD_ONS_ACCELERANTS = $(X86_ONLY)radeon.accelerant
|
|||||||
$(X86_ONLY)s3.accelerant $(X86_ONLY)vesa.accelerant
|
$(X86_ONLY)s3.accelerant $(X86_ONLY)vesa.accelerant
|
||||||
$(X86_ONLY)ati.accelerant
|
$(X86_ONLY)ati.accelerant
|
||||||
$(X86_ONLY)3dfx.accelerant
|
$(X86_ONLY)3dfx.accelerant
|
||||||
#$(X86_ONLY)radeon_hd.accelerant
|
$(X86_ONLY)radeon_hd.accelerant
|
||||||
#$(X86_ONLY)via.accelerant
|
#$(X86_ONLY)via.accelerant
|
||||||
#$(X86_ONLY)vmware.accelerant
|
#$(X86_ONLY)vmware.accelerant
|
||||||
;
|
;
|
||||||
@ -165,7 +165,7 @@ SYSTEM_ADD_ONS_DRIVERS_AUDIO_OLD = ; #cmedia usb_audio ;
|
|||||||
SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = $(X86_ONLY)radeon $(X86_ONLY)nvidia
|
SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = $(X86_ONLY)radeon $(X86_ONLY)nvidia
|
||||||
$(X86_ONLY)neomagic $(X86_ONLY)matrox $(X86_ONLY)intel_extreme
|
$(X86_ONLY)neomagic $(X86_ONLY)matrox $(X86_ONLY)intel_extreme
|
||||||
$(X86_ONLY)s3 $(X86_ONLY)vesa #$(X86_ONLY)via #$(X86_ONLY)vmware
|
$(X86_ONLY)s3 $(X86_ONLY)vesa #$(X86_ONLY)via #$(X86_ONLY)vmware
|
||||||
$(X86_ONLY)ati $(X86_ONLY)3dfx #$(X86_ONLY)radeon_hd
|
$(X86_ONLY)ati $(X86_ONLY)3dfx $(X86_ONLY)radeon_hd
|
||||||
;
|
;
|
||||||
SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki usb_midi ;
|
SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki usb_midi ;
|
||||||
SYSTEM_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com $(X86_ONLY)atheros813x
|
SYSTEM_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com $(X86_ONLY)atheros813x
|
||||||
|
@ -160,8 +160,10 @@ init_common(int device, bool isClone)
|
|||||||
(void **)&gInfo->rom, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
|
(void **)&gInfo->rom, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
|
||||||
gInfo->shared_info->rom_area);
|
gInfo->shared_info->rom_area);
|
||||||
|
|
||||||
if (gInfo->rom_area < 0)
|
if (gInfo->rom_area < 0) {
|
||||||
TRACE("%s: Clone of AtomBIOS failed!\n", __func__);
|
TRACE("%s: Clone of AtomBIOS failed!\n", __func__);
|
||||||
|
gInfo->shared_info->has_rom = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (gInfo->rom[0] != 0x55 || gInfo->rom[1] != 0xAA)
|
if (gInfo->rom[0] != 0x55 || gInfo->rom[1] != 0xAA)
|
||||||
TRACE("%s: didn't find a VGA bios in cloned region!\n", __func__);
|
TRACE("%s: didn't find a VGA bios in cloned region!\n", __func__);
|
||||||
|
@ -62,7 +62,7 @@ radeon_init_bios(uint8* bios)
|
|||||||
atom_card_info->pll_write = _write32;
|
atom_card_info->pll_write = _write32;
|
||||||
|
|
||||||
// Point AtomBIOS parser to card bios and malloc gAtomContext
|
// Point AtomBIOS parser to card bios and malloc gAtomContext
|
||||||
gAtomContext = atom_parse(atom_card_info, &bios);
|
gAtomContext = atom_parse(atom_card_info, bios);
|
||||||
|
|
||||||
if (gAtomContext == NULL) {
|
if (gAtomContext == NULL) {
|
||||||
TRACE("%s: couldn't parse system AtomBIOS\n", __func__);
|
TRACE("%s: couldn't parse system AtomBIOS\n", __func__);
|
||||||
|
@ -72,26 +72,14 @@ radeon_hd_getbios(radeon_info &info)
|
|||||||
if (flags & PCI_rom_bios)
|
if (flags & PCI_rom_bios)
|
||||||
dprintf(DEVICE_NAME ": PCI ROM BIOS copy\n");
|
dprintf(DEVICE_NAME ": PCI ROM BIOS copy\n");
|
||||||
|
|
||||||
uint32 rom_base = info.pci->u.h0.rom_base;
|
uint32 rom_base = info.shared_info->rom_phys;
|
||||||
uint32 rom_size = info.pci->u.h0.rom_size;
|
uint32 rom_size = info.shared_info->rom_size;
|
||||||
|
|
||||||
if (rom_base == 0) {
|
|
||||||
TRACE("%s: no PCI rom, trying shadow rom\n", __func__);
|
|
||||||
// ROM has been copied by BIOS
|
|
||||||
rom_base = 0xC0000;
|
|
||||||
if (rom_size == 0) {
|
|
||||||
rom_size = 0x7FFF;
|
|
||||||
// Maximum shadow bios size
|
|
||||||
// TODO : This is a guess at best
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("%s: seeking rom at 0x%" B_PRIX32 " [size: 0x%" B_PRIX32 "]\n",
|
TRACE("%s: seeking rom at 0x%" B_PRIX32 " [size: 0x%" B_PRIX32 "]\n",
|
||||||
__func__, rom_base, rom_size);
|
__func__, rom_base, rom_size);
|
||||||
|
|
||||||
uint8* bios;
|
uint8* bios;
|
||||||
status_t result = B_ERROR;
|
status_t result = B_ERROR;
|
||||||
|
|
||||||
if (rom_base == 0 || rom_size == 0) {
|
if (rom_base == 0 || rom_size == 0) {
|
||||||
TRACE("%s: no VGA rom located, disabling AtomBIOS\n", __func__);
|
TRACE("%s: no VGA rom located, disabling AtomBIOS\n", __func__);
|
||||||
result = B_ERROR;
|
result = B_ERROR;
|
||||||
@ -110,19 +98,13 @@ radeon_hd_getbios(radeon_info &info)
|
|||||||
result = B_ERROR;
|
result = B_ERROR;
|
||||||
} else {
|
} else {
|
||||||
TRACE("%s: found a valid VGA bios!\n", __func__);
|
TRACE("%s: found a valid VGA bios!\n", __func__);
|
||||||
info.atom_buffer = (uint8*)malloc(rom_size);
|
memcpy(info.atom_buffer, (void *)bios, rom_size);
|
||||||
if (info.atom_buffer == NULL) {
|
if (isAtomBIOS(info.atom_buffer)) {
|
||||||
dprintf(DEVICE_NAME ": failed to clone atombios!\n");
|
dprintf(DEVICE_NAME ": AtomBIOS found and mapped!\n");
|
||||||
result = B_ERROR;
|
result = B_OK;
|
||||||
} else {
|
} else {
|
||||||
memcpy(info.atom_buffer, (void *)bios, rom_size);
|
dprintf(DEVICE_NAME ": AtomBIOS not mapped!\n");
|
||||||
if (isAtomBIOS(info.atom_buffer)) {
|
result = B_ERROR;
|
||||||
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);
|
||||||
@ -133,9 +115,6 @@ radeon_hd_getbios(radeon_info &info)
|
|||||||
rom_config &= ~PCI_rom_enable;
|
rom_config &= ~PCI_rom_enable;
|
||||||
set_pci_config(info.pci, PCI_rom_base, 4, rom_config);
|
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;
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,17 +241,6 @@ radeon_hd_init(radeon_info &info)
|
|||||||
return info.framebuffer_area;
|
return info.framebuffer_area;
|
||||||
}
|
}
|
||||||
|
|
||||||
// *** VGA rom / AtomBIOS mapping
|
|
||||||
status_t biosStatus = radeon_hd_getbios_r600(info);
|
|
||||||
|
|
||||||
// *** AtomBIOS mapping
|
|
||||||
info.rom_area = create_area("radeon hd AtomBIOS",
|
|
||||||
(void **)&info.atom_buffer, B_ANY_KERNEL_ADDRESS,
|
|
||||||
info.shared_info->rom_size, B_READ_AREA | B_WRITE_AREA, B_NO_LOCK);
|
|
||||||
|
|
||||||
if (info.rom_area < 0)
|
|
||||||
dprintf("%s: failed to create kernel AtomBIOS area!\n", __func__);
|
|
||||||
|
|
||||||
// Turn on write combining for the area
|
// Turn on write combining for the area
|
||||||
vm_set_area_memory_type(info.framebuffer_area,
|
vm_set_area_memory_type(info.framebuffer_area,
|
||||||
info.pci->u.h0.base_registers[RHD_FB_BAR], B_MTR_WC);
|
info.pci->u.h0.base_registers[RHD_FB_BAR], B_MTR_WC);
|
||||||
@ -281,6 +249,35 @@ radeon_hd_init(radeon_info &info)
|
|||||||
mmioMapper.Detach();
|
mmioMapper.Detach();
|
||||||
frambufferMapper.Detach();
|
frambufferMapper.Detach();
|
||||||
|
|
||||||
|
// *** AtomBIOS mapping
|
||||||
|
uint32 rom_base = info.pci->u.h0.rom_base;
|
||||||
|
uint32 rom_size = info.pci->u.h0.rom_size;
|
||||||
|
if (rom_base == 0) {
|
||||||
|
TRACE("%s: no PCI rom, trying shadow rom\n", __func__);
|
||||||
|
// ROM has been copied by BIOS
|
||||||
|
rom_base = 0xC0000;
|
||||||
|
if (rom_size == 0) {
|
||||||
|
rom_size = 0x7FFF;
|
||||||
|
// A guess at maximum shadow bios size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info.shared_info->rom_phys = rom_base;
|
||||||
|
info.shared_info->rom_size = rom_size;
|
||||||
|
|
||||||
|
info.rom_area = create_area("radeon hd AtomBIOS",
|
||||||
|
(void **)&info.atom_buffer, B_ANY_KERNEL_ADDRESS,
|
||||||
|
info.shared_info->rom_size, B_FULL_LOCK,
|
||||||
|
B_READ_AREA | B_WRITE_AREA);
|
||||||
|
|
||||||
|
status_t biosStatus = B_ERROR;
|
||||||
|
if (info.rom_area < 0) {
|
||||||
|
dprintf("%s: failed to create kernel AtomBIOS area!\n", __func__);
|
||||||
|
biosStatus = B_ERROR;
|
||||||
|
} else {
|
||||||
|
//memset(&info.atom_buffer, 0, info.shared_info->rom_size);
|
||||||
|
biosStatus = radeon_hd_getbios_r600(info);
|
||||||
|
}
|
||||||
|
|
||||||
// Pass common information to accelerant
|
// Pass common information to accelerant
|
||||||
info.shared_info->device_id = info.device_id;
|
info.shared_info->device_id = info.device_id;
|
||||||
info.shared_info->device_chipset = info.device_chipset;
|
info.shared_info->device_chipset = info.device_chipset;
|
||||||
@ -358,5 +355,6 @@ radeon_hd_uninit(radeon_info &info)
|
|||||||
delete_area(info.shared_area);
|
delete_area(info.shared_area);
|
||||||
delete_area(info.registers_area);
|
delete_area(info.registers_area);
|
||||||
delete_area(info.framebuffer_area);
|
delete_area(info.framebuffer_area);
|
||||||
|
delete_area(info.rom_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user