[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bootsplash



Le 11 Septembre 2005 04:50, mess-mate a écrit :
> Hi,
> i've installed bootsplash on a machine without any problem.
> But can't do the same on a second machine :
> -233 k6 with a S3Virge graphic car.
> Seems 'mode' (vga) isn't right when booting and have to select an
> other mode like for example 80x30.
> Setted the grub vga=788 (800x600 16bit) and configured bootsplash to
> 640/480,800/600,1024/728 with of course the appropriate boosplash
> image.
> What did i wrong ?

I have encountered this problem with S3 Virge cards.

I found a patch for 2.4 kernels (tested on 2.4.21 and 2.4.24) which side-steps
the problem, by setting video modes through VESA.

Let me know if it works.



--- linux/arch/i386/boot/video.S.orig	Fri Mar 15 13:33:50 2002
+++ linux/arch/i386/boot/video.S	Fri Mar 15 13:50:02 2002
@@ -543,13 +543,22 @@
 	cmpb	$0x09, %al
 	jz	setvesa				# This is a text mode
 
+#ifdef CONFIG_FB_S3CARD
+/*
+ * removed the check for linear frame buffer as
+ * we're going to try and turn it on ourselves
+ */
+#else
 	movb	(%di), %al			# Check capabilities.
 	andb	$0x99, %al
 	cmpb	$0x99, %al
 	jnz	_setbad				# Doh! No linear frame buffer.
+#endif
 
 	subb	$VIDEO_FIRST_VESA>>8, %bh
+#ifndef CONFIG_FB_S3CARD
 	orw	$0x4000, %bx			# Use linear frame buffer
+#endif
 	movw	$0x4f02, %ax			# VESA BIOS mode set call
 	int	$0x10
 	cmpw	$0x004f, %ax			# AL=4f if implemented
--- linux/drivers/video/Config.in.orig	Fri Mar 15 13:49:33 2002
+++ linux/drivers/video/Config.in	Fri Mar 15 13:50:02 2002
@@ -89,6 +89,11 @@
    fi
    if [ "$CONFIG_X86" = "y" ]; then
       tristate '  VESA VGA graphics console' CONFIG_FB_VESA
+      if [ "$CONFIG_FB_VESA" = "y" ]; then
+         if [ "$CONFIG_PCI" != "n" ]; then
+            bool 'S3 display support' CONFIG_FB_S3CARD
+         fi
+      fi
       tristate '  VGA 16-color graphics console' CONFIG_FB_VGA16
       tristate '  Hercules mono graphics console (EXPERIMENTAL)' CONFIG_FB_HGA
       define_bool CONFIG_VIDEO_SELECT y
--- linux/drivers/video/vesafb.c.orig	Fri Mar 15 13:49:27 2002
+++ linux/drivers/video/vesafb.c	Fri Mar 15 14:36:54 2002
@@ -21,6 +21,7 @@
 #include <linux/selection.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
+#include <linux/pci.h>
 
 #include <asm/io.h>
 #include <asm/mtrr.h>
@@ -34,6 +35,10 @@
 
 #define dac_reg	(0x3c8)
 #define dac_val	(0x3c9)
+#ifdef CONFIG_FB_S3CARD
+#define crtc_adr       (0x3d4)
+#define crtc_val       (0x3d5)
+#endif
 
 /* --------------------------------------------------------------------- */
 
@@ -507,6 +512,81 @@
 
 	if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB)
 		return -ENXIO;
+#ifdef CONFIG_FB_S3CARD
+        do
+        {
+                // ----------------------------------------------
+                // try and enable linear frame buffer on S3 cards
+                // ----------------------------------------------
+ 
+                struct pci_dev *dev;
+                u8 tmp;
+                
+                // find S3 on PCI bus
+ 
+		for(dev = pci_dev_g(pci_devices.next); dev != pci_dev_g(&pci_devices) && (dev->vendor != PCI_VENDOR_ID_S3 || dev->class >> 8 != PCI_CLASS_DISPLAY_VGA); dev = pci_dev_g(dev->global_list.next));
+                if(dev == pci_dev_g(&pci_devices) && (dev->vendor != PCI_VENDOR_ID_S3 || dev->class >> 8 != PCI_CLASS_DISPLAY_VGA))
+                {
+                        break;
+                }
+                
+                // unlock S3 registers
+                
+                outb_p(0x38, crtc_adr); outb_p(0x48, crtc_val);
+                outb_p(0x39, crtc_adr); outb_p(0xa5, crtc_val);
+                
+                // check that CR47 is read/write
+                
+                outb_p(0x47, crtc_adr); outb_p(0xff, crtc_val);
+                tmp = inb_p(crtc_val);
+                outb_p(0x00, crtc_val);
+                if(tmp != 0xff || inb_p(crtc_val))
+                {
+                        // lock S3 registers
+ 
+                        outb_p(0x39, crtc_adr); outb_p(0x5a, crtc_val);
+                        outb_p(0x38, crtc_adr); outb_p(0x00, crtc_val);
+                        
+                        break;
+                }
+ 
+                printk("vesafb: enabling S3 linear frame buffer\n");
+ 
+                // enable enhanced register access
+                
+                outb_p(0x40, crtc_adr); outb_p(inb_p(crtc_val) | 1, crtc_val);
+                
+                // enable enhanced functions
+                
+                outb_p(inb_p(0x4ae8) | 1, 0x4ae8);
+                
+                // enable enhanced mode memory mapping
+                
+                outb_p(0x31, crtc_adr); outb_p(inb_p(crtc_val) | 8, crtc_val);
+                
+                // enable linear frame buffer and set address window to max
+                
+                outb_p(0x58, crtc_adr); outb_p(inb_p(crtc_val) | 0x13, crtc_val);
+ 
+                // disabled enhanced register access
+ 
+                outb_p(0x40, crtc_adr); outb_p(inb_p(crtc_val) & ~1, crtc_val);
+ 
+                // lock S3 registers
+ 
+                outb_p(0x39, crtc_adr); outb_p(0x5a, crtc_val);
+                outb_p(0x38, crtc_adr); outb_p(0x00, crtc_val);
+ 
+                // save base address
+                
+		screen_info.lfb_base = dev->resource[0].start;
+ 
+                // disable fancy stuff
+ 
+                screen_info.vesapm_seg = 0;
+        }
+        while(0);
+#endif
 
 	video_base          = screen_info.lfb_base;
 	video_bpp           = screen_info.lfb_depth;



Reply to: