1*8393253bSJani Nikula // SPDX-License-Identifier: MIT 2*8393253bSJani Nikula /* Copyright © 2025 Intel Corporation */ 3*8393253bSJani Nikula 4*8393253bSJani Nikula #include "i915_drv.h" 5*8393253bSJani Nikula #include "intel_dpio_phy.h" 6*8393253bSJani Nikula #include "vlv_sideband.h" 7*8393253bSJani Nikula 8*8393253bSJani Nikula static enum vlv_iosf_sb_unit vlv_dpio_phy_to_unit(struct drm_i915_private *i915, 9*8393253bSJani Nikula enum dpio_phy phy) 10*8393253bSJani Nikula { 11*8393253bSJani Nikula /* 12*8393253bSJani Nikula * IOSF_PORT_DPIO: VLV x2 PHY (DP/HDMI B and C), CHV x1 PHY (DP/HDMI D) 13*8393253bSJani Nikula * IOSF_PORT_DPIO_2: CHV x2 PHY (DP/HDMI B and C) 14*8393253bSJani Nikula */ 15*8393253bSJani Nikula if (IS_CHERRYVIEW(i915)) 16*8393253bSJani Nikula return phy == DPIO_PHY0 ? VLV_IOSF_SB_DPIO_2 : VLV_IOSF_SB_DPIO; 17*8393253bSJani Nikula else 18*8393253bSJani Nikula return VLV_IOSF_SB_DPIO; 19*8393253bSJani Nikula } 20*8393253bSJani Nikula 21*8393253bSJani Nikula u32 vlv_dpio_read(struct drm_i915_private *i915, enum dpio_phy phy, int reg) 22*8393253bSJani Nikula { 23*8393253bSJani Nikula enum vlv_iosf_sb_unit unit = vlv_dpio_phy_to_unit(i915, phy); 24*8393253bSJani Nikula u32 val; 25*8393253bSJani Nikula 26*8393253bSJani Nikula val = vlv_iosf_sb_read(i915, unit, reg); 27*8393253bSJani Nikula 28*8393253bSJani Nikula /* 29*8393253bSJani Nikula * FIXME: There might be some registers where all 1's is a valid value, 30*8393253bSJani Nikula * so ideally we should check the register offset instead... 31*8393253bSJani Nikula */ 32*8393253bSJani Nikula drm_WARN(&i915->drm, val == 0xffffffff, 33*8393253bSJani Nikula "DPIO PHY%d read reg 0x%x == 0x%x\n", 34*8393253bSJani Nikula phy, reg, val); 35*8393253bSJani Nikula 36*8393253bSJani Nikula return val; 37*8393253bSJani Nikula } 38*8393253bSJani Nikula 39*8393253bSJani Nikula void vlv_dpio_write(struct drm_i915_private *i915, 40*8393253bSJani Nikula enum dpio_phy phy, int reg, u32 val) 41*8393253bSJani Nikula { 42*8393253bSJani Nikula enum vlv_iosf_sb_unit unit = vlv_dpio_phy_to_unit(i915, phy); 43*8393253bSJani Nikula 44*8393253bSJani Nikula vlv_iosf_sb_write(i915, unit, reg, val); 45*8393253bSJani Nikula } 46