@@ -173,22 +173,162 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu)
173173 int pipe ;
174174
175175 if (IS_BROXTON (dev_priv )) {
176+ enum transcoder trans ;
177+ enum port port ;
178+
179+ /* Clear PIPE, DDI, PHY, HPD before setting new */
176180 vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) &=
177181 ~(GEN8_DE_PORT_HOTPLUG (HPD_PORT_A ) |
178182 GEN8_DE_PORT_HOTPLUG (HPD_PORT_B ) |
179183 GEN8_DE_PORT_HOTPLUG (HPD_PORT_C ));
180184
185+ for_each_pipe (dev_priv , pipe ) {
186+ vgpu_vreg_t (vgpu , PIPECONF (pipe )) &=
187+ ~(PIPECONF_ENABLE | I965_PIPECONF_ACTIVE );
188+ vgpu_vreg_t (vgpu , DSPCNTR (pipe )) &= ~DISPLAY_PLANE_ENABLE ;
189+ vgpu_vreg_t (vgpu , SPRCTL (pipe )) &= ~SPRITE_ENABLE ;
190+ vgpu_vreg_t (vgpu , CURCNTR (pipe )) &= ~MCURSOR_MODE ;
191+ vgpu_vreg_t (vgpu , CURCNTR (pipe )) |= MCURSOR_MODE_DISABLE ;
192+ }
193+
194+ for (trans = TRANSCODER_A ; trans <= TRANSCODER_EDP ; trans ++ ) {
195+ vgpu_vreg_t (vgpu , TRANS_DDI_FUNC_CTL (trans )) &=
196+ ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK |
197+ TRANS_DDI_PORT_MASK | TRANS_DDI_FUNC_ENABLE );
198+ }
199+ vgpu_vreg_t (vgpu , TRANS_DDI_FUNC_CTL (TRANSCODER_A )) &=
200+ ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK |
201+ TRANS_DDI_PORT_MASK );
202+
203+ for (port = PORT_A ; port <= PORT_C ; port ++ ) {
204+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (port )) &=
205+ ~BXT_PHY_LANE_ENABLED ;
206+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (port )) |=
207+ (BXT_PHY_CMNLANE_POWERDOWN_ACK |
208+ BXT_PHY_LANE_POWERDOWN_ACK );
209+
210+ vgpu_vreg_t (vgpu , BXT_PORT_PLL_ENABLE (port )) &=
211+ ~(PORT_PLL_POWER_STATE | PORT_PLL_POWER_ENABLE |
212+ PORT_PLL_REF_SEL | PORT_PLL_LOCK |
213+ PORT_PLL_ENABLE );
214+
215+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (port )) &=
216+ ~(DDI_INIT_DISPLAY_DETECTED |
217+ DDI_BUF_CTL_ENABLE );
218+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (port )) |= DDI_BUF_IS_IDLE ;
219+ }
220+
221+ vgpu_vreg_t (vgpu , BXT_P_CR_GT_DISP_PWRON ) &= ~(BIT (0 ) | BIT (1 ));
222+ vgpu_vreg_t (vgpu , BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) &=
223+ ~PHY_POWER_GOOD ;
224+ vgpu_vreg_t (vgpu , BXT_PORT_CL1CM_DW0 (DPIO_PHY1 )) &=
225+ ~PHY_POWER_GOOD ;
226+ vgpu_vreg_t (vgpu , BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) &= ~BIT (30 );
227+ vgpu_vreg_t (vgpu , BXT_PHY_CTL_FAMILY (DPIO_PHY1 )) &= ~BIT (30 );
228+
229+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIB_DETECTED ;
230+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) &= ~SFUSE_STRAP_DDIC_DETECTED ;
231+
232+ /*
233+ * Only 1 PIPE enabled in current vGPU display and PIPE_A is
234+ * tied to TRANSCODER_A in HW, so it's safe to assume PIPE_A,
235+ * TRANSCODER_A can be enabled. PORT_x depends on the input of
236+ * setup_virtual_dp_monitor.
237+ */
238+ vgpu_vreg_t (vgpu , PIPECONF (PIPE_A )) |= PIPECONF_ENABLE ;
239+ vgpu_vreg_t (vgpu , PIPECONF (PIPE_A )) |= I965_PIPECONF_ACTIVE ;
240+
241+ /*
242+ * Golden M/N are calculated based on:
243+ * 24 bpp, 4 lanes, 154000 pixel clk (from virtual EDID),
244+ * DP link clk 1620 MHz and non-constant_n.
245+ * TODO: calculate DP link symbol clk and stream clk m/n.
246+ */
247+ vgpu_vreg_t (vgpu , PIPE_DATA_M1 (TRANSCODER_A )) = 63 << TU_SIZE_SHIFT ;
248+ vgpu_vreg_t (vgpu , PIPE_DATA_M1 (TRANSCODER_A )) |= 0x5b425e ;
249+ vgpu_vreg_t (vgpu , PIPE_DATA_N1 (TRANSCODER_A )) = 0x800000 ;
250+ vgpu_vreg_t (vgpu , PIPE_LINK_M1 (TRANSCODER_A )) = 0x3cd6e ;
251+ vgpu_vreg_t (vgpu , PIPE_LINK_N1 (TRANSCODER_A )) = 0x80000 ;
252+
253+ /* Enable per-DDI/PORT vreg */
181254 if (intel_vgpu_has_monitor_on_port (vgpu , PORT_A )) {
255+ vgpu_vreg_t (vgpu , BXT_P_CR_GT_DISP_PWRON ) |= BIT (1 );
256+ vgpu_vreg_t (vgpu , BXT_PORT_CL1CM_DW0 (DPIO_PHY1 )) |=
257+ PHY_POWER_GOOD ;
258+ vgpu_vreg_t (vgpu , BXT_PHY_CTL_FAMILY (DPIO_PHY1 )) |=
259+ BIT (30 );
260+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_A )) |=
261+ BXT_PHY_LANE_ENABLED ;
262+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_A )) &=
263+ ~(BXT_PHY_CMNLANE_POWERDOWN_ACK |
264+ BXT_PHY_LANE_POWERDOWN_ACK );
265+ vgpu_vreg_t (vgpu , BXT_PORT_PLL_ENABLE (PORT_A )) |=
266+ (PORT_PLL_POWER_STATE | PORT_PLL_POWER_ENABLE |
267+ PORT_PLL_REF_SEL | PORT_PLL_LOCK |
268+ PORT_PLL_ENABLE );
269+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_A )) |=
270+ (DDI_BUF_CTL_ENABLE | DDI_INIT_DISPLAY_DETECTED );
271+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_A )) &=
272+ ~DDI_BUF_IS_IDLE ;
273+ vgpu_vreg_t (vgpu , TRANS_DDI_FUNC_CTL (TRANSCODER_EDP )) |=
274+ (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
275+ TRANS_DDI_FUNC_ENABLE );
182276 vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
183277 GEN8_DE_PORT_HOTPLUG (HPD_PORT_A );
184278 }
185279
186280 if (intel_vgpu_has_monitor_on_port (vgpu , PORT_B )) {
281+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) |= SFUSE_STRAP_DDIB_DETECTED ;
282+ vgpu_vreg_t (vgpu , BXT_P_CR_GT_DISP_PWRON ) |= BIT (0 );
283+ vgpu_vreg_t (vgpu , BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) |=
284+ PHY_POWER_GOOD ;
285+ vgpu_vreg_t (vgpu , BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) |=
286+ BIT (30 );
287+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_B )) |=
288+ BXT_PHY_LANE_ENABLED ;
289+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_B )) &=
290+ ~(BXT_PHY_CMNLANE_POWERDOWN_ACK |
291+ BXT_PHY_LANE_POWERDOWN_ACK );
292+ vgpu_vreg_t (vgpu , BXT_PORT_PLL_ENABLE (PORT_B )) |=
293+ (PORT_PLL_POWER_STATE | PORT_PLL_POWER_ENABLE |
294+ PORT_PLL_REF_SEL | PORT_PLL_LOCK |
295+ PORT_PLL_ENABLE );
296+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_B )) |=
297+ DDI_BUF_CTL_ENABLE ;
298+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_B )) &=
299+ ~DDI_BUF_IS_IDLE ;
300+ vgpu_vreg_t (vgpu , TRANS_DDI_FUNC_CTL (TRANSCODER_A )) |=
301+ (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
302+ (PORT_B << TRANS_DDI_PORT_SHIFT ) |
303+ TRANS_DDI_FUNC_ENABLE );
187304 vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
188305 GEN8_DE_PORT_HOTPLUG (HPD_PORT_B );
189306 }
190307
191308 if (intel_vgpu_has_monitor_on_port (vgpu , PORT_C )) {
309+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) |= SFUSE_STRAP_DDIC_DETECTED ;
310+ vgpu_vreg_t (vgpu , BXT_P_CR_GT_DISP_PWRON ) |= BIT (0 );
311+ vgpu_vreg_t (vgpu , BXT_PORT_CL1CM_DW0 (DPIO_PHY0 )) |=
312+ PHY_POWER_GOOD ;
313+ vgpu_vreg_t (vgpu , BXT_PHY_CTL_FAMILY (DPIO_PHY0 )) |=
314+ BIT (30 );
315+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_C )) |=
316+ BXT_PHY_LANE_ENABLED ;
317+ vgpu_vreg_t (vgpu , BXT_PHY_CTL (PORT_C )) &=
318+ ~(BXT_PHY_CMNLANE_POWERDOWN_ACK |
319+ BXT_PHY_LANE_POWERDOWN_ACK );
320+ vgpu_vreg_t (vgpu , BXT_PORT_PLL_ENABLE (PORT_C )) |=
321+ (PORT_PLL_POWER_STATE | PORT_PLL_POWER_ENABLE |
322+ PORT_PLL_REF_SEL | PORT_PLL_LOCK |
323+ PORT_PLL_ENABLE );
324+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_C )) |=
325+ DDI_BUF_CTL_ENABLE ;
326+ vgpu_vreg_t (vgpu , DDI_BUF_CTL (PORT_C )) &=
327+ ~DDI_BUF_IS_IDLE ;
328+ vgpu_vreg_t (vgpu , TRANS_DDI_FUNC_CTL (TRANSCODER_A )) |=
329+ (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST |
330+ (PORT_B << TRANS_DDI_PORT_SHIFT ) |
331+ TRANS_DDI_FUNC_ENABLE );
192332 vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
193333 GEN8_DE_PORT_HOTPLUG (HPD_PORT_C );
194334 }
@@ -520,6 +660,45 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected)
520660 vgpu_vreg_t (vgpu , PCH_PORT_HOTPLUG ) |=
521661 PORTD_HOTPLUG_STATUS_MASK ;
522662 intel_vgpu_trigger_virtual_event (vgpu , DP_D_HOTPLUG );
663+ } else if (IS_BROXTON (i915 )) {
664+ if (connected ) {
665+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_A )) {
666+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
667+ GEN8_DE_PORT_HOTPLUG (HPD_PORT_A );
668+ }
669+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_B )) {
670+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) |=
671+ SFUSE_STRAP_DDIB_DETECTED ;
672+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
673+ GEN8_DE_PORT_HOTPLUG (HPD_PORT_B );
674+ }
675+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_C )) {
676+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) |=
677+ SFUSE_STRAP_DDIC_DETECTED ;
678+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) |=
679+ GEN8_DE_PORT_HOTPLUG (HPD_PORT_C );
680+ }
681+ } else {
682+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_A )) {
683+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) &=
684+ ~GEN8_DE_PORT_HOTPLUG (HPD_PORT_A );
685+ }
686+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_B )) {
687+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) &=
688+ ~SFUSE_STRAP_DDIB_DETECTED ;
689+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) &=
690+ ~GEN8_DE_PORT_HOTPLUG (HPD_PORT_B );
691+ }
692+ if (intel_vgpu_has_monitor_on_port (vgpu , PORT_C )) {
693+ vgpu_vreg_t (vgpu , SFUSE_STRAP ) &=
694+ ~SFUSE_STRAP_DDIC_DETECTED ;
695+ vgpu_vreg_t (vgpu , GEN8_DE_PORT_ISR ) &=
696+ ~GEN8_DE_PORT_HOTPLUG (HPD_PORT_C );
697+ }
698+ }
699+ vgpu_vreg_t (vgpu , PCH_PORT_HOTPLUG ) |=
700+ PORTB_HOTPLUG_STATUS_MASK ;
701+ intel_vgpu_trigger_virtual_event (vgpu , DP_B_HOTPLUG );
523702 }
524703}
525704
0 commit comments