xref: /linux/drivers/gpu/drm/i915/display/vlv_sideband.c (revision 8393253b850b6a5c62d4bb875b582e1582103db8)
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