[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