Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329408
b: refs/heads/master
c: b2cabb0
h: refs/heads/master
v: v3
  • Loading branch information
Daniel Vetter committed Sep 6, 2012
1 parent c9e6e4d commit 526ec03
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 113 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: 19c63fa8070b09f409f64c5b3bcd0444e6e67b3b
refs/heads/master: b2cabb0e1d205708dab11bd9e1b97fd080537096
97 changes: 50 additions & 47 deletions trunk/drivers/gpu/drm/i915/intel_crt.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,58 +84,77 @@ static void intel_enable_crt(struct intel_encoder *encoder)
I915_WRITE(crt->adpa_reg, temp);
}

static void pch_crt_dpms(struct drm_encoder *encoder, int mode)
/* Note: The caller is required to filter out dpms modes not supported by the
* platform. */
static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)
{
struct drm_device *dev = encoder->dev;
struct drm_device *dev = encoder->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crt *crt = intel_encoder_to_crt(encoder);
u32 temp;

temp = I915_READ(PCH_ADPA);
temp = I915_READ(crt->adpa_reg);
temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
temp &= ~ADPA_DAC_ENABLE;

switch (mode) {
case DRM_MODE_DPMS_ON:
temp |= ADPA_DAC_ENABLE;
break;
case DRM_MODE_DPMS_STANDBY:
temp |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE;
break;
case DRM_MODE_DPMS_SUSPEND:
temp |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE;
break;
case DRM_MODE_DPMS_OFF:
/* Just leave port enable cleared */
temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
break;
}

I915_WRITE(PCH_ADPA, temp);
I915_WRITE(crt->adpa_reg, temp);
}

