|
@@ -3962,9 +3962,49 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
|
|
for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
|
|
for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
|
|
if ((1 << (domain)) & (mask))
|
|
if ((1 << (domain)) & (mask))
|
|
|
|
|
|
-static unsigned long get_pipe_power_domains(struct drm_device *dev,
|
|
|
|
- enum pipe pipe, bool pfit_enabled)
|
|
|
|
|
|
+enum intel_display_power_domain
|
|
|
|
+intel_display_port_power_domain(struct intel_encoder *intel_encoder)
|
|
|
|
+{
|
|
|
|
+ struct drm_device *dev = intel_encoder->base.dev;
|
|
|
|
+ struct intel_digital_port *intel_dig_port;
|
|
|
|
+
|
|
|
|
+ switch (intel_encoder->type) {
|
|
|
|
+ case INTEL_OUTPUT_UNKNOWN:
|
|
|
|
+ /* Only DDI platforms should ever use this output type */
|
|
|
|
+ WARN_ON_ONCE(!HAS_DDI(dev));
|
|
|
|
+ case INTEL_OUTPUT_DISPLAYPORT:
|
|
|
|
+ case INTEL_OUTPUT_HDMI:
|
|
|
|
+ case INTEL_OUTPUT_EDP:
|
|
|
|
+ intel_dig_port = enc_to_dig_port(&intel_encoder->base);
|
|
|
|
+ switch (intel_dig_port->port) {
|
|
|
|
+ case PORT_A:
|
|
|
|
+ return POWER_DOMAIN_PORT_DDI_A_4_LANES;
|
|
|
|
+ case PORT_B:
|
|
|
|
+ return POWER_DOMAIN_PORT_DDI_B_4_LANES;
|
|
|
|
+ case PORT_C:
|
|
|
|
+ return POWER_DOMAIN_PORT_DDI_C_4_LANES;
|
|
|
|
+ case PORT_D:
|
|
|
|
+ return POWER_DOMAIN_PORT_DDI_D_4_LANES;
|
|
|
|
+ default:
|
|
|
|
+ WARN_ON_ONCE(1);
|
|
|
|
+ return POWER_DOMAIN_PORT_OTHER;
|
|
|
|
+ }
|
|
|
|
+ case INTEL_OUTPUT_ANALOG:
|
|
|
|
+ return POWER_DOMAIN_PORT_CRT;
|
|
|
|
+ case INTEL_OUTPUT_DSI:
|
|
|
|
+ return POWER_DOMAIN_PORT_DSI;
|
|
|
|
+ default:
|
|
|
|
+ return POWER_DOMAIN_PORT_OTHER;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
|
|
{
|
|
{
|
|
|
|
+ struct drm_device *dev = crtc->dev;
|
|
|
|
+ struct intel_encoder *intel_encoder;
|
|
|
|
+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
|
|
+ enum pipe pipe = intel_crtc->pipe;
|
|
|
|
+ bool pfit_enabled = intel_crtc->config.pch_pfit.enabled;
|
|
unsigned long mask;
|
|
unsigned long mask;
|
|
enum transcoder transcoder;
|
|
enum transcoder transcoder;
|
|
|
|
|
|
@@ -3975,6 +4015,9 @@ static unsigned long get_pipe_power_domains(struct drm_device *dev,
|
|
if (pfit_enabled)
|
|
if (pfit_enabled)
|
|
mask |= BIT(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
|
|
mask |= BIT(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
|
|
|
|
|
|
|
|
+ for_each_encoder_on_crtc(dev, crtc, intel_encoder)
|
|
|
|
+ mask |= BIT(intel_display_port_power_domain(intel_encoder));
|
|
|
|
+
|
|
return mask;
|
|
return mask;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4008,9 +4051,7 @@ static void modeset_update_crtc_power_domains(struct drm_device *dev)
|
|
if (!crtc->base.enabled)
|
|
if (!crtc->base.enabled)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- pipe_domains[crtc->pipe] = get_pipe_power_domains(dev,
|
|
|
|
- crtc->pipe,
|
|
|
|
- crtc->config.pch_pfit.enabled);
|
|
|
|
|
|
+ pipe_domains[crtc->pipe] = get_crtc_power_domains(&crtc->base);
|
|
|
|
|
|
for_each_power_domain(domain, pipe_domains[crtc->pipe])
|
|
for_each_power_domain(domain, pipe_domains[crtc->pipe])
|
|
intel_display_power_get(dev_priv, domain);
|
|
intel_display_power_get(dev_priv, domain);
|