Lines Matching +full:standby +full:- +full:idle +full:- +full:ns
1 // SPDX-License-Identifier: MIT
43 return rps_to_gt(rps)->i915; in rps_to_i915()
48 return rps_to_gt(rps)->uncore; in rps_to_uncore()
55 return >_to_guc(gt)->slpc; in rps_to_slpc()
62 return intel_uc_uses_guc_slpc(>->uc); in rps_uses_slpc()
67 return mask & ~rps->pm_intrmsk_mbz; in rps_pm_sanitize_mask()
90 last = engine->stats.rps; in rps_timer()
91 engine->stats.rps = dt; in rps_timer()
99 last = rps->pm_timestamp; in rps_timer()
100 rps->pm_timestamp = timestamp; in rps_timer()
115 * video decode on vcs followed by colour post-processing in rps_timer()
116 * on vecs, followed by general post-processing on rcs. in rps_timer()
117 * Since multi-engines being active does imply a single in rps_timer()
133 rps->pm_interval); in rps_timer()
135 if (100 * busy > rps->power.up_threshold * dt && in rps_timer()
136 rps->cur_freq < rps->max_freq_softlimit) { in rps_timer()
137 rps->pm_iir |= GEN6_PM_RP_UP_THRESHOLD; in rps_timer()
138 rps->pm_interval = 1; in rps_timer()
139 queue_work(gt->i915->unordered_wq, &rps->work); in rps_timer()
140 } else if (100 * busy < rps->power.down_threshold * dt && in rps_timer()
141 rps->cur_freq > rps->min_freq_softlimit) { in rps_timer()
142 rps->pm_iir |= GEN6_PM_RP_DOWN_THRESHOLD; in rps_timer()
143 rps->pm_interval = 1; in rps_timer()
144 queue_work(gt->i915->unordered_wq, &rps->work); in rps_timer()
146 rps->last_adj = 0; in rps_timer()
149 mod_timer(&rps->timer, in rps_timer()
150 jiffies + msecs_to_jiffies(rps->pm_interval)); in rps_timer()
151 rps->pm_interval = min(rps->pm_interval * 2, BUSY_MAX_EI); in rps_timer()
157 rps->pm_timestamp = ktime_sub(ktime_get(), rps->pm_timestamp); in rps_start_timer()
158 rps->pm_interval = 1; in rps_start_timer()
159 mod_timer(&rps->timer, jiffies + 1); in rps_start_timer()
164 timer_delete_sync(&rps->timer); in rps_stop_timer()
165 rps->pm_timestamp = ktime_sub(ktime_get(), rps->pm_timestamp); in rps_stop_timer()
166 cancel_work_sync(&rps->work); in rps_stop_timer()
174 if (val > rps->min_freq_softlimit) in rps_pm_mask()
179 if (val < rps->max_freq_softlimit) in rps_pm_mask()
182 mask &= rps->pm_events; in rps_pm_mask()
189 memset(&rps->ei, 0, sizeof(rps->ei)); in rps_reset_ei()
198 GT_TRACE(gt, "interrupts:on rps->pm_events: %x, rps_pm_mask:%x\n", in rps_enable_interrupts()
199 rps->pm_events, rps_pm_mask(rps, rps->last_freq)); in rps_enable_interrupts()
203 spin_lock_irq(gt->irq_lock); in rps_enable_interrupts()
204 gen6_gt_pm_enable_irq(gt, rps->pm_events); in rps_enable_interrupts()
205 spin_unlock_irq(gt->irq_lock); in rps_enable_interrupts()
207 intel_uncore_write(gt->uncore, in rps_enable_interrupts()
208 GEN6_PMINTRMSK, rps_pm_mask(rps, rps->last_freq)); in rps_enable_interrupts()
226 spin_lock_irq(gt->irq_lock); in rps_reset_interrupts()
227 if (GRAPHICS_VER(gt->i915) >= 11) in rps_reset_interrupts()
232 rps->pm_iir = 0; in rps_reset_interrupts()
233 spin_unlock_irq(gt->irq_lock); in rps_reset_interrupts()
240 intel_uncore_write(gt->uncore, in rps_disable_interrupts()
243 spin_lock_irq(gt->irq_lock); in rps_disable_interrupts()
245 spin_unlock_irq(gt->irq_lock); in rps_disable_interrupts()
247 intel_synchronize_irq(gt->i915); in rps_disable_interrupts()
251 * outstanding tasks. As we are called on the RPS idle path, in rps_disable_interrupts()
255 cancel_work_sync(&rps->work); in rps_disable_interrupts()
283 if (i915->fsb_freq <= 3200000) in gen5_rps_init()
285 else if (i915->fsb_freq <= 4800000) in gen5_rps_init()
292 cparams[i].t == DIV_ROUND_CLOSEST(i915->mem_freq, 1000)) { in gen5_rps_init()
293 rps->ips.m = cparams[i].m; in gen5_rps_init()
294 rps->ips.c = cparams[i].c; in gen5_rps_init()
306 drm_dbg(&i915->drm, "fmax: %d, fmin: %d, fstart: %d\n", in gen5_rps_init()
309 rps->min_freq = fmax; in gen5_rps_init()
310 rps->efficient_freq = fstart; in gen5_rps_init()
311 rps->max_freq = fmin; in gen5_rps_init()
326 * Prevent division-by-zero if we are asking too fast. in __ips_chipset_val()
331 dt = now - ips->last_time1; in __ips_chipset_val()
333 return ips->chipset_power; in __ips_chipset_val()
335 /* FIXME: handle per-counter overflow */ in __ips_chipset_val()
340 delta = total - ips->last_count1; in __ips_chipset_val()
342 result = div_u64(div_u64(ips->m * delta, dt) + ips->c, 10); in __ips_chipset_val()
344 ips->last_count1 = total; in __ips_chipset_val()
345 ips->last_time1 = now; in __ips_chipset_val()
347 ips->chipset_power = result; in __ips_chipset_val()
363 return m * x / 127 - b; in ips_mch_val()
381 if (INTEL_INFO(i915)->is_mobile) in pvid_to_extvid()
382 return max(vd - 1125, 0); in pvid_to_extvid()
397 dt = now - ips->last_time2; in __gen5_ips_update()
405 delta = count - ips->last_count2; in __gen5_ips_update()
407 ips->last_count2 = count; in __gen5_ips_update()
408 ips->last_time2 = now; in __gen5_ips_update()
411 ips->gfx_power = div_u64(delta * 1181, dt * 10); in __gen5_ips_update()
417 __gen5_ips_update(&rps->ips); in gen5_rps_update()
425 val = rps->max_freq - val; in gen5_invert_freq()
426 val = rps->min_freq + val; in gen5_invert_freq()
440 drm_dbg(&rps_to_i915(rps)->drm, in __gen5_rps_set()
442 return -EBUSY; /* still busy with another command */ in __gen5_rps_set()
504 /* Program P-state weights to account for frequency power adjustment */ in init_emon()
517 /* Render standby states get 0 weight */ in init_emon()
596 drm_err(&uncore->i915->drm, in gen5_rps_enable()
600 __gen5_rps_set(rps, rps->cur_freq); in gen5_rps_enable()
602 rps->ips.last_count1 = intel_uncore_read(uncore, DMIEC); in gen5_rps_enable()
603 rps->ips.last_count1 += intel_uncore_read(uncore, DDREC); in gen5_rps_enable()
604 rps->ips.last_count1 += intel_uncore_read(uncore, CSIEC); in gen5_rps_enable()
605 rps->ips.last_time1 = jiffies_to_msecs(jiffies); in gen5_rps_enable()
607 rps->ips.last_count2 = intel_uncore_read(uncore, GFXEC); in gen5_rps_enable()
608 rps->ips.last_time2 = ktime_get_raw_ns(); in gen5_rps_enable()
610 spin_lock(&i915->irq_lock); in gen5_rps_enable()
612 spin_unlock(&i915->irq_lock); in gen5_rps_enable()
616 rps->ips.corr = init_emon(uncore); in gen5_rps_enable()
629 spin_lock(&i915->irq_lock); in gen5_rps_disable()
631 spin_unlock(&i915->irq_lock); in gen5_rps_disable()
640 __gen5_rps_set(rps, rps->idle_freq); in gen5_rps_disable()
662 limits = rps->max_freq_softlimit << 23; in rps_limits()
663 if (val <= rps->min_freq_softlimit) in rps_limits()
664 limits |= rps->min_freq_softlimit << 14; in rps_limits()
666 limits = rps->max_freq_softlimit << 24; in rps_limits()
667 if (val <= rps->min_freq_softlimit) in rps_limits()
668 limits |= rps->min_freq_softlimit << 16; in rps_limits()
677 struct intel_uncore *uncore = gt->uncore; in rps_set_power()
680 lockdep_assert_held(&rps->power.mutex); in rps_set_power()
682 if (new_power == rps->power.mode) in rps_set_power()
685 /* Note the units here are not exactly 1us, but 1280ns. */ in rps_set_power()
706 if (IS_VALLEYVIEW(gt->i915)) in rps_set_power()
712 rps->power.up_threshold, ei_up, in rps_set_power()
713 rps->power.down_threshold, ei_down); in rps_set_power()
719 ei_up * rps->power.up_threshold * 10)); in rps_set_power()
726 rps->power.down_threshold * 10)); in rps_set_power()
729 (GRAPHICS_VER(gt->i915) > 9 ? 0 : GEN6_RP_MEDIA_TURBO) | in rps_set_power()
737 rps->power.mode = new_power; in rps_set_power()
744 new_power = rps->power.mode; in gen6_rps_set_thresholds()
745 switch (rps->power.mode) { in gen6_rps_set_thresholds()
747 if (val > rps->efficient_freq + 1 && in gen6_rps_set_thresholds()
748 val > rps->cur_freq) in gen6_rps_set_thresholds()
753 if (val <= rps->efficient_freq && in gen6_rps_set_thresholds()
754 val < rps->cur_freq) in gen6_rps_set_thresholds()
756 else if (val >= rps->rp0_freq && in gen6_rps_set_thresholds()
757 val > rps->cur_freq) in gen6_rps_set_thresholds()
762 if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 && in gen6_rps_set_thresholds()
763 val < rps->cur_freq) in gen6_rps_set_thresholds()
768 if (val <= rps->min_freq_softlimit) in gen6_rps_set_thresholds()
770 if (val >= rps->max_freq_softlimit) in gen6_rps_set_thresholds()
773 mutex_lock(&rps->power.mutex); in gen6_rps_set_thresholds()
774 if (rps->power.interactive) in gen6_rps_set_thresholds()
777 mutex_unlock(&rps->power.mutex); in gen6_rps_set_thresholds()
785 mutex_lock(&rps->power.mutex); in intel_rps_mark_interactive()
787 if (!rps->power.interactive++ && intel_rps_is_active(rps)) in intel_rps_mark_interactive()
790 GEM_BUG_ON(!rps->power.interactive); in intel_rps_mark_interactive()
791 rps->power.interactive--; in intel_rps_mark_interactive()
793 mutex_unlock(&rps->power.mutex); in intel_rps_mark_interactive()
840 if (val == rps->last_freq) in rps_set()
854 rps->last_freq = val; in rps_set()
864 GT_TRACE(rps_to_gt(rps), "unpark:%x\n", rps->cur_freq); in intel_rps_unpark()
870 mutex_lock(&rps->lock); in intel_rps_unpark()
874 clamp(rps->cur_freq, in intel_rps_unpark()
875 rps->min_freq_softlimit, in intel_rps_unpark()
876 rps->max_freq_softlimit)); in intel_rps_unpark()
878 mutex_unlock(&rps->lock); in intel_rps_unpark()
880 rps->pm_iir = 0; in intel_rps_unpark()
905 if (rps->last_freq <= rps->idle_freq) in intel_rps_park()
912 * However, the GPU and driver is now idle and we do not want to delay in intel_rps_park()
913 * switching to minimum voltage (reducing power whilst idle) as we do in intel_rps_park()
922 rps_set(rps, rps->idle_freq, false); in intel_rps_park()
927 * frequency on unparking, treat this idle point as a downclock in intel_rps_park()
935 adj = rps->last_adj; in intel_rps_park()
939 adj = -2; in intel_rps_park()
940 rps->last_adj = adj; in intel_rps_park()
941 rps->cur_freq = max_t(int, rps->cur_freq + adj, rps->min_freq); in intel_rps_park()
942 if (rps->cur_freq < rps->efficient_freq) { in intel_rps_park()
943 rps->cur_freq = rps->efficient_freq; in intel_rps_park()
944 rps->last_adj = 0; in intel_rps_park()
947 GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq); in intel_rps_park()
957 return slpc->boost_freq; in intel_rps_get_boost_frequency()
959 return intel_gpu_freq(rps, rps->boost_freq); in intel_rps_get_boost_frequency()
969 if (val < rps->min_freq || val > rps->max_freq) in rps_set_boost_freq()
970 return -EINVAL; in rps_set_boost_freq()
972 mutex_lock(&rps->lock); in rps_set_boost_freq()
973 if (val != rps->boost_freq) { in rps_set_boost_freq()
974 rps->boost_freq = val; in rps_set_boost_freq()
975 boost = atomic_read(&rps->num_waiters); in rps_set_boost_freq()
977 mutex_unlock(&rps->lock); in rps_set_boost_freq()
979 queue_work(rps_to_gt(rps)->i915->unordered_wq, &rps->work); in rps_set_boost_freq()
1005 if (slpc->power_profile == SLPC_POWER_PROFILES_POWER_SAVING) in intel_rps_dec_waiters()
1010 atomic_dec(&rps->num_waiters); in intel_rps_dec_waiters()
1022 if (test_bit(CONTEXT_LOW_LATENCY, &rq->context->flags)) in intel_rps_boost()
1026 if (!test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags)) { in intel_rps_boost()
1027 struct intel_rps *rps = &READ_ONCE(rq->engine)->gt->rps; in intel_rps_boost()
1033 if (slpc->power_profile == SLPC_POWER_PROFILES_POWER_SAVING) in intel_rps_boost()
1037 if (!atomic_fetch_inc(&slpc->num_waiters)) { in intel_rps_boost()
1042 if (slpc->min_freq_softlimit >= slpc->boost_freq) in intel_rps_boost()
1046 rq->fence.context, rq->fence.seqno); in intel_rps_boost()
1047 queue_work(rps_to_gt(rps)->i915->unordered_wq, in intel_rps_boost()
1048 &slpc->boost_work); in intel_rps_boost()
1054 if (atomic_fetch_inc(&rps->num_waiters)) in intel_rps_boost()
1061 rq->fence.context, rq->fence.seqno); in intel_rps_boost()
1063 if (READ_ONCE(rps->cur_freq) < rps->boost_freq) in intel_rps_boost()
1064 queue_work(rps_to_gt(rps)->i915->unordered_wq, &rps->work); in intel_rps_boost()
1066 WRITE_ONCE(rps->boosts, rps->boosts + 1); /* debug only */ in intel_rps_boost()
1074 lockdep_assert_held(&rps->lock); in intel_rps_set()
1075 GEM_BUG_ON(val > rps->max_freq); in intel_rps_set()
1076 GEM_BUG_ON(val < rps->min_freq); in intel_rps_set()
1097 rps->cur_freq = val; in intel_rps_set()
1116 u32 rp_state_cap = rps_to_gt(rps)->type == GT_MEDIA ? in mtl_get_freq_caps()
1119 u32 rpe = rps_to_gt(rps)->type == GT_MEDIA ? in mtl_get_freq_caps()
1124 caps->rp0_freq = REG_FIELD_GET(MTL_RP0_CAP_MASK, rp_state_cap); in mtl_get_freq_caps()
1125 caps->min_freq = REG_FIELD_GET(MTL_RPN_CAP_MASK, rp_state_cap); in mtl_get_freq_caps()
1126 caps->rp1_freq = REG_FIELD_GET(MTL_RPE_MASK, rpe); in mtl_get_freq_caps()
1139 caps->rp0_freq = (rp_state_cap >> 16) & 0xff; in __gen6_rps_get_freq_caps()
1140 caps->rp1_freq = (rp_state_cap >> 8) & 0xff; in __gen6_rps_get_freq_caps()
1141 caps->min_freq = (rp_state_cap >> 0) & 0xff; in __gen6_rps_get_freq_caps()
1143 caps->rp0_freq = (rp_state_cap >> 0) & 0xff; in __gen6_rps_get_freq_caps()
1145 caps->rp1_freq = REG_FIELD_GET(RPE_MASK, in __gen6_rps_get_freq_caps()
1146 intel_uncore_read(to_gt(i915)->uncore, in __gen6_rps_get_freq_caps()
1149 caps->rp1_freq = (rp_state_cap >> 8) & 0xff; in __gen6_rps_get_freq_caps()
1150 caps->min_freq = (rp_state_cap >> 16) & 0xff; in __gen6_rps_get_freq_caps()
1159 caps->rp0_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1160 caps->rp1_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1161 caps->min_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1166 * gen6_rps_get_freq_caps - Get freq caps exposed by HW
1189 rps->rp0_freq = caps.rp0_freq; in gen6_rps_init()
1190 rps->rp1_freq = caps.rp1_freq; in gen6_rps_init()
1191 rps->min_freq = caps.min_freq; in gen6_rps_init()
1194 rps->max_freq = rps->rp0_freq; in gen6_rps_init()
1196 rps->efficient_freq = rps->rp1_freq; in gen6_rps_init()
1204 if (snb_pcode_read(rps_to_gt(rps)->uncore, in gen6_rps_init()
1207 rps->efficient_freq = in gen6_rps_init()
1210 rps->min_freq, in gen6_rps_init()
1211 rps->max_freq); in gen6_rps_init()
1220 rps->power.mode = -1; in rps_reset()
1221 rps->last_freq = -1; in rps_reset()
1223 if (rps_set(rps, rps->min_freq, true)) { in rps_reset()
1224 drm_err(&i915->drm, "Failed to reset RPS to initial values\n"); in rps_reset()
1228 rps->cur_freq = rps->min_freq; in rps_reset()
1236 struct intel_uncore *uncore = gt->uncore; in gen9_rps_enable()
1239 if (GRAPHICS_VER(gt->i915) == 9) in gen9_rps_enable()
1241 GEN9_FREQUENCY(rps->rp1_freq)); in gen9_rps_enable()
1245 rps->pm_events = GEN6_PM_RP_UP_THRESHOLD | GEN6_PM_RP_DOWN_THRESHOLD; in gen9_rps_enable()
1255 HSW_FREQUENCY(rps->rp1_freq)); in gen8_rps_enable()
1259 rps->pm_events = GEN6_PM_RP_UP_THRESHOLD | GEN6_PM_RP_DOWN_THRESHOLD; in gen8_rps_enable()
1268 /* Power down if completely idle for over 50ms */ in gen6_rps_enable()
1272 rps->pm_events = (GEN6_PM_RP_UP_THRESHOLD | in gen6_rps_enable()
1287 switch (gt->info.sseu.eu_total) { in chv_rps_max_freq()
1362 rps->pm_events = (GEN6_PM_RP_UP_THRESHOLD | in chv_rps_enable()
1377 drm_WARN_ONCE(&i915->drm, (val & GPLLENABLE) == 0, in chv_rps_enable()
1380 drm_dbg(&i915->drm, "GPLL enabled? %s\n", in chv_rps_enable()
1382 drm_dbg(&i915->drm, "GPU status: 0x%08x\n", val); in chv_rps_enable()
1436 * a BYT-M B0 the above register contains 0xbf. Moreover when setting in vlv_rps_min_freq()
1466 rps->pm_events = GEN6_PM_RP_UP_EI_EXPIRED; in vlv_rps_enable()
1479 drm_WARN_ONCE(&i915->drm, (val & GPLLENABLE) == 0, in vlv_rps_enable()
1482 drm_dbg(&i915->drm, "GPLL enabled? %s\n", in vlv_rps_enable()
1484 drm_dbg(&i915->drm, "GPU status: 0x%08x\n", val); in vlv_rps_enable()
1499 pxvid = intel_uncore_read(uncore, PXVFREQ(rps->cur_freq)); in __ips_gfx_val()
1516 corr = div_u64(corr * 150142 * state1, 10000) - 78642; in __ips_gfx_val()
1517 corr2 = div_u64(corr, 100000) * ips->corr; in __ips_gfx_val()
1524 return ips->gfx_power + state2; in __ips_gfx_val()
1555 if (rps->max_freq <= rps->min_freq) in intel_rps_enable()
1577 rps->min_freq, rps->max_freq, in intel_rps_enable()
1578 intel_gpu_freq(rps, rps->min_freq), in intel_rps_enable()
1579 intel_gpu_freq(rps, rps->max_freq), in intel_rps_enable()
1580 rps->power.up_threshold, in intel_rps_enable()
1581 rps->power.down_threshold); in intel_rps_enable()
1583 GEM_BUG_ON(rps->max_freq < rps->min_freq); in intel_rps_enable()
1584 GEM_BUG_ON(rps->idle_freq > rps->max_freq); in intel_rps_enable()
1586 GEM_BUG_ON(rps->efficient_freq < rps->min_freq); in intel_rps_enable()
1587 GEM_BUG_ON(rps->efficient_freq > rps->max_freq); in intel_rps_enable()
1624 * N = val - 0xb7 in byt_gpu_freq()
1627 return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * (val - 0xb7), 1000); in byt_gpu_freq()
1632 return DIV_ROUND_CLOSEST(1000 * val, rps->gpll_ref_freq) + 0xb7; in byt_freq_opcode()
1641 return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * val, 2 * 2 * 1000); in chv_gpu_freq()
1647 return DIV_ROUND_CLOSEST(2 * 1000 * val, rps->gpll_ref_freq) * 2; in chv_freq_opcode()
1688 rps->gpll_ref_freq = in vlv_init_gpll_ref_freq()
1691 i915->czclk_freq); in vlv_init_gpll_ref_freq()
1693 drm_dbg(&i915->drm, "GPLL reference freq: %d kHz\n", in vlv_init_gpll_ref_freq()
1694 rps->gpll_ref_freq); in vlv_init_gpll_ref_freq()
1708 rps->max_freq = vlv_rps_max_freq(rps); in vlv_rps_init()
1709 rps->rp0_freq = rps->max_freq; in vlv_rps_init()
1710 drm_dbg(&i915->drm, "max GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1711 intel_gpu_freq(rps, rps->max_freq), rps->max_freq); in vlv_rps_init()
1713 rps->efficient_freq = vlv_rps_rpe_freq(rps); in vlv_rps_init()
1714 drm_dbg(&i915->drm, "RPe GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1715 intel_gpu_freq(rps, rps->efficient_freq), rps->efficient_freq); in vlv_rps_init()
1717 rps->rp1_freq = vlv_rps_guar_freq(rps); in vlv_rps_init()
1718 drm_dbg(&i915->drm, "RP1(Guar Freq) GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1719 intel_gpu_freq(rps, rps->rp1_freq), rps->rp1_freq); in vlv_rps_init()
1721 rps->min_freq = vlv_rps_min_freq(rps); in vlv_rps_init()
1722 drm_dbg(&i915->drm, "min GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1723 intel_gpu_freq(rps, rps->min_freq), rps->min_freq); in vlv_rps_init()
1742 rps->max_freq = chv_rps_max_freq(rps); in chv_rps_init()
1743 rps->rp0_freq = rps->max_freq; in chv_rps_init()
1744 drm_dbg(&i915->drm, "max GPU freq: %d MHz (%u)\n", in chv_rps_init()
1745 intel_gpu_freq(rps, rps->max_freq), rps->max_freq); in chv_rps_init()
1747 rps->efficient_freq = chv_rps_rpe_freq(rps); in chv_rps_init()
1748 drm_dbg(&i915->drm, "RPe GPU freq: %d MHz (%u)\n", in chv_rps_init()
1749 intel_gpu_freq(rps, rps->efficient_freq), rps->efficient_freq); in chv_rps_init()
1751 rps->rp1_freq = chv_rps_guar_freq(rps); in chv_rps_init()
1752 drm_dbg(&i915->drm, "RP1(Guar) GPU freq: %d MHz (%u)\n", in chv_rps_init()
1753 intel_gpu_freq(rps, rps->rp1_freq), rps->rp1_freq); in chv_rps_init()
1755 rps->min_freq = chv_rps_min_freq(rps); in chv_rps_init()
1756 drm_dbg(&i915->drm, "min GPU freq: %d MHz (%u)\n", in chv_rps_init()
1757 intel_gpu_freq(rps, rps->min_freq), rps->min_freq); in chv_rps_init()
1764 drm_WARN_ONCE(&i915->drm, (rps->max_freq | rps->efficient_freq | in chv_rps_init()
1765 rps->rp1_freq | rps->min_freq) & 1, in chv_rps_init()
1771 ei->ktime = ktime_get_raw(); in vlv_c0_read()
1772 ei->render_c0 = intel_uncore_read(uncore, VLV_RENDER_C0_COUNT); in vlv_c0_read()
1773 ei->media_c0 = intel_uncore_read(uncore, VLV_MEDIA_C0_COUNT); in vlv_c0_read()
1779 const struct intel_rps_ei *prev = &rps->ei; in vlv_wa_c0_ei()
1788 if (prev->ktime) { in vlv_wa_c0_ei()
1792 time = ktime_us_delta(now.ktime, prev->ktime); in vlv_wa_c0_ei()
1794 time *= rps_to_i915(rps)->czclk_freq; in vlv_wa_c0_ei()
1801 render = now.render_c0 - prev->render_c0; in vlv_wa_c0_ei()
1802 media = now.media_c0 - prev->media_c0; in vlv_wa_c0_ei()
1806 if (c0 > time * rps->power.up_threshold) in vlv_wa_c0_ei()
1808 else if (c0 < time * rps->power.down_threshold) in vlv_wa_c0_ei()
1812 rps->ei = now; in vlv_wa_c0_ei()
1825 spin_lock_irq(gt->irq_lock); in rps_work()
1826 pm_iir = fetch_and_zero(&rps->pm_iir) & rps->pm_events; in rps_work()
1827 client_boost = atomic_read(&rps->num_waiters); in rps_work()
1828 spin_unlock_irq(gt->irq_lock); in rps_work()
1834 mutex_lock(&rps->lock); in rps_work()
1836 mutex_unlock(&rps->lock); in rps_work()
1842 adj = rps->last_adj; in rps_work()
1843 new_freq = rps->cur_freq; in rps_work()
1844 min = rps->min_freq_softlimit; in rps_work()
1845 max = rps->max_freq_softlimit; in rps_work()
1847 max = rps->max_freq; in rps_work()
1854 if (client_boost && new_freq < rps->boost_freq) { in rps_work()
1855 new_freq = rps->boost_freq; in rps_work()
1861 adj = IS_CHERRYVIEW(gt->i915) ? 2 : 1; in rps_work()
1863 if (new_freq >= rps->max_freq_softlimit) in rps_work()
1868 if (rps->cur_freq > rps->efficient_freq) in rps_work()
1869 new_freq = rps->efficient_freq; in rps_work()
1870 else if (rps->cur_freq > rps->min_freq_softlimit) in rps_work()
1871 new_freq = rps->min_freq_softlimit; in rps_work()
1877 adj = IS_CHERRYVIEW(gt->i915) ? -2 : -1; in rps_work()
1879 if (new_freq <= rps->min_freq_softlimit) in rps_work()
1893 drm_dbg(&i915->drm, "Failed to set new GPU frequency\n"); in rps_work()
1896 rps->last_adj = adj; in rps_work()
1898 mutex_unlock(&rps->lock); in rps_work()
1901 spin_lock_irq(gt->irq_lock); in rps_work()
1902 gen6_gt_pm_unmask_irq(gt, rps->pm_events); in rps_work()
1903 spin_unlock_irq(gt->irq_lock); in rps_work()
1909 const u32 events = rps->pm_events & pm_iir; in gen11_rps_irq_handler()
1911 lockdep_assert_held(gt->irq_lock); in gen11_rps_irq_handler()
1920 rps->pm_iir |= events; in gen11_rps_irq_handler()
1921 queue_work(gt->i915->unordered_wq, &rps->work); in gen11_rps_irq_handler()
1929 events = pm_iir & rps->pm_events; in gen6_rps_irq_handler()
1931 spin_lock(gt->irq_lock); in gen6_rps_irq_handler()
1936 rps->pm_iir |= events; in gen6_rps_irq_handler()
1938 queue_work(gt->i915->unordered_wq, &rps->work); in gen6_rps_irq_handler()
1939 spin_unlock(gt->irq_lock); in gen6_rps_irq_handler()
1942 if (GRAPHICS_VER(gt->i915) >= 8) in gen6_rps_irq_handler()
1946 intel_engine_cs_irq(gt->engine[VECS0], pm_iir >> 10); in gen6_rps_irq_handler()
1949 drm_dbg(&rps_to_i915(rps)->drm, in gen6_rps_irq_handler()
1972 new_freq = rps->cur_freq; in gen5_rps_irq_handler()
1976 new_freq--; in gen5_rps_irq_handler()
1978 rps->min_freq_softlimit, in gen5_rps_irq_handler()
1979 rps->max_freq_softlimit); in gen5_rps_irq_handler()
1981 if (new_freq != rps->cur_freq && !__gen5_rps_set(rps, new_freq)) in gen5_rps_irq_handler()
1982 rps->cur_freq = new_freq; in gen5_rps_irq_handler()
1989 mutex_init(&rps->lock); in intel_rps_init_early()
1990 mutex_init(&rps->power.mutex); in intel_rps_init_early()
1992 INIT_WORK(&rps->work, rps_work); in intel_rps_init_early()
1993 timer_setup(&rps->timer, rps_timer, 0); in intel_rps_init_early()
1995 atomic_set(&rps->num_waiters, 0); in intel_rps_init_early()
2015 rps->max_freq_softlimit = rps->max_freq; in intel_rps_init()
2016 rps_to_gt(rps)->defaults.max_freq = rps->max_freq_softlimit; in intel_rps_init()
2017 rps->min_freq_softlimit = rps->min_freq; in intel_rps_init()
2018 rps_to_gt(rps)->defaults.min_freq = rps->min_freq_softlimit; in intel_rps_init()
2020 /* After setting max-softlimit, find the overclock max freq */ in intel_rps_init()
2024 snb_pcode_read(rps_to_gt(rps)->uncore, GEN6_READ_OC_PARAMS, ¶ms, NULL); in intel_rps_init()
2026 drm_dbg(&i915->drm, in intel_rps_init()
2028 (rps->max_freq & 0xff) * 50, in intel_rps_init()
2030 rps->max_freq = params & 0xff; in intel_rps_init()
2035 rps->power.up_threshold = 95; in intel_rps_init()
2036 rps_to_gt(rps)->defaults.rps_up_threshold = rps->power.up_threshold; in intel_rps_init()
2037 rps->power.down_threshold = 85; in intel_rps_init()
2038 rps_to_gt(rps)->defaults.rps_down_threshold = rps->power.down_threshold; in intel_rps_init()
2041 rps->boost_freq = rps->max_freq; in intel_rps_init()
2042 rps->idle_freq = rps->min_freq; in intel_rps_init()
2045 rps->cur_freq = rps->efficient_freq; in intel_rps_init()
2047 rps->pm_intrmsk_mbz = 0; in intel_rps_init()
2056 rps->pm_intrmsk_mbz |= GEN6_PM_RP_UP_EI_EXPIRED; in intel_rps_init()
2059 rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC; in intel_rps_init()
2062 if (intel_uc_uses_guc_submission(&rps_to_gt(rps)->uc)) in intel_rps_init()
2063 rps->pm_intrmsk_mbz |= ARAT_EXPIRED_INTRMSK; in intel_rps_init()
2082 return intel_uncore_read(rps_to_gt(rps)->uncore, rpstat); in intel_rps_read_rpstat()
2146 struct intel_runtime_pm *rpm = rps_to_uncore(rps)->rpm; in intel_rps_read_actual_frequency()
2164 struct intel_runtime_pm *rpm = rps_to_uncore(rps)->rpm; in intel_rps_read_punit_req()
2193 return intel_gpu_freq(rps, rps->cur_freq); in intel_rps_get_requested_frequency()
2201 return slpc->max_freq_softlimit; in intel_rps_get_max_frequency()
2203 return intel_gpu_freq(rps, rps->max_freq_softlimit); in intel_rps_get_max_frequency()
2207 * intel_rps_get_max_raw_freq - returns the max frequency in some raw format.
2219 return DIV_ROUND_CLOSEST(slpc->rp0_freq, in intel_rps_get_max_raw_freq()
2222 freq = rps->max_freq; in intel_rps_get_max_raw_freq()
2236 return slpc->rp0_freq; in intel_rps_get_rp0_frequency()
2238 return intel_gpu_freq(rps, rps->rp0_freq); in intel_rps_get_rp0_frequency()
2246 return slpc->rp1_freq; in intel_rps_get_rp1_frequency()
2248 return intel_gpu_freq(rps, rps->rp1_freq); in intel_rps_get_rp1_frequency()
2256 return slpc->min_freq; in intel_rps_get_rpn_frequency()
2258 return intel_gpu_freq(rps, rps->min_freq); in intel_rps_get_rpn_frequency()
2264 struct drm_i915_private *i915 = gt->i915; in rps_frequency_dump()
2265 struct intel_uncore *uncore = gt->uncore; in rps_frequency_dump()
2355 rps->pm_intrmsk_mbz); in rps_frequency_dump()
2357 drm_printf(p, "Render p-state ratio: %d\n", in rps_frequency_dump()
2359 drm_printf(p, "Render p-state VID: %d\n", in rps_frequency_dump()
2361 drm_printf(p, "Render p-state limit: %d\n", in rps_frequency_dump()
2377 rps->power.up_threshold); in rps_frequency_dump()
2393 rps->power.down_threshold); in rps_frequency_dump()
2403 drm_printf(p, "Max non-overclocked (RP0) frequency: %dMHz\n", in rps_frequency_dump()
2406 intel_gpu_freq(rps, rps->max_freq)); in rps_frequency_dump()
2409 intel_gpu_freq(rps, rps->cur_freq)); in rps_frequency_dump()
2411 drm_printf(p, "Idle freq: %d MHz\n", in rps_frequency_dump()
2412 intel_gpu_freq(rps, rps->idle_freq)); in rps_frequency_dump()
2414 intel_gpu_freq(rps, rps->min_freq)); in rps_frequency_dump()
2416 intel_gpu_freq(rps, rps->boost_freq)); in rps_frequency_dump()
2418 intel_gpu_freq(rps, rps->max_freq)); in rps_frequency_dump()
2421 intel_gpu_freq(rps, rps->efficient_freq)); in rps_frequency_dump()
2427 struct intel_uncore *uncore = gt->uncore; in slpc_frequency_dump()
2436 rps->pm_intrmsk_mbz); in slpc_frequency_dump()
2443 drm_printf(p, "Max non-overclocked (RP0) frequency: %dMHz\n", in slpc_frequency_dump()
2473 mutex_lock(&rps->lock); in set_max_freq()
2476 if (val < rps->min_freq || in set_max_freq()
2477 val > rps->max_freq || in set_max_freq()
2478 val < rps->min_freq_softlimit) { in set_max_freq()
2479 ret = -EINVAL; in set_max_freq()
2483 if (val > rps->rp0_freq) in set_max_freq()
2484 drm_dbg(&i915->drm, "User requested overclocking to %d\n", in set_max_freq()
2487 rps->max_freq_softlimit = val; in set_max_freq()
2489 val = clamp_t(int, rps->cur_freq, in set_max_freq()
2490 rps->min_freq_softlimit, in set_max_freq()
2491 rps->max_freq_softlimit); in set_max_freq()
2501 mutex_unlock(&rps->lock); in set_max_freq()
2521 return slpc->min_freq_softlimit; in intel_rps_get_min_frequency()
2523 return intel_gpu_freq(rps, rps->min_freq_softlimit); in intel_rps_get_min_frequency()
2527 * intel_rps_get_min_raw_freq - returns the min frequency in some raw format.
2539 return DIV_ROUND_CLOSEST(slpc->min_freq, in intel_rps_get_min_raw_freq()
2542 freq = rps->min_freq; in intel_rps_get_min_raw_freq()
2555 mutex_lock(&rps->lock); in set_min_freq()
2558 if (val < rps->min_freq || in set_min_freq()
2559 val > rps->max_freq || in set_min_freq()
2560 val > rps->max_freq_softlimit) { in set_min_freq()
2561 ret = -EINVAL; in set_min_freq()
2565 rps->min_freq_softlimit = val; in set_min_freq()
2567 val = clamp_t(int, rps->cur_freq, in set_min_freq()
2568 rps->min_freq_softlimit, in set_min_freq()
2569 rps->max_freq_softlimit); in set_min_freq()
2579 mutex_unlock(&rps->lock); in set_min_freq()
2596 return rps->power.up_threshold; in intel_rps_get_up_threshold()
2604 return -EINVAL; in rps_set_threshold()
2606 ret = mutex_lock_interruptible(&rps->lock); in rps_set_threshold()
2616 rps->last_freq = -1; in rps_set_threshold()
2617 mutex_lock(&rps->power.mutex); in rps_set_threshold()
2618 rps->power.mode = -1; in rps_set_threshold()
2619 mutex_unlock(&rps->power.mutex); in rps_set_threshold()
2621 intel_rps_set(rps, clamp(rps->cur_freq, in rps_set_threshold()
2622 rps->min_freq_softlimit, in rps_set_threshold()
2623 rps->max_freq_softlimit)); in rps_set_threshold()
2626 mutex_unlock(&rps->lock); in rps_set_threshold()
2633 return rps_set_threshold(rps, &rps->power.up_threshold, threshold); in intel_rps_set_up_threshold()
2638 return rps->power.down_threshold; in intel_rps_get_down_threshold()
2643 return rps_set_threshold(rps, &rps->power.down_threshold, threshold); in intel_rps_set_down_threshold()
2659 mutex_lock(&rps->lock); in intel_rps_raise_unslice()
2674 intel_rps_set(rps, rps->rp0_freq); in intel_rps_raise_unslice()
2677 mutex_unlock(&rps->lock); in intel_rps_raise_unslice()
2684 mutex_lock(&rps->lock); in intel_rps_lower_unslice()
2699 intel_rps_set(rps, rps->min_freq); in intel_rps_lower_unslice()
2702 mutex_unlock(&rps->lock); in intel_rps_lower_unslice()
2711 with_intel_runtime_pm(gt->uncore->rpm, wakeref) in rps_read_mmio()
2712 val = intel_uncore_read(gt->uncore, reg32); in rps_read_mmio()
2752 * We only register the i915 ips part with intel-ips once everything is in intel_rps_driver_register()
2753 * set up, to avoid intel-ips sneaking in and reading bogus values. in intel_rps_driver_register()
2755 if (GRAPHICS_VER(gt->i915) == 5) { in intel_rps_driver_register()
2757 rcu_assign_pointer(ips_mchdev, gt->i915); in intel_rps_driver_register()
2774 if (i915 && !kref_get_unless_zero(&i915->drm.ref)) in mchdev_get()
2782 * i915_read_mch_val - return value for IPS use
2798 with_intel_runtime_pm(&i915->runtime_pm, wakeref) { in i915_read_mch_val()
2799 struct intel_ips *ips = &to_gt(i915)->rps.ips; in i915_read_mch_val()
2807 drm_dev_put(&i915->drm); in i915_read_mch_val()
2813 * i915_gpu_raise - raise GPU frequency limit
2826 rps = &to_gt(i915)->rps; in i915_gpu_raise()
2829 if (rps->max_freq_softlimit < rps->max_freq) in i915_gpu_raise()
2830 rps->max_freq_softlimit++; in i915_gpu_raise()
2833 drm_dev_put(&i915->drm); in i915_gpu_raise()
2839 * i915_gpu_lower - lower GPU frequency limit
2853 rps = &to_gt(i915)->rps; in i915_gpu_lower()
2856 if (rps->max_freq_softlimit > rps->min_freq) in i915_gpu_lower()
2857 rps->max_freq_softlimit--; in i915_gpu_lower()
2860 drm_dev_put(&i915->drm); in i915_gpu_lower()
2866 * i915_gpu_busy - indicate GPU business to IPS
2879 ret = to_gt(i915)->awake; in i915_gpu_busy()
2881 drm_dev_put(&i915->drm); in i915_gpu_busy()
2887 * i915_gpu_turbo_disable - disable graphics turbo
2902 rps = &to_gt(i915)->rps; in i915_gpu_turbo_disable()
2905 rps->max_freq_softlimit = rps->min_freq; in i915_gpu_turbo_disable()
2906 ret = !__gen5_rps_set(&to_gt(i915)->rps, rps->min_freq); in i915_gpu_turbo_disable()
2909 drm_dev_put(&i915->drm); in i915_gpu_turbo_disable()