[haiku-commits] Change in haiku[master]: intel_extreme: check internal crt feature in VBT for analog probe on DDI

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 23 May 2022 12:42:22 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: intel_extreme: check internal crt feature in VBT for analog probe on DDI - Gerrit