aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPei Zhang <pei.zhang@intel.com>2017-04-07 04:50:16 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-04-12 01:59:33 -0400
commitefa69d734adbf8a562d58d9fdc3429f2717764e7 (patch)
tree10d1f25204c97c4b7660e609daa1c399463367f1
parentfd3bd0a99cffffe476d54edd2eb13b52b1e9a27d (diff)
drm/i915/gvt: add mmio init for virtual display
GVT implements a purely virtual monitor for virtual GPU independent of the host. Some DDI related MMIO are not initialized in current code which cause the display initialization failure in guest. This patch fills the gap. Signed-off-by: Pei Zhang <pei.zhang@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/display.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c
index 4cf2b29fbaa1..e0261fcc5b50 100644
--- a/drivers/gpu/drm/i915/gvt/display.c
+++ b/drivers/gpu/drm/i915/gvt/display.c
@@ -189,17 +189,44 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu)
189 } 189 }
190 190
191 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_B)) { 191 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_B)) {
192 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTB_HOTPLUG_CPT;
193 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIB_DETECTED; 192 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIB_DETECTED;
193 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &=
194 ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK |
195 TRANS_DDI_PORT_MASK);
196 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |=
197 (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
198 (PORT_B << TRANS_DDI_PORT_SHIFT) |
199 TRANS_DDI_FUNC_ENABLE);
200 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_B)) |= DDI_BUF_CTL_ENABLE;
201 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_B)) &= ~DDI_BUF_IS_IDLE;
202 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTB_HOTPLUG_CPT;
194 } 203 }
195 204
196 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_C)) { 205 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_C)) {
197 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTC_HOTPLUG_CPT; 206 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTC_HOTPLUG_CPT;
207 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &=
208 ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK |
209 TRANS_DDI_PORT_MASK);
210 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |=
211 (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
212 (PORT_C << TRANS_DDI_PORT_SHIFT) |
213 TRANS_DDI_FUNC_ENABLE);
214 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_C)) |= DDI_BUF_CTL_ENABLE;
215 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_C)) &= ~DDI_BUF_IS_IDLE;
198 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIC_DETECTED; 216 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIC_DETECTED;
199 } 217 }
200 218
201 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_D)) { 219 if (intel_vgpu_has_monitor_on_port(vgpu, PORT_D)) {
202 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTD_HOTPLUG_CPT; 220 vgpu_vreg(vgpu, SDEISR) |= SDE_PORTD_HOTPLUG_CPT;
221 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &=
222 ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK |
223 TRANS_DDI_PORT_MASK);
224 vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |=
225 (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
226 (PORT_D << TRANS_DDI_PORT_SHIFT) |
227 TRANS_DDI_FUNC_ENABLE);
228 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_D)) |= DDI_BUF_CTL_ENABLE;
229 vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_D)) &= ~DDI_BUF_IS_IDLE;
203 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDID_DETECTED; 230 vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDID_DETECTED;
204 } 231 }
205 232