Mercurial > mplayer.hg
comparison drivers/radeon/radeon_vid.c @ 3607:f5cc15e11d6e
+ Added support of FIFO engine (suggested by Vladimir Dergachev)
- Disabled save/restore state functions (caused a lots of problems
during driver reloading)
author | nick |
---|---|
date | Wed, 19 Dec 2001 10:41:08 +0000 |
parents | 135926174ee8 |
children | 80d0864322b9 |
comparison
equal
deleted
inserted
replaced
3606:1ceab741e3e6 | 3607:f5cc15e11d6e |
---|---|
15 * | 15 * |
16 * SPECIAL THANKS TO: Hans-Peter Raschke for active testing and hacking | 16 * SPECIAL THANKS TO: Hans-Peter Raschke for active testing and hacking |
17 * Rage128(pro) stuff of this driver. | 17 * Rage128(pro) stuff of this driver. |
18 */ | 18 */ |
19 | 19 |
20 #define RADEON_VID_VERSION "1.1.1" | 20 #define RADEON_VID_VERSION "1.1.2" |
21 | 21 |
22 /* | 22 /* |
23 It's entirely possible this major conflicts with something else | 23 It's entirely possible this major conflicts with something else |
24 mknod /dev/radeon_vid c 178 0 | 24 mknod /dev/radeon_vid c 178 0 |
25 or | 25 or |
178 #ifdef DEBUG | 178 #ifdef DEBUG |
179 #define DECLARE_VREG(name) { #name, name, 0 } | 179 #define DECLARE_VREG(name) { #name, name, 0 } |
180 #else | 180 #else |
181 #define DECLARE_VREG(name) { name, 0 } | 181 #define DECLARE_VREG(name) { name, 0 } |
182 #endif | 182 #endif |
183 | 183 #ifdef DEBUG |
184 static video_registers_t vregs[] = | 184 static video_registers_t vregs[] = |
185 { | 185 { |
186 DECLARE_VREG(VIDEOMUX_CNTL), | 186 DECLARE_VREG(VIDEOMUX_CNTL), |
187 DECLARE_VREG(VIPPAD_MASK), | 187 DECLARE_VREG(VIPPAD_MASK), |
188 DECLARE_VREG(VIPPAD1_A), | 188 DECLARE_VREG(VIPPAD1_A), |
273 DECLARE_VREG(IDCT_LEVELS), | 273 DECLARE_VREG(IDCT_LEVELS), |
274 DECLARE_VREG(IDCT_AUTH_CONTROL), | 274 DECLARE_VREG(IDCT_AUTH_CONTROL), |
275 DECLARE_VREG(IDCT_AUTH), | 275 DECLARE_VREG(IDCT_AUTH), |
276 DECLARE_VREG(IDCT_CONTROL) | 276 DECLARE_VREG(IDCT_CONTROL) |
277 }; | 277 }; |
278 | 278 #endif |
279 static uint32_t radeon_vid_in_use = 0; | 279 static uint32_t radeon_vid_in_use = 0; |
280 | 280 |
281 static uint8_t *radeon_mmio_base = 0; | 281 static uint8_t *radeon_mmio_base = 0; |
282 static uint32_t radeon_mem_base = 0; | 282 static uint32_t radeon_mem_base = 0; |
283 static int32_t radeon_overlay_off = 0; | 283 static int32_t radeon_overlay_off = 0; |
342 | 342 |
343 #define INREG8(addr) readb((radeon_mmio_base)+addr) | 343 #define INREG8(addr) readb((radeon_mmio_base)+addr) |
344 #define OUTREG8(addr,val) writeb(val, (radeon_mmio_base)+addr) | 344 #define OUTREG8(addr,val) writeb(val, (radeon_mmio_base)+addr) |
345 #define INREG(addr) readl((radeon_mmio_base)+addr) | 345 #define INREG(addr) readl((radeon_mmio_base)+addr) |
346 #define OUTREG(addr,val) writel(val, (radeon_mmio_base)+addr) | 346 #define OUTREG(addr,val) writel(val, (radeon_mmio_base)+addr) |
347 #define OUTREGP(addr,val,mask) \ | |
348 do { \ | |
349 unsigned int _tmp = INREG(addr); \ | |
350 _tmp &= (mask); \ | |
351 _tmp |= (val); \ | |
352 OUTREG(addr, _tmp); \ | |
353 } while (0) | |
347 | 354 |
348 static uint32_t radeon_vid_get_dbpp( void ) | 355 static uint32_t radeon_vid_get_dbpp( void ) |
349 { | 356 { |
350 uint32_t dbpp,retval; | 357 uint32_t dbpp,retval; |
351 dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF; | 358 dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF; |
368 static int radeon_is_interlace( void ) | 375 static int radeon_is_interlace( void ) |
369 { | 376 { |
370 return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN; | 377 return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN; |
371 } | 378 } |
372 | 379 |
380 static __inline__ void radeon_engine_flush ( void ) | |
381 { | |
382 int i; | |
383 | |
384 /* initiate flush */ | |
385 OUTREGP(RB2D_DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL, | |
386 ~RB2D_DC_FLUSH_ALL); | |
387 | |
388 for (i=0; i < 2000000; i++) { | |
389 if (!(INREG(RB2D_DSTCACHE_CTLSTAT) & RB2D_DC_BUSY)) | |
390 break; | |
391 } | |
392 } | |
393 | |
394 | |
395 static __inline__ void _radeon_fifo_wait (int entries) | |
396 { | |
397 int i; | |
398 | |
399 for (i=0; i<2000000; i++) | |
400 if ((INREG(RBBM_STATUS) & 0x7f) >= entries) | |
401 return; | |
402 } | |
403 | |
404 | |
405 static __inline__ void _radeon_engine_idle ( void ) | |
406 { | |
407 int i; | |
408 | |
409 /* ensure FIFO is empty before waiting for idle */ | |
410 _radeon_fifo_wait (64); | |
411 | |
412 for (i=0; i<2000000; i++) { | |
413 if (((INREG(RBBM_STATUS) & GUI_ACTIVE)) == 0) { | |
414 radeon_engine_flush (); | |
415 return; | |
416 } | |
417 } | |
418 } | |
419 | |
420 #define radeon_engine_idle() _radeon_engine_idle() | |
421 #define radeon_fifo_wait(entries) _radeon_fifo_wait(entries) | |
422 | |
423 #if 0 | |
373 static void __init radeon_vid_save_state( void ) | 424 static void __init radeon_vid_save_state( void ) |
374 { | 425 { |
375 size_t i; | 426 size_t i; |
376 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) | 427 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) |
377 vregs[i].value = INREG(vregs[i].name); | 428 vregs[i].value = INREG(vregs[i].name); |
378 } | 429 } |
379 | 430 |
380 static void __exit radeon_vid_restore_state( void ) | 431 static void __exit radeon_vid_restore_state( void ) |
381 { | 432 { |
382 size_t i; | 433 size_t i; |
434 radeon_fifo_wait(2); | |
435 OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); | |
436 radeon_engine_idle(); | |
437 while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); | |
438 radeon_fifo_wait(15); | |
383 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) | 439 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) |
440 { | |
441 radeon_fifo_wait(1); | |
384 OUTREG(vregs[i].name,vregs[i].value); | 442 OUTREG(vregs[i].name,vregs[i].value); |
385 } | 443 } |
386 | 444 OUTREG(OV0_REG_LOAD_CNTL, 0); |
445 } | |
446 #endif | |
387 #ifdef DEBUG | 447 #ifdef DEBUG |
388 static void radeon_vid_dump_regs( void ) | 448 static void radeon_vid_dump_regs( void ) |
389 { | 449 { |
390 size_t i; | 450 size_t i; |
391 printk(RVID_MSG"*** Begin of OV0 registers dump ***\n"); | 451 printk(RVID_MSG"*** Begin of OV0 registers dump ***\n"); |
395 } | 455 } |
396 #endif | 456 #endif |
397 | 457 |
398 static void radeon_vid_stop_video( void ) | 458 static void radeon_vid_stop_video( void ) |
399 { | 459 { |
460 radeon_engine_idle(); | |
400 OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET); | 461 OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET); |
401 OUTREG(OV0_EXCLUSIVE_HORZ, 0); | 462 OUTREG(OV0_EXCLUSIVE_HORZ, 0); |
402 OUTREG(OV0_AUTO_FLIP_CNTL, 0); /* maybe */ | 463 OUTREG(OV0_AUTO_FLIP_CNTL, 0); /* maybe */ |
403 OUTREG(OV0_FILTER_CNTL, FILTER_HARDCODED_COEF); | 464 OUTREG(OV0_FILTER_CNTL, FILTER_HARDCODED_COEF); |
404 OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_NE); | 465 OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_NE); |
406 } | 467 } |
407 | 468 |
408 static void radeon_vid_display_video( void ) | 469 static void radeon_vid_display_video( void ) |
409 { | 470 { |
410 int bes_flags; | 471 int bes_flags; |
472 radeon_fifo_wait(2); | |
411 OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); | 473 OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); |
474 radeon_engine_idle(); | |
412 while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); | 475 while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); |
413 | 476 radeon_fifo_wait(15); |
414 OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD); | 477 OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD); |
415 OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); | 478 OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); |
416 OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); | 479 OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); |
417 | 480 |
418 OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern); | 481 OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern); |
419 #ifdef RAGE128 | 482 #ifdef RAGE128 |
420 OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) | | 483 OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) | |
421 (besr.saturation << 8) | | 484 (besr.saturation << 8) | |
422 (besr.saturation << 16)); | 485 (besr.saturation << 16)); |
423 #endif | 486 #endif |
487 radeon_fifo_wait(2); | |
424 if(besr.ckey_on) | 488 if(besr.ckey_on) |
425 { | 489 { |
426 OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk); | 490 OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk); |
427 OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr); | 491 OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr); |
428 OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_EQ|VIDEO_KEY_FN_FALSE|CMP_MIX_OR); | 492 OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_EQ|VIDEO_KEY_FN_FALSE|CMP_MIX_OR); |
450 OUTREG(OV0_BASE_ADDR, besr.base_addr); | 514 OUTREG(OV0_BASE_ADDR, besr.base_addr); |
451 #endif | 515 #endif |
452 OUTREG(OV0_VID_BUF0_BASE_ADRS, besr.vid_buf0_base_adrs); | 516 OUTREG(OV0_VID_BUF0_BASE_ADRS, besr.vid_buf0_base_adrs); |
453 OUTREG(OV0_VID_BUF1_BASE_ADRS, besr.vid_buf1_base_adrs); | 517 OUTREG(OV0_VID_BUF1_BASE_ADRS, besr.vid_buf1_base_adrs); |
454 OUTREG(OV0_VID_BUF2_BASE_ADRS, besr.vid_buf2_base_adrs); | 518 OUTREG(OV0_VID_BUF2_BASE_ADRS, besr.vid_buf2_base_adrs); |
519 radeon_fifo_wait(9); | |
455 OUTREG(OV0_VID_BUF3_BASE_ADRS, besr.vid_buf3_base_adrs); | 520 OUTREG(OV0_VID_BUF3_BASE_ADRS, besr.vid_buf3_base_adrs); |
456 OUTREG(OV0_VID_BUF4_BASE_ADRS, besr.vid_buf4_base_adrs); | 521 OUTREG(OV0_VID_BUF4_BASE_ADRS, besr.vid_buf4_base_adrs); |
457 OUTREG(OV0_VID_BUF5_BASE_ADRS, besr.vid_buf5_base_adrs); | 522 OUTREG(OV0_VID_BUF5_BASE_ADRS, besr.vid_buf5_base_adrs); |
458 OUTREG(OV0_P1_V_ACCUM_INIT, besr.p1_v_accum_init); | 523 OUTREG(OV0_P1_V_ACCUM_INIT, besr.p1_v_accum_init); |
459 OUTREG(OV0_P1_H_ACCUM_INIT, besr.p1_h_accum_init); | 524 OUTREG(OV0_P1_H_ACCUM_INIT, besr.p1_h_accum_init); |
1133 unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); | 1198 unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); |
1134 return -EINVAL; | 1199 return -EINVAL; |
1135 } | 1200 } |
1136 radeon_param_buff = kmalloc(PARAM_BUFF_SIZE,GFP_KERNEL); | 1201 radeon_param_buff = kmalloc(PARAM_BUFF_SIZE,GFP_KERNEL); |
1137 if(radeon_param_buff) radeon_param_buff_size = PARAM_BUFF_SIZE; | 1202 if(radeon_param_buff) radeon_param_buff_size = PARAM_BUFF_SIZE; |
1203 #if 0 | |
1138 radeon_vid_save_state(); | 1204 radeon_vid_save_state(); |
1205 #endif | |
1139 radeon_vid_make_default(); | 1206 radeon_vid_make_default(); |
1140 radeon_vid_preset(); | 1207 radeon_vid_preset(); |
1141 #ifdef CONFIG_MTRR | 1208 #ifdef CONFIG_MTRR |
1142 if (mtrr) { | 1209 if (mtrr) { |
1143 smtrr.vram = mtrr_add(radeon_mem_base, | 1210 smtrr.vram = mtrr_add(radeon_mem_base, |
1155 return radeon_vid_initialize(); | 1222 return radeon_vid_initialize(); |
1156 } | 1223 } |
1157 | 1224 |
1158 void __exit cleanup_module(void) | 1225 void __exit cleanup_module(void) |
1159 { | 1226 { |
1227 #if 0 | |
1160 radeon_vid_restore_state(); | 1228 radeon_vid_restore_state(); |
1229 #endif | |
1161 if(radeon_mmio_base) | 1230 if(radeon_mmio_base) |
1162 iounmap(radeon_mmio_base); | 1231 iounmap(radeon_mmio_base); |
1163 kfree(radeon_param_buff); | 1232 kfree(radeon_param_buff); |
1164 RTRACE(RVID_MSG"Cleaning up module\n"); | 1233 RTRACE(RVID_MSG"Cleaning up module\n"); |
1165 unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); | 1234 unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); |