Panel information incorrectly retrived from BIOS (dithering)

Peter Clifton pcjc2 at
Sun Aug 10 12:48:15 PDT 2008


Having had a poke more at the panel dithering problem, it seems that the
packed bitfield in i830_bios.h is in the wrong order when compiled with
gcc 4.2.3.

This all feels quite dangerous, as a few cursory searches suggest that
the structure packing order could be endian / compiler dependant.

I'm about to give this diff a spin, but there are other packed bit-field
structures which probably ought to be checked. The only reference I have
is the old code, since I'm not sure where (if anywhere) these VBIOS
structures are documented and publicly available.

diff --git a/src/i830_bios.h b/src/i830_bios.h
index a8d9add..2963882 100644
--- a/src/i830_bios.h
+++ b/src/i830_bios.h
@@ -151,14 +151,13 @@ struct bdb_general_definitions {
 struct bdb_lvds_options {
     uint8_t panel_type;
     uint8_t rsvd1;
-    /* LVDS capabilities, stored in a dword */
-    uint8_t rsvd2:1;
-    uint8_t lvds_edid:1;
-    uint8_t pixel_dither:1;
-    uint8_t pfit_ratio_auto:1;
-    uint8_t pfit_gfx_mode_enhanced:1;
-    uint8_t pfit_text_mode_enhanced:1;
     uint8_t pfit_mode:2;
+    uint8_t pfit_text_mode_enhanced:1;
+    uint8_t pfit_gfx_mode_enhanced:1;
+    uint8_t pfit_ratio_auto:1;
+    uint8_t pixel_dither:1;
+    uint8_t lvds_edid:1;
+    uint8_t rsvd2:1;
     uint8_t rsvd4;
 } __attribute__((packed));

Peter Clifton

Electrical Engineering Division,
Engineering Department,
University of Cambridge,
9, JJ Thomson Avenue,

Tel: +44 (0)7729 980173 - (No signal in the lab!)

More information about the xorg mailing list