summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/i830.h1
-rw-r--r--src/i830_bios.c18
-rw-r--r--src/i830_lvds.c7
3 files changed, 26 insertions, 0 deletions
diff --git a/src/i830.h b/src/i830.h
index 7904b9fc..eb686ae8 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -619,6 +619,7 @@ typedef struct _I830Rec {
Bool lvds_dither;
DisplayModePtr lvds_fixed_mode;
Bool skip_panel_detect;
+ Bool integrated_lvds; /* LVDS config from driver feature BDB */
Bool tv_present; /* TV connector present (from VBIOS) */
diff --git a/src/i830_bios.c b/src/i830_bios.c
index 6baacd48..a990ebec 100644
--- a/src/i830_bios.c
+++ b/src/i830_bios.c
@@ -168,6 +168,23 @@ parse_general_features(I830Ptr pI830, struct bdb_header *bdb)
}
}
+static void
+parse_driver_feature(I830Ptr pI830, struct bdb_header *bdb)
+{
+ struct bdb_driver_feature *feature;
+
+ /* For mobile chip, set default as true */
+ if (IS_MOBILE(pI830))
+ pI830->integrated_lvds = TRUE;
+
+ feature = find_section(bdb, BDB_DRIVER_FEATURES);
+ if (!feature)
+ return;
+
+ if (feature->lvds_config != BDB_DRIVER_INT_LVDS)
+ pI830->integrated_lvds = FALSE;
+}
+
#define INTEL_VBIOS_SIZE (64 * 1024) /* XXX */
/**
@@ -246,6 +263,7 @@ i830_bios_init(ScrnInfoPtr pScrn)
parse_general_features(pI830, bdb);
parse_panel_data(pI830, bdb);
+ parse_driver_feature(pI830, bdb);
xfree(bios);
diff --git a/src/i830_lvds.c b/src/i830_lvds.c
index 027bb5de..63533cdc 100644
--- a/src/i830_lvds.c
+++ b/src/i830_lvds.c
@@ -1415,6 +1415,13 @@ i830_lvds_init(ScrnInfoPtr pScrn)
DisplayModePtr lvds_ddc_mode = NULL;
struct i830_lvds_priv *dev_priv;
+ if (!pI830->integrated_lvds) {
+ if (pI830->debug_modes)
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Skipping LVDS from driver feature BDB's LVDS config info.\n");
+ return;
+ }
+
if (pI830->quirk_flag & QUIRK_IGNORE_LVDS)
return;