s3fb: fix Virge/VX
PATCH 1/1 s3fb: fix Virge/VX
Add memory size detection for Virge/VX and small delay in mode setting (same as in X.org driver) to fix blank screen problem.
Also adjust DTPC position to fix garbled screen in some modes (tested that this adjustment does not break other cards - at least Trio32, Trio64V+, Trio64V2/DX, Virge, Virge/DX).
Tested on ELSA Winner 2000AVI/3D.
Signed-off-by Ondrej Zary <[email protected]>
drivers/video/s3fb.c +28 -2
@@ -727,7 +727,7 @@if (par->chip =CHIP_988_VIRGE_VX ) {vga_wcrt (par->state.vgabase,0x50 ,0x00 );vga_wcrt (par->state.vgabase,0x67 ,0x50 ); - +msleep (10 );/* screen remains blank sometimes without this */ vga_wcrt (par->state.vgabase,0x63 , (mode <=2 ) ?0x90 :0x09 );vga_wcrt (par->state.vgabase,0x66 ,0x90 ); }
@@ -901,7 +901,8 @@/* Set Data Transfer Position */ hsstart = ((info->var.xres + info->var.right_margin) * hmul) /8 ; - value =clamp ((htotal + hsstart +1 ) /2 , hsstart +4 , htotal +1 ); +/* + 2 is needed for Virge/VX, does no harm on other cards */ + value =clamp ((htotal + hsstart +1 ) /2 +2 , hsstart +4 , htotal +1 );svga_wcrt_multi (par->state.vgabase, s3_dtpc_regs, value);memset_io (info->screen_base,0x00 , screen_size);
@@ -1215,6 +1216,31 @@ info->screen_size =2 <<20 ;break ; } + }else if (par->chip =CHIP_988_VIRGE_VX ) { +switch ((regval &0x60 ) >>5 ) { +case 0 :/* 2MB */ + info->screen_size =2 <<20 ; +break ; +case 1 :/* 4MB */ + info->screen_size =4 <<20 ; +break ; +case 2 :/* 6MB */ + info->screen_size =6 <<20 ; +break ; +case 3 :/* 8MB */ + info->screen_size =8 <<20 ; +break ; + } +/* off-screen memory */ + regval =vga_rcrt (par->state.vgabase,0x37 ); +switch ((regval &0x60 ) >>5 ) { +case 1 :/* 4MB */ + info->screen_size -=4 <<20 ; +break ; +case 2 :/* 2MB */ + info->screen_size -=2 <<20 ; +break ; + } }else info->screen_size = s3_memsizes[regval >>5 ] <<10 ; info->fix.smem_len = info->screen_size;
Signature · 1 line
Ondrej Zary
Florian Tobias Schandinat
AppliedQuoted 10 lines · Ondrej Zary
Add memory size detection for Virge/VX and small delay in mode setting (same as in X.org driver) to fix blank screen problem.
Also adjust DTPC position to fix garbled screen in some modes (tested that this adjustment does not break other cards - at least Trio32, Trio64V+, Trio64V2/DX, Virge, Virge/DX).
Tested on ELSA Winner 2000AVI/3D.
Signed-off-by Ondrej Zary <[email protected]>
Applied.
Thanks,
Florian Tobias Schandinat
Quoted 56 lines
drivers/video/s3fb.c +28
-2@@ -727,7 +727,7 @@if (par->chip =CHIP_988_VIRGE_VX ) {vga_wcrt (par->state.vgabase,0x50 ,0x00 );vga_wcrt (par->state.vgabase,0x67 ,0x50 ); - +msleep (10 );/* screen remains blank sometimes without this */ vga_wcrt (par->state.vgabase,0x63 , (mode <=2 ) ?0x90 :0x09 );vga_wcrt (par->state.vgabase,0x66 ,0x90 ); }@@ -901,7 +901,8 @@/* Set Data Transfer Position */ hsstart = ((info->var.xres + info->var.right_margin) * hmul) /8 ; - value =clamp ((htotal + hsstart +1 ) /2 , hsstart +4 , htotal +1 ); +/* + 2 is needed for Virge/VX, does no harm on other cards */ + value =clamp ((htotal + hsstart +1 ) /2 +2 , hsstart +4 , htotal +1 );svga_wcrt_multi (par->state.vgabase, s3_dtpc_regs, value);memset_io (info->screen_base,0x00 , screen_size);@@ -1215,6 +1216,31 @@ info->screen_size =2 <<20 ;break ; } + }else if (par->chip =CHIP_988_VIRGE_VX ) { +switch ((regval &0x60 ) >>5 ) { +case 0 :/* 2MB */ + info->screen_size =2 <<20 ; +break ; +case 1 :/* 4MB */ + info->screen_size =4 <<20 ; +break ; +case 2 :/* 6MB */ + info->screen_size =6 <<20 ; +break ; +case 3 :/* 8MB */ + info->screen_size =8 <<20 ; +break ; + } +/* off-screen memory */ + regval =vga_rcrt (par->state.vgabase,0x37 ); +switch ((regval &0x60 ) >>5 ) { +case 1 :/* 4MB */ + info->screen_size -=4 <<20 ; +break ; +case 2 :/* 2MB */ + info->screen_size -=2 <<20 ; +break ; + } }else info->screen_size = s3_memsizes[regval >>5 ] <<10 ; info->fix.smem_len = info->screen_size;