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;