On Wed, Jul 22, 2009 at 09:31:50PM +0200, Luca Tettamanti wrote:
> 
> The patch for the size of FB is not sufficient; applying the color
> hack makes vesafb work:

Great.  We're almost finished.  Please could you test:

  - Whether the color hack alone is sufficient, or the patch for FB size
    is also needed.

  - Attached patch to (hopefully) fix color properly instead of the hack.

Many thanks!

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
Index: kern/i386/pc/startup.S
===================================================================
--- kern/i386/pc/startup.S	(revision 2439)
+++ kern/i386/pc/startup.S	(working copy)
@@ -1733,6 +1733,42 @@
 	ret
 
 /*
+ * grub_vbe_status_t grub_vbe_bios_get_dac_palette_width (int *dac_mask_size)
+ *
+ * Register allocations for parameters:
+ * %eax		*dac_mask_size
+ */
+FUNCTION(grub_vbe_bios_get_dac_palette_width)
+	pushl	%ebp
+	pushl	%ebx
+
+	pushl	%eax
+
+	xorl	%ebx, %ebx
+	incb	%bl
+
+	call    prot_to_real
+	.code16
+
+	movw	$0x4f08, %ax
+	int	$0x10
+
+	movw	%ax, %dx	/* real_to_prot destroys %eax.  */
+
+	DATA32 call	real_to_prot
+	.code32
+
+	popl	%eax
+	movl	%ebx, (%eax)
+
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax	/* Return value in %eax.  */
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
  * grub_vbe_status_t grub_vbe_bios_set_memory_window (grub_uint32_t window,
  *						      grub_uint32_t position);
  *
Index: video/i386/pc/vbe.c
===================================================================
--- video/i386/pc/vbe.c	(revision 2439)
+++ video/i386/pc/vbe.c	(working copy)
@@ -300,6 +300,16 @@
 
       /* Make copy of mode info block.  */
       grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
+
+      if (mode_info->bits_per_pixel <= 8)
+	{
+	  int width;
+	  status = grub_vbe_bios_get_dac_palette_width (& width);
+	  if (status != 0x004F)
+	    /* Default after mode set.  */
+	    width = 6;
+	  mode_info->red_mask_size = mode_info->green_mask_size = mode_info->blue_mask_size = width;
+	}
     }
   else
     /* Just clear mode info block if it isn't a VESA mode.  */
Index: include/grub/i386/pc/vbe.h
===================================================================
--- include/grub/i386/pc/vbe.h	(revision 2439)
+++ include/grub/i386/pc/vbe.h	(working copy)
@@ -181,6 +181,8 @@
 grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_mode_info) (grub_uint32_t mode,
                                                             struct grub_vbe_mode_info_block *mode_info);
 
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_dac_palette_width) (int *width);
+
 /* Call VESA BIOS 0x4f02 to set video mode, return status.  */
 grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_mode) (grub_uint32_t mode,
                                                        struct grub_vbe_crtc_info_block *crtc_info);

Reply via email to