diff options
-rw-r--r-- | drivers/gpu/drm/i915/gvt/kvmgt.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lpe_audio.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 101 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_workarounds.c | 3 |
10 files changed, 123 insertions, 62 deletions
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index 718ab307a500..4d2f53ae9f0f 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c | |||
@@ -185,12 +185,6 @@ static int gvt_dma_map_page(struct intel_vgpu *vgpu, unsigned long gfn, | |||
185 | if (ret) | 185 | if (ret) |
186 | return ret; | 186 | return ret; |
187 | 187 | ||
188 | if (!pfn_valid(pfn)) { | ||
189 | gvt_vgpu_err("pfn 0x%lx is not mem backed\n", pfn); | ||
190 | vfio_unpin_pages(mdev_dev(vgpu->vdev.mdev), &gfn, 1); | ||
191 | return -EINVAL; | ||
192 | } | ||
193 | |||
194 | /* Setup DMA mapping. */ | 188 | /* Setup DMA mapping. */ |
195 | *dma_addr = dma_map_page(dev, page, 0, size, PCI_DMA_BIDIRECTIONAL); | 189 | *dma_addr = dma_map_page(dev, page, 0, size, PCI_DMA_BIDIRECTIONAL); |
196 | ret = dma_mapping_error(dev, *dma_addr); | 190 | ret = dma_mapping_error(dev, *dma_addr); |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index b3aefd623557..f9ce35da4123 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1218,7 +1218,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused) | |||
1218 | rpcurup, GT_PM_INTERVAL_TO_US(dev_priv, rpcurup)); | 1218 | rpcurup, GT_PM_INTERVAL_TO_US(dev_priv, rpcurup)); |
1219 | seq_printf(m, "RP PREV UP: %d (%dus)\n", | 1219 | seq_printf(m, "RP PREV UP: %d (%dus)\n", |
1220 | rpprevup, GT_PM_INTERVAL_TO_US(dev_priv, rpprevup)); | 1220 | rpprevup, GT_PM_INTERVAL_TO_US(dev_priv, rpprevup)); |
1221 | seq_printf(m, "Up threshold: %d%%\n", rps->up_threshold); | 1221 | seq_printf(m, "Up threshold: %d%%\n", |
1222 | rps->power.up_threshold); | ||
1222 | 1223 | ||
1223 | seq_printf(m, "RP CUR DOWN EI: %d (%dus)\n", | 1224 | seq_printf(m, "RP CUR DOWN EI: %d (%dus)\n", |
1224 | rpdownei, GT_PM_INTERVAL_TO_US(dev_priv, rpdownei)); | 1225 | rpdownei, GT_PM_INTERVAL_TO_US(dev_priv, rpdownei)); |
@@ -1226,7 +1227,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused) | |||
1226 | rpcurdown, GT_PM_INTERVAL_TO_US(dev_priv, rpcurdown)); | 1227 | rpcurdown, GT_PM_INTERVAL_TO_US(dev_priv, rpcurdown)); |
1227 | seq_printf(m, "RP PREV DOWN: %d (%dus)\n", | 1228 | seq_printf(m, "RP PREV DOWN: %d (%dus)\n", |
1228 | rpprevdown, GT_PM_INTERVAL_TO_US(dev_priv, rpprevdown)); | 1229 | rpprevdown, GT_PM_INTERVAL_TO_US(dev_priv, rpprevdown)); |
1229 | seq_printf(m, "Down threshold: %d%%\n", rps->down_threshold); | 1230 | seq_printf(m, "Down threshold: %d%%\n", |
1231 | rps->power.down_threshold); | ||
1230 | 1232 | ||
1231 | max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 : | 1233 | max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 : |
1232 | rp_state_cap >> 16) & 0xff; | 1234 | rp_state_cap >> 16) & 0xff; |
@@ -2218,6 +2220,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) | |||
2218 | seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv)); | 2220 | seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv)); |
2219 | seq_printf(m, "Boosts outstanding? %d\n", | 2221 | seq_printf(m, "Boosts outstanding? %d\n", |
2220 | atomic_read(&rps->num_waiters)); | 2222 | atomic_read(&rps->num_waiters)); |
2223 | seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->power.interactive)); | ||
2221 | seq_printf(m, "Frequency requested %d\n", | 2224 | seq_printf(m, "Frequency requested %d\n", |
2222 | intel_gpu_freq(dev_priv, rps->cur_freq)); | 2225 | intel_gpu_freq(dev_priv, rps->cur_freq)); |
2223 | seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n", | 2226 | seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n", |
@@ -2261,13 +2264,13 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) | |||
2261 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); | 2264 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); |
2262 | 2265 | ||
2263 | seq_printf(m, "\nRPS Autotuning (current \"%s\" window):\n", | 2266 | seq_printf(m, "\nRPS Autotuning (current \"%s\" window):\n", |
2264 | rps_power_to_str(rps->power)); | 2267 | rps_power_to_str(rps->power.mode)); |
2265 | seq_printf(m, " Avg. up: %d%% [above threshold? %d%%]\n", | 2268 | seq_printf(m, " Avg. up: %d%% [above threshold? %d%%]\n", |
2266 | rpup && rpupei ? 100 * rpup / rpupei : 0, | 2269 | rpup && rpupei ? 100 * rpup / rpupei : 0, |
2267 | rps->up_threshold); | 2270 | rps->power.up_threshold); |
2268 | seq_printf(m, " Avg. down: %d%% [below threshold? %d%%]\n", | 2271 | seq_printf(m, " Avg. down: %d%% [below threshold? %d%%]\n", |
2269 | rpdown && rpdownei ? 100 * rpdown / rpdownei : 0, | 2272 | rpdown && rpdownei ? 100 * rpdown / rpdownei : 0, |
2270 | rps->down_threshold); | 2273 | rps->power.down_threshold); |
2271 | } else { | 2274 | } else { |
2272 | seq_puts(m, "\nRPS Autotuning inactive\n"); | 2275 | seq_puts(m, "\nRPS Autotuning inactive\n"); |
2273 | } | 2276 | } |
@@ -2606,13 +2609,22 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data) | |||
2606 | "sink internal error", | 2609 | "sink internal error", |
2607 | }; | 2610 | }; |
2608 | struct drm_connector *connector = m->private; | 2611 | struct drm_connector *connector = m->private; |
2612 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | ||
2609 | struct intel_dp *intel_dp = | 2613 | struct intel_dp *intel_dp = |
2610 | enc_to_intel_dp(&intel_attached_encoder(connector)->base); | 2614 | enc_to_intel_dp(&intel_attached_encoder(connector)->base); |
2615 | int ret; | ||
2616 | |||
2617 | if (!CAN_PSR(dev_priv)) { | ||
2618 | seq_puts(m, "PSR Unsupported\n"); | ||
2619 | return -ENODEV; | ||
2620 | } | ||
2611 | 2621 | ||
2612 | if (connector->status != connector_status_connected) | 2622 | if (connector->status != connector_status_connected) |
2613 | return -ENODEV; | 2623 | return -ENODEV; |
2614 | 2624 | ||
2615 | if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val) == 1) { | 2625 | ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val); |
2626 | |||
2627 | if (ret == 1) { | ||
2616 | const char *str = "unknown"; | 2628 | const char *str = "unknown"; |
2617 | 2629 | ||
2618 | val &= DP_PSR_SINK_STATE_MASK; | 2630 | val &= DP_PSR_SINK_STATE_MASK; |
@@ -2620,7 +2632,7 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data) | |||
2620 | str = sink_status[val]; | 2632 | str = sink_status[val]; |
2621 | seq_printf(m, "Sink PSR status: 0x%x [%s]\n", val, str); | 2633 | seq_printf(m, "Sink PSR status: 0x%x [%s]\n", val, str); |
2622 | } else { | 2634 | } else { |
2623 | DRM_ERROR("dpcd read (at %u) failed\n", DP_PSR_STATUS); | 2635 | return ret; |
2624 | } | 2636 | } |
2625 | 2637 | ||
2626 | return 0; | 2638 | return 0; |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 0f49f9988dfa..4aca5344863d 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -779,11 +779,17 @@ struct intel_rps { | |||
779 | u8 rp0_freq; /* Non-overclocked max frequency. */ | 779 | u8 rp0_freq; /* Non-overclocked max frequency. */ |
780 | u16 gpll_ref_freq; /* vlv/chv GPLL reference frequency */ | 780 | u16 gpll_ref_freq; /* vlv/chv GPLL reference frequency */ |
781 | 781 | ||
782 | u8 up_threshold; /* Current %busy required to uplock */ | ||
783 | u8 down_threshold; /* Current %busy required to downclock */ | ||
784 | |||
785 | int last_adj; | 782 | int last_adj; |
786 | enum { LOW_POWER, BETWEEN, HIGH_POWER } power; | 783 | |
784 | struct { | ||
785 | struct mutex mutex; | ||
786 | |||
787 | enum { LOW_POWER, BETWEEN, HIGH_POWER } mode; | ||
788 | unsigned int interactive; | ||
789 | |||
790 | u8 up_threshold; /* Current %busy required to uplock */ | ||
791 | u8 down_threshold; /* Current %busy required to downclock */ | ||
792 | } power; | ||
787 | 793 | ||
788 | bool enabled; | 794 | bool enabled; |
789 | atomic_t num_waiters; | 795 | atomic_t num_waiters; |
@@ -3422,6 +3428,8 @@ extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv); | |||
3422 | extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val); | 3428 | extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val); |
3423 | extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv); | 3429 | extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv); |
3424 | extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val); | 3430 | extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val); |
3431 | extern void intel_rps_mark_interactive(struct drm_i915_private *i915, | ||
3432 | bool interactive); | ||
3425 | extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, | 3433 | extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, |
3426 | bool enable); | 3434 | bool enable); |
3427 | 3435 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 5dadefca2ad2..90628a47ae17 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1265,9 +1265,9 @@ static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir) | |||
1265 | c0 = max(render, media); | 1265 | c0 = max(render, media); |
1266 | c0 *= 1000 * 100 << 8; /* to usecs and scale to threshold% */ | 1266 | c0 *= 1000 * 100 << 8; /* to usecs and scale to threshold% */ |
1267 | 1267 | ||
1268 | if (c0 > time * rps->up_threshold) | 1268 | if (c0 > time * rps->power.up_threshold) |
1269 | events = GEN6_PM_RP_UP_THRESHOLD; | 1269 | events = GEN6_PM_RP_UP_THRESHOLD; |
1270 | else if (c0 < time * rps->down_threshold) | 1270 | else if (c0 < time * rps->power.down_threshold) |
1271 | events = GEN6_PM_RP_DOWN_THRESHOLD; | 1271 | events = GEN6_PM_RP_DOWN_THRESHOLD; |
1272 | } | 1272 | } |
1273 | 1273 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 8af945d8a995..91e7483228e1 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -2780,9 +2780,6 @@ enum i915_power_well_id { | |||
2780 | #define GEN8_4x4_STC_OPTIMIZATION_DISABLE (1 << 6) | 2780 | #define GEN8_4x4_STC_OPTIMIZATION_DISABLE (1 << 6) |
2781 | #define GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE (1 << 1) | 2781 | #define GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE (1 << 1) |
2782 | 2782 | ||
2783 | #define GEN10_CACHE_MODE_SS _MMIO(0xe420) | ||
2784 | #define FLOAT_BLEND_OPTIMIZATION_ENABLE (1 << 4) | ||
2785 | |||
2786 | #define GEN6_BLITTER_ECOSKPD _MMIO(0x221d0) | 2783 | #define GEN6_BLITTER_ECOSKPD _MMIO(0x221d0) |
2787 | #define GEN6_BLITTER_LOCK_SHIFT 16 | 2784 | #define GEN6_BLITTER_LOCK_SHIFT 16 |
2788 | #define GEN6_BLITTER_FBC_NOTIFY (1 << 3) | 2785 | #define GEN6_BLITTER_FBC_NOTIFY (1 << 3) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 87e4cfbfd096..ed3fa1c8a983 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -13104,6 +13104,19 @@ intel_prepare_plane_fb(struct drm_plane *plane, | |||
13104 | add_rps_boost_after_vblank(new_state->crtc, new_state->fence); | 13104 | add_rps_boost_after_vblank(new_state->crtc, new_state->fence); |
13105 | } | 13105 | } |
13106 | 13106 | ||
13107 | /* | ||
13108 | * We declare pageflips to be interactive and so merit a small bias | ||
13109 | * towards upclocking to deliver the frame on time. By only changing | ||
13110 | * the RPS thresholds to sample more regularly and aim for higher | ||
13111 | * clocks we can hopefully deliver low power workloads (like kodi) | ||
13112 | * that are not quite steady state without resorting to forcing | ||
13113 | * maximum clocks following a vblank miss (see do_rps_boost()). | ||
13114 | */ | ||
13115 | if (!intel_state->rps_interactive) { | ||
13116 | intel_rps_mark_interactive(dev_priv, true); | ||
13117 | intel_state->rps_interactive = true; | ||
13118 | } | ||
13119 | |||
13107 | return 0; | 13120 | return 0; |
13108 | } | 13121 | } |
13109 | 13122 | ||
@@ -13120,8 +13133,15 @@ void | |||
13120 | intel_cleanup_plane_fb(struct drm_plane *plane, | 13133 | intel_cleanup_plane_fb(struct drm_plane *plane, |
13121 | struct drm_plane_state *old_state) | 13134 | struct drm_plane_state *old_state) |
13122 | { | 13135 | { |
13136 | struct intel_atomic_state *intel_state = | ||
13137 | to_intel_atomic_state(old_state->state); | ||
13123 | struct drm_i915_private *dev_priv = to_i915(plane->dev); | 13138 | struct drm_i915_private *dev_priv = to_i915(plane->dev); |
13124 | 13139 | ||
13140 | if (intel_state->rps_interactive) { | ||
13141 | intel_rps_mark_interactive(dev_priv, false); | ||
13142 | intel_state->rps_interactive = false; | ||
13143 | } | ||
13144 | |||
13125 | /* Should only be called after a successful intel_prepare_plane_fb()! */ | 13145 | /* Should only be called after a successful intel_prepare_plane_fb()! */ |
13126 | mutex_lock(&dev_priv->drm.struct_mutex); | 13146 | mutex_lock(&dev_priv->drm.struct_mutex); |
13127 | intel_plane_unpin_fb(to_intel_plane_state(old_state)); | 13147 | intel_plane_unpin_fb(to_intel_plane_state(old_state)); |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index c275f91244a6..17af06d8a43e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -484,6 +484,8 @@ struct intel_atomic_state { | |||
484 | */ | 484 | */ |
485 | bool skip_intermediate_wm; | 485 | bool skip_intermediate_wm; |
486 | 486 | ||
487 | bool rps_interactive; | ||
488 | |||
487 | /* Gen9+ only */ | 489 | /* Gen9+ only */ |
488 | struct skl_ddb_values wm_results; | 490 | struct skl_ddb_values wm_results; |
489 | 491 | ||
diff --git a/drivers/gpu/drm/i915/intel_lpe_audio.c b/drivers/gpu/drm/i915/intel_lpe_audio.c index 6269750e2b54..430732720e65 100644 --- a/drivers/gpu/drm/i915/intel_lpe_audio.c +++ b/drivers/gpu/drm/i915/intel_lpe_audio.c | |||
@@ -126,9 +126,7 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv) | |||
126 | return platdev; | 126 | return platdev; |
127 | } | 127 | } |
128 | 128 | ||
129 | pm_runtime_forbid(&platdev->dev); | 129 | pm_runtime_no_callbacks(&platdev->dev); |
130 | pm_runtime_set_active(&platdev->dev); | ||
131 | pm_runtime_enable(&platdev->dev); | ||
132 | 130 | ||
133 | return platdev; | 131 | return platdev; |
134 | } | 132 | } |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 7312ecb73415..43ae9de12ba3 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -6264,42 +6264,15 @@ static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val) | |||
6264 | return limits; | 6264 | return limits; |
6265 | } | 6265 | } |
6266 | 6266 | ||
6267 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | 6267 | static void rps_set_power(struct drm_i915_private *dev_priv, int new_power) |
6268 | { | 6268 | { |
6269 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | 6269 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
6270 | int new_power; | ||
6271 | u32 threshold_up = 0, threshold_down = 0; /* in % */ | 6270 | u32 threshold_up = 0, threshold_down = 0; /* in % */ |
6272 | u32 ei_up = 0, ei_down = 0; | 6271 | u32 ei_up = 0, ei_down = 0; |
6273 | 6272 | ||
6274 | new_power = rps->power; | 6273 | lockdep_assert_held(&rps->power.mutex); |
6275 | switch (rps->power) { | ||
6276 | case LOW_POWER: | ||
6277 | if (val > rps->efficient_freq + 1 && | ||
6278 | val > rps->cur_freq) | ||
6279 | new_power = BETWEEN; | ||
6280 | break; | ||
6281 | |||
6282 | case BETWEEN: | ||
6283 | if (val <= rps->efficient_freq && | ||
6284 | val < rps->cur_freq) | ||
6285 | new_power = LOW_POWER; | ||
6286 | else if (val >= rps->rp0_freq && | ||
6287 | val > rps->cur_freq) | ||
6288 | new_power = HIGH_POWER; | ||
6289 | break; | ||
6290 | 6274 | ||
6291 | case HIGH_POWER: | 6275 | if (new_power == rps->power.mode) |
6292 | if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 && | ||
6293 | val < rps->cur_freq) | ||
6294 | new_power = BETWEEN; | ||
6295 | break; | ||
6296 | } | ||
6297 | /* Max/min bins are special */ | ||
6298 | if (val <= rps->min_freq_softlimit) | ||
6299 | new_power = LOW_POWER; | ||
6300 | if (val >= rps->max_freq_softlimit) | ||
6301 | new_power = HIGH_POWER; | ||
6302 | if (new_power == rps->power) | ||
6303 | return; | 6276 | return; |
6304 | 6277 | ||
6305 | /* Note the units here are not exactly 1us, but 1280ns. */ | 6278 | /* Note the units here are not exactly 1us, but 1280ns. */ |
@@ -6362,12 +6335,71 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | |||
6362 | GEN6_RP_DOWN_IDLE_AVG); | 6335 | GEN6_RP_DOWN_IDLE_AVG); |
6363 | 6336 | ||
6364 | skip_hw_write: | 6337 | skip_hw_write: |
6365 | rps->power = new_power; | 6338 | rps->power.mode = new_power; |
6366 | rps->up_threshold = threshold_up; | 6339 | rps->power.up_threshold = threshold_up; |
6367 | rps->down_threshold = threshold_down; | 6340 | rps->power.down_threshold = threshold_down; |
6341 | } | ||
6342 | |||
6343 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | ||
6344 | { | ||
6345 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6346 | int new_power; | ||
6347 | |||
6348 | new_power = rps->power.mode; | ||
6349 | switch (rps->power.mode) { | ||
6350 | case LOW_POWER: | ||
6351 | if (val > rps->efficient_freq + 1 && | ||
6352 | val > rps->cur_freq) | ||
6353 | new_power = BETWEEN; | ||
6354 | break; | ||
6355 | |||
6356 | case BETWEEN: | ||
6357 | if (val <= rps->efficient_freq && | ||
6358 | val < rps->cur_freq) | ||
6359 | new_power = LOW_POWER; | ||
6360 | else if (val >= rps->rp0_freq && | ||
6361 | val > rps->cur_freq) | ||
6362 | new_power = HIGH_POWER; | ||
6363 | break; | ||
6364 | |||
6365 | case HIGH_POWER: | ||
6366 | if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 && | ||
6367 | val < rps->cur_freq) | ||
6368 | new_power = BETWEEN; | ||
6369 | break; | ||
6370 | } | ||
6371 | /* Max/min bins are special */ | ||
6372 | if (val <= rps->min_freq_softlimit) | ||
6373 | new_power = LOW_POWER; | ||
6374 | if (val >= rps->max_freq_softlimit) | ||
6375 | new_power = HIGH_POWER; | ||
6376 | |||
6377 | mutex_lock(&rps->power.mutex); | ||
6378 | if (rps->power.interactive) | ||
6379 | new_power = HIGH_POWER; | ||
6380 | rps_set_power(dev_priv, new_power); | ||
6381 | mutex_unlock(&rps->power.mutex); | ||
6368 | rps->last_adj = 0; | 6382 | rps->last_adj = 0; |
6369 | } | 6383 | } |
6370 | 6384 | ||
6385 | void intel_rps_mark_interactive(struct drm_i915_private *i915, bool interactive) | ||
6386 | { | ||
6387 | struct intel_rps *rps = &i915->gt_pm.rps; | ||
6388 | |||
6389 | if (INTEL_GEN(i915) < 6) | ||
6390 | return; | ||
6391 | |||
6392 | mutex_lock(&rps->power.mutex); | ||
6393 | if (interactive) { | ||
6394 | if (!rps->power.interactive++ && READ_ONCE(i915->gt.awake)) | ||
6395 | rps_set_power(i915, HIGH_POWER); | ||
6396 | } else { | ||
6397 | GEM_BUG_ON(!rps->power.interactive); | ||
6398 | rps->power.interactive--; | ||
6399 | } | ||
6400 | mutex_unlock(&rps->power.mutex); | ||
6401 | } | ||
6402 | |||
6371 | static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | 6403 | static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) |
6372 | { | 6404 | { |
6373 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | 6405 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
@@ -6780,7 +6812,7 @@ static void reset_rps(struct drm_i915_private *dev_priv, | |||
6780 | u8 freq = rps->cur_freq; | 6812 | u8 freq = rps->cur_freq; |
6781 | 6813 | ||
6782 | /* force a reset */ | 6814 | /* force a reset */ |
6783 | rps->power = -1; | 6815 | rps->power.mode = -1; |
6784 | rps->cur_freq = -1; | 6816 | rps->cur_freq = -1; |
6785 | 6817 | ||
6786 | if (set(dev_priv, freq)) | 6818 | if (set(dev_priv, freq)) |
@@ -9604,6 +9636,7 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val) | |||
9604 | void intel_pm_setup(struct drm_i915_private *dev_priv) | 9636 | void intel_pm_setup(struct drm_i915_private *dev_priv) |
9605 | { | 9637 | { |
9606 | mutex_init(&dev_priv->pcu_lock); | 9638 | mutex_init(&dev_priv->pcu_lock); |
9639 | mutex_init(&dev_priv->gt_pm.rps.power.mutex); | ||
9607 | 9640 | ||
9608 | atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0); | 9641 | atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0); |
9609 | 9642 | ||
diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c index f8bb32e974f6..4bcdeaf8d98f 100644 --- a/drivers/gpu/drm/i915/intel_workarounds.c +++ b/drivers/gpu/drm/i915/intel_workarounds.c | |||
@@ -508,9 +508,6 @@ static int icl_ctx_workarounds_init(struct drm_i915_private *dev_priv) | |||
508 | WA_SET_BIT_MASKED(GEN11_COMMON_SLICE_CHICKEN3, | 508 | WA_SET_BIT_MASKED(GEN11_COMMON_SLICE_CHICKEN3, |
509 | GEN11_BLEND_EMB_FIX_DISABLE_IN_RCC); | 509 | GEN11_BLEND_EMB_FIX_DISABLE_IN_RCC); |
510 | 510 | ||
511 | /* WaEnableFloatBlendOptimization:icl */ | ||
512 | WA_SET_BIT_MASKED(GEN10_CACHE_MODE_SS, FLOAT_BLEND_OPTIMIZATION_ENABLE); | ||
513 | |||
514 | return 0; | 511 | return 0; |
515 | } | 512 | } |
516 | 513 | ||