10ceb8395SAlexander von Gluck IV /* 20ceb8395SAlexander von Gluck IV * Copyright 2011, Haiku, Inc. All Rights Reserved. 30ceb8395SAlexander von Gluck IV * Distributed under the terms of the MIT License. 40ceb8395SAlexander von Gluck IV * 50ceb8395SAlexander von Gluck IV * Authors: 60ceb8395SAlexander von Gluck IV * Alexander von Gluck IV, kallisti5@unixzen.com 70ceb8395SAlexander von Gluck IV */ 80ceb8395SAlexander von Gluck IV 90ceb8395SAlexander von Gluck IV 100ceb8395SAlexander von Gluck IV #include <Debug.h> 110ceb8395SAlexander von Gluck IV 120ceb8395SAlexander von Gluck IV #include "bios.h" 130ceb8395SAlexander von Gluck IV 140ceb8395SAlexander von Gluck IV #include "accelerant.h" 150ceb8395SAlexander von Gluck IV #include "accelerant_protos.h" 160ceb8395SAlexander von Gluck IV 170ceb8395SAlexander von Gluck IV 180ceb8395SAlexander von Gluck IV #undef TRACE 190ceb8395SAlexander von Gluck IV 200ceb8395SAlexander von Gluck IV #define TRACE_ATOM 210ceb8395SAlexander von Gluck IV #ifdef TRACE_ATOM 2212c25669SAlexander von Gluck IV # define TRACE(x...) _sPrintf("radeon_hd: " x) 230ceb8395SAlexander von Gluck IV #else 2412c25669SAlexander von Gluck IV # define TRACE(x...) ; 250ceb8395SAlexander von Gluck IV #endif 260ceb8395SAlexander von Gluck IV 2751360674SAlexander von Gluck IV 28*1d5cfc64SAlexander von Gluck IV atom_context *gAtomContext; 2951360674SAlexander von Gluck IV 3051360674SAlexander von Gluck IV 3151360674SAlexander von Gluck IV status_t 32*1d5cfc64SAlexander von Gluck IV bios_read_enabled(void* bios, size_t size) 3351360674SAlexander von Gluck IV { 34*1d5cfc64SAlexander von Gluck IV status_t result = B_ERROR; 35*1d5cfc64SAlexander von Gluck IV if (gInfo->rom[0] == 0x55 && gInfo->rom[1] == 0xaa) { 36*1d5cfc64SAlexander von Gluck IV TRACE("%s: found AtomBIOS signature!\n", __func__); 37*1d5cfc64SAlexander von Gluck IV bios = gInfo->rom; 38*1d5cfc64SAlexander von Gluck IV result = B_OK; 39*1d5cfc64SAlexander von Gluck IV } else 40*1d5cfc64SAlexander von Gluck IV TRACE("%s: didn't find valid AtomBIOS\n", __func__); 41*1d5cfc64SAlexander von Gluck IV 42*1d5cfc64SAlexander von Gluck IV return result; 4381cd6636SAlexander von Gluck IV } 4481cd6636SAlexander von Gluck IV 45*1d5cfc64SAlexander von Gluck IV 46*1d5cfc64SAlexander von Gluck IV status_t 47*1d5cfc64SAlexander von Gluck IV bios_read_disabled_northern(void* bios, size_t size) 48*1d5cfc64SAlexander von Gluck IV { 49*1d5cfc64SAlexander von Gluck IV uint32 bus_cntl = Read32(OUT, R600_BUS_CNTL); 50*1d5cfc64SAlexander von Gluck IV uint32 d1vga_control = Read32(OUT, D1VGA_CONTROL); 51*1d5cfc64SAlexander von Gluck IV uint32 d2vga_control = Read32(OUT, D2VGA_CONTROL); 52*1d5cfc64SAlexander von Gluck IV uint32 vga_render_control = Read32(OUT, VGA_RENDER_CONTROL); 53*1d5cfc64SAlexander von Gluck IV uint32 rom_cntl = Read32(OUT, R600_ROM_CNTL); 54*1d5cfc64SAlexander von Gluck IV 55*1d5cfc64SAlexander von Gluck IV // Enable rom access 56*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); 57*1d5cfc64SAlexander von Gluck IV // Disable VGA mode 58*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, (d1vga_control 59*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 60*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 61*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, (d2vga_control 62*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 63*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 64*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, (vga_render_control 65*1d5cfc64SAlexander von Gluck IV & ~VGA_VSTATUS_CNTL_MASK)); 66*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE); 67*1d5cfc64SAlexander von Gluck IV 68*1d5cfc64SAlexander von Gluck IV snooze(2); 69*1d5cfc64SAlexander von Gluck IV 70*1d5cfc64SAlexander von Gluck IV status_t result = B_ERROR; 71*1d5cfc64SAlexander von Gluck IV if (gInfo->rom[0] == 0x55 && gInfo->rom[1] == 0xaa) { 72*1d5cfc64SAlexander von Gluck IV TRACE("%s: found AtomBIOS signature!\n", __func__); 73*1d5cfc64SAlexander von Gluck IV memcpy(&bios, gInfo->rom, size); 74*1d5cfc64SAlexander von Gluck IV // grab it while we can 75*1d5cfc64SAlexander von Gluck IV result = B_OK; 76*1d5cfc64SAlexander von Gluck IV } else 77*1d5cfc64SAlexander von Gluck IV TRACE("%s: didn't find valid AtomBIOS\n", __func__); 78*1d5cfc64SAlexander von Gluck IV 79*1d5cfc64SAlexander von Gluck IV // restore regs 80*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_BUS_CNTL, bus_cntl); 81*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, d1vga_control); 82*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, d2vga_control); 83*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, vga_render_control); 84*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_ROM_CNTL, rom_cntl); 85*1d5cfc64SAlexander von Gluck IV 86*1d5cfc64SAlexander von Gluck IV return result; 87*1d5cfc64SAlexander von Gluck IV } 88*1d5cfc64SAlexander von Gluck IV 89*1d5cfc64SAlexander von Gluck IV 90*1d5cfc64SAlexander von Gluck IV status_t 91*1d5cfc64SAlexander von Gluck IV bios_read_disabled_avivo(void* bios, size_t size) 92*1d5cfc64SAlexander von Gluck IV { 93*1d5cfc64SAlexander von Gluck IV uint32 seprom_cntl1 = Read32(OUT, RADEON_SEPROM_CNTL1); 94*1d5cfc64SAlexander von Gluck IV uint32 viph_control = Read32(OUT, RADEON_VIPH_CONTROL); 95*1d5cfc64SAlexander von Gluck IV uint32 bus_cntl = Read32(OUT, RV370_BUS_CNTL); 96*1d5cfc64SAlexander von Gluck IV uint32 d1vga_control = Read32(OUT, D1VGA_CONTROL); 97*1d5cfc64SAlexander von Gluck IV uint32 d2vga_control = Read32(OUT, D2VGA_CONTROL); 98*1d5cfc64SAlexander von Gluck IV uint32 vga_render_control = Read32(OUT, VGA_RENDER_CONTROL); 99*1d5cfc64SAlexander von Gluck IV uint32 gpiopad_a = Read32(OUT, RADEON_GPIOPAD_A); 100*1d5cfc64SAlexander von Gluck IV uint32 gpiopad_en = Read32(OUT, RADEON_GPIOPAD_EN); 101*1d5cfc64SAlexander von Gluck IV uint32 gpiopad_mask = Read32(OUT, RADEON_GPIOPAD_MASK); 102*1d5cfc64SAlexander von Gluck IV 103*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_SEPROM_CNTL1, ((seprom_cntl1 & 104*1d5cfc64SAlexander von Gluck IV ~RADEON_SCK_PRESCALE_MASK) | (0xc << RADEON_SCK_PRESCALE_SHIFT))); 105*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_A, 0); 106*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_EN, 0); 107*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_MASK, 0); 108*1d5cfc64SAlexander von Gluck IV 109*1d5cfc64SAlexander von Gluck IV // Disable VIP 110*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 111*1d5cfc64SAlexander von Gluck IV // Disable VGA mode 112*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, (d1vga_control 113*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 114*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 115*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, (d2vga_control 116*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 117*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 118*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, (vga_render_control 119*1d5cfc64SAlexander von Gluck IV & ~VGA_VSTATUS_CNTL_MASK)); 120*1d5cfc64SAlexander von Gluck IV 121*1d5cfc64SAlexander von Gluck IV snooze(2); 122*1d5cfc64SAlexander von Gluck IV 123*1d5cfc64SAlexander von Gluck IV status_t result = B_ERROR; 124*1d5cfc64SAlexander von Gluck IV if (gInfo->rom[0] == 0x55 && gInfo->rom[1] == 0xaa) { 125*1d5cfc64SAlexander von Gluck IV TRACE("%s: found AtomBIOS signature!\n", __func__); 126*1d5cfc64SAlexander von Gluck IV memcpy(&bios, gInfo->rom, size); 127*1d5cfc64SAlexander von Gluck IV // grab it while we can 128*1d5cfc64SAlexander von Gluck IV result = B_OK; 129*1d5cfc64SAlexander von Gluck IV } else 130*1d5cfc64SAlexander von Gluck IV TRACE("%s: didn't find valid AtomBIOS\n", __func__); 131*1d5cfc64SAlexander von Gluck IV 132*1d5cfc64SAlexander von Gluck IV /* restore regs */ 133*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_SEPROM_CNTL1, seprom_cntl1); 134*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_VIPH_CONTROL, viph_control); 135*1d5cfc64SAlexander von Gluck IV Write32(OUT, RV370_BUS_CNTL, bus_cntl); 136*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, d1vga_control); 137*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, d2vga_control); 138*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, vga_render_control); 139*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_A, gpiopad_a); 140*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_EN, gpiopad_en); 141*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_GPIOPAD_MASK, gpiopad_mask); 142*1d5cfc64SAlexander von Gluck IV 143*1d5cfc64SAlexander von Gluck IV 144*1d5cfc64SAlexander von Gluck IV return result; 145*1d5cfc64SAlexander von Gluck IV } 146*1d5cfc64SAlexander von Gluck IV 147*1d5cfc64SAlexander von Gluck IV 148*1d5cfc64SAlexander von Gluck IV status_t 149*1d5cfc64SAlexander von Gluck IV bios_read_disabled_r700(void* bios, size_t size) 150*1d5cfc64SAlexander von Gluck IV { 151*1d5cfc64SAlexander von Gluck IV uint32 viph_control = Read32(OUT, RADEON_VIPH_CONTROL); 152*1d5cfc64SAlexander von Gluck IV uint32 bus_cntl = Read32(OUT, R600_BUS_CNTL); 153*1d5cfc64SAlexander von Gluck IV uint32 d1vga_control = Read32(OUT, D1VGA_CONTROL); 154*1d5cfc64SAlexander von Gluck IV uint32 d2vga_control = Read32(OUT, D2VGA_CONTROL); 155*1d5cfc64SAlexander von Gluck IV uint32 vga_render_control = Read32(OUT, VGA_RENDER_CONTROL); 156*1d5cfc64SAlexander von Gluck IV uint32 rom_cntl = Read32(OUT, R600_ROM_CNTL); 157*1d5cfc64SAlexander von Gluck IV 158*1d5cfc64SAlexander von Gluck IV // Disable VIP 159*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 160*1d5cfc64SAlexander von Gluck IV // Enable rom access 161*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); 162*1d5cfc64SAlexander von Gluck IV // Disable VGA mode 163*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, (d1vga_control 164*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 165*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 166*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, (d2vga_control 167*1d5cfc64SAlexander von Gluck IV & ~(DVGA_CONTROL_MODE_ENABLE 168*1d5cfc64SAlexander von Gluck IV | DVGA_CONTROL_TIMING_SELECT))); 169*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, (vga_render_control 170*1d5cfc64SAlexander von Gluck IV & ~VGA_VSTATUS_CNTL_MASK)); 171*1d5cfc64SAlexander von Gluck IV 172*1d5cfc64SAlexander von Gluck IV uint32 cg_spll_func_cntl = 0; 173*1d5cfc64SAlexander von Gluck IV radeon_shared_info &info = *gInfo->shared_info; 174*1d5cfc64SAlexander von Gluck IV if (info.device_chipset == (RADEON_R700 | 0x30)) { 175*1d5cfc64SAlexander von Gluck IV cg_spll_func_cntl = Read32(OUT, R600_CG_SPLL_FUNC_CNTL); 176*1d5cfc64SAlexander von Gluck IV 177*1d5cfc64SAlexander von Gluck IV // Enable bypass mode 178*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_CG_SPLL_FUNC_CNTL, cg_spll_func_cntl 179*1d5cfc64SAlexander von Gluck IV | R600_SPLL_BYPASS_EN); 180*1d5cfc64SAlexander von Gluck IV 181*1d5cfc64SAlexander von Gluck IV // wait for SPLL_CHG_STATUS to change to 1 182*1d5cfc64SAlexander von Gluck IV uint32 cg_spll_status = 0; 183*1d5cfc64SAlexander von Gluck IV while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) 184*1d5cfc64SAlexander von Gluck IV cg_spll_status = Read32(OUT, R600_CG_SPLL_STATUS); 185*1d5cfc64SAlexander von Gluck IV 186*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_ROM_CNTL, (rom_cntl & ~R600_SCK_OVERWRITE)); 187*1d5cfc64SAlexander von Gluck IV } else 188*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE); 189*1d5cfc64SAlexander von Gluck IV 190*1d5cfc64SAlexander von Gluck IV snooze(2); 191*1d5cfc64SAlexander von Gluck IV 192*1d5cfc64SAlexander von Gluck IV status_t result = B_ERROR; 193*1d5cfc64SAlexander von Gluck IV if (gInfo->rom[0] == 0x55 && gInfo->rom[1] == 0xaa) { 194*1d5cfc64SAlexander von Gluck IV TRACE("%s: found AtomBIOS signature!\n", __func__); 195*1d5cfc64SAlexander von Gluck IV memcpy(&bios, gInfo->rom, size); 196*1d5cfc64SAlexander von Gluck IV // grab it while we can 197*1d5cfc64SAlexander von Gluck IV result = B_OK; 198*1d5cfc64SAlexander von Gluck IV } else 199*1d5cfc64SAlexander von Gluck IV TRACE("%s: didn't find valid AtomBIOS\n", __func__); 200*1d5cfc64SAlexander von Gluck IV 201*1d5cfc64SAlexander von Gluck IV // restore regs 202*1d5cfc64SAlexander von Gluck IV if (info.device_chipset == (RADEON_R700 | 0x30)) { 203*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_CG_SPLL_FUNC_CNTL, cg_spll_func_cntl); 204*1d5cfc64SAlexander von Gluck IV 205*1d5cfc64SAlexander von Gluck IV // wait for SPLL_CHG_STATUS to change to 1 206*1d5cfc64SAlexander von Gluck IV uint32 cg_spll_status = 0; 207*1d5cfc64SAlexander von Gluck IV while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) 208*1d5cfc64SAlexander von Gluck IV cg_spll_status = Read32(OUT, R600_CG_SPLL_STATUS); 209*1d5cfc64SAlexander von Gluck IV } 210*1d5cfc64SAlexander von Gluck IV Write32(OUT, RADEON_VIPH_CONTROL, viph_control); 211*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_BUS_CNTL, bus_cntl); 212*1d5cfc64SAlexander von Gluck IV Write32(OUT, D1VGA_CONTROL, d1vga_control); 213*1d5cfc64SAlexander von Gluck IV Write32(OUT, D2VGA_CONTROL, d2vga_control); 214*1d5cfc64SAlexander von Gluck IV Write32(OUT, VGA_RENDER_CONTROL, vga_render_control); 215*1d5cfc64SAlexander von Gluck IV Write32(OUT, R600_ROM_CNTL, rom_cntl); 216*1d5cfc64SAlexander von Gluck IV 217*1d5cfc64SAlexander von Gluck IV return result; 218*1d5cfc64SAlexander von Gluck IV } 219*1d5cfc64SAlexander von Gluck IV 220*1d5cfc64SAlexander von Gluck IV 221*1d5cfc64SAlexander von Gluck IV status_t 222*1d5cfc64SAlexander von Gluck IV radeon_init_bios(void* bios) 223*1d5cfc64SAlexander von Gluck IV { 224*1d5cfc64SAlexander von Gluck IV radeon_shared_info &info = *gInfo->shared_info; 225*1d5cfc64SAlexander von Gluck IV 226*1d5cfc64SAlexander von Gluck IV status_t bios_status; 227*1d5cfc64SAlexander von Gluck IV if (bios_read_enabled(bios, info.rom_size) != B_OK) { 228*1d5cfc64SAlexander von Gluck IV if (info.device_chipset > RADEON_R800) // TODO : >= BARTS 229*1d5cfc64SAlexander von Gluck IV bios_status = bios_read_disabled_northern(bios, info.rom_size); 230*1d5cfc64SAlexander von Gluck IV else if (info.device_chipset >= (RADEON_R700 | 0x70)) 231*1d5cfc64SAlexander von Gluck IV bios_status = bios_read_disabled_r700(bios, info.rom_size); 232*1d5cfc64SAlexander von Gluck IV else if (info.device_chipset >= RADEON_R600) 233*1d5cfc64SAlexander von Gluck IV bios_status = bios_read_disabled_avivo(bios, info.rom_size); 234*1d5cfc64SAlexander von Gluck IV else 235*1d5cfc64SAlexander von Gluck IV bios_status = B_ERROR; 236*1d5cfc64SAlexander von Gluck IV } 237*1d5cfc64SAlexander von Gluck IV 238*1d5cfc64SAlexander von Gluck IV if (bios_status != B_OK) 239*1d5cfc64SAlexander von Gluck IV return bios_status; 240*1d5cfc64SAlexander von Gluck IV 24151360674SAlexander von Gluck IV struct card_info *atom_card_info 24251360674SAlexander von Gluck IV = (card_info*)malloc(sizeof(card_info)); 24351360674SAlexander von Gluck IV 24451360674SAlexander von Gluck IV if (!atom_card_info) 24551360674SAlexander von Gluck IV return B_NO_MEMORY; 24651360674SAlexander von Gluck IV 24751360674SAlexander von Gluck IV atom_card_info->reg_read = _read32; 24851360674SAlexander von Gluck IV atom_card_info->reg_write = _write32; 24951360674SAlexander von Gluck IV 25051360674SAlexander von Gluck IV if (false) { 25151360674SAlexander von Gluck IV // TODO : if rio_mem, use ioreg 25251360674SAlexander von Gluck IV //atom_card_info->ioreg_read = cail_ioreg_read; 25351360674SAlexander von Gluck IV //atom_card_info->ioreg_write = cail_ioreg_write; 25451360674SAlexander von Gluck IV } else { 25551360674SAlexander von Gluck IV TRACE("%s: Cannot find PCI I/O BAR; using MMIO\n", __func__); 25651360674SAlexander von Gluck IV atom_card_info->ioreg_read = _read32; 25751360674SAlexander von Gluck IV atom_card_info->ioreg_write = _write32; 25851360674SAlexander von Gluck IV } 25951360674SAlexander von Gluck IV atom_card_info->mc_read = _read32; 26051360674SAlexander von Gluck IV atom_card_info->mc_write = _write32; 26151360674SAlexander von Gluck IV atom_card_info->pll_read = _read32; 26251360674SAlexander von Gluck IV atom_card_info->pll_write = _write32; 26351360674SAlexander von Gluck IV 264*1d5cfc64SAlexander von Gluck IV // Point AtomBIOS parser to card bios and malloc gAtomContext 265*1d5cfc64SAlexander von Gluck IV gAtomContext = atom_parse(atom_card_info, bios); 26651360674SAlexander von Gluck IV 267*1d5cfc64SAlexander von Gluck IV if (gAtomContext == NULL) { 268ef2909a1SAlexander von Gluck IV TRACE("%s: couldn't parse system AtomBIOS\n", __func__); 269ef2909a1SAlexander von Gluck IV return B_ERROR; 270ef2909a1SAlexander von Gluck IV } 271ef2909a1SAlexander von Gluck IV 27251360674SAlexander von Gluck IV #if 0 27351360674SAlexander von Gluck IV rdev->mode_info.atom_context = atom_parse(atom_card_info, rdev->bios); 27451360674SAlexander von Gluck IV mutex_init(&rdev->mode_info.atom_context->mutex); 27551360674SAlexander von Gluck IV radeon_atom_initialize_bios_scratch_regs(rdev->ddev); 27651360674SAlexander von Gluck IV atom_allocate_fb_scratch(rdev->mode_info.atom_context); 27751360674SAlexander von Gluck IV #endif 27851360674SAlexander von Gluck IV 27951360674SAlexander von Gluck IV return B_OK; 28051360674SAlexander von Gluck IV } 281