From deb591ec89313d3f6c590f8d89c4c2e689239b8b Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 8 Mar 2020 15:51:18 +0100 Subject: [PATCH] intel_extreme: fix detection of BDB block with LVDS panel info The terminator is not always present, but the mode (at least the fields we use) seems to be there nonetheless. --- .../drivers/graphics/intel_extreme/bios.cpp | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp index d386f85da5..c4b8ed08db 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp @@ -77,7 +77,7 @@ struct lvds_bdb2_entry { struct lvds_bdb2 { uint8 id; uint16 size; - uint8 table_size; /* unapproved */ + uint8 table_size; /* followed by one or more lvds_data_ptr structs */ struct lvds_bdb2_entry panels[16]; } __attribute__((packed)); @@ -225,7 +225,6 @@ get_lvds_mode_from_bios(display_mode* sharedInfo) delete_area(vbios.area); } - TRACE((DEVICE_NAME": parsing BDB blocks\n")); int blockSize; int panelType = -1; @@ -235,19 +234,21 @@ get_lvds_mode_from_bios(display_mode* sharedInfo) int id = vbios.memory[start]; blockSize = vbios.ReadWord(start + 1) + 3; - // TRACE((DEVICE_NAME": found BDB block type %d\n", id)); switch (id) { case 40: // FIXME magic numbers { struct lvds_bdb1 *lvds1; lvds1 = (struct lvds_bdb1 *)(vbios.memory + start); panelType = lvds1->panel_type; + TRACE((DEVICE_NAME ": panel type: %d\n", panelType)); break; } case 41: { + // First make sure we found block 40 and the panel type if (panelType == -1) break; + struct lvds_bdb2 *lvds2; struct lvds_bdb2_lfp_info *lvds2_lfp_info; @@ -255,14 +256,23 @@ get_lvds_mode_from_bios(display_mode* sharedInfo) lvds2_lfp_info = (struct lvds_bdb2_lfp_info *) (vbios.memory + bdbOffset + lvds2->panels[panelType].lfp_info_offset); - /* found bad one terminator */ - if (lvds2_lfp_info->terminator != 0xffff) { + /* check terminator */ + if (*terminator != 0xffff) { + TRACE((DEVICE_NAME ": Incorrect LFP info terminator %x %x\n", + lvds2_lfp_info->terminator, *terminator)); +#if 0 + // FIXME the terminator is not present on my SandyBridge + // laptop, but the video mode is still correct. Maybe the + // format of the block has changed accross versions. We + // could check the size of the block to detect different + // layouts. delete_area(vbios.area); return false; +#endif } uint8_t* timing_data = vbios.memory + bdbOffset + lvds2->panels[panelType].lfp_edid_dtd_offset; - TRACE((DEVICE_NAME": found LFP of size %d x %d " + TRACE((DEVICE_NAME ": found LFP of size %d x %d " "in BIOS VBT tables\n", lvds2_lfp_info->x_res, lvds2_lfp_info->y_res));