Lines Matching +full:max +full:- +full:freq
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 >->uc.guc.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()
130 "busy:%lld [%d%%], max:[%lld, %lld, %lld], interval:%d\n", 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 del_timer_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()
255 cancel_work_sync(&rps->work); in rps_disable_interrupts()
283 if (i915->fsb_freq <= 3200) in gen5_rps_init()
285 else if (i915->fsb_freq <= 4800) in gen5_rps_init()
291 if (cparams[i].i == c_m && cparams[i].t == i915->mem_freq) { in gen5_rps_init()
292 rps->ips.m = cparams[i].m; in gen5_rps_init()
293 rps->ips.c = cparams[i].c; in gen5_rps_init()
300 /* Set up min, max, and cur for interrupt handling */ in gen5_rps_init()
305 drm_dbg(&i915->drm, "fmax: %d, fmin: %d, fstart: %d\n", in gen5_rps_init()
308 rps->min_freq = fmax; in gen5_rps_init()
309 rps->efficient_freq = fstart; in gen5_rps_init()
310 rps->max_freq = fmin; in gen5_rps_init()
325 * Prevent division-by-zero if we are asking too fast. in __ips_chipset_val()
330 dt = now - ips->last_time1; in __ips_chipset_val()
332 return ips->chipset_power; in __ips_chipset_val()
334 /* FIXME: handle per-counter overflow */ in __ips_chipset_val()
339 delta = total - ips->last_count1; in __ips_chipset_val()
341 result = div_u64(div_u64(ips->m * delta, dt) + ips->c, 10); in __ips_chipset_val()
343 ips->last_count1 = total; in __ips_chipset_val()
344 ips->last_time1 = now; in __ips_chipset_val()
346 ips->chipset_power = result; in __ips_chipset_val()
362 return m * x / 127 - b; in ips_mch_val()
380 if (INTEL_INFO(i915)->is_mobile) in pvid_to_extvid()
381 return max(vd - 1125, 0); in pvid_to_extvid()
396 dt = now - ips->last_time2; in __gen5_ips_update()
404 delta = count - ips->last_count2; in __gen5_ips_update()
406 ips->last_count2 = count; in __gen5_ips_update()
407 ips->last_time2 = now; in __gen5_ips_update()
410 ips->gfx_power = div_u64(delta * 1181, dt * 10); in __gen5_ips_update()
416 __gen5_ips_update(&rps->ips); in gen5_rps_update()
424 val = rps->max_freq - val; in gen5_invert_freq()
425 val = rps->min_freq + val; in gen5_invert_freq()
439 drm_dbg(&rps_to_i915(rps)->drm, in __gen5_rps_set()
441 return -EBUSY; /* still busy with another command */ in __gen5_rps_set()
503 /* Program P-state weights to account for frequency power adjustment */ in init_emon()
506 unsigned int freq = intel_pxfreq(pxvidfreq); in init_emon() local
511 val = vid * vid * freq / 1000 * 255; in init_emon()
570 /* Set max/min thresholds to 90ms and 80ms respectively */ in gen5_rps_enable()
576 /* Set up min, max, and cur for interrupt handling */ in gen5_rps_enable()
595 drm_err(&uncore->i915->drm, in gen5_rps_enable()
599 __gen5_rps_set(rps, rps->cur_freq); in gen5_rps_enable()
601 rps->ips.last_count1 = intel_uncore_read(uncore, DMIEC); in gen5_rps_enable()
602 rps->ips.last_count1 += intel_uncore_read(uncore, DDREC); in gen5_rps_enable()
603 rps->ips.last_count1 += intel_uncore_read(uncore, CSIEC); in gen5_rps_enable()
604 rps->ips.last_time1 = jiffies_to_msecs(jiffies); in gen5_rps_enable()
606 rps->ips.last_count2 = intel_uncore_read(uncore, GFXEC); in gen5_rps_enable()
607 rps->ips.last_time2 = ktime_get_raw_ns(); in gen5_rps_enable()
609 spin_lock(&i915->irq_lock); in gen5_rps_enable()
611 spin_unlock(&i915->irq_lock); in gen5_rps_enable()
615 rps->ips.corr = init_emon(uncore); in gen5_rps_enable()
628 spin_lock(&i915->irq_lock); in gen5_rps_disable()
630 spin_unlock(&i915->irq_lock); in gen5_rps_disable()
639 __gen5_rps_set(rps, rps->idle_freq); in gen5_rps_disable()
661 limits = rps->max_freq_softlimit << 23; in rps_limits()
662 if (val <= rps->min_freq_softlimit) in rps_limits()
663 limits |= rps->min_freq_softlimit << 14; in rps_limits()
665 limits = rps->max_freq_softlimit << 24; in rps_limits()
666 if (val <= rps->min_freq_softlimit) in rps_limits()
667 limits |= rps->min_freq_softlimit << 16; in rps_limits()
676 struct intel_uncore *uncore = gt->uncore; in rps_set_power()
679 lockdep_assert_held(&rps->power.mutex); in rps_set_power()
681 if (new_power == rps->power.mode) in rps_set_power()
703 * sw freq adjustments, this restriction can be lifted. in rps_set_power()
705 if (IS_VALLEYVIEW(gt->i915)) in rps_set_power()
711 rps->power.up_threshold, ei_up, in rps_set_power()
712 rps->power.down_threshold, ei_down); in rps_set_power()
718 ei_up * rps->power.up_threshold * 10)); in rps_set_power()
725 rps->power.down_threshold * 10)); in rps_set_power()
728 (GRAPHICS_VER(gt->i915) > 9 ? 0 : GEN6_RP_MEDIA_TURBO) | in rps_set_power()
736 rps->power.mode = new_power; in rps_set_power()
743 new_power = rps->power.mode; in gen6_rps_set_thresholds()
744 switch (rps->power.mode) { in gen6_rps_set_thresholds()
746 if (val > rps->efficient_freq + 1 && in gen6_rps_set_thresholds()
747 val > rps->cur_freq) in gen6_rps_set_thresholds()
752 if (val <= rps->efficient_freq && in gen6_rps_set_thresholds()
753 val < rps->cur_freq) in gen6_rps_set_thresholds()
755 else if (val >= rps->rp0_freq && in gen6_rps_set_thresholds()
756 val > rps->cur_freq) in gen6_rps_set_thresholds()
761 if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 && in gen6_rps_set_thresholds()
762 val < rps->cur_freq) in gen6_rps_set_thresholds()
766 /* Max/min bins are special */ in gen6_rps_set_thresholds()
767 if (val <= rps->min_freq_softlimit) in gen6_rps_set_thresholds()
769 if (val >= rps->max_freq_softlimit) in gen6_rps_set_thresholds()
772 mutex_lock(&rps->power.mutex); in gen6_rps_set_thresholds()
773 if (rps->power.interactive) in gen6_rps_set_thresholds()
776 mutex_unlock(&rps->power.mutex); in gen6_rps_set_thresholds()
784 mutex_lock(&rps->power.mutex); in intel_rps_mark_interactive()
786 if (!rps->power.interactive++ && intel_rps_is_active(rps)) in intel_rps_mark_interactive()
789 GEM_BUG_ON(!rps->power.interactive); in intel_rps_mark_interactive()
790 rps->power.interactive--; in intel_rps_mark_interactive()
792 mutex_unlock(&rps->power.mutex); in intel_rps_mark_interactive()
813 GT_TRACE(rps_to_gt(rps), "set val:%x, freq:%d, swreq:%x\n", in gen6_rps_set()
828 GT_TRACE(rps_to_gt(rps), "set val:%x, freq:%d\n", in vlv_rps_set()
839 if (val == rps->last_freq) in rps_set()
853 rps->last_freq = val; in rps_set()
863 GT_TRACE(rps_to_gt(rps), "unpark:%x\n", rps->cur_freq); in intel_rps_unpark()
869 mutex_lock(&rps->lock); in intel_rps_unpark()
873 clamp(rps->cur_freq, in intel_rps_unpark()
874 rps->min_freq_softlimit, in intel_rps_unpark()
875 rps->max_freq_softlimit)); in intel_rps_unpark()
877 mutex_unlock(&rps->lock); in intel_rps_unpark()
879 rps->pm_iir = 0; in intel_rps_unpark()
904 if (rps->last_freq <= rps->idle_freq) in intel_rps_park()
921 rps_set(rps, rps->idle_freq, false); in intel_rps_park()
934 adj = rps->last_adj; in intel_rps_park()
938 adj = -2; in intel_rps_park()
939 rps->last_adj = adj; in intel_rps_park()
940 rps->cur_freq = max_t(int, rps->cur_freq + adj, rps->min_freq); in intel_rps_park()
941 if (rps->cur_freq < rps->efficient_freq) { in intel_rps_park()
942 rps->cur_freq = rps->efficient_freq; in intel_rps_park()
943 rps->last_adj = 0; in intel_rps_park()
946 GT_TRACE(rps_to_gt(rps), "park:%x\n", rps->cur_freq); in intel_rps_park()
956 return slpc->boost_freq; in intel_rps_get_boost_frequency()
958 return intel_gpu_freq(rps, rps->boost_freq); in intel_rps_get_boost_frequency()
968 if (val < rps->min_freq || val > rps->max_freq) in rps_set_boost_freq()
969 return -EINVAL; in rps_set_boost_freq()
971 mutex_lock(&rps->lock); in rps_set_boost_freq()
972 if (val != rps->boost_freq) { in rps_set_boost_freq()
973 rps->boost_freq = val; in rps_set_boost_freq()
974 boost = atomic_read(&rps->num_waiters); in rps_set_boost_freq()
976 mutex_unlock(&rps->lock); in rps_set_boost_freq()
978 queue_work(rps_to_gt(rps)->i915->unordered_wq, &rps->work); in rps_set_boost_freq()
983 int intel_rps_set_boost_frequency(struct intel_rps *rps, u32 freq) in intel_rps_set_boost_frequency() argument
990 return intel_guc_slpc_set_boost_freq(slpc, freq); in intel_rps_set_boost_frequency()
992 return rps_set_boost_freq(rps, freq); in intel_rps_set_boost_frequency()
1005 atomic_dec(&rps->num_waiters); in intel_rps_dec_waiters()
1017 if (!test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags)) { in intel_rps_boost()
1018 struct intel_rps *rps = &READ_ONCE(rq->engine)->gt->rps; in intel_rps_boost()
1023 if (slpc->min_freq_softlimit >= slpc->boost_freq) in intel_rps_boost()
1027 if (!atomic_fetch_inc(&slpc->num_waiters)) { in intel_rps_boost()
1029 rq->fence.context, rq->fence.seqno); in intel_rps_boost()
1030 queue_work(rps_to_gt(rps)->i915->unordered_wq, in intel_rps_boost()
1031 &slpc->boost_work); in intel_rps_boost()
1037 if (atomic_fetch_inc(&rps->num_waiters)) in intel_rps_boost()
1044 rq->fence.context, rq->fence.seqno); in intel_rps_boost()
1046 if (READ_ONCE(rps->cur_freq) < rps->boost_freq) in intel_rps_boost()
1047 queue_work(rps_to_gt(rps)->i915->unordered_wq, &rps->work); in intel_rps_boost()
1049 WRITE_ONCE(rps->boosts, rps->boosts + 1); /* debug only */ in intel_rps_boost()
1057 lockdep_assert_held(&rps->lock); in intel_rps_set()
1058 GEM_BUG_ON(val > rps->max_freq); in intel_rps_set()
1059 GEM_BUG_ON(val < rps->min_freq); in intel_rps_set()
1080 rps->cur_freq = val; in intel_rps_set()
1103 u32 rp_state_cap = rps_to_gt(rps)->type == GT_MEDIA ? in mtl_get_freq_caps()
1106 u32 rpe = rps_to_gt(rps)->type == GT_MEDIA ? in mtl_get_freq_caps()
1111 caps->rp0_freq = REG_FIELD_GET(MTL_RP0_CAP_MASK, rp_state_cap); in mtl_get_freq_caps()
1112 caps->min_freq = REG_FIELD_GET(MTL_RPN_CAP_MASK, rp_state_cap); in mtl_get_freq_caps()
1113 caps->rp1_freq = REG_FIELD_GET(MTL_RPE_MASK, rpe); in mtl_get_freq_caps()
1126 caps->rp0_freq = (rp_state_cap >> 16) & 0xff; in __gen6_rps_get_freq_caps()
1127 caps->rp1_freq = (rp_state_cap >> 8) & 0xff; in __gen6_rps_get_freq_caps()
1128 caps->min_freq = (rp_state_cap >> 0) & 0xff; in __gen6_rps_get_freq_caps()
1130 caps->rp0_freq = (rp_state_cap >> 0) & 0xff; in __gen6_rps_get_freq_caps()
1132 caps->rp1_freq = REG_FIELD_GET(RPE_MASK, in __gen6_rps_get_freq_caps()
1133 intel_uncore_read(to_gt(i915)->uncore, in __gen6_rps_get_freq_caps()
1136 caps->rp1_freq = (rp_state_cap >> 8) & 0xff; in __gen6_rps_get_freq_caps()
1137 caps->min_freq = (rp_state_cap >> 16) & 0xff; in __gen6_rps_get_freq_caps()
1146 caps->rp0_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1147 caps->rp1_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1148 caps->min_freq *= GEN9_FREQ_SCALER; in __gen6_rps_get_freq_caps()
1153 * gen6_rps_get_freq_caps - Get freq caps exposed by HW
1155 * @caps: returned freq caps
1176 rps->rp0_freq = caps.rp0_freq; in gen6_rps_init()
1177 rps->rp1_freq = caps.rp1_freq; in gen6_rps_init()
1178 rps->min_freq = caps.min_freq; in gen6_rps_init()
1181 rps->max_freq = rps->rp0_freq; in gen6_rps_init()
1183 rps->efficient_freq = rps->rp1_freq; in gen6_rps_init()
1191 if (snb_pcode_read(rps_to_gt(rps)->uncore, in gen6_rps_init()
1194 rps->efficient_freq = in gen6_rps_init()
1197 rps->min_freq, in gen6_rps_init()
1198 rps->max_freq); in gen6_rps_init()
1207 rps->power.mode = -1; in rps_reset()
1208 rps->last_freq = -1; in rps_reset()
1210 if (rps_set(rps, rps->min_freq, true)) { in rps_reset()
1211 drm_err(&i915->drm, "Failed to reset RPS to initial values\n"); in rps_reset()
1215 rps->cur_freq = rps->min_freq; in rps_reset()
1223 struct intel_uncore *uncore = gt->uncore; in gen9_rps_enable()
1226 if (GRAPHICS_VER(gt->i915) == 9) in gen9_rps_enable()
1228 GEN9_FREQUENCY(rps->rp1_freq)); in gen9_rps_enable()
1232 rps->pm_events = GEN6_PM_RP_UP_THRESHOLD | GEN6_PM_RP_DOWN_THRESHOLD; in gen9_rps_enable()
1242 HSW_FREQUENCY(rps->rp1_freq)); in gen8_rps_enable()
1246 rps->pm_events = GEN6_PM_RP_UP_THRESHOLD | GEN6_PM_RP_DOWN_THRESHOLD; in gen8_rps_enable()
1259 rps->pm_events = (GEN6_PM_RP_UP_THRESHOLD | in gen6_rps_enable()
1274 switch (gt->info.sseu.eu_total) { in chv_rps_max_freq()
1349 rps->pm_events = (GEN6_PM_RP_UP_THRESHOLD | in chv_rps_enable()
1364 drm_WARN_ONCE(&i915->drm, (val & GPLLENABLE) == 0, in chv_rps_enable()
1367 drm_dbg(&i915->drm, "GPLL enabled? %s\n", in chv_rps_enable()
1369 drm_dbg(&i915->drm, "GPU status: 0x%08x\n", val); in chv_rps_enable()
1395 /* Clamp to max */ in vlv_rps_max_freq()
1423 * a BYT-M B0 the above register contains 0xbf. Moreover when setting in vlv_rps_min_freq()
1453 rps->pm_events = GEN6_PM_RP_UP_EI_EXPIRED; in vlv_rps_enable()
1466 drm_WARN_ONCE(&i915->drm, (val & GPLLENABLE) == 0, in vlv_rps_enable()
1469 drm_dbg(&i915->drm, "GPLL enabled? %s\n", in vlv_rps_enable()
1471 drm_dbg(&i915->drm, "GPU status: 0x%08x\n", val); in vlv_rps_enable()
1486 pxvid = intel_uncore_read(uncore, PXVFREQ(rps->cur_freq)); in __ips_gfx_val()
1503 corr = div_u64(corr * 150142 * state1, 10000) - 78642; in __ips_gfx_val()
1504 corr2 = div_u64(corr, 100000) * ips->corr; in __ips_gfx_val()
1511 return ips->gfx_power + state2; in __ips_gfx_val()
1542 if (rps->max_freq <= rps->min_freq) in intel_rps_enable()
1563 "min:%x, max:%x, freq:[%d, %d], thresholds:[%u, %u]\n", in intel_rps_enable()
1564 rps->min_freq, rps->max_freq, in intel_rps_enable()
1565 intel_gpu_freq(rps, rps->min_freq), in intel_rps_enable()
1566 intel_gpu_freq(rps, rps->max_freq), in intel_rps_enable()
1567 rps->power.up_threshold, in intel_rps_enable()
1568 rps->power.down_threshold); in intel_rps_enable()
1570 GEM_BUG_ON(rps->max_freq < rps->min_freq); in intel_rps_enable()
1571 GEM_BUG_ON(rps->idle_freq > rps->max_freq); in intel_rps_enable()
1573 GEM_BUG_ON(rps->efficient_freq < rps->min_freq); in intel_rps_enable()
1574 GEM_BUG_ON(rps->efficient_freq > rps->max_freq); in intel_rps_enable()
1611 * N = val - 0xb7 in byt_gpu_freq()
1614 return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * (val - 0xb7), 1000); in byt_gpu_freq()
1619 return DIV_ROUND_CLOSEST(1000 * val, rps->gpll_ref_freq) + 0xb7; in byt_freq_opcode()
1628 return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * val, 2 * 2 * 1000); in chv_gpu_freq()
1634 return DIV_ROUND_CLOSEST(2 * 1000 * val, rps->gpll_ref_freq) * 2; in chv_freq_opcode()
1675 rps->gpll_ref_freq = in vlv_init_gpll_ref_freq()
1678 i915->czclk_freq); in vlv_init_gpll_ref_freq()
1680 drm_dbg(&i915->drm, "GPLL reference freq: %d kHz\n", in vlv_init_gpll_ref_freq()
1681 rps->gpll_ref_freq); in vlv_init_gpll_ref_freq()
1695 rps->max_freq = vlv_rps_max_freq(rps); in vlv_rps_init()
1696 rps->rp0_freq = rps->max_freq; in vlv_rps_init()
1697 drm_dbg(&i915->drm, "max GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1698 intel_gpu_freq(rps, rps->max_freq), rps->max_freq); in vlv_rps_init()
1700 rps->efficient_freq = vlv_rps_rpe_freq(rps); in vlv_rps_init()
1701 drm_dbg(&i915->drm, "RPe GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1702 intel_gpu_freq(rps, rps->efficient_freq), rps->efficient_freq); in vlv_rps_init()
1704 rps->rp1_freq = vlv_rps_guar_freq(rps); in vlv_rps_init()
1705 drm_dbg(&i915->drm, "RP1(Guar Freq) GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1706 intel_gpu_freq(rps, rps->rp1_freq), rps->rp1_freq); in vlv_rps_init()
1708 rps->min_freq = vlv_rps_min_freq(rps); in vlv_rps_init()
1709 drm_dbg(&i915->drm, "min GPU freq: %d MHz (%u)\n", in vlv_rps_init()
1710 intel_gpu_freq(rps, rps->min_freq), rps->min_freq); in vlv_rps_init()
1729 rps->max_freq = chv_rps_max_freq(rps); in chv_rps_init()
1730 rps->rp0_freq = rps->max_freq; in chv_rps_init()
1731 drm_dbg(&i915->drm, "max GPU freq: %d MHz (%u)\n", in chv_rps_init()
1732 intel_gpu_freq(rps, rps->max_freq), rps->max_freq); in chv_rps_init()
1734 rps->efficient_freq = chv_rps_rpe_freq(rps); in chv_rps_init()
1735 drm_dbg(&i915->drm, "RPe GPU freq: %d MHz (%u)\n", in chv_rps_init()
1736 intel_gpu_freq(rps, rps->efficient_freq), rps->efficient_freq); in chv_rps_init()
1738 rps->rp1_freq = chv_rps_guar_freq(rps); in chv_rps_init()
1739 drm_dbg(&i915->drm, "RP1(Guar) GPU freq: %d MHz (%u)\n", in chv_rps_init()
1740 intel_gpu_freq(rps, rps->rp1_freq), rps->rp1_freq); in chv_rps_init()
1742 rps->min_freq = chv_rps_min_freq(rps); in chv_rps_init()
1743 drm_dbg(&i915->drm, "min GPU freq: %d MHz (%u)\n", in chv_rps_init()
1744 intel_gpu_freq(rps, rps->min_freq), rps->min_freq); in chv_rps_init()
1751 drm_WARN_ONCE(&i915->drm, (rps->max_freq | rps->efficient_freq | in chv_rps_init()
1752 rps->rp1_freq | rps->min_freq) & 1, in chv_rps_init()
1753 "Odd GPU freq values\n"); in chv_rps_init()
1758 ei->ktime = ktime_get_raw(); in vlv_c0_read()
1759 ei->render_c0 = intel_uncore_read(uncore, VLV_RENDER_C0_COUNT); in vlv_c0_read()
1760 ei->media_c0 = intel_uncore_read(uncore, VLV_MEDIA_C0_COUNT); in vlv_c0_read()
1766 const struct intel_rps_ei *prev = &rps->ei; in vlv_wa_c0_ei()
1775 if (prev->ktime) { in vlv_wa_c0_ei()
1779 time = ktime_us_delta(now.ktime, prev->ktime); in vlv_wa_c0_ei()
1781 time *= rps_to_i915(rps)->czclk_freq; in vlv_wa_c0_ei()
1788 render = now.render_c0 - prev->render_c0; in vlv_wa_c0_ei()
1789 media = now.media_c0 - prev->media_c0; in vlv_wa_c0_ei()
1790 c0 = max(render, media); in vlv_wa_c0_ei()
1793 if (c0 > time * rps->power.up_threshold) in vlv_wa_c0_ei()
1795 else if (c0 < time * rps->power.down_threshold) in vlv_wa_c0_ei()
1799 rps->ei = now; in vlv_wa_c0_ei()
1809 int new_freq, adj, min, max; in rps_work() local
1812 spin_lock_irq(gt->irq_lock); in rps_work()
1813 pm_iir = fetch_and_zero(&rps->pm_iir) & rps->pm_events; in rps_work()
1814 client_boost = atomic_read(&rps->num_waiters); in rps_work()
1815 spin_unlock_irq(gt->irq_lock); in rps_work()
1821 mutex_lock(&rps->lock); in rps_work()
1823 mutex_unlock(&rps->lock); in rps_work()
1829 adj = rps->last_adj; in rps_work()
1830 new_freq = rps->cur_freq; in rps_work()
1831 min = rps->min_freq_softlimit; in rps_work()
1832 max = rps->max_freq_softlimit; in rps_work()
1834 max = rps->max_freq; in rps_work()
1837 "pm_iir:%x, client_boost:%s, last:%d, cur:%x, min:%x, max:%x\n", in rps_work()
1839 adj, new_freq, min, max); in rps_work()
1841 if (client_boost && new_freq < rps->boost_freq) { in rps_work()
1842 new_freq = rps->boost_freq; in rps_work()
1848 adj = IS_CHERRYVIEW(gt->i915) ? 2 : 1; in rps_work()
1850 if (new_freq >= rps->max_freq_softlimit) in rps_work()
1855 if (rps->cur_freq > rps->efficient_freq) in rps_work()
1856 new_freq = rps->efficient_freq; in rps_work()
1857 else if (rps->cur_freq > rps->min_freq_softlimit) in rps_work()
1858 new_freq = rps->min_freq_softlimit; in rps_work()
1864 adj = IS_CHERRYVIEW(gt->i915) ? -2 : -1; in rps_work()
1866 if (new_freq <= rps->min_freq_softlimit) in rps_work()
1877 new_freq = clamp_t(int, new_freq, min, max); in rps_work()
1880 drm_dbg(&i915->drm, "Failed to set new GPU frequency\n"); in rps_work()
1883 rps->last_adj = adj; in rps_work()
1885 mutex_unlock(&rps->lock); in rps_work()
1888 spin_lock_irq(gt->irq_lock); in rps_work()
1889 gen6_gt_pm_unmask_irq(gt, rps->pm_events); in rps_work()
1890 spin_unlock_irq(gt->irq_lock); in rps_work()
1896 const u32 events = rps->pm_events & pm_iir; in gen11_rps_irq_handler()
1898 lockdep_assert_held(gt->irq_lock); in gen11_rps_irq_handler()
1907 rps->pm_iir |= events; in gen11_rps_irq_handler()
1908 queue_work(gt->i915->unordered_wq, &rps->work); in gen11_rps_irq_handler()
1916 events = pm_iir & rps->pm_events; in gen6_rps_irq_handler()
1918 spin_lock(gt->irq_lock); in gen6_rps_irq_handler()
1923 rps->pm_iir |= events; in gen6_rps_irq_handler()
1925 queue_work(gt->i915->unordered_wq, &rps->work); in gen6_rps_irq_handler()
1926 spin_unlock(gt->irq_lock); in gen6_rps_irq_handler()
1929 if (GRAPHICS_VER(gt->i915) >= 8) in gen6_rps_irq_handler()
1933 intel_engine_cs_irq(gt->engine[VECS0], pm_iir >> 10); in gen6_rps_irq_handler()
1936 drm_dbg(&rps_to_i915(rps)->drm, in gen6_rps_irq_handler()
1959 new_freq = rps->cur_freq; in gen5_rps_irq_handler()
1963 new_freq--; in gen5_rps_irq_handler()
1965 rps->min_freq_softlimit, in gen5_rps_irq_handler()
1966 rps->max_freq_softlimit); in gen5_rps_irq_handler()
1968 if (new_freq != rps->cur_freq && !__gen5_rps_set(rps, new_freq)) in gen5_rps_irq_handler()
1969 rps->cur_freq = new_freq; in gen5_rps_irq_handler()
1976 mutex_init(&rps->lock); in intel_rps_init_early()
1977 mutex_init(&rps->power.mutex); in intel_rps_init_early()
1979 INIT_WORK(&rps->work, rps_work); in intel_rps_init_early()
1980 timer_setup(&rps->timer, rps_timer, 0); in intel_rps_init_early()
1982 atomic_set(&rps->num_waiters, 0); in intel_rps_init_early()
2002 rps->max_freq_softlimit = rps->max_freq; in intel_rps_init()
2003 rps_to_gt(rps)->defaults.max_freq = rps->max_freq_softlimit; in intel_rps_init()
2004 rps->min_freq_softlimit = rps->min_freq; in intel_rps_init()
2005 rps_to_gt(rps)->defaults.min_freq = rps->min_freq_softlimit; in intel_rps_init()
2007 /* After setting max-softlimit, find the overclock max freq */ in intel_rps_init()
2011 snb_pcode_read(rps_to_gt(rps)->uncore, GEN6_READ_OC_PARAMS, ¶ms, NULL); in intel_rps_init()
2013 drm_dbg(&i915->drm, in intel_rps_init()
2014 "Overclocking supported, max: %dMHz, overclock: %dMHz\n", in intel_rps_init()
2015 (rps->max_freq & 0xff) * 50, in intel_rps_init()
2017 rps->max_freq = params & 0xff; in intel_rps_init()
2022 rps->power.up_threshold = 95; in intel_rps_init()
2023 rps_to_gt(rps)->defaults.rps_up_threshold = rps->power.up_threshold; in intel_rps_init()
2024 rps->power.down_threshold = 85; in intel_rps_init()
2025 rps_to_gt(rps)->defaults.rps_down_threshold = rps->power.down_threshold; in intel_rps_init()
2027 /* Finally allow us to boost to max by default */ in intel_rps_init()
2028 rps->boost_freq = rps->max_freq; in intel_rps_init()
2029 rps->idle_freq = rps->min_freq; in intel_rps_init()
2032 rps->cur_freq = rps->efficient_freq; in intel_rps_init()
2034 rps->pm_intrmsk_mbz = 0; in intel_rps_init()
2043 rps->pm_intrmsk_mbz |= GEN6_PM_RP_UP_EI_EXPIRED; in intel_rps_init()
2046 rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC; in intel_rps_init()
2049 if (intel_uc_uses_guc_submission(&rps_to_gt(rps)->uc)) in intel_rps_init()
2050 rps->pm_intrmsk_mbz |= ARAT_EXPIRED_INTRMSK; in intel_rps_init()
2069 return intel_uncore_read(rps_to_gt(rps)->uncore, rpstat); in intel_rps_read_rpstat()
2100 u32 freq; in __read_cagf() local
2103 * For Gen12+ reading freq from HW does not need a forcewake and in __read_cagf()
2104 * registers will return 0 freq when GT is in RC6 in __read_cagf()
2112 freq = vlv_punit_read(i915, PUNIT_REG_GPU_FREQ_STS); in __read_cagf()
2121 freq = take_fw ? intel_uncore_read(uncore, r) : intel_uncore_read_fw(uncore, r); in __read_cagf()
2123 return intel_rps_get_cagf(rps, freq); in __read_cagf()
2133 struct intel_runtime_pm *rpm = rps_to_uncore(rps)->rpm; in intel_rps_read_actual_frequency()
2135 u32 freq = 0; in intel_rps_read_actual_frequency() local
2138 freq = intel_gpu_freq(rps, read_cagf(rps)); in intel_rps_read_actual_frequency()
2140 return freq; in intel_rps_read_actual_frequency()
2151 struct intel_runtime_pm *rpm = rps_to_uncore(rps)->rpm; in intel_rps_read_punit_req()
2153 u32 freq = 0; in intel_rps_read_punit_req() local
2156 freq = intel_uncore_read(uncore, GEN6_RPNSWREQ); in intel_rps_read_punit_req()
2158 return freq; in intel_rps_read_punit_req()
2170 u32 freq = intel_rps_get_req(intel_rps_read_punit_req(rps)); in intel_rps_read_punit_req_frequency() local
2172 return intel_gpu_freq(rps, freq); in intel_rps_read_punit_req_frequency()
2180 return intel_gpu_freq(rps, rps->cur_freq); in intel_rps_get_requested_frequency()
2188 return slpc->max_freq_softlimit; in intel_rps_get_max_frequency()
2190 return intel_gpu_freq(rps, rps->max_freq_softlimit); in intel_rps_get_max_frequency()
2194 * intel_rps_get_max_raw_freq - returns the max frequency in some raw format.
2197 * Returns the max frequency in a raw format. In newer platforms raw is in
2203 u32 freq; in intel_rps_get_max_raw_freq() local
2206 return DIV_ROUND_CLOSEST(slpc->rp0_freq, in intel_rps_get_max_raw_freq()
2209 freq = rps->max_freq; in intel_rps_get_max_raw_freq()
2212 freq /= GEN9_FREQ_SCALER; in intel_rps_get_max_raw_freq()
2214 return freq; in intel_rps_get_max_raw_freq()
2223 return slpc->rp0_freq; in intel_rps_get_rp0_frequency()
2225 return intel_gpu_freq(rps, rps->rp0_freq); in intel_rps_get_rp0_frequency()
2233 return slpc->rp1_freq; in intel_rps_get_rp1_frequency()
2235 return intel_gpu_freq(rps, rps->rp1_freq); in intel_rps_get_rp1_frequency()
2243 return slpc->min_freq; in intel_rps_get_rpn_frequency()
2245 return intel_gpu_freq(rps, rps->min_freq); in intel_rps_get_rpn_frequency()
2251 struct drm_i915_private *i915 = gt->i915; in rps_frequency_dump()
2252 struct intel_uncore *uncore = gt->uncore; in rps_frequency_dump()
2342 rps->pm_intrmsk_mbz); in rps_frequency_dump()
2344 drm_printf(p, "Render p-state ratio: %d\n", in rps_frequency_dump()
2346 drm_printf(p, "Render p-state VID: %d\n", in rps_frequency_dump()
2348 drm_printf(p, "Render p-state limit: %d\n", in rps_frequency_dump()
2364 rps->power.up_threshold); in rps_frequency_dump()
2380 rps->power.down_threshold); in rps_frequency_dump()
2390 drm_printf(p, "Max non-overclocked (RP0) frequency: %dMHz\n", in rps_frequency_dump()
2392 drm_printf(p, "Max overclocked frequency: %dMHz\n", in rps_frequency_dump()
2393 intel_gpu_freq(rps, rps->max_freq)); in rps_frequency_dump()
2395 drm_printf(p, "Current freq: %d MHz\n", in rps_frequency_dump()
2396 intel_gpu_freq(rps, rps->cur_freq)); in rps_frequency_dump()
2397 drm_printf(p, "Actual freq: %d MHz\n", cagf); in rps_frequency_dump()
2398 drm_printf(p, "Idle freq: %d MHz\n", in rps_frequency_dump()
2399 intel_gpu_freq(rps, rps->idle_freq)); in rps_frequency_dump()
2400 drm_printf(p, "Min freq: %d MHz\n", in rps_frequency_dump()
2401 intel_gpu_freq(rps, rps->min_freq)); in rps_frequency_dump()
2402 drm_printf(p, "Boost freq: %d MHz\n", in rps_frequency_dump()
2403 intel_gpu_freq(rps, rps->boost_freq)); in rps_frequency_dump()
2404 drm_printf(p, "Max freq: %d MHz\n", in rps_frequency_dump()
2405 intel_gpu_freq(rps, rps->max_freq)); in rps_frequency_dump()
2408 intel_gpu_freq(rps, rps->efficient_freq)); in rps_frequency_dump()
2414 struct intel_uncore *uncore = gt->uncore; in slpc_frequency_dump()
2423 rps->pm_intrmsk_mbz); in slpc_frequency_dump()
2430 drm_printf(p, "Max non-overclocked (RP0) frequency: %dMHz\n", in slpc_frequency_dump()
2432 drm_printf(p, "Current freq: %d MHz\n", in slpc_frequency_dump()
2434 drm_printf(p, "Actual freq: %d MHz\n", in slpc_frequency_dump()
2436 drm_printf(p, "Min freq: %d MHz\n", in slpc_frequency_dump()
2438 drm_printf(p, "Boost freq: %d MHz\n", in slpc_frequency_dump()
2440 drm_printf(p, "Max freq: %d MHz\n", in slpc_frequency_dump()
2460 mutex_lock(&rps->lock); in set_max_freq()
2463 if (val < rps->min_freq || in set_max_freq()
2464 val > rps->max_freq || in set_max_freq()
2465 val < rps->min_freq_softlimit) { in set_max_freq()
2466 ret = -EINVAL; in set_max_freq()
2470 if (val > rps->rp0_freq) in set_max_freq()
2471 drm_dbg(&i915->drm, "User requested overclocking to %d\n", in set_max_freq()
2474 rps->max_freq_softlimit = val; in set_max_freq()
2476 val = clamp_t(int, rps->cur_freq, in set_max_freq()
2477 rps->min_freq_softlimit, in set_max_freq()
2478 rps->max_freq_softlimit); in set_max_freq()
2488 mutex_unlock(&rps->lock); in set_max_freq()
2508 return slpc->min_freq_softlimit; in intel_rps_get_min_frequency()
2510 return intel_gpu_freq(rps, rps->min_freq_softlimit); in intel_rps_get_min_frequency()
2514 * intel_rps_get_min_raw_freq - returns the min frequency in some raw format.
2523 u32 freq; in intel_rps_get_min_raw_freq() local
2526 return DIV_ROUND_CLOSEST(slpc->min_freq, in intel_rps_get_min_raw_freq()
2529 freq = rps->min_freq; in intel_rps_get_min_raw_freq()
2532 freq /= GEN9_FREQ_SCALER; in intel_rps_get_min_raw_freq()
2534 return freq; in intel_rps_get_min_raw_freq()
2542 mutex_lock(&rps->lock); in set_min_freq()
2545 if (val < rps->min_freq || in set_min_freq()
2546 val > rps->max_freq || in set_min_freq()
2547 val > rps->max_freq_softlimit) { in set_min_freq()
2548 ret = -EINVAL; in set_min_freq()
2552 rps->min_freq_softlimit = val; in set_min_freq()
2554 val = clamp_t(int, rps->cur_freq, in set_min_freq()
2555 rps->min_freq_softlimit, in set_min_freq()
2556 rps->max_freq_softlimit); in set_min_freq()
2566 mutex_unlock(&rps->lock); in set_min_freq()
2583 return rps->power.up_threshold; in intel_rps_get_up_threshold()
2591 return -EINVAL; in rps_set_threshold()
2593 ret = mutex_lock_interruptible(&rps->lock); in rps_set_threshold()
2603 rps->last_freq = -1; in rps_set_threshold()
2604 mutex_lock(&rps->power.mutex); in rps_set_threshold()
2605 rps->power.mode = -1; in rps_set_threshold()
2606 mutex_unlock(&rps->power.mutex); in rps_set_threshold()
2608 intel_rps_set(rps, clamp(rps->cur_freq, in rps_set_threshold()
2609 rps->min_freq_softlimit, in rps_set_threshold()
2610 rps->max_freq_softlimit)); in rps_set_threshold()
2613 mutex_unlock(&rps->lock); in rps_set_threshold()
2620 return rps_set_threshold(rps, &rps->power.up_threshold, threshold); in intel_rps_set_up_threshold()
2625 return rps->power.down_threshold; in intel_rps_get_down_threshold()
2630 return rps_set_threshold(rps, &rps->power.down_threshold, threshold); in intel_rps_set_down_threshold()
2646 mutex_lock(&rps->lock); in intel_rps_raise_unslice()
2661 intel_rps_set(rps, rps->rp0_freq); in intel_rps_raise_unslice()
2664 mutex_unlock(&rps->lock); in intel_rps_raise_unslice()
2671 mutex_lock(&rps->lock); in intel_rps_lower_unslice()
2686 intel_rps_set(rps, rps->min_freq); in intel_rps_lower_unslice()
2689 mutex_unlock(&rps->lock); in intel_rps_lower_unslice()
2698 with_intel_runtime_pm(gt->uncore->rpm, wakeref) in rps_read_mmio()
2699 val = intel_uncore_read(gt->uncore, reg32); in rps_read_mmio()
2739 * We only register the i915 ips part with intel-ips once everything is in intel_rps_driver_register()
2740 * set up, to avoid intel-ips sneaking in and reading bogus values. in intel_rps_driver_register()
2742 if (GRAPHICS_VER(gt->i915) == 5) { in intel_rps_driver_register()
2744 rcu_assign_pointer(ips_mchdev, gt->i915); in intel_rps_driver_register()
2761 if (i915 && !kref_get_unless_zero(&i915->drm.ref)) in mchdev_get()
2769 * i915_read_mch_val - return value for IPS use
2785 with_intel_runtime_pm(&i915->runtime_pm, wakeref) { in i915_read_mch_val()
2786 struct intel_ips *ips = &to_gt(i915)->rps.ips; in i915_read_mch_val()
2794 drm_dev_put(&i915->drm); in i915_read_mch_val()
2800 * i915_gpu_raise - raise GPU frequency limit
2813 rps = &to_gt(i915)->rps; in i915_gpu_raise()
2816 if (rps->max_freq_softlimit < rps->max_freq) in i915_gpu_raise()
2817 rps->max_freq_softlimit++; in i915_gpu_raise()
2820 drm_dev_put(&i915->drm); in i915_gpu_raise()
2826 * i915_gpu_lower - lower GPU frequency limit
2840 rps = &to_gt(i915)->rps; in i915_gpu_lower()
2843 if (rps->max_freq_softlimit > rps->min_freq) in i915_gpu_lower()
2844 rps->max_freq_softlimit--; in i915_gpu_lower()
2847 drm_dev_put(&i915->drm); in i915_gpu_lower()
2853 * i915_gpu_busy - indicate GPU business to IPS
2866 ret = to_gt(i915)->awake; in i915_gpu_busy()
2868 drm_dev_put(&i915->drm); in i915_gpu_busy()
2874 * i915_gpu_turbo_disable - disable graphics turbo
2876 * Disable graphics turbo by resetting the max frequency and setting the
2889 rps = &to_gt(i915)->rps; in i915_gpu_turbo_disable()
2892 rps->max_freq_softlimit = rps->min_freq; in i915_gpu_turbo_disable()
2893 ret = !__gen5_rps_set(&to_gt(i915)->rps, rps->min_freq); in i915_gpu_turbo_disable()
2896 drm_dev_put(&i915->drm); in i915_gpu_turbo_disable()