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)&REG_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)&REG_LD_CTL_LOCK_READBACK)); 475 while(!(INREG(OV0_REG_LOAD_CNTL)&REG_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");