aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_sideband.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sideband.c')
-rw-r--r--drivers/gpu/drm/i915/intel_sideband.c79
1 files changed, 73 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_sideband.c b/drivers/gpu/drm/i915/intel_sideband.c
index 9a0e6c5ea540..9944d8135e87 100644
--- a/drivers/gpu/drm/i915/intel_sideband.c
+++ b/drivers/gpu/drm/i915/intel_sideband.c
@@ -25,7 +25,10 @@
25#include "i915_drv.h" 25#include "i915_drv.h"
26#include "intel_drv.h" 26#include "intel_drv.h"
27 27
28/* IOSF sideband */ 28/*
29 * IOSF sideband, see VLV2_SidebandMsg_HAS.docx and
30 * VLV_VLV2_PUNIT_HAS_0.8.docx
31 */
29static int vlv_sideband_rw(struct drm_i915_private *dev_priv, u32 devfn, 32static int vlv_sideband_rw(struct drm_i915_private *dev_priv, u32 devfn,
30 u32 port, u32 opcode, u32 addr, u32 *val) 33 u32 port, u32 opcode, u32 addr, u32 *val)
31{ 34{
@@ -101,19 +104,83 @@ u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
101 return val; 104 return val;
102} 105}
103 106
104u32 vlv_dpio_read(struct drm_i915_private *dev_priv, int reg) 107u32 vlv_gpio_nc_read(struct drm_i915_private *dev_priv, u32 reg)
105{ 108{
106 u32 val = 0; 109 u32 val = 0;
110 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_GPIO_NC,
111 PUNIT_OPCODE_REG_READ, reg, &val);
112 return val;
113}
107 114
108 vlv_sideband_rw(dev_priv, DPIO_DEVFN, IOSF_PORT_DPIO, 115void vlv_gpio_nc_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
109 DPIO_OPCODE_REG_READ, reg, &val); 116{
117 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_GPIO_NC,
118 PUNIT_OPCODE_REG_WRITE, reg, &val);
119}
120
121u32 vlv_cck_read(struct drm_i915_private *dev_priv, u32 reg)
122{
123 u32 val = 0;
124 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_CCK,
125 PUNIT_OPCODE_REG_READ, reg, &val);
126 return val;
127}
128
129void vlv_cck_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
130{
131 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_CCK,
132 PUNIT_OPCODE_REG_WRITE, reg, &val);
133}
134
135u32 vlv_ccu_read(struct drm_i915_private *dev_priv, u32 reg)
136{
137 u32 val = 0;
138 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_CCU,
139 PUNIT_OPCODE_REG_READ, reg, &val);
140 return val;
141}
110 142
143void vlv_ccu_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
144{
145 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_CCU,
146 PUNIT_OPCODE_REG_WRITE, reg, &val);
147}
148
149u32 vlv_gps_core_read(struct drm_i915_private *dev_priv, u32 reg)
150{
151 u32 val = 0;
152 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_GPS_CORE,
153 PUNIT_OPCODE_REG_READ, reg, &val);
154 return val;
155}
156
157void vlv_gps_core_write(struct drm_i915_private *dev_priv, u32 reg, u32 val)
158{
159 vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_GPS_CORE,
160 PUNIT_OPCODE_REG_WRITE, reg, &val);
161}
162
163static u32 vlv_get_phy_port(enum pipe pipe)
164{
165 u32 port = IOSF_PORT_DPIO;
166
167 WARN_ON ((pipe != PIPE_A) && (pipe != PIPE_B));
168
169 return port;
170}
171
172u32 vlv_dpio_read(struct drm_i915_private *dev_priv, enum pipe pipe, int reg)
173{
174 u32 val = 0;
175
176 vlv_sideband_rw(dev_priv, DPIO_DEVFN, vlv_get_phy_port(pipe),
177 DPIO_OPCODE_REG_READ, reg, &val);
111 return val; 178 return val;
112} 179}
113 180
114void vlv_dpio_write(struct drm_i915_private *dev_priv, int reg, u32 val) 181void vlv_dpio_write(struct drm_i915_private *dev_priv, enum pipe pipe, int reg, u32 val)
115{ 182{
116 vlv_sideband_rw(dev_priv, DPIO_DEVFN, IOSF_PORT_DPIO, 183 vlv_sideband_rw(dev_priv, DPIO_DEVFN, vlv_get_phy_port(pipe),
117 DPIO_OPCODE_REG_WRITE, reg, &val); 184 DPIO_OPCODE_REG_WRITE, reg, &val);
118} 185}
119 186