aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c4
-rw-r--r--drivers/gpu/drm/i915/intel_display.c18
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c14
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h25
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c7
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c10
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c2
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c14
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c2
9 files changed, 35 insertions, 61 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 7ed4a41c3965..e1d02be368a5 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -658,9 +658,7 @@ void intel_crt_init(struct drm_device *dev)
658 intel_connector_attach_encoder(intel_connector, &crt->base); 658 intel_connector_attach_encoder(intel_connector, &crt->base);
659 659
660 crt->base.type = INTEL_OUTPUT_ANALOG; 660 crt->base.type = INTEL_OUTPUT_ANALOG;
661 crt->base.clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT | 661 crt->base.cloneable = true;
662 1 << INTEL_ANALOG_CLONE_BIT |
663 1 << INTEL_SDVO_LVDS_CLONE_BIT);
664 if (IS_HASWELL(dev)) 662 if (IS_HASWELL(dev))
665 crt->base.crtc_mask = (1 << 0); 663 crt->base.crtc_mask = (1 << 0);
666 else 664 else
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e9e476eca89f..5c0a72606225 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6707,15 +6707,23 @@ int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
6707 return 0; 6707 return 0;
6708} 6708}
6709 6709
6710static int intel_encoder_clones(struct drm_device *dev, int type_mask) 6710static int intel_encoder_clones(struct intel_encoder *encoder)
6711{ 6711{
6712 struct intel_encoder *encoder; 6712 struct drm_device *dev = encoder->base.dev;
6713 struct intel_encoder *source_encoder;
6713 int index_mask = 0; 6714 int index_mask = 0;
6714 int entry = 0; 6715 int entry = 0;
6715 6716
6716 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) { 6717 list_for_each_entry(source_encoder,
6717 if (type_mask & encoder->clone_mask) 6718 &dev->mode_config.encoder_list, base.head) {
6719
6720 if (encoder == source_encoder)
6718 index_mask |= (1 << entry); 6721 index_mask |= (1 << entry);
6722
6723 /* Intel hw has only one MUX where enocoders could be cloned. */
6724 if (encoder->cloneable && source_encoder->cloneable)
6725 index_mask |= (1 << entry);
6726
6719 entry++; 6727 entry++;
6720 } 6728 }
6721 6729
@@ -6874,7 +6882,7 @@ static void intel_setup_outputs(struct drm_device *dev)
6874 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) { 6882 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
6875 encoder->base.possible_crtcs = encoder->crtc_mask; 6883 encoder->base.possible_crtcs = encoder->crtc_mask;
6876 encoder->base.possible_clones = 6884 encoder->base.possible_clones =
6877 intel_encoder_clones(dev, encoder->clone_mask); 6885 intel_encoder_clones(encoder);
6878 } 6886 }
6879 6887
6880 /* disable all the possible outputs/crtcs before entering KMS mode */ 6888 /* disable all the possible outputs/crtcs before entering KMS mode */
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 9f415643c8e2..d1489ab56fc9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2451,18 +2451,10 @@ intel_dp_init(struct drm_device *dev, int output_reg)
2451 2451
2452 connector->polled = DRM_CONNECTOR_POLL_HPD; 2452 connector->polled = DRM_CONNECTOR_POLL_HPD;
2453 2453
2454 if (output_reg == DP_B || output_reg == PCH_DP_B) 2454 intel_encoder->cloneable = false;
2455 intel_encoder->clone_mask = (1 << INTEL_DP_B_CLONE_BIT);
2456 else if (output_reg == DP_C || output_reg == PCH_DP_C)
2457 intel_encoder->clone_mask = (1 << INTEL_DP_C_CLONE_BIT);
2458 else if (output_reg == DP_D || output_reg == PCH_DP_D)
2459 intel_encoder->clone_mask = (1 << INTEL_DP_D_CLONE_BIT);
2460 2455
2461 if (is_edp(intel_dp)) { 2456 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
2462 intel_encoder->clone_mask = (1 << INTEL_EDP_CLONE_BIT); 2457 ironlake_panel_vdd_work);
2463 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
2464 ironlake_panel_vdd_work);
2465 }
2466 2458
2467 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 2459 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
2468 2460
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 35488aae5d09..76ba554f6592 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -90,25 +90,6 @@
90#define INTEL_OUTPUT_DISPLAYPORT 7 90#define INTEL_OUTPUT_DISPLAYPORT 7
91#define INTEL_OUTPUT_EDP 8 91#define INTEL_OUTPUT_EDP 8
92 92
93/* Intel Pipe Clone Bit */
94#define INTEL_HDMIB_CLONE_BIT 1
95#define INTEL_HDMIC_CLONE_BIT 2
96#define INTEL_HDMID_CLONE_BIT 3
97#define INTEL_HDMIE_CLONE_BIT 4
98#define INTEL_HDMIF_CLONE_BIT 5
99#define INTEL_SDVO_NON_TV_CLONE_BIT 6
100#define INTEL_SDVO_TV_CLONE_BIT 7
101#define INTEL_SDVO_LVDS_CLONE_BIT 8
102#define INTEL_ANALOG_CLONE_BIT 9
103#define INTEL_TV_CLONE_BIT 10
104#define INTEL_DP_B_CLONE_BIT 11
105#define INTEL_DP_C_CLONE_BIT 12
106#define INTEL_DP_D_CLONE_BIT 13
107#define INTEL_LVDS_CLONE_BIT 14
108#define INTEL_DVO_TMDS_CLONE_BIT 15
109#define INTEL_DVO_LVDS_CLONE_BIT 16
110#define INTEL_EDP_CLONE_BIT 17
111
112#define INTEL_DVO_CHIP_NONE 0 93#define INTEL_DVO_CHIP_NONE 0
113#define INTEL_DVO_CHIP_LVDS 1 94#define INTEL_DVO_CHIP_LVDS 1
114#define INTEL_DVO_CHIP_TMDS 2 95#define INTEL_DVO_CHIP_TMDS 2
@@ -153,9 +134,13 @@ struct intel_encoder {
153 struct drm_encoder base; 134 struct drm_encoder base;
154 int type; 135 int type;
155 bool needs_tv_clock; 136 bool needs_tv_clock;
137 /*
138 * Intel hw has only one MUX where encoders could be clone, hence a
139 * simple flag is enough to compute the possible_clones mask.
140 */
141 bool cloneable;
156 void (*hot_plug)(struct intel_encoder *); 142 void (*hot_plug)(struct intel_encoder *);
157 int crtc_mask; 143 int crtc_mask;
158 int clone_mask;
159}; 144};
160 145
161struct intel_connector { 146struct intel_connector {
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 36c542e5036b..556cf6bf2a55 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -396,17 +396,14 @@ void intel_dvo_init(struct drm_device *dev)
396 intel_encoder->crtc_mask = (1 << 0) | (1 << 1); 396 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
397 switch (dvo->type) { 397 switch (dvo->type) {
398 case INTEL_DVO_CHIP_TMDS: 398 case INTEL_DVO_CHIP_TMDS:
399 intel_encoder->clone_mask = 399 intel_encoder->cloneable = true;
400 (1 << INTEL_DVO_TMDS_CLONE_BIT) |
401 (1 << INTEL_ANALOG_CLONE_BIT);
402 drm_connector_init(dev, connector, 400 drm_connector_init(dev, connector,
403 &intel_dvo_connector_funcs, 401 &intel_dvo_connector_funcs,
404 DRM_MODE_CONNECTOR_DVII); 402 DRM_MODE_CONNECTOR_DVII);
405 encoder_type = DRM_MODE_ENCODER_TMDS; 403 encoder_type = DRM_MODE_ENCODER_TMDS;
406 break; 404 break;
407 case INTEL_DVO_CHIP_LVDS: 405 case INTEL_DVO_CHIP_LVDS:
408 intel_encoder->clone_mask = 406 intel_encoder->cloneable = false;
409 (1 << INTEL_DVO_LVDS_CLONE_BIT);
410 drm_connector_init(dev, connector, 407 drm_connector_init(dev, connector,
411 &intel_dvo_connector_funcs, 408 &intel_dvo_connector_funcs,
412 DRM_MODE_CONNECTOR_LVDS); 409 DRM_MODE_CONNECTOR_LVDS);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 98f602427eb8..593b8fe2e00a 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -923,42 +923,36 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
923 connector->doublescan_allowed = 0; 923 connector->doublescan_allowed = 0;
924 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 924 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
925 925
926 intel_encoder->cloneable = false;
927
926 /* Set up the DDC bus. */ 928 /* Set up the DDC bus. */
927 if (sdvox_reg == SDVOB) { 929 if (sdvox_reg == SDVOB) {
928 intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
929 intel_hdmi->ddc_bus = GMBUS_PORT_DPB; 930 intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
930 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; 931 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
931 } else if (sdvox_reg == SDVOC) { 932 } else if (sdvox_reg == SDVOC) {
932 intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
933 intel_hdmi->ddc_bus = GMBUS_PORT_DPC; 933 intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
934 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; 934 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
935 } else if (sdvox_reg == HDMIB) { 935 } else if (sdvox_reg == HDMIB) {
936 intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT);
937 intel_hdmi->ddc_bus = GMBUS_PORT_DPB; 936 intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
938 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; 937 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
939 } else if (sdvox_reg == HDMIC) { 938 } else if (sdvox_reg == HDMIC) {
940 intel_encoder->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT);
941 intel_hdmi->ddc_bus = GMBUS_PORT_DPC; 939 intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
942 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; 940 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
943 } else if (sdvox_reg == HDMID) { 941 } else if (sdvox_reg == HDMID) {
944 intel_encoder->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT);
945 intel_hdmi->ddc_bus = GMBUS_PORT_DPD; 942 intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
946 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS; 943 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
947 } else if (sdvox_reg == DDI_BUF_CTL(PORT_B)) { 944 } else if (sdvox_reg == DDI_BUF_CTL(PORT_B)) {
948 DRM_DEBUG_DRIVER("LPT: detected output on DDI B\n"); 945 DRM_DEBUG_DRIVER("LPT: detected output on DDI B\n");
949 intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
950 intel_hdmi->ddc_bus = GMBUS_PORT_DPB; 946 intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
951 intel_hdmi->ddi_port = PORT_B; 947 intel_hdmi->ddi_port = PORT_B;
952 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; 948 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
953 } else if (sdvox_reg == DDI_BUF_CTL(PORT_C)) { 949 } else if (sdvox_reg == DDI_BUF_CTL(PORT_C)) {
954 DRM_DEBUG_DRIVER("LPT: detected output on DDI C\n"); 950 DRM_DEBUG_DRIVER("LPT: detected output on DDI C\n");
955 intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
956 intel_hdmi->ddc_bus = GMBUS_PORT_DPC; 951 intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
957 intel_hdmi->ddi_port = PORT_C; 952 intel_hdmi->ddi_port = PORT_C;
958 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; 953 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
959 } else if (sdvox_reg == DDI_BUF_CTL(PORT_D)) { 954 } else if (sdvox_reg == DDI_BUF_CTL(PORT_D)) {
960 DRM_DEBUG_DRIVER("LPT: detected output on DDI D\n"); 955 DRM_DEBUG_DRIVER("LPT: detected output on DDI D\n");
961 intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT);
962 intel_hdmi->ddc_bus = GMBUS_PORT_DPD; 956 intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
963 intel_hdmi->ddi_port = PORT_D; 957 intel_hdmi->ddi_port = PORT_D;
964 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS; 958 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index e05c0d3e3440..d789fdad5d37 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -967,7 +967,7 @@ bool intel_lvds_init(struct drm_device *dev)
967 intel_connector_attach_encoder(intel_connector, intel_encoder); 967 intel_connector_attach_encoder(intel_connector, intel_encoder);
968 intel_encoder->type = INTEL_OUTPUT_LVDS; 968 intel_encoder->type = INTEL_OUTPUT_LVDS;
969 969
970 intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); 970 intel_encoder->cloneable = false;
971 if (HAS_PCH_SPLIT(dev)) 971 if (HAS_PCH_SPLIT(dev))
972 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 972 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
973 else if (IS_GEN4(dev)) 973 else if (IS_GEN4(dev))
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 26a6a4d0d078..d881602a9155 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2078,8 +2078,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2078 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; 2078 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
2079 intel_sdvo->is_hdmi = true; 2079 intel_sdvo->is_hdmi = true;
2080 } 2080 }
2081 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | 2081 intel_sdvo->base.cloneable = true;
2082 (1 << INTEL_ANALOG_CLONE_BIT));
2083 2082
2084 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); 2083 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2085 if (intel_sdvo->is_hdmi) 2084 if (intel_sdvo->is_hdmi)
@@ -2110,7 +2109,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
2110 2109
2111 intel_sdvo->is_tv = true; 2110 intel_sdvo->is_tv = true;
2112 intel_sdvo->base.needs_tv_clock = true; 2111 intel_sdvo->base.needs_tv_clock = true;
2113 intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; 2112 intel_sdvo->base.cloneable = false;
2114 2113
2115 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); 2114 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2116 2115
@@ -2153,8 +2152,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
2153 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1; 2152 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1;
2154 } 2153 }
2155 2154
2156 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | 2155 intel_sdvo->base.cloneable = true;
2157 (1 << INTEL_ANALOG_CLONE_BIT));
2158 2156
2159 intel_sdvo_connector_init(intel_sdvo_connector, 2157 intel_sdvo_connector_init(intel_sdvo_connector,
2160 intel_sdvo); 2158 intel_sdvo);
@@ -2186,8 +2184,10 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
2186 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1; 2184 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1;
2187 } 2185 }
2188 2186
2189 intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) | 2187 /* SDVO LVDS is cloneable because the SDVO encoder does the upscaling,
2190 (1 << INTEL_SDVO_LVDS_CLONE_BIT)); 2188 * as opposed to native LVDS, where we upscale with the panel-fitter
2189 * (and hence only the native LVDS resolution could be cloned). */
2190 intel_sdvo->base.cloneable = true;
2191 2191
2192 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); 2192 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2193 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) 2193 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index befce6c49704..1a0bab07699e 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1622,7 +1622,7 @@ intel_tv_init(struct drm_device *dev)
1622 intel_connector_attach_encoder(intel_connector, intel_encoder); 1622 intel_connector_attach_encoder(intel_connector, intel_encoder);
1623 intel_encoder->type = INTEL_OUTPUT_TVOUT; 1623 intel_encoder->type = INTEL_OUTPUT_TVOUT;
1624 intel_encoder->crtc_mask = (1 << 0) | (1 << 1); 1624 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
1625 intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT); 1625 intel_encoder->cloneable = false;
1626 intel_encoder->base.possible_crtcs = ((1 << 0) | (1 << 1)); 1626 intel_encoder->base.possible_crtcs = ((1 << 0) | (1 << 1));
1627 intel_encoder->base.possible_clones = (1 << INTEL_OUTPUT_TVOUT); 1627 intel_encoder->base.possible_clones = (1 << INTEL_OUTPUT_TVOUT);
1628 intel_tv->type = DRM_MODE_CONNECTOR_Unknown; 1628 intel_tv->type = DRM_MODE_CONNECTOR_Unknown;