From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Michael Byrne Date: Fri, 14 Sep 2018 16:10:16 +0800 Subject: [PATCH] drm/i915/gvt: Change DomU to support 3 HDMI displays. Request DomU supports 3 virtual HDMI displays. This requires eDP-1, DP-1 and DP-2 to be disabled on DomU command line. DomU's ias.conf must also be updated to support HDMI and not DP displays. If a panel is not present on port A, DDI B and DDI C will be made active (as in Dom0). Reviewed by: Min He Signed-off-by: Michael Byrne Change-Id: Ib944de7bf9be5c19db28d35edd77a9f89148f27a Reviewed-on: Reviewed-by: He, Min Reviewed-by: Jiang, Fei Reviewed-by: Dong, Eddie Tested-by: Dong, Eddie --- drivers/gpu/drm/i915/gvt/display.c | 40 +++++++++++++++++++++--------- drivers/gpu/drm/i915/gvt/display.h | 1 + drivers/gpu/drm/i915/gvt/edid.c | 2 +- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c index 82068a7f08a4..39b255985cd8 100644 --- a/drivers/gpu/drm/i915/gvt/display.c +++ b/drivers/gpu/drm/i915/gvt/display.c @@ -353,8 +353,8 @@ static void clean_virtual_dp_monitor(struct intel_vgpu *vgpu, int port_num) port->dpcd = NULL; } -static int setup_virtual_dp_monitor(struct intel_vgpu *vgpu, int port_num, - int type, unsigned int resolution, void *edid) +static int setup_virtual_monitor(struct intel_vgpu *vgpu, int port_num, + int type, unsigned int resolution, void *edid, bool is_dp) { struct intel_vgpu_port *port = intel_vgpu_port(vgpu, port_num); int valid_extensions = 1; @@ -395,9 +395,11 @@ static int setup_virtual_dp_monitor(struct intel_vgpu *vgpu, int port_num, port->edid->data_valid = true; - memcpy(port->dpcd->data, dpcd_fix_data, DPCD_HEADER_SIZE); - port->dpcd->data_valid = true; - port->dpcd->data[DPCD_SINK_COUNT] = 0x1; + if (is_dp) { + memcpy(port->dpcd->data, dpcd_fix_data, DPCD_HEADER_SIZE); + port->dpcd->data_valid = true; + port->dpcd->data[DPCD_SINK_COUNT] = 0x1; + } port->type = type; emulate_monitor_status_change(vgpu); @@ -527,22 +529,36 @@ void intel_gvt_init_pipe_info(struct intel_gvt *gvt) } } +bool gvt_emulate_hdmi = true; + int setup_virtual_monitors(struct intel_vgpu *vgpu) { struct intel_connector *connector = NULL; struct drm_connector_list_iter conn_iter; + struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; int pipe = 0; int ret = 0; + int type = gvt_emulate_hdmi ? GVT_HDMI_A : GVT_DP_A; + int port = PORT_B; + + /* BXT have to use port A for HDMI to support 3 HDMI monitors */ + if (IS_BROXTON(dev_priv)) + port = PORT_A; drm_connector_list_iter_begin(&vgpu->gvt->dev_priv->drm, &conn_iter); for_each_intel_connector_iter(connector, &conn_iter) { if (connector->encoder->get_hw_state(connector->encoder, &pipe) && connector->detect_edid) { - ret = setup_virtual_dp_monitor(vgpu, pipe, - GVT_DP_A + pipe, 0, - connector->detect_edid); + /* Get (Dom0) port associated with current pipe. */ + port = enc_to_dig_port( + &(connector->encoder->base))->base.port; + ret = setup_virtual_monitor(vgpu, port, + type, 0, connector->detect_edid, + !gvt_emulate_hdmi); if (ret) return ret; + type++; + port++; } } drm_connector_list_iter_end(&conn_iter); @@ -599,11 +615,11 @@ int intel_vgpu_init_display(struct intel_vgpu *vgpu, u64 resolution) if (IS_BROXTON(dev_priv) || IS_KABYLAKE(dev_priv)) return setup_virtual_monitors(vgpu); else if (IS_SKYLAKE(dev_priv)) - return setup_virtual_dp_monitor(vgpu, PORT_D, GVT_DP_D, - resolution, NULL); + return setup_virtual_monitor(vgpu, PORT_D, GVT_DP_D, + resolution, NULL, true); else - return setup_virtual_dp_monitor(vgpu, PORT_B, GVT_DP_B, - resolution, NULL); + return setup_virtual_monitor(vgpu, PORT_B, GVT_DP_B, + resolution, NULL, true); } /** diff --git a/drivers/gpu/drm/i915/gvt/display.h b/drivers/gpu/drm/i915/gvt/display.h index ea7c1c525b8c..e6d3912bc730 100644 --- a/drivers/gpu/drm/i915/gvt/display.h +++ b/drivers/gpu/drm/i915/gvt/display.h @@ -140,6 +140,7 @@ enum intel_vgpu_port_type { GVT_DP_B, GVT_DP_C, GVT_DP_D, + GVT_HDMI_A, GVT_HDMI_B, GVT_HDMI_C, GVT_HDMI_D, diff --git a/drivers/gpu/drm/i915/gvt/edid.c b/drivers/gpu/drm/i915/gvt/edid.c index 4785b8a10619..fb690a4f55a0 100644 --- a/drivers/gpu/drm/i915/gvt/edid.c +++ b/drivers/gpu/drm/i915/gvt/edid.c @@ -83,7 +83,7 @@ static inline int bxt_get_port_from_gmbus0(u32 gmbus0) else if (port_select == 2) port = PORT_C; else if (port_select == 3) - port = PORT_D; + port = PORT_A; return port; } -- https://clearlinux.org