Lines Matching defs:ips

228 #define thm_readb(off) readb(ips->regmap + (off))
229 #define thm_readw(off) readw(ips->regmap + (off))
230 #define thm_readl(off) readl(ips->regmap + (off))
231 #define thm_readq(off) readq(ips->regmap + (off))
233 #define thm_writeb(off, val) writeb((val), ips->regmap + (off))
234 #define thm_writew(off, val) writew((val), ips->regmap + (off))
235 #define thm_writel(off, val) writel((val), ips->regmap + (off))
335 ips_gpu_turbo_enabled(struct ips_driver *ips);
339 * @ips: IPS driver struct
346 static bool ips_cpu_busy(struct ips_driver *ips)
356 * @ips: IPS driver struct
364 static void ips_cpu_raise(struct ips_driver *ips)
369 if (!ips->cpu_turbo_enabled)
378 if (((new_tdp_limit * 10) / 8) > ips->core_power_limit)
394 * @ips: IPS driver struct
402 static void ips_cpu_lower(struct ips_driver *ips)
413 if (new_limit < (ips->orig_turbo_limit & TURBO_TDP_MASK))
414 new_limit = ips->orig_turbo_limit & TURBO_TDP_MASK;
448 * @ips: IPS driver struct
453 static void ips_enable_cpu_turbo(struct ips_driver *ips)
456 if (ips->__cpu_turbo_on)
459 if (ips->turbo_toggle_allowed)
460 on_each_cpu(do_enable_cpu_turbo, ips, 1);
462 ips->__cpu_turbo_on = true;
486 * @ips: IPS driver struct
491 static void ips_disable_cpu_turbo(struct ips_driver *ips)
494 if (!ips->__cpu_turbo_on)
497 if (ips->turbo_toggle_allowed)
498 on_each_cpu(do_disable_cpu_turbo, ips, 1);
500 ips->__cpu_turbo_on = false;
505 * @ips: IPS driver struct
513 static bool ips_gpu_busy(struct ips_driver *ips)
515 if (!ips_gpu_turbo_enabled(ips))
518 return ips->gpu_busy();
523 * @ips: IPS driver struct
528 static void ips_gpu_raise(struct ips_driver *ips)
530 if (!ips_gpu_turbo_enabled(ips))
533 if (!ips->gpu_raise())
534 ips->gpu_turbo_enabled = false;
541 * @ips: IPS driver struct
545 static void ips_gpu_lower(struct ips_driver *ips)
547 if (!ips_gpu_turbo_enabled(ips))
550 if (!ips->gpu_lower())
551 ips->gpu_turbo_enabled = false;
558 * @ips: IPS driver struct
563 static void ips_enable_gpu_turbo(struct ips_driver *ips)
565 if (ips->__gpu_turbo_on)
567 ips->__gpu_turbo_on = true;
572 * @ips: IPS driver struct
576 static void ips_disable_gpu_turbo(struct ips_driver *ips)
579 if (!ips->__gpu_turbo_on)
582 if (!ips->gpu_turbo_disable())
583 dev_err(ips->dev, "failed to disable graphics turbo\n");
585 ips->__gpu_turbo_on = false;
590 * @ips: IPS driver struct
594 static bool mcp_exceeded(struct ips_driver *ips)
601 spin_lock_irqsave(&ips->turbo_status_lock, flags);
603 temp_limit = ips->mcp_temp_limit * 100;
604 if (ips->mcp_avg_temp > temp_limit)
607 avg_power = ips->cpu_avg_power + ips->mch_avg_power;
608 if (avg_power > ips->mcp_power_limit)
611 spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
618 * @ips: IPS driver struct
623 static bool cpu_exceeded(struct ips_driver *ips, int cpu)
629 spin_lock_irqsave(&ips->turbo_status_lock, flags);
630 avg = cpu ? ips->ctv2_avg_temp : ips->ctv1_avg_temp;
631 if (avg > (ips->limits->core_temp_limit * 100))
633 if (ips->cpu_avg_power > ips->core_power_limit * 100)
635 spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
638 dev_info(ips->dev, "CPU power or thermal limit exceeded\n");
645 * @ips: IPS driver struct
649 static bool mch_exceeded(struct ips_driver *ips)
654 spin_lock_irqsave(&ips->turbo_status_lock, flags);
655 if (ips->mch_avg_temp > (ips->limits->mch_temp_limit * 100))
657 if (ips->mch_avg_power > ips->mch_power_limit)
659 spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
666 * @ips: IPS structure
672 static void verify_limits(struct ips_driver *ips)
674 if (ips->mcp_power_limit < ips->limits->mcp_power_limit ||
675 ips->mcp_power_limit > 35000)
676 ips->mcp_power_limit = ips->limits->mcp_power_limit;
678 if (ips->mcp_temp_limit < ips->limits->core_temp_limit ||
679 ips->mcp_temp_limit < ips->limits->mch_temp_limit ||
680 ips->mcp_temp_limit > 150)
681 ips->mcp_temp_limit = min(ips->limits->core_temp_limit,
682 ips->limits->mch_temp_limit);
687 * @ips: IPS driver struct
698 static void update_turbo_limits(struct ips_driver *ips)
702 ips->cpu_turbo_enabled = !(hts & HTS_PCTD_DIS);
707 ips->cpu_turbo_enabled = false;
709 if (ips->gpu_busy)
710 ips->gpu_turbo_enabled = !(hts & HTS_GTD_DIS);
712 ips->core_power_limit = thm_readw(THM_MPCPC);
713 ips->mch_power_limit = thm_readw(THM_MMGPC);
714 ips->mcp_temp_limit = thm_readw(THM_PTL);
715 ips->mcp_power_limit = thm_readw(THM_MPPC);
717 verify_limits(ips);
723 * @data: ips driver structure
754 struct ips_driver *ips = data;
757 dev_dbg(ips->dev, "starting ips-adjust thread\n");
764 bool cpu_busy = ips_cpu_busy(ips);
765 bool gpu_busy = ips_gpu_busy(ips);
767 spin_lock_irqsave(&ips->turbo_status_lock, flags);
768 if (ips->poll_turbo_status)
769 update_turbo_limits(ips);
770 spin_unlock_irqrestore(&ips->turbo_status_lock, flags);
773 if (ips->cpu_turbo_enabled)
774 ips_enable_cpu_turbo(ips);
776 ips_disable_cpu_turbo(ips);
778 if (ips->gpu_turbo_enabled)
779 ips_enable_gpu_turbo(ips);
781 ips_disable_gpu_turbo(ips);
784 if (mcp_exceeded(ips)) {
785 ips_cpu_lower(ips);
786 ips_gpu_lower(ips);
790 if (!cpu_exceeded(ips, 0) && cpu_busy)
791 ips_cpu_raise(ips);
793 ips_cpu_lower(ips);
795 if (!mch_exceeded(ips) && gpu_busy)
796 ips_gpu_raise(ips);
798 ips_gpu_lower(ips);
804 dev_dbg(ips->dev, "ips-adjust thread stopped\n");
814 static u16 calc_avg_temp(struct ips_driver *ips, u16 *array)
830 static u16 read_mgtv(struct ips_driver *ips)
848 static u16 read_ptv(struct ips_driver *ips)
857 static u16 read_ctv(struct ips_driver *ips, int cpu)
871 static u32 get_cpu_power(struct ips_driver *ips, u32 *last, int period)
912 static u32 calc_avg_power(struct ips_driver *ips, u32 *array)
929 struct ips_driver *ips = from_timer(ips, t, timer);
930 wake_up_process(ips->monitor);
935 * @data: ips driver structure
946 struct ips_driver *ips = data;
961 dev_err(ips->dev,
962 "failed to allocate sample array, ips disabled\n");
984 mcp_samples[i] = read_ptv(ips);
986 val = read_ctv(ips, 0);
989 val = read_ctv(ips, 1);
992 val = read_mgtv(ips);
995 cpu_power = get_cpu_power(ips, &old_cpu_power,
999 if (ips->read_mch_val) {
1000 mchp = ips->read_mch_val();
1009 ips->mcp_avg_temp = calc_avg_temp(ips, mcp_samples);
1010 ips->ctv1_avg_temp = calc_avg_temp(ips, ctv1_samples);
1011 ips->ctv2_avg_temp = calc_avg_temp(ips, ctv2_samples);
1012 ips->mch_avg_temp = calc_avg_temp(ips, mch_samples);
1013 ips->cpu_avg_power = calc_avg_power(ips, cpu_samples);
1014 ips->mch_avg_power = calc_avg_power(ips, mchp_samples);
1023 wake_up_process(ips->adjust);
1034 timer_setup(&ips->timer, monitor_timeout, TIMER_DEFERRABLE);
1040 val = read_ptv(ips);
1041 ips->mcp_avg_temp = update_average_temp(ips->mcp_avg_temp, val);
1044 val = read_ctv(ips, 0);
1045 ips->ctv1_avg_temp =
1046 update_average_temp(ips->ctv1_avg_temp, val);
1048 cpu_val = get_cpu_power(ips, &old_cpu_power,
1050 ips->cpu_avg_power =
1051 update_average_power(ips->cpu_avg_power, cpu_val);
1053 if (ips->second_cpu) {
1055 val = read_ctv(ips, 1);
1056 ips->ctv2_avg_temp =
1057 update_average_temp(ips->ctv2_avg_temp, val);
1061 val = read_mgtv(ips);
1062 ips->mch_avg_temp = update_average_temp(ips->mch_avg_temp, val);
1064 if (ips->read_mch_val) {
1065 mch_val = ips->read_mch_val();
1066 ips->mch_avg_power =
1067 update_average_power(ips->mch_avg_power,
1081 dev_warn(ips->dev,
1092 mod_timer(&ips->timer, expire);
1101 del_timer_sync(&ips->timer);
1103 dev_dbg(ips->dev, "ips-monitor thread stopped\n");
1112 dev_dbg(ips->dev, #reg ": 0x%04x\n", val); \
1117 dev_dbg(ips->dev, #reg ": 0x%08x\n", val); \
1122 dev_dbg(ips->dev, #reg ": 0x%016x\n", val); \
1125 static void dump_thermal_info(struct ips_driver *ips)
1130 dev_dbg(ips->dev, "Processor temp limit: %d\n", ptl);
1152 struct ips_driver *ips = arg;
1159 dev_info(ips->dev, "TSES: 0x%02x\n", tses);
1160 dev_info(ips->dev, "TES: 0x%02x\n", tes);
1170 spin_lock(&ips->turbo_status_lock);
1171 ips->core_power_limit = (sts & STS_PCPL_MASK) >>
1173 ips->mch_power_limit = (sts & STS_GPL_MASK) >>
1176 ips->cpu_turbo_enabled = !(sts & STS_PCTD_DIS);
1181 ips->cpu_turbo_enabled = false;
1182 if (ips->gpu_busy)
1183 ips->gpu_turbo_enabled = !(sts & STS_GTD_DIS);
1184 ips->mcp_temp_limit = (sts & STS_PTL_MASK) >>
1186 ips->mcp_power_limit = (tc1 & STS_PPL_MASK) >>
1188 verify_limits(ips);
1189 spin_unlock(&ips->turbo_status_lock);
1198 dev_warn(ips->dev, "thermal trip occurred, tses: 0x%04x\n",
1207 static void ips_debugfs_init(struct ips_driver *ips) { return; }
1208 static void ips_debugfs_cleanup(struct ips_driver *ips) { return; }
1215 struct ips_driver *ips = m->private;
1217 seq_printf(m, "%d.%02d\n", ips->ctv1_avg_temp / 100,
1218 ips->ctv1_avg_temp % 100);
1226 struct ips_driver *ips = m->private;
1228 seq_printf(m, "%dmW\n", ips->cpu_avg_power);
1258 struct ips_driver *ips = m->private;
1260 seq_printf(m, "%d.%02d\n", ips->mch_avg_temp / 100,
1261 ips->mch_avg_temp % 100);
1269 struct ips_driver *ips = m->private;
1271 seq_printf(m, "%dmW\n", ips->mch_avg_power);
1277 static void ips_debugfs_cleanup(struct ips_driver *ips)
1279 debugfs_remove_recursive(ips->debug_root);
1282 static void ips_debugfs_init(struct ips_driver *ips)
1284 ips->debug_root = debugfs_create_dir("ips", NULL);
1286 debugfs_create_file("cpu_temp", 0444, ips->debug_root, ips, &cpu_temp_fops);
1287 debugfs_create_file("cpu_power", 0444, ips->debug_root, ips, &cpu_power_fops);
1288 debugfs_create_file("cpu_clamp", 0444, ips->debug_root, ips, &cpu_clamp_fops);
1289 debugfs_create_file("mch_temp", 0444, ips->debug_root, ips, &mch_temp_fops);
1290 debugfs_create_file("mch_power", 0444, ips->debug_root, ips, &mch_power_fops);
1300 static struct ips_mcp_limits *ips_detect_cpu(struct ips_driver *ips)
1307 dev_info(ips->dev, "Non-IPS CPU detected.\n");
1318 ips->turbo_toggle_allowed = true;
1320 ips->turbo_toggle_allowed = false;
1329 dev_info(ips->dev, "No CPUID match found.\n");
1338 dev_info(ips->dev,
1349 * @ips: IPS driver
1356 static bool ips_get_i915_syms(struct ips_driver *ips)
1358 ips->read_mch_val = symbol_get(i915_read_mch_val);
1359 if (!ips->read_mch_val)
1361 ips->gpu_raise = symbol_get(i915_gpu_raise);
1362 if (!ips->gpu_raise)
1364 ips->gpu_lower = symbol_get(i915_gpu_lower);
1365 if (!ips->gpu_lower)
1367 ips->gpu_busy = symbol_get(i915_gpu_busy);
1368 if (!ips->gpu_busy)
1370 ips->gpu_turbo_disable = symbol_get(i915_gpu_turbo_disable);
1371 if (!ips->gpu_turbo_disable)
1389 ips_gpu_turbo_enabled(struct ips_driver *ips)
1391 if (!ips->gpu_busy && late_i915_load) {
1392 if (ips_get_i915_syms(ips)) {
1393 dev_info(ips->dev,
1395 ips->gpu_turbo_enabled = !(thm_readl(THM_HTS) & HTS_GTD_DIS);
1399 return ips->gpu_turbo_enabled;
1441 struct ips_driver *ips;
1450 ips = devm_kzalloc(&dev->dev, sizeof(*ips), GFP_KERNEL);
1451 if (!ips)
1454 spin_lock_init(&ips->turbo_status_lock);
1455 ips->dev = &dev->dev;
1457 ips->limits = ips_detect_cpu(ips);
1458 if (!ips->limits) {
1474 ips->regmap = pcim_iomap_table(dev)[0];
1476 pci_set_drvdata(dev, ips);
1492 ips->second_cpu = true;
1494 update_turbo_limits(ips);
1496 ips->mcp_power_limit / 10);
1498 ips->core_power_limit / 10);
1501 ips->poll_turbo_status = true;
1503 if (!ips_get_i915_syms(ips)) {
1505 ips->gpu_turbo_enabled = false;
1508 ips->gpu_turbo_enabled = true;
1529 ips->irq = pci_irq_vector(dev, 0);
1531 ret = request_irq(ips->irq, ips_irq_handler, IRQF_SHARED, "ips", ips);
1543 ips->cta_val = thm_readw(THM_CTA);
1544 ips->pta_val = thm_readw(THM_PTA);
1545 ips->mgta_val = thm_readw(THM_MGTA);
1548 rdmsrl(TURBO_POWER_CURRENT_LIMIT, ips->orig_turbo_limit);
1550 ips_disable_cpu_turbo(ips);
1551 ips->cpu_turbo_enabled = false;
1554 ips->adjust = kthread_create(ips_adjust, ips, "ips-adjust");
1555 if (IS_ERR(ips->adjust)) {
1567 ips->monitor = kthread_run(ips_monitor, ips, "ips-monitor");
1568 if (IS_ERR(ips->monitor)) {
1575 hts = (ips->core_power_limit << HTS_PCPL_SHIFT) |
1576 (ips->mcp_temp_limit << HTS_PTL_SHIFT) | HTS_NVV;
1582 ips_debugfs_init(ips);
1585 ips->mcp_temp_limit);
1589 kthread_stop(ips->adjust);
1591 free_irq(ips->irq, ips);
1598 struct ips_driver *ips = pci_get_drvdata(dev);
1601 ips_debugfs_cleanup(ips);
1604 if (ips->read_mch_val)
1606 if (ips->gpu_raise)
1608 if (ips->gpu_lower)
1610 if (ips->gpu_busy)
1612 if (ips->gpu_turbo_disable)
1618 wrmsrl(TURBO_POWER_CURRENT_LIMIT, ips->orig_turbo_limit);
1620 free_irq(ips->irq, ips);
1622 if (ips->adjust)
1623 kthread_stop(ips->adjust);
1624 if (ips->monitor)
1625 kthread_stop(ips->monitor);
1630 .name = "intel ips",