static void gmch_crt_dpms(struct drm_encoder *encoder, int mode)
static void intel_crt_dpms(struct drm_connector *connector, int mode)
{
struct drm_device *dev = encoder->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
u32 temp;

temp = I915_READ(ADPA);
temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
temp &= ~ADPA_DAC_ENABLE;
struct drm_device *dev = connector->dev;
struct intel_encoder *encoder = intel_attached_encoder(connector);
struct drm_crtc *crtc;
int old_dpms;

if (IS_VALLEYVIEW(dev) && mode != DRM_MODE_DPMS_ON)
/* PCH platforms and VLV only support on/off. */
if (INTEL_INFO(dev)->gen < 5 && mode != DRM_MODE_DPMS_ON)
mode = DRM_MODE_DPMS_OFF;

switch (mode) {
case DRM_MODE_DPMS_ON:
temp |= ADPA_DAC_ENABLE;
break;
case DRM_MODE_DPMS_STANDBY:
temp |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE;
break;
case DRM_MODE_DPMS_SUSPEND:
temp |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE;
break;
case DRM_MODE_DPMS_OFF:
temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
break;
if (mode == connector->dpms)
return;

old_dpms = connector->dpms;
connector->dpms = mode;

/* Only need to change hw state when actually enabled */
crtc = encoder->base.crtc;
if (!crtc) {
encoder->connectors_active = false;
return;
}

I915_WRITE(ADPA, temp);
/* We need the pipe to run for anything but OFF. */
if (mode == DRM_MODE_DPMS_OFF)
encoder->connectors_active = false;
else
encoder->connectors_active = true;

if (mode < old_dpms) {
/* From off to on, enable the pipe first. */
intel_crtc_update_dpms(crtc);

intel_crt_set_dpms(encoder, mode);
} else {
intel_crt_set_dpms(encoder, mode);

intel_crtc_update_dpms(crtc);
}
}

static int intel_crt_mode_valid(struct drm_connector *connector,
Expand Down Expand Up @@ -596,27 +615,17 @@ static void intel_crt_reset(struct drm_connector *connector)
* Routines for controlling stuff on the analog port
*/

static const struct drm_encoder_helper_funcs pch_encoder_funcs = {
.mode_fixup = intel_crt_mode_fixup,
.prepare = intel_encoder_noop,
.commit = intel_encoder_noop,
.mode_set = intel_crt_mode_set,
.dpms = pch_crt_dpms,
.disable = intel_encoder_disable,
};

static const struct drm_encoder_helper_funcs gmch_encoder_funcs = {
static const struct drm_encoder_helper_funcs crt_encoder_funcs = {
.mode_fixup = intel_crt_mode_fixup,
.prepare = intel_encoder_noop,
.commit = intel_encoder_noop,
.mode_set = intel_crt_mode_set,
.dpms = gmch_crt_dpms,
.disable = intel_encoder_disable,
};

static const struct drm_connector_funcs intel_crt_connector_funcs = {
.reset = intel_crt_reset,
.dpms = drm_helper_connector_dpms,
.dpms = intel_crt_dpms,
.detect = intel_crt_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = intel_crt_destroy,
Expand Down Expand Up @@ -657,7 +666,6 @@ void intel_crt_init(struct drm_device *dev)
struct intel_crt *crt;
struct intel_connector *intel_connector;
struct drm_i915_private *dev_priv = dev->dev_private;
const struct drm_encoder_helper_funcs *encoder_helper_funcs;

/* Skip machines without VGA that falsely report hotplug events */
if (dmi_check_system(intel_no_crt))
Expand Down Expand Up @@ -695,11 +703,6 @@ void intel_crt_init(struct drm_device *dev)
connector->interlace_allowed = 1;
connector->doublescan_allowed = 0;

if (HAS_PCH_SPLIT(dev))
encoder_helper_funcs = &pch_encoder_funcs;
else
encoder_helper_funcs = &gmch_encoder_funcs;

if (HAS_PCH_SPLIT(dev))
crt->adpa_reg = PCH_ADPA;
else if (IS_VALLEYVIEW(dev))
Expand All @@ -710,7 +713,7 @@ void intel_crt_init(struct drm_device *dev)
crt->base.disable = intel_disable_crt;
crt->base.enable = intel_enable_crt;

drm_encoder_helper_add(&crt->base.base, encoder_helper_funcs);
drm_encoder_helper_add(&crt->base.base, &crt_encoder_funcs);
drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);

drm_sysfs_connector_add(connector);
Expand Down
37 changes: 17 additions & 20 deletions trunk/drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -3462,34 +3462,31 @@ static void i9xx_crtc_off(struct drm_crtc *crtc)
/**
* Sets the power management mode of the pipe and plane.
*/
static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
void intel_crtc_update_dpms(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_master_private *master_priv;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
struct intel_encoder *intel_encoder;
int pipe = intel_crtc->pipe;
bool enabled;
bool enabled, enable = false;
int mode;

for_each_encoder_on_crtc(dev, crtc, intel_encoder)
enable |= intel_encoder->connectors_active;

mode = enable ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF;

if (intel_crtc->dpms_mode == mode)
return;

intel_crtc->dpms_mode = mode;

/* XXX: When our outputs are all unaware of DPMS modes other than off
* and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
*/
switch (mode) {
case DRM_MODE_DPMS_ON:
case DRM_MODE_DPMS_STANDBY:
case DRM_MODE_DPMS_SUSPEND:
if (enable)
dev_priv->display.crtc_enable(crtc);
break;

case DRM_MODE_DPMS_OFF:
else
dev_priv->display.crtc_disable(crtc);
break;
}

if (!dev->primary->master)
return;
Expand All @@ -3498,7 +3495,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
if (!master_priv->sarea_priv)
return;

enabled = crtc->enabled && mode != DRM_MODE_DPMS_OFF;
enabled = crtc->enabled && enable;

switch (pipe) {
case 0:
Expand All @@ -3517,11 +3514,12 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)

static void intel_crtc_disable(struct drm_crtc *crtc)
{
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;

crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
/* crtc->disable is only called when we have no encoders, hence this
* will disable the pipe. */
intel_crtc_update_dpms(crtc);
dev_priv->display.off(crtc);

assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane);
Expand Down Expand Up @@ -3581,11 +3579,11 @@ void intel_encoder_dpms(struct intel_encoder *encoder, int mode)
if (mode == DRM_MODE_DPMS_ON) {
encoder->connectors_active = true;

intel_crtc_dpms(encoder->base.crtc, DRM_MODE_DPMS_ON);
intel_crtc_update_dpms(encoder->base.crtc);
} else {
encoder->connectors_active = false;

intel_crtc_dpms(encoder->base.crtc, DRM_MODE_DPMS_OFF);
intel_crtc_update_dpms(encoder->base.crtc);
}
}

Expand Down Expand Up @@ -6609,7 +6607,6 @@ static void intel_crtc_reset(struct drm_crtc *crtc)
}

static struct drm_crtc_helper_funcs intel_helper_funcs = {
.dpms = intel_crtc_dpms,
.mode_fixup = intel_crtc_mode_fixup,
.mode_set = intel_crtc_mode_set,
.mode_set_base = intel_pipe_set_base,
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/gpu/drm/i915/intel_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ extern void intel_panel_destroy_backlight(struct drm_device *dev);
extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);

extern void intel_crtc_load_lut(struct drm_crtc *crtc);
extern void intel_crtc_update_dpms(struct drm_crtc *crtc);
extern void intel_encoder_prepare(struct drm_encoder *encoder);
extern void intel_encoder_commit(struct drm_encoder *encoder);
extern void intel_encoder_noop(struct drm_encoder *encoder);
Expand Down
39 changes: 28 additions & 11 deletions trunk/drivers/gpu/drm/i915/intel_dvo.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,21 +129,39 @@ static void intel_enable_dvo(struct intel_encoder *encoder)
intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, true);
}

