Rev 881 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 881 | Rev 883 | ||
---|---|---|---|
Line 50... | Line 50... | ||
50 | # define RADEON_ISYNC_CPSCRATCH_IDLEGUI (1 << 5) |
50 | # define RADEON_ISYNC_CPSCRATCH_IDLEGUI (1 << 5) |
51 | 51 | ||
Line 52... | Line 52... | ||
52 | #define R5XX_LOOP_COUNT 2000000 |
52 | #define R5XX_LOOP_COUNT 2000000 |
Line 53... | Line -... | ||
53 | - | ||
54 | #include "microcode.h" |
- | |
55 | 53 | ||
Line 56... | Line 54... | ||
56 | #define RADEON_CLOCK_CNTL_DATA 0x000c |
54 | #define RADEON_CLOCK_CNTL_DATA 0x000c |
57 | 55 | ||
58 | #define RADEON_CLOCK_CNTL_INDEX 0x0008 |
56 | #define RADEON_CLOCK_CNTL_INDEX 0x0008 |
Line 70... | Line 68... | ||
70 | # define R300_DISABLE_MC_MCLKA (1 << 21) |
68 | # define R300_DISABLE_MC_MCLKA (1 << 21) |
71 | # define R300_DISABLE_MC_MCLKB (1 << 21) |
69 | # define R300_DISABLE_MC_MCLKB (1 << 21) |
72 | 70 | ||
Line 73... | Line -... | ||
73 | - | ||
74 | void RADEONPllErrataAfterData() |
- | |
75 | { |
- | |
76 | - | ||
77 | /* This function is required to workaround a hardware bug in some (all?) |
- | |
78 | * revisions of the R300. This workaround should be called after every |
- | |
79 | * CLOCK_CNTL_INDEX register access. If not, register reads afterward |
- | |
80 | * may not be correct. |
- | |
81 | */ |
- | |
82 | if (rhd.ChipFamily <= CHIP_FAMILY_RV380) |
- | |
83 | { |
- | |
84 | u32_t save, tmp; |
- | |
85 | - | ||
86 | save = INREG(RADEON_CLOCK_CNTL_INDEX); |
- | |
87 | tmp = save & ~(0x3f | RADEON_PLL_WR_EN); |
- | |
88 | OUTREG(RADEON_CLOCK_CNTL_INDEX, tmp); |
- | |
89 | tmp = INREG(RADEON_CLOCK_CNTL_DATA); |
- | |
90 | OUTREG(RADEON_CLOCK_CNTL_INDEX, save); |
- | |
91 | } |
- | |
92 | } |
- | |
93 | - | ||
94 | - | ||
95 | /* Read PLL register */ |
- | |
96 | u32_t RADEONINPLL(int addr) |
- | |
97 | { |
- | |
98 | u32_t data; |
- | |
99 | - | ||
100 | OUTREG8(RADEON_CLOCK_CNTL_INDEX, addr & 0x3f); |
- | |
101 | //RADEONPllErrataAfterIndex(); |
- | |
102 | data = INREG(RADEON_CLOCK_CNTL_DATA); |
- | |
103 | RADEONPllErrataAfterData(); |
- | |
104 | - | ||
105 | return data; |
- | |
106 | }; |
- | |
107 | - | ||
108 | /* Write PLL information */ |
- | |
109 | void RADEONOUTPLL(int addr, u32_t data) |
- | |
110 | { |
- | |
111 | OUTREG8(RADEON_CLOCK_CNTL_INDEX, (((addr) & 0x3f) | |
- | |
112 | RADEON_PLL_WR_EN)); |
- | |
113 | // RADEONPllErrataAfterIndex(info); |
- | |
114 | OUTREG(RADEON_CLOCK_CNTL_DATA, data); |
- | |
115 | RADEONPllErrataAfterData(); |
- | |
116 | } |
- | |
117 | - | ||
118 | - | ||
119 | - | ||
120 | static Bool |
- | |
121 | R5xxFIFOWaitLocal(u32_t required) //R100-R500 |
- | |
122 | { |
- | |
123 | int i; |
- | |
124 | - | ||
125 | for (i = 0; i < R5XX_LOOP_COUNT; i++) |
- | |
126 | if (required <= (INREG(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK)) |
- | |
Line 127... | Line -... | ||
127 | return TRUE; |
- | |
128 | - | ||
129 | dbgprintf("%s: Timeout 0x%08X.\n", __func__, |
- | |
130 | (unsigned int) INREG(R5XX_RBBM_STATUS)); |
- | |
Line 131... | Line 71... | ||
131 | return FALSE; |
71 | |
132 | } |
72 | |
133 | 73 | ||
Line 178... | Line 118... | ||
178 | return FALSE; |
118 | return FALSE; |
179 | 119 | ||
Line 180... | Line 120... | ||
180 | } |
120 | } |
Line 181... | Line -... | ||
181 | - | ||
182 | static void |
- | |
183 | R5xx2DReset() |
- | |
184 | { |
- | |
185 | u32_t save, tmp; |
- | |
186 | u32_t clock_cntl_index; |
- | |
187 | u32_t mclk_cntl; |
- | |
188 | - | ||
189 | /* The following RBBM_SOFT_RESET sequence can help un-wedge |
- | |
190 | * an R300 after the command processor got stuck. */ |
- | |
191 | save = INREG(R5XX_RBBM_SOFT_RESET); |
- | |
192 | tmp = save | R5XX_SOFT_RESET_CP | |
- | |
193 | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_SE | |
- | |
194 | R5XX_SOFT_RESET_RE | R5XX_SOFT_RESET_PP | |
- | |
195 | R5XX_SOFT_RESET_E2 | R5XX_SOFT_RESET_RB; |
- | |
196 | OUTREG(R5XX_RBBM_SOFT_RESET, tmp); |
- | |
197 | - | ||
198 | INREG(R5XX_RBBM_SOFT_RESET); |
- | |
199 | tmp &= ~(R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | |
- | |
200 | R5XX_SOFT_RESET_SE | R5XX_SOFT_RESET_RE | |
- | |
201 | R5XX_SOFT_RESET_PP | R5XX_SOFT_RESET_E2 | |
- | |
202 | R5XX_SOFT_RESET_RB); |
- | |
203 | OUTREG(R5XX_RBBM_SOFT_RESET, tmp); |
- | |
204 | - | ||
205 | INREG(R5XX_RBBM_SOFT_RESET); |
- | |
206 | OUTREG(R5XX_RBBM_SOFT_RESET, save); |
- | |
207 | INREG(R5XX_RBBM_SOFT_RESET); |
- | |
208 | - | ||
209 | R5xx2DFlush(); |
- | |
210 | - | ||
211 | #if 0 |
- | |
212 | clock_cntl_index = INREG(RADEON_CLOCK_CNTL_INDEX); |
- | |
213 | RADEONPllErrataAfterIndex(info); |
- | |
214 | - | ||
215 | mclk_cntl = RADEONINPLL(RADEON_MCLK_CNTL); |
- | |
216 | - | ||
217 | RADEONOUTPLL(RADEON_MCLK_CNTL, (mclk_cntl | |
- | |
218 | RADEON_FORCEON_MCLKA | |
- | |
219 | RADEON_FORCEON_MCLKB | |
- | |
220 | RADEON_FORCEON_YCLKA | |
- | |
221 | RADEON_FORCEON_YCLKB | |
- | |
222 | RADEON_FORCEON_MC | |
- | |
223 | RADEON_FORCEON_AIC)); |
- | |
224 | #endif |
- | |
225 | - | ||
226 | /* Soft resetting HDP thru RBBM_SOFT_RESET register can cause some |
- | |
227 | * unexpected behaviour on some machines. Here we use |
- | |
228 | * R5XX_HOST_PATH_CNTL to reset it. */ |
- | |
229 | save = INREG(R5XX_HOST_PATH_CNTL); |
- | |
230 | - | ||
231 | tmp = INREG(R5XX_RBBM_SOFT_RESET); |
- | |
232 | tmp |= R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2; |
- | |
233 | OUTREG(R5XX_RBBM_SOFT_RESET, tmp); |
- | |
234 | - | ||
235 | INREG(R5XX_RBBM_SOFT_RESET); |
- | |
236 | OUTREG(R5XX_RBBM_SOFT_RESET, 0); |
- | |
237 | - | ||
238 | MASKREG(R5XX_RB2D_DSTCACHE_MODE, |
- | |
239 | R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE, |
- | |
240 | R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE); |
- | |
241 | - | ||
242 | OUTREG(R5XX_HOST_PATH_CNTL, save | R5XX_HDP_SOFT_RESET); |
- | |
243 | INREG(R5XX_HOST_PATH_CNTL); |
- | |
244 | OUTREG(R5XX_HOST_PATH_CNTL, save); |
- | |
245 | - | ||
246 | #if 0 |
- | |
247 | OUTREG(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); |
- | |
248 | RADEONPllErrataAfterIndex(info); |
- | |
249 | RADEONOUTPLL(RADEON_MCLK_CNTL, mclk_cntl); |
- | |
250 | #endif |
- | |
Line 251... | Line 121... | ||
251 | } |
121 | |
252 | 122 | ||
253 | void |
123 | void |
Line 266... | Line 136... | ||
266 | MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN); |
136 | MASKREG(R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN); |
267 | 137 | ||
Line 268... | Line 138... | ||
268 | OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl); |
138 | OUTREG(R5XX_SURFACE_CNTL, rhd.surface_cntl); |
Line 269... | Line 139... | ||
269 | 139 | ||
- | 140 | R5xxFIFOWaitLocal(3); |
|
- | 141 | OUTREG(R5XX_SC_TOP_LEFT, 0); |
|
- | 142 | OUTREG(R5XX_SC_BOTTOM_RIGHT, |
|
270 | R5xxFIFOWaitLocal(1); |
143 | RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX); |
271 | OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT, |
144 | OUTREG(R5XX_DEFAULT_SC_BOTTOM_RIGHT, |
- | 145 | RADEON_DEFAULT_SC_RIGHT_MAX | RADEON_DEFAULT_SC_BOTTOM_MAX); |
|
272 | R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX); |
146 | |
273 | R5xxFIFOWaitLocal(1); |
147 | R5xxFIFOWaitLocal(1); |
274 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | |
148 | // OUTREG(R5XX_DP_GUI_MASTER_CNTL, rhd.gui_control | |
- | 149 | // R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR); |
|
Line 275... | Line 150... | ||
275 | R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR); |
150 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); |
276 | 151 | ||
277 | R5xxFIFOWaitLocal(5); |
152 | R5xxFIFOWaitLocal(5); |
278 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF); |
153 | OUTREG(R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF); |
Line 286... | Line 161... | ||
286 | 161 | ||
Line 287... | Line 162... | ||
287 | void R5xxFIFOWait(u32_t required) |
162 | void R5xxFIFOWait(u32_t required) |
288 | { |
163 | { |
289 | if (!R5xxFIFOWaitLocal(required)) { |
164 | if (!R5xxFIFOWaitLocal(required)) { |
290 | R5xx2DReset(); |
165 | // R5xx2DReset(); |
291 | R5xx2DSetup(); |
166 | R5xx2DSetup(); |
292 | } |
167 | } |
293 | } |
168 | } |
Line 294... | Line 169... | ||
294 | 169 | ||
295 | void R5xx2DIdle() |
170 | void R5xx2DIdle() |
296 | { |
171 | { |
297 | if (!R5xx2DIdleLocal()) { |
172 | if (!R5xx2DIdleLocal()) { |
298 | R5xx2DReset(); |
173 | // R5xx2DReset(); |
299 | R5xx2DSetup(); |
174 | R5xx2DSetup(); |
300 | } |
175 | } |
Line 301... | Line -... | ||
301 | } |
- | |
302 | - | ||
303 | static void load_microcode() |
- | |
304 | { |
- | |
305 | u32_t ifl; |
- | |
306 | int i; |
- | |
307 | - | ||
308 | ifl = safe_cli(); |
- | |
309 | - | ||
310 | OUTREG(RADEON_CP_ME_RAM_ADDR,0); |
- | |
311 | - | ||
312 | R5xx2DIdleLocal(); |
- | |
313 | - | ||
314 | switch(rhd.ChipFamily) |
- | |
315 | { |
- | |
316 | case CHIP_FAMILY_R300: |
- | |
317 | case CHIP_FAMILY_R350: |
- | |
318 | case CHIP_FAMILY_RV350: |
- | |
319 | dbgprintf("Loading R300 microcode\n"); |
- | |
320 | for (i = 0; i < 256; i++) |
- | |
321 | { |
- | |
322 | OUTREG(RADEON_CP_ME_RAM_DATAH, R300_cp_microcode[i][1]); |
- | |
323 | OUTREG(RADEON_CP_ME_RAM_DATAL, R300_cp_microcode[i][0]); |
- | |
324 | } |
- | |
325 | break; |
- | |
326 | /* |
- | |
327 | case RHD_RV505: |
- | |
328 | case RHD_RV515: |
- | |
329 | case RHD_RV516: |
- | |
330 | case RHD_R520: |
- | |
331 | case RHD_RV530: |
- | |
332 | case RHD_RV535: |
- | |
333 | case RHD_RV550: |
- | |
334 | case RHD_RV560: |
- | |
335 | case RHD_RV570: |
- | |
336 | case RHD_R580: |
- | |
337 | dbgprintf("Loading R500 microcode\n"); |
- | |
338 | for (i = 0; i < 256; i++) |
- | |
339 | { |
- | |
340 | OUTREG(RADEON_CP_ME_RAM_DATAH, R520_cp_microcode[i][1]); |
- | |
341 | OUTREG(RADEON_CP_ME_RAM_DATAL, R520_cp_microcode[i][0]); |
- | |
342 | } |
- | |
343 | */ |
- | |
344 | } |
- | |
Line 345... | Line 176... | ||
345 | safe_sti(ifl); |
176 | } |
346 | }; |
177 | |
347 | 178 | ||
Line 367... | Line 198... | ||
367 | clip.ymin = 0; |
198 | clip.ymin = 0; |
368 | clip.xmax = rhd.displayWidth - 1; |
199 | clip.xmax = rhd.displayWidth - 1; |
369 | clip.ymax = rhd.displayHeight - 1; |
200 | clip.ymax = rhd.displayHeight - 1; |
370 | 201 | ||
Line 371... | Line 202... | ||
371 | dbgprintf("width %d \n", rhd.displayWidth); |
202 | dbgprintf("screen width %d height %d\n", |
372 | dbgprintf("height %d \n", rhd.displayHeight); |
203 | rhd.displayWidth, rhd.displayHeight); |
Line 373... | Line 204... | ||
373 | 204 | ||
- | 205 | rhd.gui_control = ((6 << RADEON_GMC_DST_DATATYPE_SHIFT) |
|
374 | rhd.gui_control = (R5XX_DATATYPE_ARGB8888 << R5XX_GMC_DST_DATATYPE_SHIFT) | |
206 | | RADEON_GMC_CLR_CMP_CNTL_DIS |
Line 375... | Line 207... | ||
375 | R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_DST_PITCH_OFFSET_CNTL; |
207 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL); |
Line 376... | Line 208... | ||
376 | 208 | ||
377 | dbgprintf("gui_control %x \n", rhd.gui_control); |
209 | dbgprintf("gui_control %x \n", rhd.gui_control); |
- | 210 | ||
- | 211 | rhd.surface_cntl = 0; |
|
- | 212 | // rhd.dst_pitch_offset = ((screenpitch / 64) << 22) | (rhd.fbLocation >> 10); |
|
Line 378... | Line -... | ||
378 | - | ||
Line -... | Line 213... | ||
- | 213 | ||
Line 379... | Line 214... | ||
379 | rhd.surface_cntl = 0; |
214 | rhd.dst_pitch_offset = (((rhd.displayWidth * 4 / 64)<< 22) | |
380 | rhd.dst_pitch_offset = ((screenpitch / 64) << 22) | (rhd.fbLocation >> 10); |
215 | (rhd.fbLocation >> 10)); |
381 | 216 | ||
382 | dbgprintf("dst_pitch_offset %x \n", rhd.dst_pitch_offset); |
217 | |
383 | 218 | dbgprintf("dst_pitch_offset %x \n", rhd.dst_pitch_offset); |
|
384 | 219 | ||
385 | scr_pixmap.width = rhd.displayWidth; |
220 | scr_pixmap.width = rhd.displayWidth; |
Line -... | Line 221... | ||
- | 221 | scr_pixmap.height = rhd.displayHeight; |
|
- | 222 | scr_pixmap.format = PICT_a8r8g8b8; |
|
- | 223 | scr_pixmap.pitch = screenpitch; |
|
Line 386... | Line -... | ||
386 | scr_pixmap.height = rhd.displayHeight; |
- | |
387 | scr_pixmap.format = PICT_a8r8g8b8; |
- | |
388 | scr_pixmap.pitch = screenpitch; |
- | |
389 | scr_pixmap.local = (void*)rhd.fbLocation; |
- | |
390 | scr_pixmap.pitch_offset = rhd.dst_pitch_offset; |
- | |
391 | scr_pixmap.mapped = (void*)0; |
- | |
392 | - | ||
393 | - | ||
394 | MASKREG(R5XX_GB_TILE_CONFIG, 0, R5XX_ENABLE_TILING); |
224 | scr_pixmap.local = (void*)rhd.fbLocation; |
395 | OUTREG (R5XX_WAIT_UNTIL, R5XX_WAIT_2D_IDLECLEAN | R5XX_WAIT_3D_IDLECLEAN); |
- | |
396 | MASKREG(R5XX_DST_PIPE_CONFIG, R5XX_PIPE_AUTO_CONFIG, R5XX_PIPE_AUTO_CONFIG); |
- | |
397 | MASKREG(R5XX_RB2D_DSTCACHE_MODE, |
225 | scr_pixmap.pitch_offset = rhd.dst_pitch_offset; |
398 | R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE, |
- | |
399 | R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE); |
- | |
400 | - | ||
401 | - | ||
402 | R5xx2DReset(); |
- | |
403 | R5xx2DSetup(); |
- | |
404 | - | ||
405 | MASKREG( RADEON_AIC_CNTL,0, RADEON_PCIGART_TRANSLATE_EN); |
- | |
406 | - | ||
407 | // load_microcode(); |
- | |
408 | - | ||
409 | // rhd.ring_base = CreateRingBuffer(0x8000, PG_SW | PG_NOCACHE); |
- | |
410 | // dbgprintf("create cp ring buffer %x\n", rhd.ring_base); |
- | |
411 | // base = GetPgAddr(rhd.ring_base); |
- | |
412 | - | ||
413 | // OUTREG(RADEON_CP_RB_BASE, base); |
- | |
414 | // dbgprintf("ring base %x\n", base); |
- | |
415 | - | ||
416 | // OUTREG(RADEON_CP_RB_WPTR_DELAY, 0); |
- | |
417 | - | ||
418 | // rhd.ring_rp = rhd.ring_wp = INREG(RADEON_CP_RB_RPTR); |
- | |
Line 419... | Line 226... | ||
419 | // OUTREG(RADEON_CP_RB_WPTR,rhd.ring_rp); |
226 | scr_pixmap.mapped = (void*)0; |
Line 420... | Line -... | ||
420 | - | ||
421 | // OUTREG(RADEON_CP_RB_RPTR_ADDR, 0); // ring buffer read pointer no update |
- | |
422 | 227 | ||
- | 228 | R5xxFIFOWaitLocal(2); |
|
423 | // OUTREG(RADEON_CP_RB_CNTL, RADEON_RB_NO_UPDATE | 12); |
229 | OUTREG(R5XX_DST_PITCH_OFFSET,rhd.dst_pitch_offset); |
- | 230 | OUTREG(R5XX_SRC_PITCH_OFFSET,rhd.dst_pitch_offset); |
|
Line 424... | Line 231... | ||
424 | // OUTREG(RADEON_SCRATCH_UMSK, 0); // no scratch update |
231 | |
Line 425... | Line 232... | ||
425 | 232 | R5xxFIFOWaitLocal(1); |