[haiku-commits] haiku: hrev56113 - src/add-ons/kernel/drivers/graphics/intel_extreme headers/private/graphics/intel_extreme src/add-ons/accelerants/intel_extreme

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 18 May 2022 22:02:05 +0000 (UTC)

hrev56113 adds 1 changeset to branch 'master'
old head: fe3aff01c02ba13c45e58421583048add6821631
new head: 514c42d7408d7519531f636bdd1e0bef0430dd49
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=514c42d7408d+%5Efe3aff01c02b

----------------------------------------------------------------------------

514c42d7408d: intel_extreme: improve DpAux support on HSW/SNB/IVB
  
  hraw_clock is possibly dynamic, but for the usecase this seems good enough.
  Tested on SandyBridge and Haswell laptops.
  
  Change-Id: I045b3c03f6b37bbffb3d8688658ffaa2a97311ae
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/5319
  Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>
  Reviewed-by: Jérôme Duval <jerome.duval@xxxxxxxxx>

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev56113
Commit:      514c42d7408d7519531f636bdd1e0bef0430dd49
URL:         https://git.haiku-os.org/haiku/commit/?id=514c42d7408d
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Wed May 18 15:24:29 2022 UTC

----------------------------------------------------------------------------

3 files changed, 47 insertions(+), 1 deletion(-)
.../graphics/intel_extreme/intel_extreme.h       | 13 +++++++++
src/add-ons/accelerants/intel_extreme/Ports.cpp  |  7 ++++-
.../graphics/intel_extreme/intel_extreme.cpp     | 28 ++++++++++++++++++++

----------------------------------------------------------------------------

diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h 
b/headers/private/graphics/intel_extreme/intel_extreme.h
index 31f732ea07..aeabde514c 100644
--- a/headers/private/graphics/intel_extreme/intel_extreme.h
+++ b/headers/private/graphics/intel_extreme/intel_extreme.h
@@ -439,6 +439,8 @@ struct intel_shared_info {
        uint32                  frame_buffer_offset;
 
        uint32                  fdi_link_frequency;     // In Mhz
+       uint32                  hraw_clock;
+       uint32                  hw_cdclk;
 
        bool                    got_vbt;
        bool                    single_head_locked;
@@ -917,6 +919,11 @@ struct intel_brightness_legacy {
 #define ICL_DSSM_19200                                 1
 #define ICL_DSSM_38400                                 2
 
+#define LCPLL_CTL                                              0x130040
+#define LCPLL_CLK_FREQ_MASK                            (3 << 26)
+#define LCPLL_CLK_FREQ_450                             (0 << 26)
+#define LCPLL_CD_SOURCE_FCLK                   (1 << 21)
+
 // display
 
 #define INTEL_DISPLAY_OFFSET                   0x1000
@@ -1272,6 +1279,9 @@ struct intel_brightness_legacy {
 #define DREF_SSC4_DISABLE                                      (0 << 0)
 #define DREF_SSC4_ENABLE                                       (1 << 0)
 
+#define PCH_RAWCLK_FREQ                                                (0x6204 
| REGS_SOUTH_SHARED)
+#define RAWCLK_FREQ_MASK                                       0x3ff
+
 // PLL registers
 //  Multiplier Divisor
 #define INTEL_DISPLAY_A_PLL                            (0x6014 | 
REGS_SOUTH_SHARED)
@@ -1603,6 +1613,9 @@ struct intel_brightness_legacy {
 #define FDI_RX_PHASE_SYNC_POINTER_EN   (1 << 0)
 #define FDI_RX_PHASE_SYNC_POINTER_OVR  (1 << 1)
 
+#define SFUSE_STRAP                                            (0x2014 | 
REGS_SOUTH_SHARED)
+#define SFUSE_STRAP_RAW_FREQUENCY              (1 << 8)
+
 // CPU Panel Fitters - These are for IronLake and up and are the CPU internal
 // panel fitters.
 #define PCH_PANEL_FITTER_BASE_REGISTER 0x68000
diff --git a/src/add-ons/accelerants/intel_extreme/Ports.cpp 
b/src/add-ons/accelerants/intel_extreme/Ports.cpp
index c5bb79dff8..bb3245e1d2 100644
--- a/src/add-ons/accelerants/intel_extreme/Ports.cpp
+++ b/src/add-ons/accelerants/intel_extreme/Ports.cpp
@@ -781,7 +781,12 @@ Port::_DpAuxTransfer(uint8* transmitBuffer, uint8 
transmitSize,
                        | (transmitSize << INTEL_DP_AUX_CTL_MSG_SIZE_SHIFT) | 
INTEL_DP_AUX_CTL_FW_SYNC_PULSE_SKL(32)
                        | INTEL_DP_AUX_CTL_SYNC_PULSE_SKL(32);
        } else {
-               uint32 aux_clock_divider = 0xe1; // TODO: value for 450Mhz
+               uint32 frequency = gInfo->shared_info->hw_cdclk;
+               if (channel != AUX_CH_A)
+                       frequency = gInfo->shared_info->hraw_clock;
+               uint32 aux_clock_divider = (frequency + 2000 / 2) / 2000;
+               if (gInfo->shared_info->pch_info == INTEL_PCH_LPT && channel != 
AUX_CH_A)
+                       aux_clock_divider = 0x48; // or 0x3f
                uint32 timeout = INTEL_DP_AUX_CTL_TIMEOUT_400us;
                if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_BDW))
                        timeout = INTEL_DP_AUX_CTL_TIMEOUT_600us;
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 05f30504e0..5453c5d784 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
@@ -867,10 +867,38 @@ intel_extreme_init(intel_info &info)
                } else {
                        info.shared_info->fdi_link_frequency = 2700;
                }
