diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-11-24 13:34:40 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-11-24 13:34:40 -0500 |
commit | 8bd142c01648cdb33e9bcafa0448ba2c20ed814c (patch) | |
tree | 9197c60d3f9d4036f38f281a183e94750ceea1d7 /drivers/gpu/drm/i915 | |
parent | d792abacaf1a1a8dfea353fab699b97fa6251c2a (diff) | |
parent | fbb4574ce9a37e15a9872860bf202f2be5bdf6c4 (diff) |
Merge tag 'kvm-arm-for-v4.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into kvm-master
KVM/ARM Fixes for v4.4-rc3.
Includes some timer fixes, properly unmapping PTEs, an errata fix, and two
tweaks to the EL2 panic code.
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_params.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 75 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 37 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 10 |
7 files changed, 118 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 8afda459a26e..95bb27de774f 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -351,6 +351,8 @@ enum intel_dpll_id { | |||
351 | /* hsw/bdw */ | 351 | /* hsw/bdw */ |
352 | DPLL_ID_WRPLL1 = 0, | 352 | DPLL_ID_WRPLL1 = 0, |
353 | DPLL_ID_WRPLL2 = 1, | 353 | DPLL_ID_WRPLL2 = 1, |
354 | DPLL_ID_SPLL = 2, | ||
355 | |||
354 | /* skl */ | 356 | /* skl */ |
355 | DPLL_ID_SKL_DPLL1 = 0, | 357 | DPLL_ID_SKL_DPLL1 = 0, |
356 | DPLL_ID_SKL_DPLL2 = 1, | 358 | DPLL_ID_SKL_DPLL2 = 1, |
@@ -367,6 +369,7 @@ struct intel_dpll_hw_state { | |||
367 | 369 | ||
368 | /* hsw, bdw */ | 370 | /* hsw, bdw */ |
369 | uint32_t wrpll; | 371 | uint32_t wrpll; |
372 | uint32_t spll; | ||
370 | 373 | ||
371 | /* skl */ | 374 | /* skl */ |
372 | /* | 375 | /* |
@@ -2648,6 +2651,7 @@ struct i915_params { | |||
2648 | int enable_cmd_parser; | 2651 | int enable_cmd_parser; |
2649 | /* leave bools at the end to not create holes */ | 2652 | /* leave bools at the end to not create holes */ |
2650 | bool enable_hangcheck; | 2653 | bool enable_hangcheck; |
2654 | bool fastboot; | ||
2651 | bool prefault_disable; | 2655 | bool prefault_disable; |
2652 | bool load_detect_test; | 2656 | bool load_detect_test; |
2653 | bool reset; | 2657 | bool reset; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5cf4a1998273..91bb1fc27420 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -3809,6 +3809,7 @@ int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data, | |||
3809 | int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, | 3809 | int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, |
3810 | struct drm_file *file) | 3810 | struct drm_file *file) |
3811 | { | 3811 | { |
3812 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3812 | struct drm_i915_gem_caching *args = data; | 3813 | struct drm_i915_gem_caching *args = data; |
3813 | struct drm_i915_gem_object *obj; | 3814 | struct drm_i915_gem_object *obj; |
3814 | enum i915_cache_level level; | 3815 | enum i915_cache_level level; |
@@ -3837,9 +3838,11 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, | |||
3837 | return -EINVAL; | 3838 | return -EINVAL; |
3838 | } | 3839 | } |
3839 | 3840 | ||
3841 | intel_runtime_pm_get(dev_priv); | ||
3842 | |||
3840 | ret = i915_mutex_lock_interruptible(dev); | 3843 | ret = i915_mutex_lock_interruptible(dev); |
3841 | if (ret) | 3844 | if (ret) |
3842 | return ret; | 3845 | goto rpm_put; |
3843 | 3846 | ||
3844 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); | 3847 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); |
3845 | if (&obj->base == NULL) { | 3848 | if (&obj->base == NULL) { |
@@ -3852,6 +3855,9 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, | |||
3852 | drm_gem_object_unreference(&obj->base); | 3855 | drm_gem_object_unreference(&obj->base); |
3853 | unlock: | 3856 | unlock: |
3854 | mutex_unlock(&dev->struct_mutex); | 3857 | mutex_unlock(&dev->struct_mutex); |
3858 | rpm_put: | ||
3859 | intel_runtime_pm_put(dev_priv); | ||
3860 | |||
3855 | return ret; | 3861 | return ret; |
3856 | } | 3862 | } |
3857 | 3863 | ||
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index 96bb23865eac..4be13a5eb932 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c | |||
@@ -40,6 +40,7 @@ struct i915_params i915 __read_mostly = { | |||
40 | .preliminary_hw_support = IS_ENABLED(CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT), | 40 | .preliminary_hw_support = IS_ENABLED(CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT), |
41 | .disable_power_well = -1, | 41 | .disable_power_well = -1, |
42 | .enable_ips = 1, | 42 | .enable_ips = 1, |
43 | .fastboot = 0, | ||
43 | .prefault_disable = 0, | 44 | .prefault_disable = 0, |
44 | .load_detect_test = 0, | 45 | .load_detect_test = 0, |
45 | .reset = true, | 46 | .reset = true, |
@@ -133,6 +134,10 @@ MODULE_PARM_DESC(disable_power_well, | |||
133 | module_param_named_unsafe(enable_ips, i915.enable_ips, int, 0600); | 134 | module_param_named_unsafe(enable_ips, i915.enable_ips, int, 0600); |
134 | MODULE_PARM_DESC(enable_ips, "Enable IPS (default: true)"); | 135 | MODULE_PARM_DESC(enable_ips, "Enable IPS (default: true)"); |
135 | 136 | ||
137 | module_param_named(fastboot, i915.fastboot, bool, 0600); | ||
138 | MODULE_PARM_DESC(fastboot, | ||
139 | "Try to skip unnecessary mode sets at boot time (default: false)"); | ||
140 | |||
136 | module_param_named_unsafe(prefault_disable, i915.prefault_disable, bool, 0600); | 141 | module_param_named_unsafe(prefault_disable, i915.prefault_disable, bool, 0600); |
137 | MODULE_PARM_DESC(prefault_disable, | 142 | MODULE_PARM_DESC(prefault_disable, |
138 | "Disable page prefaulting for pread/pwrite/reloc (default:false). " | 143 | "Disable page prefaulting for pread/pwrite/reloc (default:false). " |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index b84aaa0bb48a..6a2c76e367a5 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -138,18 +138,6 @@ static void hsw_crt_get_config(struct intel_encoder *encoder, | |||
138 | pipe_config->base.adjusted_mode.flags |= intel_crt_get_flags(encoder); | 138 | pipe_config->base.adjusted_mode.flags |= intel_crt_get_flags(encoder); |
139 | } | 139 | } |
140 | 140 | ||
141 | static void hsw_crt_pre_enable(struct intel_encoder *encoder) | ||
142 | { | ||
143 | struct drm_device *dev = encoder->base.dev; | ||
144 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
145 | |||
146 | WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL already enabled\n"); | ||
147 | I915_WRITE(SPLL_CTL, | ||
148 | SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC); | ||
149 | POSTING_READ(SPLL_CTL); | ||
150 | udelay(20); | ||
151 | } | ||
152 | |||
153 | /* Note: The caller is required to filter out dpms modes not supported by the | 141 | /* Note: The caller is required to filter out dpms modes not supported by the |
154 | * platform. */ | 142 | * platform. */ |
155 | static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) | 143 | static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) |
@@ -216,19 +204,6 @@ static void pch_post_disable_crt(struct intel_encoder *encoder) | |||
216 | intel_disable_crt(encoder); | 204 | intel_disable_crt(encoder); |
217 | } | 205 | } |
218 | 206 | ||
219 | static void hsw_crt_post_disable(struct intel_encoder *encoder) | ||
220 | { | ||
221 | struct drm_device *dev = encoder->base.dev; | ||
222 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
223 | uint32_t val; | ||
224 | |||
225 | DRM_DEBUG_KMS("Disabling SPLL\n"); | ||
226 | val = I915_READ(SPLL_CTL); | ||
227 | WARN_ON(!(val & SPLL_PLL_ENABLE)); | ||
228 | I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE); | ||
229 | POSTING_READ(SPLL_CTL); | ||
230 | } | ||
231 | |||
232 | static void intel_enable_crt(struct intel_encoder *encoder) | 207 | static void intel_enable_crt(struct intel_encoder *encoder) |
233 | { | 208 | { |
234 | struct intel_crt *crt = intel_encoder_to_crt(encoder); | 209 | struct intel_crt *crt = intel_encoder_to_crt(encoder); |
@@ -280,6 +255,10 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder, | |||
280 | if (HAS_DDI(dev)) { | 255 | if (HAS_DDI(dev)) { |
281 | pipe_config->ddi_pll_sel = PORT_CLK_SEL_SPLL; | 256 | pipe_config->ddi_pll_sel = PORT_CLK_SEL_SPLL; |
282 | pipe_config->port_clock = 135000 * 2; | 257 | pipe_config->port_clock = 135000 * 2; |
258 | |||
259 | pipe_config->dpll_hw_state.wrpll = 0; | ||
260 | pipe_config->dpll_hw_state.spll = | ||
261 | SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC; | ||
283 | } | 262 | } |
284 | 263 | ||
285 | return true; | 264 | return true; |
@@ -860,8 +839,6 @@ void intel_crt_init(struct drm_device *dev) | |||
860 | if (HAS_DDI(dev)) { | 839 | if (HAS_DDI(dev)) { |
861 | crt->base.get_config = hsw_crt_get_config; | 840 | crt->base.get_config = hsw_crt_get_config; |
862 | crt->base.get_hw_state = intel_ddi_get_hw_state; | 841 | crt->base.get_hw_state = intel_ddi_get_hw_state; |
863 | crt->base.pre_enable = hsw_crt_pre_enable; | ||
864 | crt->base.post_disable = hsw_crt_post_disable; | ||
865 | } else { | 842 | } else { |
866 | crt->base.get_config = intel_crt_get_config; | 843 | crt->base.get_config = intel_crt_get_config; |
867 | crt->base.get_hw_state = intel_crt_get_hw_state; | 844 | crt->base.get_hw_state = intel_crt_get_hw_state; |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index b25e99a432fb..a6752a61d99f 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -1286,6 +1286,18 @@ hsw_ddi_pll_select(struct intel_crtc *intel_crtc, | |||
1286 | } | 1286 | } |
1287 | 1287 | ||
1288 | crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id); | 1288 | crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id); |
1289 | } else if (crtc_state->ddi_pll_sel == PORT_CLK_SEL_SPLL) { | ||
1290 | struct drm_atomic_state *state = crtc_state->base.state; | ||
1291 | struct intel_shared_dpll_config *spll = | ||
1292 | &intel_atomic_get_shared_dpll_state(state)[DPLL_ID_SPLL]; | ||
1293 | |||
1294 | if (spll->crtc_mask && | ||
1295 | WARN_ON(spll->hw_state.spll != crtc_state->dpll_hw_state.spll)) | ||
1296 | return false; | ||
1297 | |||
1298 | crtc_state->shared_dpll = DPLL_ID_SPLL; | ||
1299 | spll->hw_state.spll = crtc_state->dpll_hw_state.spll; | ||
1300 | spll->crtc_mask |= 1 << intel_crtc->pipe; | ||
1289 | } | 1301 | } |
1290 | 1302 | ||
1291 | return true; | 1303 | return true; |
@@ -2437,7 +2449,7 @@ static void intel_disable_ddi(struct intel_encoder *intel_encoder) | |||
2437 | } | 2449 | } |
2438 | } | 2450 | } |
2439 | 2451 | ||
2440 | static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv, | 2452 | static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv, |
2441 | struct intel_shared_dpll *pll) | 2453 | struct intel_shared_dpll *pll) |
2442 | { | 2454 | { |
2443 | I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll); | 2455 | I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll); |
@@ -2445,9 +2457,17 @@ static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv, | |||
2445 | udelay(20); | 2457 | udelay(20); |
2446 | } | 2458 | } |
2447 | 2459 | ||
2448 | static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv, | 2460 | static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv, |
2449 | struct intel_shared_dpll *pll) | 2461 | struct intel_shared_dpll *pll) |
2450 | { | 2462 | { |
2463 | I915_WRITE(SPLL_CTL, pll->config.hw_state.spll); | ||
2464 | POSTING_READ(SPLL_CTL); | ||
2465 | udelay(20); | ||
2466 | } | ||
2467 | |||
2468 | static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv, | ||
2469 | struct intel_shared_dpll *pll) | ||
2470 | { | ||
2451 | uint32_t val; | 2471 | uint32_t val; |
2452 | 2472 | ||
2453 | val = I915_READ(WRPLL_CTL(pll->id)); | 2473 | val = I915_READ(WRPLL_CTL(pll->id)); |
@@ -2455,9 +2475,19 @@ static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv, | |||
2455 | POSTING_READ(WRPLL_CTL(pll->id)); | 2475 | POSTING_READ(WRPLL_CTL(pll->id)); |
2456 | } | 2476 | } |
2457 | 2477 | ||
2458 | static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, | 2478 | static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv, |
2459 | struct intel_shared_dpll *pll, | 2479 | struct intel_shared_dpll *pll) |
2460 | struct intel_dpll_hw_state *hw_state) | 2480 | { |
2481 | uint32_t val; | ||
2482 | |||
2483 | val = I915_READ(SPLL_CTL); | ||
2484 | I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE); | ||
2485 | POSTING_READ(SPLL_CTL); | ||
2486 | } | ||
2487 | |||
2488 | static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv, | ||
2489 | struct intel_shared_dpll *pll, | ||
2490 | struct intel_dpll_hw_state *hw_state) | ||
2461 | { | 2491 | { |
2462 | uint32_t val; | 2492 | uint32_t val; |
2463 | 2493 | ||
@@ -2470,25 +2500,50 @@ static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, | |||
2470 | return val & WRPLL_PLL_ENABLE; | 2500 | return val & WRPLL_PLL_ENABLE; |
2471 | } | 2501 | } |
2472 | 2502 | ||
2503 | static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv, | ||
2504 | struct intel_shared_dpll *pll, | ||
2505 | struct intel_dpll_hw_state *hw_state) | ||
2506 | { | ||
2507 | uint32_t val; | ||
2508 | |||
2509 | if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS)) | ||
2510 | return false; | ||
2511 | |||
2512 | val = I915_READ(SPLL_CTL); | ||
2513 | hw_state->spll = val; | ||
2514 | |||
2515 | return val & SPLL_PLL_ENABLE; | ||
2516 | } | ||
2517 | |||
2518 | |||
2473 | static const char * const hsw_ddi_pll_names[] = { | 2519 | static const char * const hsw_ddi_pll_names[] = { |
2474 | "WRPLL 1", | 2520 | "WRPLL 1", |
2475 | "WRPLL 2", | 2521 | "WRPLL 2", |
2522 | "SPLL" | ||
2476 | }; | 2523 | }; |
2477 | 2524 | ||
2478 | static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv) | 2525 | static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv) |
2479 | { | 2526 | { |
2480 | int i; | 2527 | int i; |
2481 | 2528 | ||
2482 | dev_priv->num_shared_dpll = 2; | 2529 | dev_priv->num_shared_dpll = 3; |
2483 | 2530 | ||
2484 | for (i = 0; i < dev_priv->num_shared_dpll; i++) { | 2531 | for (i = 0; i < 2; i++) { |
2485 | dev_priv->shared_dplls[i].id = i; | 2532 | dev_priv->shared_dplls[i].id = i; |
2486 | dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i]; | 2533 | dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i]; |
2487 | dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable; | 2534 | dev_priv->shared_dplls[i].disable = hsw_ddi_wrpll_disable; |
2488 | dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable; | 2535 | dev_priv->shared_dplls[i].enable = hsw_ddi_wrpll_enable; |
2489 | dev_priv->shared_dplls[i].get_hw_state = | 2536 | dev_priv->shared_dplls[i].get_hw_state = |
2490 | hsw_ddi_pll_get_hw_state; | 2537 | hsw_ddi_wrpll_get_hw_state; |
2491 | } | 2538 | } |
2539 | |||
2540 | /* SPLL is special, but needs to be initialized anyway.. */ | ||
2541 | dev_priv->shared_dplls[i].id = i; | ||
2542 | dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i]; | ||
2543 | dev_priv->shared_dplls[i].disable = hsw_ddi_spll_disable; | ||
2544 | dev_priv->shared_dplls[i].enable = hsw_ddi_spll_enable; | ||
2545 | dev_priv->shared_dplls[i].get_hw_state = hsw_ddi_spll_get_hw_state; | ||
2546 | |||
2492 | } | 2547 | } |
2493 | 2548 | ||
2494 | static const char * const skl_ddi_pll_names[] = { | 2549 | static const char * const skl_ddi_pll_names[] = { |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f62ffc04c21d..71860f8680f9 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2646,11 +2646,13 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, | |||
2646 | return; | 2646 | return; |
2647 | 2647 | ||
2648 | valid_fb: | 2648 | valid_fb: |
2649 | plane_state->src_x = plane_state->src_y = 0; | 2649 | plane_state->src_x = 0; |
2650 | plane_state->src_y = 0; | ||
2650 | plane_state->src_w = fb->width << 16; | 2651 | plane_state->src_w = fb->width << 16; |
2651 | plane_state->src_h = fb->height << 16; | 2652 | plane_state->src_h = fb->height << 16; |
2652 | 2653 | ||
2653 | plane_state->crtc_x = plane_state->src_y = 0; | 2654 | plane_state->crtc_x = 0; |
2655 | plane_state->crtc_y = 0; | ||
2654 | plane_state->crtc_w = fb->width; | 2656 | plane_state->crtc_w = fb->width; |
2655 | plane_state->crtc_h = fb->height; | 2657 | plane_state->crtc_h = fb->height; |
2656 | 2658 | ||
@@ -4237,6 +4239,7 @@ struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc, | |||
4237 | struct intel_shared_dpll *pll; | 4239 | struct intel_shared_dpll *pll; |
4238 | struct intel_shared_dpll_config *shared_dpll; | 4240 | struct intel_shared_dpll_config *shared_dpll; |
4239 | enum intel_dpll_id i; | 4241 | enum intel_dpll_id i; |
4242 | int max = dev_priv->num_shared_dpll; | ||
4240 | 4243 | ||
4241 | shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state); | 4244 | shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state); |
4242 | 4245 | ||
@@ -4271,9 +4274,11 @@ struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc, | |||
4271 | WARN_ON(shared_dpll[i].crtc_mask); | 4274 | WARN_ON(shared_dpll[i].crtc_mask); |
4272 | 4275 | ||
4273 | goto found; | 4276 | goto found; |
4274 | } | 4277 | } else if (INTEL_INFO(dev_priv)->gen < 9 && HAS_DDI(dev_priv)) |
4278 | /* Do not consider SPLL */ | ||
4279 | max = 2; | ||
4275 | 4280 | ||
4276 | for (i = 0; i < dev_priv->num_shared_dpll; i++) { | 4281 | for (i = 0; i < max; i++) { |
4277 | pll = &dev_priv->shared_dplls[i]; | 4282 | pll = &dev_priv->shared_dplls[i]; |
4278 | 4283 | ||
4279 | /* Only want to check enabled timings first */ | 4284 | /* Only want to check enabled timings first */ |
@@ -9723,6 +9728,8 @@ static void haswell_get_ddi_pll(struct drm_i915_private *dev_priv, | |||
9723 | case PORT_CLK_SEL_WRPLL2: | 9728 | case PORT_CLK_SEL_WRPLL2: |
9724 | pipe_config->shared_dpll = DPLL_ID_WRPLL2; | 9729 | pipe_config->shared_dpll = DPLL_ID_WRPLL2; |
9725 | break; | 9730 | break; |
9731 | case PORT_CLK_SEL_SPLL: | ||
9732 | pipe_config->shared_dpll = DPLL_ID_SPLL; | ||
9726 | } | 9733 | } |
9727 | } | 9734 | } |
9728 | 9735 | ||
@@ -12003,9 +12010,10 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc, | |||
12003 | pipe_config->dpll_hw_state.cfgcr1, | 12010 | pipe_config->dpll_hw_state.cfgcr1, |
12004 | pipe_config->dpll_hw_state.cfgcr2); | 12011 | pipe_config->dpll_hw_state.cfgcr2); |
12005 | } else if (HAS_DDI(dev)) { | 12012 | } else if (HAS_DDI(dev)) { |
12006 | DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: wrpll: 0x%x\n", | 12013 | DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: wrpll: 0x%x spll: 0x%x\n", |
12007 | pipe_config->ddi_pll_sel, | 12014 | pipe_config->ddi_pll_sel, |
12008 | pipe_config->dpll_hw_state.wrpll); | 12015 | pipe_config->dpll_hw_state.wrpll, |
12016 | pipe_config->dpll_hw_state.spll); | ||
12009 | } else { | 12017 | } else { |
12010 | DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, " | 12018 | DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, " |
12011 | "fp0: 0x%x, fp1: 0x%x\n", | 12019 | "fp0: 0x%x, fp1: 0x%x\n", |
@@ -12528,6 +12536,7 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
12528 | PIPE_CONF_CHECK_X(dpll_hw_state.fp0); | 12536 | PIPE_CONF_CHECK_X(dpll_hw_state.fp0); |
12529 | PIPE_CONF_CHECK_X(dpll_hw_state.fp1); | 12537 | PIPE_CONF_CHECK_X(dpll_hw_state.fp1); |
12530 | PIPE_CONF_CHECK_X(dpll_hw_state.wrpll); | 12538 | PIPE_CONF_CHECK_X(dpll_hw_state.wrpll); |
12539 | PIPE_CONF_CHECK_X(dpll_hw_state.spll); | ||
12531 | PIPE_CONF_CHECK_X(dpll_hw_state.ctrl1); | 12540 | PIPE_CONF_CHECK_X(dpll_hw_state.ctrl1); |
12532 | PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr1); | 12541 | PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr1); |
12533 | PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr2); | 12542 | PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr2); |
@@ -13032,6 +13041,9 @@ static int intel_atomic_check(struct drm_device *dev, | |||
13032 | struct intel_crtc_state *pipe_config = | 13041 | struct intel_crtc_state *pipe_config = |
13033 | to_intel_crtc_state(crtc_state); | 13042 | to_intel_crtc_state(crtc_state); |
13034 | 13043 | ||
13044 | memset(&to_intel_crtc(crtc)->atomic, 0, | ||
13045 | sizeof(struct intel_crtc_atomic_commit)); | ||
13046 | |||
13035 | /* Catch I915_MODE_FLAG_INHERITED */ | 13047 | /* Catch I915_MODE_FLAG_INHERITED */ |
13036 | if (crtc_state->mode.private_flags != crtc->state->mode.private_flags) | 13048 | if (crtc_state->mode.private_flags != crtc->state->mode.private_flags) |
13037 | crtc_state->mode_changed = true; | 13049 | crtc_state->mode_changed = true; |
@@ -13056,7 +13068,8 @@ static int intel_atomic_check(struct drm_device *dev, | |||
13056 | if (ret) | 13068 | if (ret) |
13057 | return ret; | 13069 | return ret; |
13058 | 13070 | ||
13059 | if (intel_pipe_config_compare(state->dev, | 13071 | if (i915.fastboot && |
13072 | intel_pipe_config_compare(state->dev, | ||
13060 | to_intel_crtc_state(crtc->state), | 13073 | to_intel_crtc_state(crtc->state), |
13061 | pipe_config, true)) { | 13074 | pipe_config, true)) { |
13062 | crtc_state->mode_changed = false; | 13075 | crtc_state->mode_changed = false; |
@@ -14364,16 +14377,17 @@ static int intel_framebuffer_init(struct drm_device *dev, | |||
14364 | static struct drm_framebuffer * | 14377 | static struct drm_framebuffer * |
14365 | intel_user_framebuffer_create(struct drm_device *dev, | 14378 | intel_user_framebuffer_create(struct drm_device *dev, |
14366 | struct drm_file *filp, | 14379 | struct drm_file *filp, |
14367 | struct drm_mode_fb_cmd2 *mode_cmd) | 14380 | struct drm_mode_fb_cmd2 *user_mode_cmd) |
14368 | { | 14381 | { |
14369 | struct drm_i915_gem_object *obj; | 14382 | struct drm_i915_gem_object *obj; |
14383 | struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd; | ||
14370 | 14384 | ||
14371 | obj = to_intel_bo(drm_gem_object_lookup(dev, filp, | 14385 | obj = to_intel_bo(drm_gem_object_lookup(dev, filp, |
14372 | mode_cmd->handles[0])); | 14386 | mode_cmd.handles[0])); |
14373 | if (&obj->base == NULL) | 14387 | if (&obj->base == NULL) |
14374 | return ERR_PTR(-ENOENT); | 14388 | return ERR_PTR(-ENOENT); |
14375 | 14389 | ||
14376 | return intel_framebuffer_create(dev, mode_cmd, obj); | 14390 | return intel_framebuffer_create(dev, &mode_cmd, obj); |
14377 | } | 14391 | } |
14378 | 14392 | ||
14379 | #ifndef CONFIG_DRM_FBDEV_EMULATION | 14393 | #ifndef CONFIG_DRM_FBDEV_EMULATION |
@@ -14705,6 +14719,9 @@ static struct intel_quirk intel_quirks[] = { | |||
14705 | /* Apple Macbook 2,1 (Core 2 T7400) */ | 14719 | /* Apple Macbook 2,1 (Core 2 T7400) */ |
14706 | { 0x27a2, 0x8086, 0x7270, quirk_backlight_present }, | 14720 | { 0x27a2, 0x8086, 0x7270, quirk_backlight_present }, |
14707 | 14721 | ||
14722 | /* Apple Macbook 4,1 */ | ||
14723 | { 0x2a02, 0x106b, 0x00a1, quirk_backlight_present }, | ||
14724 | |||
14708 | /* Toshiba CB35 Chromebook (Celeron 2955U) */ | 14725 | /* Toshiba CB35 Chromebook (Celeron 2955U) */ |
14709 | { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present }, | 14726 | { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present }, |
14710 | 14727 | ||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index d52a15df6917..071a76b9ac52 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -4449,7 +4449,7 @@ static void gen6_set_rps(struct drm_device *dev, u8 val) | |||
4449 | POSTING_READ(GEN6_RPNSWREQ); | 4449 | POSTING_READ(GEN6_RPNSWREQ); |
4450 | 4450 | ||
4451 | dev_priv->rps.cur_freq = val; | 4451 | dev_priv->rps.cur_freq = val; |
4452 | trace_intel_gpu_freq_change(val * 50); | 4452 | trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); |
4453 | } | 4453 | } |
4454 | 4454 | ||
4455 | static void valleyview_set_rps(struct drm_device *dev, u8 val) | 4455 | static void valleyview_set_rps(struct drm_device *dev, u8 val) |
@@ -7255,7 +7255,8 @@ static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val) | |||
7255 | int intel_gpu_freq(struct drm_i915_private *dev_priv, int val) | 7255 | int intel_gpu_freq(struct drm_i915_private *dev_priv, int val) |
7256 | { | 7256 | { |
7257 | if (IS_GEN9(dev_priv->dev)) | 7257 | if (IS_GEN9(dev_priv->dev)) |
7258 | return (val * GT_FREQUENCY_MULTIPLIER) / GEN9_FREQ_SCALER; | 7258 | return DIV_ROUND_CLOSEST(val * GT_FREQUENCY_MULTIPLIER, |
7259 | GEN9_FREQ_SCALER); | ||
7259 | else if (IS_CHERRYVIEW(dev_priv->dev)) | 7260 | else if (IS_CHERRYVIEW(dev_priv->dev)) |
7260 | return chv_gpu_freq(dev_priv, val); | 7261 | return chv_gpu_freq(dev_priv, val); |
7261 | else if (IS_VALLEYVIEW(dev_priv->dev)) | 7262 | else if (IS_VALLEYVIEW(dev_priv->dev)) |
@@ -7267,13 +7268,14 @@ int intel_gpu_freq(struct drm_i915_private *dev_priv, int val) | |||
7267 | int intel_freq_opcode(struct drm_i915_private *dev_priv, int val) | 7268 | int intel_freq_opcode(struct drm_i915_private *dev_priv, int val) |
7268 | { | 7269 | { |
7269 | if (IS_GEN9(dev_priv->dev)) | 7270 | if (IS_GEN9(dev_priv->dev)) |
7270 | return (val * GEN9_FREQ_SCALER) / GT_FREQUENCY_MULTIPLIER; | 7271 | return DIV_ROUND_CLOSEST(val * GEN9_FREQ_SCALER, |
7272 | GT_FREQUENCY_MULTIPLIER); | ||
7271 | else if (IS_CHERRYVIEW(dev_priv->dev)) | 7273 | else if (IS_CHERRYVIEW(dev_priv->dev)) |
7272 | return chv_freq_opcode(dev_priv, val); | 7274 | return chv_freq_opcode(dev_priv, val); |
7273 | else if (IS_VALLEYVIEW(dev_priv->dev)) | 7275 | else if (IS_VALLEYVIEW(dev_priv->dev)) |
7274 | return byt_freq_opcode(dev_priv, val); | 7276 | return byt_freq_opcode(dev_priv, val); |
7275 | else | 7277 | else |
7276 | return val / GT_FREQUENCY_MULTIPLIER; | 7278 | return DIV_ROUND_CLOSEST(val, GT_FREQUENCY_MULTIPLIER); |
7277 | } | 7279 | } |
7278 | 7280 | ||
7279 | struct request_boost { | 7281 | struct request_boost { |