static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
static void intel_dvo_dpms(struct drm_connector *connector, int mode)
{
struct drm_i915_private *dev_priv = encoder->dev->dev_private;
struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
u32 dvo_reg = intel_dvo->dev.dvo_reg;
u32 temp = I915_READ(dvo_reg);
struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
struct drm_crtc *crtc;

/* dvo supports only 2 dpms states. */
if (mode != DRM_MODE_DPMS_ON)
mode = DRM_MODE_DPMS_OFF;

if (mode == connector->dpms)
return;

connector->dpms = mode;

/* Only need to change hw state when actually enabled */
crtc = intel_dvo->base.base.crtc;
if (!crtc) {
intel_dvo->base.connectors_active = false;
return;
}

if (mode == DRM_MODE_DPMS_ON) {
I915_WRITE(dvo_reg, temp | DVO_ENABLE);
I915_READ(dvo_reg);
intel_dvo->base.connectors_active = true;

intel_crtc_update_dpms(crtc);

intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, true);
} else {
intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, false);
I915_WRITE(dvo_reg, temp & ~DVO_ENABLE);
I915_READ(dvo_reg);

intel_dvo->base.connectors_active = false;

intel_crtc_update_dpms(crtc);
}
}

Expand Down Expand Up @@ -299,7 +317,6 @@ static void intel_dvo_destroy(struct drm_connector *connector)
}

static const struct drm_encoder_helper_funcs intel_dvo_helper_funcs = {
.dpms = intel_dvo_dpms,
.mode_fixup = intel_dvo_mode_fixup,
.prepare = intel_encoder_noop,
.mode_set = intel_dvo_mode_set,
Expand All @@ -308,7 +325,7 @@ static const struct drm_encoder_helper_funcs intel_dvo_helper_funcs = {
};

static const struct drm_connector_funcs intel_dvo_connector_funcs = {
.dpms = drm_helper_connector_dpms,
.dpms = intel_dvo_dpms,
.detect = intel_dvo_detect,
.destroy = intel_dvo_destroy,
.fill_modes = drm_helper_probe_single_connector_modes,
Expand Down
Loading

0 comments on commit 526ec03

Please sign in to comment.