From a0a14b6c6778dd75a816c602d6e44aebb756e8af Mon Sep 17 00:00:00 2001 From: nick Date: Wed, 19 Dec 2001 10:41:08 +0000 Subject: + Added support of FIFO engine (suggested by Vladimir Dergachev) - Disabled save/restore state functions (caused a lots of problems during driver reloading) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3608 b3059339-0415-0410-9bf9-f77b7e298cf2 --- drivers/radeon/radeon_vid.c | 79 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/radeon/radeon_vid.c b/drivers/radeon/radeon_vid.c index cfa46643eb..a79b10439c 100644 --- a/drivers/radeon/radeon_vid.c +++ b/drivers/radeon/radeon_vid.c @@ -17,7 +17,7 @@ * Rage128(pro) stuff of this driver. */ -#define RADEON_VID_VERSION "1.1.1" +#define RADEON_VID_VERSION "1.1.2" /* It's entirely possible this major conflicts with something else @@ -180,7 +180,7 @@ static bes_registers_t besr; #else #define DECLARE_VREG(name) { name, 0 } #endif - +#ifdef DEBUG static video_registers_t vregs[] = { DECLARE_VREG(VIDEOMUX_CNTL), @@ -275,7 +275,7 @@ static video_registers_t vregs[] = DECLARE_VREG(IDCT_AUTH), DECLARE_VREG(IDCT_CONTROL) }; - +#endif static uint32_t radeon_vid_in_use = 0; static uint8_t *radeon_mmio_base = 0; @@ -344,6 +344,13 @@ static char *fourcc_format_name(int format) #define OUTREG8(addr,val) writeb(val, (radeon_mmio_base)+addr) #define INREG(addr) readl((radeon_mmio_base)+addr) #define OUTREG(addr,val) writel(val, (radeon_mmio_base)+addr) +#define OUTREGP(addr,val,mask) \ + do { \ + unsigned int _tmp = INREG(addr); \ + _tmp &= (mask); \ + _tmp |= (val); \ + OUTREG(addr, _tmp); \ + } while (0) static uint32_t radeon_vid_get_dbpp( void ) { @@ -370,6 +377,50 @@ static int radeon_is_interlace( void ) return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN; } +static __inline__ void radeon_engine_flush ( void ) +{ + int i; + + /* initiate flush */ + OUTREGP(RB2D_DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL, + ~RB2D_DC_FLUSH_ALL); + + for (i=0; i < 2000000; i++) { + if (!(INREG(RB2D_DSTCACHE_CTLSTAT) & RB2D_DC_BUSY)) + break; + } +} + + +static __inline__ void _radeon_fifo_wait (int entries) +{ + int i; + + for (i=0; i<2000000; i++) + if ((INREG(RBBM_STATUS) & 0x7f) >= entries) + return; +} + + +static __inline__ void _radeon_engine_idle ( void ) +{ + int i; + + /* ensure FIFO is empty before waiting for idle */ + _radeon_fifo_wait (64); + + for (i=0; i<2000000; i++) { + if (((INREG(RBBM_STATUS) & GUI_ACTIVE)) == 0) { + radeon_engine_flush (); + return; + } + } +} + +#define radeon_engine_idle() _radeon_engine_idle() +#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries) + +#if 0 static void __init radeon_vid_save_state( void ) { size_t i; @@ -380,10 +431,19 @@ static void __init radeon_vid_save_state( void ) static void __exit radeon_vid_restore_state( void ) { size_t i; + radeon_fifo_wait(2); + OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); + radeon_engine_idle(); + while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); + radeon_fifo_wait(15); for(i=0;i