Lines Matching +full:compute +full:-
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * fam15h_power.c - AMD Family 15h processor power monitoring
5 * Copyright (c) 2011-2016 Advanced Micro Devices, Inc.
11 #include <linux/hwmon-sysfs.h>
55 /* maximum accumulated power of a compute unit */
57 /* accumulated power of the compute units */
61 /* online/offline status of current compute unit */
78 struct pci_dev *f4 = data->pdev; in power1_input_show()
80 pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5), in power1_input_show()
97 pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5), in power1_input_show()
110 data->base_tdp)) << running_avg_range; in power1_input_show()
111 curr_pwr_watts -= running_avg_capture; in power1_input_show()
112 curr_pwr_watts *= data->tdp_to_watts; in power1_input_show()
131 return sprintf(buf, "%u\n", data->processor_pwr_watts); in power1_crit_show()
142 * is compute unit id. in do_read_registers_on_cu()
146 rdmsrl_safe(MSR_F15H_CU_PWR_ACCUMULATOR, &data->cu_acc_power[cu]); in do_read_registers_on_cu()
147 rdmsrl_safe(MSR_F15H_PTSC, &data->cpu_sw_pwr_ptsc[cu]); in do_read_registers_on_cu()
149 data->cu_on[cu] = 1; in do_read_registers_on_cu()
164 return -ENOMEM; in read_registers()
166 memset(data->cu_on, 0, sizeof(int) * MAX_CUS); in read_registers()
171 * Choose the first online core of each compute unit, and then in read_registers()
173 * because the MSR value of CPU core represent the compute in read_registers()
176 core = -1; in read_registers()
186 /* get any CPU on this compute unit */ in read_registers()
210 * compute unit number. in power1_average_show()
219 prev_cu_acc_power[cu] = data->cu_acc_power[cu]; in power1_average_show()
220 prev_ptsc[cu] = data->cpu_sw_pwr_ptsc[cu]; in power1_average_show()
223 leftover = schedule_timeout_interruptible(msecs_to_jiffies(data->power_period)); in power1_average_show()
232 /* check if current compute unit is online */ in power1_average_show()
233 if (data->cu_on[cu] == 0) in power1_average_show()
236 if (data->cu_acc_power[cu] < prev_cu_acc_power[cu]) { in power1_average_show()
237 jdelta[cu] = data->max_cu_acc_power + data->cu_acc_power[cu]; in power1_average_show()
238 jdelta[cu] -= prev_cu_acc_power[cu]; in power1_average_show()
240 jdelta[cu] = data->cu_acc_power[cu] - prev_cu_acc_power[cu]; in power1_average_show()
242 tdelta = data->cpu_sw_pwr_ptsc[cu] - prev_ptsc[cu]; in power1_average_show()
243 jdelta[cu] *= data->cpu_pwr_sample_ratio * 1000; in power1_average_show()
260 return sprintf(buf, "%lu\n", data->power_period); in power1_average_interval_show()
276 return -EINVAL; in power1_average_interval_store()
280 return -EINVAL; in power1_average_interval_store()
282 data->power_period = temp; in power1_average_interval_store()
295 if (c->x86 == 0x15 && in fam15h_power_init_attrs()
296 (c->x86_model <= 0xf || in fam15h_power_init_attrs()
297 (c->x86_model >= 0x60 && c->x86_model <= 0x7f))) in fam15h_power_init_attrs()
304 fam15h_power_attrs = devm_kcalloc(&pdev->dev, n, in fam15h_power_init_attrs()
309 return -ENOMEM; in fam15h_power_init_attrs()
313 if (c->x86 == 0x15 && in fam15h_power_init_attrs()
314 (c->x86_model <= 0xf || in fam15h_power_init_attrs()
315 (c->x86_model >= 0x60 && c->x86_model <= 0x7f))) in fam15h_power_init_attrs()
323 data->group.attrs = fam15h_power_attrs; in fam15h_power_init_attrs()
332 pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 3), in should_load_on_this_node()
362 pci_bus_read_config_dword(pdev->bus, in tweak_runavg_range()
363 PCI_DEVFN(PCI_SLOT(pdev->devfn), 5), in tweak_runavg_range()
370 pci_bus_write_config_dword(pdev->bus, in tweak_runavg_range()
371 PCI_DEVFN(PCI_SLOT(pdev->devfn), 5), in tweak_runavg_range()
393 data->base_tdp = val >> 16; in fam15h_power_init_data()
396 pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5), in fam15h_power_init_data()
399 data->tdp_to_watts = ((val & 0x3ff) << 6) | ((val >> 10) & 0x3f); in fam15h_power_init_data()
400 tmp *= data->tdp_to_watts; in fam15h_power_init_data()
404 dev_warn(&f4->dev, in fam15h_power_init_data()
409 data->processor_pwr_watts = (tmp * 15625) >> 10; in fam15h_power_init_data()
421 * determine the ratio of the compute unit power accumulator in fam15h_power_init_data()
425 data->cpu_pwr_sample_ratio = cpuid_ecx(0x80000007); in fam15h_power_init_data()
428 pr_err("Failed to read max compute unit power accumulator MSR\n"); in fam15h_power_init_data()
429 return -ENODEV; in fam15h_power_init_data()
432 data->max_cu_acc_power = tmp; in fam15h_power_init_data()
440 data->power_period = 10; in fam15h_power_init_data()
449 struct device *dev = &pdev->dev; in fam15h_power_probe()
456 * are working hand-in-hand in fam15h_power_probe()
461 return -ENODEV; in fam15h_power_probe()
465 return -ENOMEM; in fam15h_power_probe()
471 data->pdev = pdev; in fam15h_power_probe()
473 data->groups[0] = &data->group; in fam15h_power_probe()
477 &data->groups[0]); in fam15h_power_probe()