|
@@ -1187,7 +1187,7 @@ static bool g4x_compute_wm0(struct drm_device *dev,
|
|
|
|
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
clock = adjusted_mode->crtc_clock;
|
|
clock = adjusted_mode->crtc_clock;
|
|
- htotal = adjusted_mode->htotal;
|
|
|
|
|
|
+ htotal = adjusted_mode->crtc_htotal;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
|
|
|
|
@@ -1274,7 +1274,7 @@ static bool g4x_compute_srwm(struct drm_device *dev,
|
|
crtc = intel_get_crtc_for_plane(dev, plane);
|
|
crtc = intel_get_crtc_for_plane(dev, plane);
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
clock = adjusted_mode->crtc_clock;
|
|
clock = adjusted_mode->crtc_clock;
|
|
- htotal = adjusted_mode->htotal;
|
|
|
|
|
|
+ htotal = adjusted_mode->crtc_htotal;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
|
|
|
|
@@ -1505,7 +1505,7 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
|
|
const struct drm_display_mode *adjusted_mode =
|
|
const struct drm_display_mode *adjusted_mode =
|
|
&to_intel_crtc(crtc)->config.adjusted_mode;
|
|
&to_intel_crtc(crtc)->config.adjusted_mode;
|
|
int clock = adjusted_mode->crtc_clock;
|
|
int clock = adjusted_mode->crtc_clock;
|
|
- int htotal = adjusted_mode->htotal;
|
|
|
|
|
|
+ int htotal = adjusted_mode->crtc_htotal;
|
|
int hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
int hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
int pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
int pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
unsigned long line_time_us;
|
|
unsigned long line_time_us;
|
|
@@ -1631,7 +1631,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
|
|
const struct drm_display_mode *adjusted_mode =
|
|
const struct drm_display_mode *adjusted_mode =
|
|
&to_intel_crtc(enabled)->config.adjusted_mode;
|
|
&to_intel_crtc(enabled)->config.adjusted_mode;
|
|
int clock = adjusted_mode->crtc_clock;
|
|
int clock = adjusted_mode->crtc_clock;
|
|
- int htotal = adjusted_mode->htotal;
|
|
|
|
|
|
+ int htotal = adjusted_mode->crtc_htotal;
|
|
int hdisplay = to_intel_crtc(enabled)->config.pipe_src_w;
|
|
int hdisplay = to_intel_crtc(enabled)->config.pipe_src_w;
|
|
int pixel_size = enabled->fb->bits_per_pixel / 8;
|
|
int pixel_size = enabled->fb->bits_per_pixel / 8;
|
|
unsigned long line_time_us;
|
|
unsigned long line_time_us;
|
|
@@ -1783,7 +1783,7 @@ static bool ironlake_compute_srwm(struct drm_device *dev, int level, int plane,
|
|
crtc = intel_get_crtc_for_plane(dev, plane);
|
|
crtc = intel_get_crtc_for_plane(dev, plane);
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode;
|
|
clock = adjusted_mode->crtc_clock;
|
|
clock = adjusted_mode->crtc_clock;
|
|
- htotal = adjusted_mode->htotal;
|
|
|
|
|
|
+ htotal = adjusted_mode->crtc_htotal;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
pixel_size = crtc->fb->bits_per_pixel / 8;
|
|
|
|
|
|
@@ -2476,8 +2476,9 @@ hsw_compute_linetime_wm(struct drm_device *dev, struct drm_crtc *crtc)
|
|
/* The WM are computed with base on how long it takes to fill a single
|
|
/* The WM are computed with base on how long it takes to fill a single
|
|
* row at the given clock rate, multiplied by 8.
|
|
* row at the given clock rate, multiplied by 8.
|
|
* */
|
|
* */
|
|
- linetime = DIV_ROUND_CLOSEST(mode->htotal * 1000 * 8, mode->clock);
|
|
|
|
- ips_linetime = DIV_ROUND_CLOSEST(mode->htotal * 1000 * 8,
|
|
|
|
|
|
+ linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
|
|
|
|
+ mode->crtc_clock);
|
|
|
|
+ ips_linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
|
|
intel_ddi_get_cdclk_freq(dev_priv));
|
|
intel_ddi_get_cdclk_freq(dev_priv));
|
|
|
|
|
|
return PIPE_WM_LINETIME_IPS_LINETIME(ips_linetime) |
|
|
return PIPE_WM_LINETIME_IPS_LINETIME(ips_linetime) |
|
|
@@ -6179,10 +6180,19 @@ int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
|
|
return DIV_ROUND_CLOSEST(4 * mul * val, dev_priv->mem_freq) + 0xbd - 6;
|
|
return DIV_ROUND_CLOSEST(4 * mul * val, dev_priv->mem_freq) + 0xbd - 6;
|
|
}
|
|
}
|
|
|
|
|
|
-void intel_pm_init(struct drm_device *dev)
|
|
|
|
|
|
+void intel_pm_setup(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
|
|
|
|
+ mutex_init(&dev_priv->rps.hw_lock);
|
|
|
|
+
|
|
|
|
+ mutex_init(&dev_priv->pc8.lock);
|
|
|
|
+ dev_priv->pc8.requirements_met = false;
|
|
|
|
+ dev_priv->pc8.gpu_idle = false;
|
|
|
|
+ dev_priv->pc8.irqs_disabled = false;
|
|
|
|
+ dev_priv->pc8.enabled = false;
|
|
|
|
+ dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */
|
|
|
|
+ INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work);
|
|
INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work,
|
|
INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work,
|
|
intel_gen6_powersave_work);
|
|
intel_gen6_powersave_work);
|
|
}
|
|
}
|