+               if (info.shared_info->pch_info >= INTEL_PCH_CNP) {
+                       // TODO read/write info.shared_info->hraw_clock
+               } else {
+                       info.shared_info->hraw_clock = (read32(info, 
PCH_RAWCLK_FREQ)
+                               & RAWCLK_FREQ_MASK) * 1000;
+                       TRACE("%s: rawclk rate: %" B_PRIu32 " kHz\n", __func__, 
info.shared_info->hraw_clock);
+               }
        } else {
+               // TODO read info.shared_info->hraw_clock
                info.shared_info->fdi_link_frequency = 0;
        }
 
+       if (info.device_type.InGroup(INTEL_GROUP_HAS)) {
+               uint32 lcpll = read32(info, LCPLL_CTL);
+               if ((lcpll & LCPLL_CD_SOURCE_FCLK) != 0)
+                       info.shared_info->hw_cdclk = 800000;
+               else if ((lcpll & LCPLL_CLK_FREQ_MASK) == LCPLL_CLK_FREQ_450)
+                       info.shared_info->hw_cdclk = 450000;
+               /* ULT type is missing
+               else if (IS_ULT)
+                       info.shared_info->hw_cdclk = 337500;
+               */
+               else
+                       info.shared_info->hw_cdclk = 540000;
+       } else if (info.device_type.InGroup(INTEL_GROUP_SNB)
+               || info.device_type.InGroup(INTEL_GROUP_IVB)) {
+               info.shared_info->hw_cdclk = 400000;
+       } else if (info.device_type.InGroup(INTEL_GROUP_ILK)) {
+               info.shared_info->hw_cdclk = 450000;
+       }
+       TRACE("%s: hw_cdclk: %" B_PRIu32 " kHz\n", __func__, 
info.shared_info->hw_cdclk);
+
        TRACE("%s: completed successfully!\n", __func__);
        return B_OK;
 }


Other related posts:

  • » [haiku-commits] haiku: hrev56113 - src/add-ons/kernel/drivers/graphics/intel_extreme headers/private/graphics/intel_extreme src/add-ons/accelerants/intel_extreme - Jérôme Duval