[Intel-gfx] [PATCH] drm/i915: Choose sharing pipe according to encoder

Ma, Ling ling.ma at intel.com
Mon Jul 20 11:44:22 CEST 2009


Sorry please ignore this mail.

>-----Original Message-----
>From: Ma, Ling
>Sent: 2009年7月20日 17:25
>To: Ma, Ling; eric at anholt.net
>Cc: intel-gfx at lists.freedesktop.org
>Subject: RE: [PATCH] drm/i915: Choose sharing pipe according to encoder
>
>Whether this patch is better contrasted with patch:
>[PATCH 3/4 V2] drm/i915: Construct all possible sdvo outputs
>for sdvo encoder, here we chose dynamically real encoder
>from multiple encoders ?
>
>Thanks
>Ma Ling
>>-----Original Message-----
>>From: Ma, Ling
>>Sent: 2009年7月17日 16:43
>>To: eric at anholt.net
>>Cc: intel-gfx at lists.freedesktop.org; Ma, Ling
>>Subject: [PATCH] drm/i915: Choose sharing pipe according to encoder
>>
>>Based on Bspec each encoder has different sharing pipe property,
>>i.e. Integrated or SDVO TV both will occupy one pipe exlusively,
>>and sdvo-non-tv and crt are allowed to share one. The patch moves
>>sharing judgment into differnet output functions, and set right
>>clone bit.
>>
>>Signed-off-by: Ma Ling <ling.ma at intel.com>
>>---
>> drivers/gpu/drm/i915/intel_crt.c     |    4 +++
>> drivers/gpu/drm/i915/intel_display.c |   45
>>+++-------------------------------
>> drivers/gpu/drm/i915/intel_dp.c      |    7 +++++
>> drivers/gpu/drm/i915/intel_drv.h     |   17 +++++++++++++
>> drivers/gpu/drm/i915/intel_hdmi.c    |   18 +++++++++----
>> drivers/gpu/drm/i915/intel_sdvo.c    |   12 +++++++++
>> drivers/gpu/drm/i915/intel_tv.c      |    2 +
>> 7 files changed, 58 insertions(+), 47 deletions(-)
>>
>>diff --git a/drivers/gpu/drm/i915/intel_crt.c
>>b/drivers/gpu/drm/i915/intel_crt.c
>>index d6a1a6e..3b46dda 100644
>>--- a/drivers/gpu/drm/i915/intel_crt.c
>>+++ b/drivers/gpu/drm/i915/intel_crt.c
>>@@ -533,6 +533,10 @@ void intel_crt_init(struct drm_device *dev)
>> 	}
>>
>> 	intel_output->type = INTEL_OUTPUT_ANALOG;
>>+	intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
>>+				   (1 << INTEL_ANALOG_CLONE_BIT) |
>>+				   (1 << INTEL_SDVO_LVDS_CLONE_BIT);
>>+
>> 	connector->interlace_allowed = 0;
>> 	connector->doublescan_allowed = 0;
>>
>>diff --git a/drivers/gpu/drm/i915/intel_display.c
>>b/drivers/gpu/drm/i915/intel_display.c
>>index 3fa0d63..81978f2 100644
>>--- a/drivers/gpu/drm/i915/intel_display.c
>>+++ b/drivers/gpu/drm/i915/intel_display.c
>>@@ -2967,7 +2967,7 @@ static int intel_connector_clones(struct drm_device
>*dev,
>>int type_mask)
>>
>>         list_for_each_entry(connector, &dev->mode_config.connector_list,
>>head) {
>> 		struct intel_output *intel_output = to_intel_output(connector);
>>-		if (type_mask & (1 << intel_output->type))
>>+		if (type_mask & intel_output->clone_mask)
>> 			index_mask |= (1 << entry);
>> 		entry++;
>> 	}
>>@@ -3039,47 +3039,10 @@ static void intel_setup_outputs(struct drm_device
>*dev)
>> 	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
>>{
>> 		struct intel_output *intel_output = to_intel_output(connector);
>> 		struct drm_encoder *encoder = &intel_output->enc;
>>-		int crtc_mask = 0, clone_mask = 0;
>>
>>-		/* valid crtcs */
>>-		switch(intel_output->type) {
>>-		case INTEL_OUTPUT_HDMI:
>>-			crtc_mask = ((1 << 0)|
>>-				     (1 << 1));
>>-			clone_mask = ((1 << INTEL_OUTPUT_HDMI));
>>-			break;
>>-		case INTEL_OUTPUT_DVO:
>>-		case INTEL_OUTPUT_SDVO:
>>-			crtc_mask = ((1 << 0)|
>>-				     (1 << 1));
>>-			clone_mask = ((1 << INTEL_OUTPUT_ANALOG) |
>>-				      (1 << INTEL_OUTPUT_DVO) |
>>-				      (1 << INTEL_OUTPUT_SDVO));
>>-			break;
>>-		case INTEL_OUTPUT_ANALOG:
>>-			crtc_mask = ((1 << 0)|
>>-				     (1 << 1));
>>-			clone_mask = ((1 << INTEL_OUTPUT_ANALOG) |
>>-				      (1 << INTEL_OUTPUT_DVO) |
>>-				      (1 << INTEL_OUTPUT_SDVO));
>>-			break;
>>-		case INTEL_OUTPUT_LVDS:
>>-			crtc_mask = (1 << 1);
>>-			clone_mask = (1 << INTEL_OUTPUT_LVDS);
>>-			break;
>>-		case INTEL_OUTPUT_TVOUT:
>>-			crtc_mask = ((1 << 0) |
>>-				     (1 << 1));
>>-			clone_mask = (1 << INTEL_OUTPUT_TVOUT);
>>-			break;
>>-		case INTEL_OUTPUT_DISPLAYPORT:
>>-			crtc_mask = ((1 << 0) |
>>-				     (1 << 1));
>>-			clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT);
>>-			break;
>>-		}
>>-		encoder->possible_crtcs = crtc_mask;
>>-		encoder->possible_clones = intel_connector_clones(dev, clone_mask);
>>+		encoder->possible_crtcs = intel_output->crtc_mask;
>>+		encoder->possible_clones = intel_connector_clones(dev,
>>+						intel_output->clone_mask);
>> 	}
>> }
>>
>>diff --git a/drivers/gpu/drm/i915/intel_dp.c
>>b/drivers/gpu/drm/i915/intel_dp.c
>>index 6770ae8..a5f9a6f 100644
>>--- a/drivers/gpu/drm/i915/intel_dp.c
>>+++ b/drivers/gpu/drm/i915/intel_dp.c
>>@@ -1121,6 +1121,13 @@ intel_dp_init(struct drm_device *dev, int output_reg)
>>
>> 	intel_output->type = INTEL_OUTPUT_DISPLAYPORT;
>>
>>+	if (output_reg == DP_B)
>>+		intel_output->clone_mask = (1 << INTEL_DP_B_CLONE_BIT);
>>+	else if (output_reg == DP_C)
>>+		intel_output->clone_mask = (1 << INTEL_DP_C_CLONE_BIT);
>>+	else if (output_reg == DP_D)
>>+		intel_output->clone_mask = (1 << INTEL_DP_D_CLONE_BIT);
>>+
>> 	connector->interlace_allowed = true;
>> 	connector->doublescan_allowed = 0;
>>
>>diff --git a/drivers/gpu/drm/i915/intel_drv.h
>>b/drivers/gpu/drm/i915/intel_drv.h
>>index 004541c..291da8a 100644
>>--- a/drivers/gpu/drm/i915/intel_drv.h
>>+++ b/drivers/gpu/drm/i915/intel_drv.h
>>@@ -56,6 +56,21 @@
>> #define INTEL_OUTPUT_HDMI 6
>> #define INTEL_OUTPUT_DISPLAYPORT 7
>>
>>+/* Intel Pipe Clone Bit */
>>+#define INTEL_HDMIB_CLONE_BIT 1
>>+#define INTEL_HDMIC_CLONE_BIT 2
>>+#define INTEL_HDMID_CLONE_BIT 3
>>+#define INTEL_HDMIE_CLONE_BIT 4
>>+#define INTEL_HDMIF_CLONE_BIT 5
>>+#define INTEL_SDVO_NON_TV_CLONE_BIT 6
>>+#define INTEL_SDVO_TV_CLONE_BIT 7
>>+#define INTEL_SDVO_LVDS_CLONE_BIT 8
>>+#define INTEL_ANALOG_CLONE_BIT 9
>>+#define INTEL_TV_CLONE_BIT 10
>>+#define INTEL_DP_B_CLONE_BIT 11
>>+#define INTEL_DP_C_CLONE_BIT 12
>>+#define INTEL_DP_D_CLONE_BIT 13
>>+
>> #define INTEL_DVO_CHIP_NONE 0
>> #define INTEL_DVO_CHIP_LVDS 1
>> #define INTEL_DVO_CHIP_TMDS 2
>>@@ -85,6 +100,8 @@ struct intel_output {
>> 	bool needs_tv_clock;
>> 	void *dev_priv;
>> 	void (*hot_plug)(struct intel_output *);
>>+	int crtc_mask;
>>+	int clone_mask;
>> };
>>
>> struct intel_crtc {
>>diff --git a/drivers/gpu/drm/i915/intel_hdmi.c
>>b/drivers/gpu/drm/i915/intel_hdmi.c
>>index 9e30daa..e1ec162 100644
>>--- a/drivers/gpu/drm/i915/intel_hdmi.c
>>+++ b/drivers/gpu/drm/i915/intel_hdmi.c
>>@@ -286,22 +286,28 @@ void intel_hdmi_init(struct drm_device *dev, int
>>sdvox_reg)
>>
>> 	connector->interlace_allowed = 0;
>> 	connector->doublescan_allowed = 0;
>>+	intel_output->crtc_mask = (1 << 0) | (1 << 1);
>>
>> 	/* Set up the DDC bus. */
>>-	if (sdvox_reg == SDVOB)
>>+	if (sdvox_reg == SDVOB) {
>>+		intel_output->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
>> 		intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB");
>>-	else if (sdvox_reg == SDVOC)
>>+	} else if (sdvox_reg == SDVOC) {
>>+		intel_output->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
>> 		intel_output->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC");
>>-	else if (sdvox_reg == HDMIB)
>>+	} else if (sdvox_reg == HDMIB) {
>>+		intel_output->clone_mask = (1 << INTEL_HDMID_CLONE_BIT);
>> 		intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOE,
>> 								"HDMIB");
>>-	else if (sdvox_reg == HDMIC)
>>+	} else if (sdvox_reg == HDMIC) {
>>+		intel_output->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT);
>> 		intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOD,
>> 								"HDMIC");
>>-	else if (sdvox_reg == HDMID)
>>+	} else if (sdvox_reg == HDMID) {
>>+		intel_output->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT);
>> 		intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOF,
>> 								"HDMID");
>>-
>>+	}
>> 	if (!intel_output->ddc_bus)
>> 		goto err_connector;
>>
>>diff --git a/drivers/gpu/drm/i915/intel_sdvo.c
>>b/drivers/gpu/drm/i915/intel_sdvo.c
>>index 4f0c309..44b5b3f 100644
>>--- a/drivers/gpu/drm/i915/intel_sdvo.c
>>+++ b/drivers/gpu/drm/i915/intel_sdvo.c
>>@@ -1948,6 +1948,8 @@ bool intel_sdvo_init(struct drm_device *dev, int
>>output_device)
>> 						   SDVO_COLORIMETRY_RGB256);
>> 			connector_type = DRM_MODE_CONNECTOR_HDMIA;
>> 		}
>>+		intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
>>+					   (1 << INTEL_ANALOG_CLONE_BIT);
>> 	}
>> 	else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0)
>> 	{
>>@@ -1956,18 +1958,23 @@ bool intel_sdvo_init(struct drm_device *dev, int
>>output_device)
>> 		connector_type = DRM_MODE_CONNECTOR_SVIDEO;
>> 		sdvo_priv->is_tv = true;
>> 		intel_output->needs_tv_clock = true;
>>+		intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
>> 	}
>> 	else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
>> 	{
>> 		sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
>> 		encoder_type = DRM_MODE_ENCODER_DAC;
>> 		connector_type = DRM_MODE_CONNECTOR_VGA;
>>+		intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
>>+					   (1 << INTEL_ANALOG_CLONE_BIT);
>> 	}
>> 	else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1)
>> 	{
>> 		sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
>> 		encoder_type = DRM_MODE_ENCODER_DAC;
>> 		connector_type = DRM_MODE_CONNECTOR_VGA;
>>+		intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
>>+					   (1 << INTEL_ANALOG_CLONE_BIT);
>> 	}
>> 	else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0)
>> 	{
>>@@ -1975,6 +1982,9 @@ bool intel_sdvo_init(struct drm_device *dev, int
>>output_device)
>> 		encoder_type = DRM_MODE_ENCODER_LVDS;
>> 		connector_type = DRM_MODE_CONNECTOR_LVDS;
>> 		sdvo_priv->is_lvds = true;
>>+		intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
>>+					   (1 << INTEL_SDVO_LVDS_CLONE_BIT);
>>+
>> 	}
>> 	else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1)
>> 	{
>>@@ -1982,6 +1992,8 @@ bool intel_sdvo_init(struct drm_device *dev, int
>>output_device)
>> 		encoder_type = DRM_MODE_ENCODER_LVDS;
>> 		connector_type = DRM_MODE_CONNECTOR_LVDS;
>> 		sdvo_priv->is_lvds = true;
>>+		intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
>>+					   (1 << INTEL_SDVO_LVDS_CLONE_BIT);
>> 	}
>> 	else
>> 	{
>>diff --git a/drivers/gpu/drm/i915/intel_tv.c
>>b/drivers/gpu/drm/i915/intel_tv.c
>>index a43c98e..8ba37f6 100644
>>--- a/drivers/gpu/drm/i915/intel_tv.c
>>+++ b/drivers/gpu/drm/i915/intel_tv.c
>>@@ -1696,6 +1696,7 @@ intel_tv_init(struct drm_device *dev)
>> 	if (!intel_output) {
>> 		return;
>> 	}
>>+
>> 	connector = &intel_output->base;
>>
>> 	drm_connector_init(dev, connector, &intel_tv_connector_funcs,
>>@@ -1707,6 +1708,7 @@ intel_tv_init(struct drm_device *dev)
>> 	drm_mode_connector_attach_encoder(&intel_output->base,
>>&intel_output->enc);
>> 	tv_priv = (struct intel_tv_priv *)(intel_output + 1);
>> 	intel_output->type = INTEL_OUTPUT_TVOUT;
>>+	intel_output->clone_mask = (1 << INTEL_TV_CLONE_BIT);
>> 	intel_output->enc.possible_crtcs = ((1 << 0) | (1 << 1));
>> 	intel_output->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT);
>> 	intel_output->dev_priv = tv_priv;
>>--
>>1.5.4.4



More information about the Intel-gfx mailing list