Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329453
b: refs/heads/master
c: ea9d758
h: refs/heads/master
i:
  329451: 52a59fe
v: v3
  • Loading branch information
Daniel Vetter committed Sep 6, 2012
1 parent 17d32fb commit 72b0a2a
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 42 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fc303101dc9bfe2b079798c948f6ad4245c51e57
refs/heads/master: ea9d758d6ddb9f4bb9639619100743e8f5fa85a0
108 changes: 70 additions & 38 deletions trunk/drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -3221,10 +3221,8 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)

WARN_ON(!crtc->enabled);

/* XXX: For compatability with the crtc helper code, call the encoder's
* enable function unconditionally for now. */
if (intel_crtc->active)
goto encoders;
return;

intel_crtc->active = true;
intel_update_watermarks(dev);
Expand Down Expand Up @@ -3272,7 +3270,6 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)

intel_crtc_update_cursor(crtc, true);

encoders:
for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->enable(encoder);

Expand All @@ -3290,14 +3287,13 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
int plane = intel_crtc->plane;
u32 reg, temp;

/* XXX: For compatability with the crtc helper code, call the encoder's
* disable function unconditionally for now. */
for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->disable(encoder);

if (!intel_crtc->active)
return;

for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->disable(encoder);

intel_crtc_wait_for_pending_flips(crtc);
drm_vblank_off(dev, pipe);
intel_crtc_update_cursor(crtc, false);
Expand Down Expand Up @@ -3399,10 +3395,8 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)

WARN_ON(!crtc->enabled);

/* XXX: For compatability with the crtc helper code, call the encoder's
* enable function unconditionally for now. */
if (intel_crtc->active)
goto encoders;
return;

intel_crtc->active = true;
intel_update_watermarks(dev);
Expand All @@ -3418,7 +3412,6 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
intel_crtc_dpms_overlay(intel_crtc, true);
intel_crtc_update_cursor(crtc, true);

encoders:
for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->enable(encoder);
}
Expand All @@ -3432,14 +3425,13 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
int pipe = intel_crtc->pipe;
int plane = intel_crtc->plane;

/* XXX: For compatability with the crtc helper code, call the encoder's
* disable function unconditionally for now. */
for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->disable(encoder);

if (!intel_crtc->active)
return;

for_each_encoder_on_crtc(dev, crtc, encoder)
encoder->disable(encoder);

/* Give the overlay scaler a chance to disable if it's on this pipe */
intel_crtc_wait_for_pending_flips(crtc);
drm_vblank_off(dev, pipe);
Expand Down Expand Up @@ -6631,18 +6623,6 @@ static bool intel_encoder_crtc_ok(struct drm_encoder *encoder,
return false;
}

static void
intel_crtc_prepare_encoders(struct drm_device *dev)
{
struct intel_encoder *encoder;

list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
/* Disable unused encoders */
if (encoder->base.crtc == NULL)
encoder->disable(encoder);
}
}

/**
* intel_modeset_update_staged_output_state
*
Expand Down Expand Up @@ -6822,6 +6802,60 @@ intel_modeset_affected_pipes(struct drm_crtc *crtc, unsigned *modeset_pipes,
*prepare_pipes &= ~(*disable_pipes);
}

static bool intel_crtc_in_use(struct drm_crtc *crtc)
{
struct drm_encoder *encoder;
struct drm_device *dev = crtc->dev;

list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
if (encoder->crtc == crtc)
return true;

return false;
}

static void
intel_modeset_update_state(struct drm_device *dev, unsigned prepare_pipes)
{
struct intel_encoder *intel_encoder;
struct intel_crtc *intel_crtc;
struct drm_connector *connector;

list_for_each_entry(intel_encoder, &dev->mode_config.encoder_list,
base.head) {
if (!intel_encoder->base.crtc)
continue;

intel_crtc = to_intel_crtc(intel_encoder->base.crtc);

if (prepare_pipes & (1 << intel_crtc->pipe))
intel_encoder->connectors_active = false;
}

intel_modeset_commit_output_state(dev);

/* Update computed state. */
list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
base.head) {
intel_crtc->base.enabled = intel_crtc_in_use(&intel_crtc->base);
}

list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
if (!connector->encoder || !connector->encoder->crtc)
continue;

intel_crtc = to_intel_crtc(connector->encoder->crtc);

if (prepare_pipes & (1 << intel_crtc->pipe)) {
connector->dpms = DRM_MODE_DPMS_ON;

intel_encoder = to_intel_encoder(connector->encoder);
intel_encoder->connectors_active = true;
}
}

}

#define for_each_intel_crtc_masked(dev, mask, intel_crtc) \
list_for_each_entry((intel_crtc), \
&(dev)->mode_config.crtc_list, \
Expand Down Expand Up @@ -6850,12 +6884,6 @@ bool intel_set_mode(struct drm_crtc *crtc,
for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
intel_crtc_disable(&intel_crtc->base);

intel_modeset_commit_output_state(dev);

list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
base.head)
intel_crtc->base.enabled = drm_helper_crtc_in_use(crtc);

saved_hwmode = crtc->hwmode;
saved_mode = crtc->mode;

Expand All @@ -6870,19 +6898,23 @@ bool intel_set_mode(struct drm_crtc *crtc,
if (IS_ERR(adjusted_mode)) {
return false;
}

intel_crtc_prepare_encoders(dev);
}

for_each_intel_crtc_masked(dev, prepare_pipes, intel_crtc)
dev_priv->display.crtc_disable(&intel_crtc->base);
for_each_intel_crtc_masked(dev, prepare_pipes, intel_crtc) {
if (intel_crtc->base.enabled)
dev_priv->display.crtc_disable(&intel_crtc->base);
}

if (modeset_pipes) {
crtc->mode = *mode;
crtc->x = x;
crtc->y = y;
}

/* Only after disabling all output pipelines that will be changed can we
* update the the output configuration. */
intel_modeset_update_state(dev, prepare_pipes);

/* Set up the DPLL and any encoders state that needs to adjust or depend
* on the DPLL.
*/
Expand Down
3 changes: 0 additions & 3 deletions trunk/drivers/gpu/drm/i915/intel_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,6 @@ struct intel_crtc {
* Whether the crtc and the connected output pipeline is active. Implies
* that crtc->enabled is set, i.e. the current mode configuration has
* some outputs connected to this crtc.
*
* Atm crtc->enabled is unconditionally updated _before_ the hw state is
* changed, hence we can only check this when enabling the crtc.
*/
bool active;
bool primary_disabled; /* is the crtc obscured by a plane? */
Expand Down

0 comments on commit 72b0a2a

Please sign in to comment.