xref: /haiku/src/add-ons/accelerants/radeon_hd/bios.cpp (revision 1d5cfc649aeba62066af20336ca69566566500c3)
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