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

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


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