From c1400fb61762f2c48cb541b3bb79ae011bc853e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 4 Jun 2014 01:00:29 +0200 Subject: [PATCH] intel_extreme: use VESA EDID info as fallback. * Only in case retrieving EDID info failed on head A and C. * Should help with detecting the native resolution for ticket #10878. --- .../graphics/intel_extreme/intel_extreme.h | 7 ++++++- src/add-ons/accelerants/intel_extreme/mode.cpp | 12 +++++++++--- .../kernel/drivers/graphics/intel_extreme/Jamfile | 1 + .../graphics/intel_extreme/intel_extreme.cpp | 15 +++++++++++++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h b/headers/private/graphics/intel_extreme/intel_extreme.h index 7c4c957bef4..9b5ecc55fb6 100644 --- a/headers/private/graphics/intel_extreme/intel_extreme.h +++ b/headers/private/graphics/intel_extreme/intel_extreme.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2009, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2014, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -15,6 +15,8 @@ #include #include +#include + #define VENDOR_ID_INTEL 0x8086 @@ -201,6 +203,9 @@ struct intel_shared_info { DeviceType device_type; char device_identifier[32]; struct pll_info pll_info; + + edid1_info vesa_edid_info; + bool has_vesa_edid_info; }; //----------------- ioctl() interface ---------------- diff --git a/src/add-ons/accelerants/intel_extreme/mode.cpp b/src/add-ons/accelerants/intel_extreme/mode.cpp index 6fbd2c9f6d8..ae63f777f17 100644 --- a/src/add-ons/accelerants/intel_extreme/mode.cpp +++ b/src/add-ons/accelerants/intel_extreme/mode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2014, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Support for i915 chipset and up based on the X driver, @@ -592,15 +592,21 @@ create_mode_list(void) if (gInfo->shared_info->single_head_locked) gInfo->head_mode = HEAD_MODE_A_ANALOG; } else { - TRACE("getting EDID on port A (analog) failed : %s. " + TRACE("getting EDID on port A (analog) failed: %s. " "Trying on port C (lvds)\n", strerror(error)); bus.cookie = (void*)INTEL_I2C_IO_C; error = ddc2_read_edid1(&bus, &gInfo->edid_info, NULL, NULL); if (error == B_OK) { edid_dump(&gInfo->edid_info); gInfo->has_edid = true; + } else if (gInfo->shared_info->has_vesa_edid_info) { + TRACE("getting EDID on port C failed: %s. Use VESA EDID info\n", + strerror(error)); + memcpy(&gInfo->edid_info, &gInfo->shared_info->vesa_edid_info, + sizeof(edid1_info)); + gInfo->has_edid = true; } else { - TRACE("getting EDID on port C failed : %s\n", + TRACE("getting EDID on port C failed: %s\n", strerror(error)); // We could not read any EDID info. Fallback to creating a list with diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/Jamfile b/src/add-ons/kernel/drivers/graphics/intel_extreme/Jamfile index 33e0b0f3a6a..c8641e6cc90 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/Jamfile +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/Jamfile @@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons kernel drivers graphics intel_extreme ; SetSubDirSupportedPlatformsBeOSCompatible ; UsePrivateHeaders [ FDirName graphics intel_extreme ] ; +UsePrivateHeaders [ FDirName graphics vesa ] ; UsePrivateHeaders [ FDirName graphics common ] ; UsePrivateHeaders graphics ; UsePrivateKernelHeaders ; diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp index f9dddbbfcee..04904217e0c 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2010, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2014, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -14,12 +14,16 @@ #include #include #include + +#include #include #include -#include "utility.h" + +#include #include "driver.h" #include "power.h" +#include "utility.h" #define TRACE_INTELEXTREME @@ -395,6 +399,13 @@ intel_extreme_init(intel_info &info) &info.shared_info->physical_cursor_memory); } + edid1_info* edidInfo = (edid1_info*)get_boot_item(VESA_EDID_BOOT_INFO, + NULL); + if (edidInfo != NULL) { + info.shared_info->has_vesa_edid_info = true; + memcpy(&info.shared_info->vesa_edid_info, edidInfo, sizeof(edid1_info)); + } + init_interrupt_handler(info); TRACE("%s: completed successfully!\n", __func__);