* refactor accelerant debugging

* clone VGA rom shared area in accelerant
* enable access, and make a copy of the VGA bios
* give malloc'ed VGA bios pointer to AtomBIOS parser
* Still invalid BIOS magic
* TODO : Move atomBIOS pointer and reorganize some stuff


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42550 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Alexander von Gluck IV 2011-08-02 23:11:15 +00:00
parent c70bf97cfc
commit 81cd663666
4 changed files with 79 additions and 8 deletions

View File

@ -17,6 +17,8 @@
#include "pll.h"
#include "utility.h"
#include <Debug.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
@ -27,9 +29,10 @@
#include <AGP.h>
#undef TRACE
#define TRACE_ACCELERANT
#ifdef TRACE_ACCELERANT
extern "C" void _sPrintf(const char *format, ...);
# define TRACE(x...) _sPrintf("radeon_hd: " x)
#else
# define TRACE(x...) ;
@ -138,8 +141,7 @@ init_common(int device, bool isClone)
status_t status = sharedCloner.InitCheck();
if (status < B_OK) {
free(gInfo);
TRACE("%s, failed shared area%i, %i\n",
__func__, data.shared_info_area, gInfo->shared_info_area);
TRACE("%s, failed to create shared area\n", __func__);
return status;
}
@ -150,11 +152,24 @@ init_common(int device, bool isClone)
status = regsCloner.InitCheck();
if (status < B_OK) {
free(gInfo);
TRACE("%s, failed to create mmio area\n", __func__);
return status;
}
AreaCloner romCloner;
gInfo->rom_area = romCloner.Clone("radeon hd rom",
(void **)&gInfo->rom, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
gInfo->shared_info->rom_area);
status = romCloner.InitCheck();
if (status < B_OK) {
//free(gInfo);
TRACE("%s, failed to create rom area\n", __func__);
//return status;
}
sharedCloner.Keep();
regsCloner.Keep();
romCloner.Keep();
// Define Radeon PLL default ranges
gInfo->shared_info->pll_info.reference_frequency
@ -173,6 +188,7 @@ uninit_common(void)
if (gInfo != NULL) {
delete_area(gInfo->regs_area);
delete_area(gInfo->shared_info_area);
delete_area(gInfo->rom_area);
gInfo->regs_area = gInfo->shared_info_area = -1;
@ -192,6 +208,52 @@ uninit_common(void)
}
status_t
radeon_init_bios()
{
radeon_shared_info &info = *gInfo->shared_info;
uint32 bus_cntl = Read32(OUT, R600_BUS_CNTL);
uint32 d1vga_control = Read32(OUT, D1VGA_CONTROL);
uint32 d2vga_control = Read32(OUT, D2VGA_CONTROL);
uint32 vga_render_control = Read32(OUT, VGA_RENDER_CONTROL);
uint32 rom_cntl = Read32(OUT, R600_ROM_CNTL);
// Enable rom access
Write32(OUT, R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
/* Disable VGA mode */
Write32(OUT, D1VGA_CONTROL, (d1vga_control
& ~(DVGA_CONTROL_MODE_ENABLE
| DVGA_CONTROL_TIMING_SELECT)));
Write32(OUT, D2VGA_CONTROL, (d2vga_control
& ~(DVGA_CONTROL_MODE_ENABLE
| DVGA_CONTROL_TIMING_SELECT)));
Write32(OUT, VGA_RENDER_CONTROL, (vga_render_control
& ~VGA_VSTATUS_CNTL_MASK));
Write32(OUT, R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
void* atomBIOS = (void*)malloc(info.rom_size);
if (atomBIOS == NULL)
return B_NO_MEMORY;
snooze(2);
memcpy(atomBIOS, gInfo->rom, info.rom_size);
/* restore regs */
Write32(OUT, R600_BUS_CNTL, bus_cntl);
Write32(OUT, D1VGA_CONTROL, d1vga_control);
Write32(OUT, D2VGA_CONTROL, d2vga_control);
Write32(OUT, VGA_RENDER_CONTROL, vga_render_control);
Write32(OUT, R600_ROM_CNTL, rom_cntl);
// Init AtomBIOS
bios_init(atomBIOS);
return B_OK;
}
// #pragma mark - public accelerant functions
@ -210,8 +272,7 @@ radeon_init_accelerant(int device)
init_lock(&info.accelerant_lock, "radeon hd accelerant");
init_lock(&info.engine_lock, "radeon hd engine");
// Init AtomBIOS
bios_init();
radeon_init_bios();
status = detect_displays();
//if (status != B_OK)

View File

@ -36,6 +36,9 @@ struct accelerant_info {
display_mode *mode_list; // cloned list of standard display modes
area_id mode_list_area;
uint8 *rom;
area_id rom_area;
edid1_info edid_info;
bool has_edid;

View File

@ -29,8 +29,15 @@ atom_context *gAtomBIOS;
status_t
bios_init()
bios_init(void* bios)
{
if (gInfo->rom == NULL) {
// just incase, this prevents a crash
TRACE("%s: called even though VGA rom hasn't been mapped!\n",
__func__);
return B_ERROR;
}
struct card_info *atom_card_info
= (card_info*)malloc(sizeof(card_info));
@ -55,7 +62,7 @@ bios_init()
atom_card_info->pll_write = _write32;
// Point AtomBIOS parser to card bios and malloc gAtomBIOS
gAtomBIOS = atom_parse(atom_card_info, gInfo->shared_info->rom);
gAtomBIOS = atom_parse(atom_card_info, bios);
if (gAtomBIOS == NULL) {
TRACE("%s: couldn't parse system AtomBIOS\n", __func__);

View File

@ -14,7 +14,7 @@
#include "atom.h"
status_t bios_init();
status_t bios_init(void* bios);
#endif /* RADEON_HD_BIOS_H */