Author: kallisti5 Date: 2011-08-02 16:58:56 +0200 (Tue, 02 Aug 2011) New Revision: 42541 Changeset: https://dev.haiku-os.org/changeset/42541 Modified: haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.cpp haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.h haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.h haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp Log: * Move bios_info into shared info * Pull pci_rom base address from pci subsystem * Point AtomBIOS parser to pci rom address to set up and malloc atom_context * This is untested! Don't run on an expensive card until I test it on a cheaper one! Modified: haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h =================================================================== --- haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h 2011-08-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h 2011-08-02 14:58:56 UTC (rev 42541) @@ -71,6 +71,9 @@ area_id mode_list_area; // area containing display mode list uint32 mode_count; + uint32 rom_base; // AtomBIOS base location + uint32 rom_size; // AtomBIOS size + display_mode current_mode; uint32 bytes_per_row; uint32 bits_per_pixel; Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.cpp 2011-08-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.cpp 2011-08-02 14:58:56 UTC (rev 42541) @@ -37,7 +37,6 @@ struct accelerant_info *gInfo; -struct bios_info *gBIOS; display_info *gDisplay[MAX_DISPLAY]; @@ -100,13 +99,11 @@ // initialize global accelerant info structure gInfo = (accelerant_info *)malloc(sizeof(accelerant_info)); - gBIOS = (bios_info *)malloc(sizeof(bios_info)); - if (gInfo == NULL || gBIOS == NULL) + if (gInfo == NULL) return B_NO_MEMORY; memset(gInfo, 0, sizeof(accelerant_info)); - memset(gBIOS, 0, sizeof(bios_info)); for (uint32 id = 0; id < MAX_DISPLAY; id++) { gDisplay[id] = (display_info *)malloc(sizeof(display_info)); @@ -131,7 +128,6 @@ if (ioctl(device, RADEON_GET_PRIVATE_DATA, &data, sizeof(radeon_get_private_data)) != 0) { free(gInfo); - free(gBIOS); return B_ERROR; } @@ -142,7 +138,6 @@ status_t status = sharedCloner.InitCheck(); if (status < B_OK) { free(gInfo); - free(gBIOS); TRACE("%s, failed shared area%i, %i\n", __func__, data.shared_info_area, gInfo->shared_info_area); return status; @@ -155,7 +150,6 @@ status = regsCloner.InitCheck(); if (status < B_OK) { free(gInfo); - free(gBIOS); return status; } @@ -189,8 +183,6 @@ free(gInfo); } - free(gBIOS); - for (uint32 id = 0; id < MAX_DISPLAY; id++) { if (gDisplay[id] != NULL) { free(gDisplay[id]->regs); Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.h =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.h 2011-08-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/accelerant.h 2011-08-02 14:58:56 UTC (rev 42541) @@ -10,6 +10,7 @@ #define RADEON_HD_ACCELERANT_H +#include "atom.h" #include "mode.h" #include "radeon_hd.h" #include "pll.h" @@ -112,6 +113,7 @@ extern accelerant_info *gInfo; +extern atom_context *gAtomBIOS; extern display_info *gDisplay[MAX_DISPLAY]; Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp 2011-08-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp 2011-08-02 14:58:56 UTC (rev 42541) @@ -25,7 +25,7 @@ #endif -// AtomBios related calls +atom_context *gAtomBIOS; status_t @@ -54,10 +54,14 @@ atom_card_info->pll_read = _read32; atom_card_info->pll_write = _write32; - // System VGA shadow bios? Why not (temporary) - atom_parse(atom_card_info, (void*)0xC0000); + // Point AtomBIOS parser to card bios and malloc gAtomBIOS + gAtomBIOS = atom_parse(atom_card_info, (void*)gInfo->shared_info->rom_base); - // TODO : we need to get a copy of the VGA bios :( + if (gAtomBIOS == NULL) { + TRACE("%s: couldn't parse system AtomBIOS\n", __func__); + return B_ERROR; + } + #if 0 rdev->mode_info.atom_context = atom_parse(atom_card_info, rdev->bios); mutex_init(&rdev->mode_info.atom_context->mutex); Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.h =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.h 2011-08-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.h 2011-08-02 14:58:56 UTC (rev 42541) @@ -14,12 +14,6 @@ #include "atom.h" -struct bios_info { - uint32 location; - uint32 size; -}; - - status_t bios_init(); 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-02 10:56:39 UTC (rev 42540) +++ haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp 2011-08-02 14:58:56 UTC (rev 42541) @@ -102,6 +102,9 @@ info.shared_info->frame_buffer_int = read32(info.registers + R6XX_CONFIG_FB_BASE); + info.shared_info->rom_base = info.pci->u.h0.rom_base; + // Grab ROM base from PCI (AtomBIOS location for card) + strcpy(info.shared_info->device_identifier, info.device_identifier); // Pull active monitor VESA EDID from boot loader