cyber2000fb: fix machine hang on module load
PATCH 1/3 cyber2000fb: fix machine hang on module load
I was testing two CyberPro 2000 based PCI cards on x86 and the machine always hanged completely when the cyber2000fb module was loaded. It seems that the card hangs when some registers are accessed too quickly after writing RAMDAC control register. With this patch, both card work.
Add delay after RAMDAC control register write to prevent hangs on module load.
drivers/video/cyber2000fb.c +2 -0
@@ -436,6 +436,8 @@ static void cyber2000fb_write_ramdac_ctrcyber2000fb_writeb (i |4 ,0x3cf , cfb);cyber2000fb_writeb (val,0x3c6 , cfb);cyber2000fb_writeb (i,0x3cf , cfb); +/* prevent card lock-up observed on x86 with CyberPro 2000 */ +cyber2000fb_readb (0x3cf , cfb); }static void cyber2000fb_set_timing (struct cfb_info *cfb,struct par_info *hw)
Signature · 1 line
Ondrej Zary
Quoted 12 lines · Ondrej Zary
I was testing two CyberPro 2000 based PCI cards on x86 and the machine always hanged completely when the cyber2000fb module was loaded. It seems that the card hangs when some registers are accessed too quickly after writing RAMDAC control register. With this patch, both card work.
Add delay after RAMDAC control register write to prevent hangs on module load.
Signed-off-by Ondrej Zary<[email protected]>
drivers/video/cyber2000fb.c static void cyber2000fb_write_ramdac_ctr · line 441
Quoted 6 lines
drivers/video/cyber2000fb.c +2
-0@@ -436,6 +436,8 @@ static void cyber2000fb_write_ramdac_ctrcyber2000fb_writeb (i |4 ,0x3cf , cfb);cyber2000fb_writeb (val,0x3c6 , cfb);cyber2000fb_writeb (i,0x3cf , cfb); +/* prevent card lock-up observed on x86 with CyberPro 2000 */ +cyber2000fb_readb (0x3cf , cfb); }
IIRC, cyber2000 is basically an S3 graphics chip. When working on s3fb, over a decade ago, ISTR needing a lot of MMIO register flushes -- dummy register reads -- to flush out just-written register writes.
Quoted 10 lines · Jeff Garzik
Quoted 9 lines · Ondrej Zary
I was testing two CyberPro 2000 based PCI cards on x86 and the machine always hanged completely when the cyber2000fb module was loaded. It seems that the card hangs when some registers are accessed too quickly after writing RAMDAC control register. With this patch, both card work.
Add delay after RAMDAC control register write to prevent hangs on module load.
Signed-off-by Ondrej Zary<[email protected]>
Quoted 11 lines
drivers/video/cyber2000fb.c static void cyber2000fb_write_ramdac_ctr · line 441
Quoted 9 lines
drivers/video/cyber2000fb.c +2
-0@@ -436,6 +436,8 @@ static void cyber2000fb_write_ramdac_ctrcyber2000fb_writeb (i |4 ,0x3cf , cfb);cyber2000fb_writeb (val,0x3c6 , cfb);cyber2000fb_writeb (i,0x3cf , cfb); +/* prevent card lock-up observed on x86 with CyberPro 2000 */ +cyber2000fb_readb (0x3cf , cfb); }IIRC, cyber2000 is basically an S3 graphics chip.
No such luck. It's a proprietary Integraphics chip, mainly used in ARM Netwinders some 10 years ago. It's completely different from the S3 chips such as Trio64.
Quoted 23 lines · Russell King - ARM Linux
Quoted 10 lines · Jeff Garzik
Quoted 9 lines · Ondrej Zary
I was testing two CyberPro 2000 based PCI cards on x86 and the machine always hanged completely when the cyber2000fb module was loaded. It seems that the card hangs when some registers are accessed too quickly after writing RAMDAC control register. With this patch, both card work.
Add delay after RAMDAC control register write to prevent hangs on module load.
Signed-off-by Ondrej Zary<[email protected]>Quoted 11 lines
drivers/video/cyber2000fb.c static void cyber2000fb_write_ramdac_ctr · line 441
Quoted 9 lines
drivers/video/cyber2000fb.c +2
-0@@ -436,6 +436,8 @@ static void cyber2000fb_write_ramdac_ctrcyber2000fb_writeb (i |4 ,0x3cf , cfb);cyber2000fb_writeb (val,0x3c6 , cfb);cyber2000fb_writeb (i,0x3cf , cfb); +/* prevent card lock-up observed on x86 with CyberPro 2000 */ +cyber2000fb_readb (0x3cf , cfb); }IIRC, cyber2000 is basically an S3 graphics chip.
Quoted 3 lines
No such luck. It's a proprietary Integraphics chip, mainly used in ARM Netwinders some 10 years ago. It's completely different from the S3 chips such as Trio64.
Ah, I stand corrected. Maybe that was cyberfb I was remembering...
Jeff
Quoted 6 lines · Jeff Garzik
Quoted 3 lines · Russell King - ARM Linux
No such luck. It's a proprietary Integraphics chip, mainly used in ARM Netwinders some 10 years ago. It's completely different from the S3 chips such as Trio64.
Ah, I stand corrected. Maybe that was cyberfb I was remembering...
I think so - the old cyberfb.h contained this:
-/* s3 commands */
-#define S3_BITBLT 0xc011
-#define S3_TWOPOINTLINE 0x2811
-#define S3_FILLEDRECT 0x40b1
so yes, it was similar to the S3 driver.