Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329447
b: refs/heads/master
c: e2e1ed4
h: refs/heads/master
i:
  329445: 72d4668
  329443: c8d3657
  329439: 3299ffa
v: v3
  • Loading branch information
Daniel Vetter committed Sep 6, 2012
1 parent 0bd0f81 commit 62457bc
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e24c5c2900ba45e2fa5ed8575ab75f6d4c7e8156
refs/heads/master: e2e1ed41ed6e3012464e8a8e7cf7bbcb6d3f7412
96 changes: 96 additions & 0 deletions trunk/drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -6706,6 +6706,98 @@ intel_modeset_adjusted_mode(struct drm_crtc *crtc,
return ERR_PTR(-EINVAL);
}

/* Computes which crtcs are affected and sets the relevant bits in the mask. For
* simplicity we use the crtc's pipe number (because it's easier to obtain). */
static void
intel_modeset_affected_pipes(struct drm_crtc *crtc, unsigned *modeset_pipes,
unsigned *prepare_pipes, unsigned *disable_pipes)
{
struct intel_crtc *intel_crtc;
struct drm_device *dev = crtc->dev;
struct intel_encoder *encoder;
struct intel_connector *connector;
struct drm_crtc *tmp_crtc;

*disable_pipes = *modeset_pipes = *prepare_pipes = 0;

/* Check which crtcs have changed outputs connected to them, these need
* to be part of the prepare_pipes mask. We don't (yet) support global
* modeset across multiple crtcs, so modeset_pipes will only have one
* bit set at most. */
list_for_each_entry(connector, &dev->mode_config.connector_list,
base.head) {
if (connector->base.encoder == &connector->new_encoder->base)
continue;

if (connector->base.encoder) {
tmp_crtc = connector->base.encoder->crtc;

*prepare_pipes |= 1 << to_intel_crtc(tmp_crtc)->pipe;
}

if (connector->new_encoder)
*prepare_pipes |=
1 << connector->new_encoder->new_crtc->pipe;
}

list_for_each_entry(encoder, &dev->mode_config.encoder_list,
base.head) {
if (encoder->base.crtc == &encoder->new_crtc->base)
continue;

if (encoder->base.crtc) {
tmp_crtc = encoder->base.crtc;

*prepare_pipes |= 1 << to_intel_crtc(tmp_crtc)->pipe;
}

if (encoder->new_crtc)
*prepare_pipes |= 1 << encoder->new_crtc->pipe;
}

/* Check for any pipes that will be fully disabled ... */
list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
base.head) {
bool used = false;

/* Don't try to disable disabled crtcs. */
if (!intel_crtc->base.enabled)
continue;

list_for_each_entry(encoder, &dev->mode_config.encoder_list,
base.head) {
if (encoder->new_crtc == intel_crtc)
used = true;
}

if (!used)
*disable_pipes |= 1 << intel_crtc->pipe;
}


/* set_mode is also used to update properties on life display pipes. */
intel_crtc = to_intel_crtc(crtc);
if (crtc->enabled)
*prepare_pipes |= 1 << intel_crtc->pipe;

/* We only support modeset on one single crtc, hence we need to do that
* only for the passed in crtc iff we change anything else than just
* disable crtcs.
*
* This is actually not true, to be fully compatible with the old crtc
* helper we automatically disable _any_ output (i.e. doesn't need to be
* connected to the crtc we're modesetting on) if it's disconnected.
* Which is a rather nutty api (since changed the output configuration
* without userspace's explicit request can lead to confusion), but
* alas. Hence we currently need to modeset on all pipes we prepare. */
if (*prepare_pipes)
*modeset_pipes = *prepare_pipes;

/* ... and mask these out. */
*modeset_pipes &= ~(*disable_pipes);
*prepare_pipes &= ~(*disable_pipes);
}

bool intel_set_mode(struct drm_crtc *crtc,
struct drm_display_mode *mode,
int x, int y, struct drm_framebuffer *fb)
Expand All @@ -6715,8 +6807,12 @@ bool intel_set_mode(struct drm_crtc *crtc,
struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
struct drm_encoder_helper_funcs *encoder_funcs;
struct drm_encoder *encoder;
unsigned disable_pipe, prepare_pipes, modeset_pipes;
bool ret = true;

intel_modeset_affected_pipes(crtc, &modeset_pipes,
&prepare_pipes, &disable_pipe);

intel_modeset_commit_output_state(dev);

crtc->enabled = drm_helper_crtc_in_use(crtc);
Expand Down

0 comments on commit 62457bc

Please sign in to comment.