From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/5334 ;)
Change subject: intel_extreme: check internal crt feature in VBT for analog
probe on DDI
......................................................................
intel_extreme: check internal crt feature in VBT for analog probe on DDI
* also uses the BAR size when dumping regs (as done by the intel_reg tool).
---
M headers/private/graphics/intel_extreme/intel_extreme.h
M src/add-ons/accelerants/intel_extreme/accelerant.cpp
M src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp
M src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp
4 files changed, 71 insertions(+), 6 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/34/5334/1
diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h
b/headers/private/graphics/intel_extreme/intel_extreme.h
index aeabde5..8ca923c 100644
--- a/headers/private/graphics/intel_extreme/intel_extreme.h
+++ b/headers/private/graphics/intel_extreme/intel_extreme.h
@@ -476,6 +476,7 @@
edid1_info vesa_edid_info;
bool has_vesa_edid_info;
+ bool internal_crt_support;
uint32 device_config_count;
child_device_config device_configs[10];
};
diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.cpp
b/src/add-ons/accelerants/intel_extreme/accelerant.cpp
index d47bba9..a633460 100644
--- a/src/add-ons/accelerants/intel_extreme/accelerant.cpp
+++ b/src/add-ons/accelerants/intel_extreme/accelerant.cpp
@@ -55,10 +55,13 @@
ERROR("%s: Taking register dump #%" B_PRId32 "\n", __func__,
gDumpCount);
+ area_info areaInfo;
+ get_area_info(gInfo->shared_info->registers_area, &areaInfo);
+
int fd = open(filename, O_CREAT | O_WRONLY, 0644);
uint32 data = 0;
if (fd >= 0) {
- for (int32 i = 0; i < 0x80000; i += sizeof(data)) {
+ for (uint32 i = 0; i < areaInfo.size; i += sizeof(data)) {
//char line[512];
//int length = sprintf(line, "%05" B_PRIx32 ": "
// "%08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32
" %08" B_PRIx32 "\n",
@@ -391,7 +394,8 @@
}
// then finally always try the analog port when chipsets supports it
- if (gInfo->shared_info->device_type.Generation() <= 8) {
+ if (gInfo->shared_info->device_type.Generation() <= 8
+ && gInfo->shared_info->internal_crt_support) {
TRACE("Probing Analog\n");
Port* analogPort = new(std::nothrow) AnalogPort();
if (analogPort == NULL)
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 ad8dd01..a00992c 100644
--- a/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp
+++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp
@@ -44,7 +44,8 @@
enum bdb_block_id {
- BDB_GENERAL_DEFINITIONS = 2,
+ BDB_GENERAL_FEATURES = 1,
+ BDB_GENERAL_DEFINITIONS,
BDB_LVDS_OPTIONS = 40,
BDB_LVDS_LFP_DATA_PTRS = 41,
BDB_LVDS_BACKLIGHT = 43,
@@ -52,6 +53,52 @@
};
+struct bdb_general_features {
+ uint8 id;
+ uint16 size;
+
+ uint8 panel_fitting: 2;
+ bool flexaim: 1;
+ bool msg_enable: 1;
+ uint8 clear_screen: 3;
+ bool color_flip: 1;
+
+ bool download_ext_vbt: 1;
+ bool enable_ssc: 1;
+ bool ssc_freq: 1;
+ bool enable_lfp_on_override: 1;
+ bool disable_ssc_ddt: 1;
+ bool underscan_vga_timings: 1;
+ bool display_clock_mode: 1;
+ bool vbios_hotplug_support: 1;
+
+ bool disable_smooth_vision: 1;
+ bool single_dvi: 1;
+ bool rotate_180: 1;
+ bool fdi_rx_polarity_inverted: 1;
+ bool vbios_extended_mode: 1;
+ bool copy_ilfp_dtd_to_svo_lvds_dtd: 1;
+ bool panel_best_fit_timing: 1;
+ bool ignore_strap_state: 1;
+
+ uint8 legacy_monitor_detect;
+
+ bool int_crt_support: 1;
+ bool int_tv_support: 1;
+ bool int_efp_support: 1;
+ bool dp_ssc_enable: 1;
+ bool dp_ssc_freq: 1;
+ bool dp_ssc_dongle_supported: 1;
+ uint8 rsvd11: 2;
+
+ uint8 tc_hpd_retry_timeout: 7;
+ bool rsvd12: 1;
+
+ uint8 afc_startup_config: 2;
+ uint8 rsvd13: 6;
+} __attribute__((packed));
+
+
struct bdb_general_definitions {
uint8 id;
uint16 size;
@@ -465,6 +512,19 @@
int id = vbios.memory[start];
blockSize = vbios.ReadWord(start + 1) + 3;
switch (id) {
+ case BDB_GENERAL_FEATURES:
+ {
+ struct bdb_general_features* features;
+ features = (struct
bdb_general_features*)(vbios.memory + start);
+ if (bdb->version >= 155
+ && (info->device_type.HasDDI()
+ ||
info->device_type.InGroup(INTEL_GROUP_VLV))) {
+ info->internal_crt_support =
features->int_crt_support;
+ TRACE((DEVICE_NAME ":
internal_crt_support: 0x%x\n",
+ info->internal_crt_support));
+ }
+ break;
+ }
case BDB_GENERAL_DEFINITIONS:
{
info->device_config_count = 0;
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 5453c5d..2220305 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
@@ -747,6 +747,9 @@
info.shared_info->frame_buffer = 0;
info.shared_info->dpms_mode = B_DPMS_ON;
info.shared_info->min_brightness = 2;
+ info.shared_info->internal_crt_support = true;
+ info.shared_info->pch_info = info.pch_info;
+ info.shared_info->device_type = info.device_type;
// Pull VBIOS info for later use
info.shared_info->got_vbt = parse_vbt_from_bios(info.shared_info);
@@ -806,9 +809,6 @@
info.shared_info->pll_info.divisor_register =
INTEL_DISPLAY_A_PLL_DIVISOR_0;
- info.shared_info->pch_info = info.pch_info;
-
- info.shared_info->device_type = info.device_type;
#ifdef __HAIKU__
strlcpy(info.shared_info->device_identifier, info.device_identifier,
sizeof(info.shared_info->device_identifier));
--
To view, visit https://review.haiku-os.org/c/haiku/+/5334
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ie29768afc8f9c42bb9a03b2866db34c4b0e43b7d
Gerrit-Change-Number: 5334
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange