diff options
-rw-r--r-- | src/i830.h | 1 | ||||
-rw-r--r-- | src/i830_bios.c | 18 | ||||
-rw-r--r-- | src/i830_lvds.c | 7 |
3 files changed, 26 insertions, 0 deletions
@@ -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; |