mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-30 06:25:03 +08:00
Merge branches 'pm-devfreq', 'pm-avs' and 'pm-tools'
* pm-devfreq: PM / devfreq: add devfreq_suspend/resume() functions PM / devfreq: add support for suspend/resume of a devfreq device PM / devfreq: refactor set_target frequency function * pm-avs: PM / AVS: SmartReflex: Switch to SPDX Licence ID PM / AVS: SmartReflex: NULL check before some freeing functions is not needed PM / AVS: SmartReflex: remove unused function * pm-tools: tools/power/x86/intel_pstate_tracer: Fix non root execution for post processing a trace file tools/power turbostat: consolidate duplicate model numbers tools/power turbostat: fix goldmont C-state limit decoding cpupower : Auto-completion for cpupower tool tools/power turbostat: reduce debug output tools/power turbosat: fix AMD APIC-id output
This commit is contained in:
commit
a465d38fa3
@ -285,6 +285,44 @@ static int devfreq_notify_transition(struct devfreq *devfreq,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int devfreq_set_target(struct devfreq *devfreq, unsigned long new_freq,
|
||||
u32 flags)
|
||||
{
|
||||
struct devfreq_freqs freqs;
|
||||
unsigned long cur_freq;
|
||||
int err = 0;
|
||||
|
||||
if (devfreq->profile->get_cur_freq)
|
||||
devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq);
|
||||
else
|
||||
cur_freq = devfreq->previous_freq;
|
||||
|
||||
freqs.old = cur_freq;
|
||||
freqs.new = new_freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE);
|
||||
|
||||
err = devfreq->profile->target(devfreq->dev.parent, &new_freq, flags);
|
||||
if (err) {
|
||||
freqs.new = cur_freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
|
||||
return err;
|
||||
}
|
||||
|
||||
freqs.new = new_freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
|
||||
|
||||
if (devfreq_update_status(devfreq, new_freq))
|
||||
dev_err(&devfreq->dev,
|
||||
"Couldn't update frequency transition information.\n");
|
||||
|
||||
devfreq->previous_freq = new_freq;
|
||||
|
||||
if (devfreq->suspend_freq)
|
||||
devfreq->resume_freq = cur_freq;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Load monitoring helper functions for governors use */
|
||||
|
||||
/**
|
||||
@ -296,8 +334,7 @@ static int devfreq_notify_transition(struct devfreq *devfreq,
|
||||
*/
|
||||
int update_devfreq(struct devfreq *devfreq)
|
||||
{
|
||||
struct devfreq_freqs freqs;
|
||||
unsigned long freq, cur_freq, min_freq, max_freq;
|
||||
unsigned long freq, min_freq, max_freq;
|
||||
int err = 0;
|
||||
u32 flags = 0;
|
||||
|
||||
@ -333,31 +370,8 @@ int update_devfreq(struct devfreq *devfreq)
|
||||
flags |= DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use LUB */
|
||||
}
|
||||
|
||||
if (devfreq->profile->get_cur_freq)
|
||||
devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq);
|
||||
else
|
||||
cur_freq = devfreq->previous_freq;
|
||||
return devfreq_set_target(devfreq, freq, flags);
|
||||
|
||||
freqs.old = cur_freq;
|
||||
freqs.new = freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE);
|
||||
|
||||
err = devfreq->profile->target(devfreq->dev.parent, &freq, flags);
|
||||
if (err) {
|
||||
freqs.new = cur_freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
|
||||
return err;
|
||||
}
|
||||
|
||||
freqs.new = freq;
|
||||
devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
|
||||
|
||||
if (devfreq_update_status(devfreq, freq))
|
||||
dev_err(&devfreq->dev,
|
||||
"Couldn't update frequency transition information.\n");
|
||||
|
||||
devfreq->previous_freq = freq;
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(update_devfreq);
|
||||
|
||||
@ -657,6 +671,9 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||
}
|
||||
devfreq->max_freq = devfreq->scaling_max_freq;
|
||||
|
||||
devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev);
|
||||
atomic_set(&devfreq->suspend_count, 0);
|
||||
|
||||
dev_set_name(&devfreq->dev, "devfreq%d",
|
||||
atomic_inc_return(&devfreq_no));
|
||||
err = device_register(&devfreq->dev);
|
||||
@ -857,14 +874,28 @@ EXPORT_SYMBOL(devm_devfreq_remove_device);
|
||||
*/
|
||||
int devfreq_suspend_device(struct devfreq *devfreq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!devfreq)
|
||||
return -EINVAL;
|
||||
|
||||
if (!devfreq->governor)
|
||||
if (atomic_inc_return(&devfreq->suspend_count) > 1)
|
||||
return 0;
|
||||
|
||||
return devfreq->governor->event_handler(devfreq,
|
||||
DEVFREQ_GOV_SUSPEND, NULL);
|
||||
if (devfreq->governor) {
|
||||
ret = devfreq->governor->event_handler(devfreq,
|
||||
DEVFREQ_GOV_SUSPEND, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (devfreq->suspend_freq) {
|
||||
ret = devfreq_set_target(devfreq, devfreq->suspend_freq, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(devfreq_suspend_device);
|
||||
|
||||
@ -878,17 +909,75 @@ EXPORT_SYMBOL(devfreq_suspend_device);
|
||||
*/
|
||||
int devfreq_resume_device(struct devfreq *devfreq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!devfreq)
|
||||
return -EINVAL;
|
||||
|
||||
if (!devfreq->governor)
|
||||
if (atomic_dec_return(&devfreq->suspend_count) >= 1)
|
||||
return 0;
|
||||
|
||||
return devfreq->governor->event_handler(devfreq,
|
||||
DEVFREQ_GOV_RESUME, NULL);
|
||||
if (devfreq->resume_freq) {
|
||||
ret = devfreq_set_target(devfreq, devfreq->resume_freq, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (devfreq->governor) {
|
||||
ret = devfreq->governor->event_handler(devfreq,
|
||||
DEVFREQ_GOV_RESUME, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(devfreq_resume_device);
|
||||
|
||||
/**
|
||||
* devfreq_suspend() - Suspend devfreq governors and devices
|
||||
*
|
||||
* Called during system wide Suspend/Hibernate cycles for suspending governors
|
||||
* and devices preserving the state for resume. On some platforms the devfreq
|
||||
* device must have precise state (frequency) after resume in order to provide
|
||||
* fully operating setup.
|
||||
*/
|
||||
void devfreq_suspend(void)
|
||||
{
|
||||
struct devfreq *devfreq;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&devfreq_list_lock);
|
||||
list_for_each_entry(devfreq, &devfreq_list, node) {
|
||||
ret = devfreq_suspend_device(devfreq);
|
||||
if (ret)
|
||||
dev_err(&devfreq->dev,
|
||||
"failed to suspend devfreq device\n");
|
||||
}
|
||||
mutex_unlock(&devfreq_list_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* devfreq_resume() - Resume devfreq governors and devices
|
||||
*
|
||||
* Called during system wide Suspend/Hibernate cycle for resuming governors and
|
||||
* devices that are suspended with devfreq_suspend().
|
||||
*/
|
||||
void devfreq_resume(void)
|
||||
{
|
||||
struct devfreq *devfreq;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&devfreq_list_lock);
|
||||
list_for_each_entry(devfreq, &devfreq_list, node) {
|
||||
ret = devfreq_resume_device(devfreq);
|
||||
if (ret)
|
||||
dev_warn(&devfreq->dev,
|
||||
"failed to resume devfreq device\n");
|
||||
}
|
||||
mutex_unlock(&devfreq_list_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* devfreq_add_governor() - Add devfreq governor
|
||||
* @governor: the devfreq governor to be added
|
||||
|
@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* OMAP SmartReflex Voltage Control
|
||||
*
|
||||
@ -11,10 +12,6 @@
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Lesly A M <x0080970@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -37,7 +34,6 @@
|
||||
static LIST_HEAD(sr_list);
|
||||
|
||||
static struct omap_sr_class_data *sr_class;
|
||||
static struct omap_sr_pmic_data *sr_pmic_data;
|
||||
static struct dentry *sr_dbg_dir;
|
||||
|
||||
static inline void sr_write_reg(struct omap_sr *sr, unsigned offset, u32 value)
|
||||
@ -780,25 +776,6 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
|
||||
sr_class->disable(sr, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_sr_register_pmic() - API to register pmic specific info.
|
||||
* @pmic_data: The structure containing pmic specific data.
|
||||
*
|
||||
* This API is to be called from the PMIC specific code to register with
|
||||
* smartreflex driver pmic specific info. Currently the only info required
|
||||
* is the smartreflex init on the PMIC side.
|
||||
*/
|
||||
void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data)
|
||||
{
|
||||
if (!pmic_data) {
|
||||
pr_warn("%s: Trying to register NULL PMIC data structure with smartreflex\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
sr_pmic_data = pmic_data;
|
||||
}
|
||||
|
||||
/* PM Debug FS entries to enable and disable smartreflex. */
|
||||
static int omap_sr_autocomp_show(void *data, u64 *val)
|
||||
{
|
||||
@ -1010,8 +987,7 @@ static int omap_sr_remove(struct platform_device *pdev)
|
||||
|
||||
if (sr_info->autocomp_active)
|
||||
sr_stop_vddautocomp(sr_info);
|
||||
if (sr_info->dbg_dir)
|
||||
debugfs_remove_recursive(sr_info->dbg_dir);
|
||||
debugfs_remove_recursive(sr_info->dbg_dir);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
list_del(&sr_info->node);
|
||||
@ -1065,17 +1041,6 @@ static int __init sr_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* sr_init is a late init. If by then a pmic specific API is not
|
||||
* registered either there is no need for anything to be done on
|
||||
* the PMIC side or somebody has forgotten to register a PMIC
|
||||
* handler. Warn for the second condition.
|
||||
*/
|
||||
if (sr_pmic_data && sr_pmic_data->sr_pmic_init)
|
||||
sr_pmic_data->sr_pmic_init();
|
||||
else
|
||||
pr_warn("%s: No PMIC hook to init smartreflex\n", __func__);
|
||||
|
||||
ret = platform_driver_register(&smartreflex_driver);
|
||||
if (ret) {
|
||||
pr_err("%s: platform driver register failed for SR\n",
|
||||
|
@ -131,6 +131,9 @@ struct devfreq_dev_profile {
|
||||
* @scaling_min_freq: Limit minimum frequency requested by OPP interface
|
||||
* @scaling_max_freq: Limit maximum frequency requested by OPP interface
|
||||
* @stop_polling: devfreq polling status of a device.
|
||||
* @suspend_freq: frequency of a device set during suspend phase.
|
||||
* @resume_freq: frequency of a device set in resume phase.
|
||||
* @suspend_count: suspend requests counter for a device.
|
||||
* @total_trans: Number of devfreq transitions
|
||||
* @trans_table: Statistics of devfreq transitions
|
||||
* @time_in_state: Statistics of devfreq states
|
||||
@ -167,6 +170,10 @@ struct devfreq {
|
||||
unsigned long scaling_max_freq;
|
||||
bool stop_polling;
|
||||
|
||||
unsigned long suspend_freq;
|
||||
unsigned long resume_freq;
|
||||
atomic_t suspend_count;
|
||||
|
||||
/* information for device frequency transition */
|
||||
unsigned int total_trans;
|
||||
unsigned int *trans_table;
|
||||
@ -198,6 +205,9 @@ extern void devm_devfreq_remove_device(struct device *dev,
|
||||
extern int devfreq_suspend_device(struct devfreq *devfreq);
|
||||
extern int devfreq_resume_device(struct devfreq *devfreq);
|
||||
|
||||
extern void devfreq_suspend(void);
|
||||
extern void devfreq_resume(void);
|
||||
|
||||
/**
|
||||
* update_devfreq() - Reevaluate the device and configure frequency
|
||||
* @devfreq: the devfreq device
|
||||
@ -324,6 +334,9 @@ static inline int devfreq_resume_device(struct devfreq *devfreq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void devfreq_suspend(void) {}
|
||||
static inline void devfreq_resume(void) {}
|
||||
|
||||
static inline struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
|
||||
unsigned long *freq, u32 flags)
|
||||
{
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* OMAP Smartreflex Defines and Routines
|
||||
*
|
||||
@ -11,10 +12,6 @@
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Lesly A M <x0080970@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __POWER_SMARTREFLEX_H
|
||||
@ -303,9 +300,6 @@ void omap_sr_enable(struct voltagedomain *voltdm);
|
||||
void omap_sr_disable(struct voltagedomain *voltdm);
|
||||
void omap_sr_disable_reset_volt(struct voltagedomain *voltdm);
|
||||
|
||||
/* API to register the pmic specific data with the smartreflex driver. */
|
||||
void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data);
|
||||
|
||||
/* Smartreflex driver hooks to be called from Smartreflex class driver */
|
||||
int sr_enable(struct omap_sr *sr, unsigned long volt);
|
||||
void sr_disable(struct omap_sr *sr);
|
||||
@ -320,7 +314,5 @@ static inline void omap_sr_enable(struct voltagedomain *voltdm) {}
|
||||
static inline void omap_sr_disable(struct voltagedomain *voltdm) {}
|
||||
static inline void omap_sr_disable_reset_volt(
|
||||
struct voltagedomain *voltdm) {}
|
||||
static inline void omap_sr_register_pmic(
|
||||
struct omap_sr_pmic_data *pmic_data) {}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -89,6 +89,7 @@ endif
|
||||
localedir ?= /usr/share/locale
|
||||
docdir ?= /usr/share/doc/packages/cpupower
|
||||
confdir ?= /etc/
|
||||
bash_completion_dir ?= /usr/share/bash-completion/completions
|
||||
|
||||
# Toolchain: what tools do we use, and what options do they need:
|
||||
|
||||
@ -96,7 +97,8 @@ CP = cp -fpR
|
||||
INSTALL = /usr/bin/install -c
|
||||
INSTALL_PROGRAM = ${INSTALL}
|
||||
INSTALL_DATA = ${INSTALL} -m 644
|
||||
INSTALL_SCRIPT = ${INSTALL_PROGRAM}
|
||||
#bash completion scripts get sourced and so they should be rw only.
|
||||
INSTALL_SCRIPT = ${INSTALL} -m 644
|
||||
|
||||
# If you are running a cross compiler, you may want to set this
|
||||
# to something more interesting, like "arm-linux-". If you want
|
||||
@ -288,6 +290,8 @@ install-lib:
|
||||
install-tools:
|
||||
$(INSTALL) -d $(DESTDIR)${bindir}
|
||||
$(INSTALL_PROGRAM) $(OUTPUT)cpupower $(DESTDIR)${bindir}
|
||||
$(INSTALL) -d $(DESTDIR)${bash_completion_dir}
|
||||
$(INSTALL_SCRIPT) cpupower-completion.sh '$(DESTDIR)${bash_completion_dir}/cpupower'
|
||||
|
||||
install-man:
|
||||
$(INSTALL_DATA) -D man/cpupower.1 $(DESTDIR)${mandir}/man1/cpupower.1
|
||||
|
128
tools/power/cpupower/cpupower-completion.sh
Normal file
128
tools/power/cpupower/cpupower-completion.sh
Normal file
@ -0,0 +1,128 @@
|
||||
# -*- shell-script -*-
|
||||
# bash completion script for cpupower
|
||||
# Taken from git.git's completion script.
|
||||
|
||||
_cpupower_commands="frequency-info frequency-set idle-info idle-set set info monitor"
|
||||
|
||||
_frequency_info ()
|
||||
{
|
||||
local flags="-f -w -l -d -p -g -a -s -y -o -m -n --freq --hwfreq --hwlimits --driver --policy --governors --related-cpus --affected-cpus --stats --latency --proc --human --no-rounding"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
frequency-info) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_frequency_set ()
|
||||
{
|
||||
local flags="-f -g --freq --governor -d --min -u --max -r --related"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
-f| --freq | -d | --min | -u | --max)
|
||||
if [ -d /sys/devices/system/cpu/cpufreq/ ] ; then
|
||||
COMPREPLY=($(compgen -W '$(cat $(ls -d /sys/devices/system/cpu/cpufreq/policy* | head -1)/scaling_available_frequencies)' -- "$cur"))
|
||||
fi ;;
|
||||
-g| --governor)
|
||||
if [ -d /sys/devices/system/cpu/cpufreq/ ] ; then
|
||||
COMPREPLY=($(compgen -W '$(cat $(ls -d /sys/devices/system/cpu/cpufreq/policy* | head -1)/scaling_available_governors)' -- "$cur"))
|
||||
fi;;
|
||||
frequency-set) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_idle_info()
|
||||
{
|
||||
local flags="-f --silent"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
idle-info) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_idle_set()
|
||||
{
|
||||
local flags="-d --disable -e --enable -D --disable-by-latency -E --enable-all"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
idle-set) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_set()
|
||||
{
|
||||
local flags="--perf-bias, -b"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
set) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_monitor()
|
||||
{
|
||||
local flags="-l -m -i -c -v"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev" in
|
||||
monitor) COMPREPLY=($(compgen -W "$flags" -- "$cur")) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_taskset()
|
||||
{
|
||||
local prev_to_prev="${COMP_WORDS[COMP_CWORD-2]}"
|
||||
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$prev_to_prev" in
|
||||
-c|--cpu) COMPREPLY=($(compgen -W "$_cpupower_commands" -- "$cur")) ;;
|
||||
esac
|
||||
case "$prev" in
|
||||
frequency-info) _frequency_info ;;
|
||||
frequency-set) _frequency_set ;;
|
||||
idle-info) _idle_info ;;
|
||||
idle-set) _idle_set ;;
|
||||
set) _set ;;
|
||||
monitor) _monitor ;;
|
||||
esac
|
||||
|
||||
}
|
||||
|
||||
_cpupower ()
|
||||
{
|
||||
local i
|
||||
local c=1
|
||||
local command
|
||||
|
||||
while test $c -lt $COMP_CWORD; do
|
||||
if test $c == 1; then
|
||||
command="${COMP_WORDS[c]}"
|
||||
fi
|
||||
c=$((++c))
|
||||
done
|
||||
|
||||
# Complete name of subcommand if the user has not finished typing it yet.
|
||||
if test $c -eq $COMP_CWORD -a -z "$command"; then
|
||||
COMPREPLY=($(compgen -W "help -v --version -c --cpu $_cpupower_commands" -- "${COMP_WORDS[COMP_CWORD]}"))
|
||||
return
|
||||
fi
|
||||
|
||||
# Complete arguments to subcommands.
|
||||
case "$command" in
|
||||
-v|--version) return ;;
|
||||
-c|--cpu) _taskset ;;
|
||||
help) COMPREPLY=($(compgen -W "$_cpupower_commands" -- "${COMP_WORDS[COMP_CWORD]}")) ;;
|
||||
frequency-info) _frequency_info ;;
|
||||
frequency-set) _frequency_set ;;
|
||||
idle-info) _idle_info ;;
|
||||
idle-set) _idle_set ;;
|
||||
set) _set ;;
|
||||
monitor) _monitor ;;
|
||||
esac
|
||||
}
|
||||
|
||||
complete -o bashdefault -o default -F _cpupower cpupower 2>/dev/null \
|
||||
|| complete -o default -F _cpupower cpupower
|
@ -585,9 +585,9 @@ current_max_cpu = 0
|
||||
|
||||
read_trace_data(filename)
|
||||
|
||||
clear_trace_file()
|
||||
# Free the memory
|
||||
if interval:
|
||||
clear_trace_file()
|
||||
# Free the memory
|
||||
free_trace_buffer()
|
||||
|
||||
if graph_data_present == False:
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* turbostat -- show CPU frequency and C-state residency
|
||||
* on modern Intel turbo-capable processors.
|
||||
* on modern Intel and AMD processors.
|
||||
*
|
||||
* Copyright (c) 2013 Intel Corporation.
|
||||
* Len Brown <len.brown@intel.com>
|
||||
@ -71,6 +71,8 @@ unsigned int do_irtl_snb;
|
||||
unsigned int do_irtl_hsw;
|
||||
unsigned int units = 1000000; /* MHz etc */
|
||||
unsigned int genuine_intel;
|
||||
unsigned int authentic_amd;
|
||||
unsigned int max_level, max_extended_level;
|
||||
unsigned int has_invariant_tsc;
|
||||
unsigned int do_nhm_platform_info;
|
||||
unsigned int no_MSR_MISC_PWR_MGMT;
|
||||
@ -1667,30 +1669,51 @@ int get_mp(int cpu, struct msr_counter *mp, unsigned long long *counterp)
|
||||
|
||||
void get_apic_id(struct thread_data *t)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx, max_level;
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
eax = ebx = ecx = edx = 0;
|
||||
if (DO_BIC(BIC_APIC)) {
|
||||
eax = ebx = ecx = edx = 0;
|
||||
__cpuid(1, eax, ebx, ecx, edx);
|
||||
|
||||
t->apic_id = (ebx >> 24) & 0xff;
|
||||
}
|
||||
|
||||
if (!DO_BIC(BIC_X2APIC))
|
||||
return;
|
||||
|
||||
if (authentic_amd) {
|
||||
unsigned int topology_extensions;
|
||||
|
||||
if (max_extended_level < 0x8000001e)
|
||||
return;
|
||||
|
||||
eax = ebx = ecx = edx = 0;
|
||||
__cpuid(0x80000001, eax, ebx, ecx, edx);
|
||||
topology_extensions = ecx & (1 << 22);
|
||||
|
||||
if (topology_extensions == 0)
|
||||
return;
|
||||
|
||||
eax = ebx = ecx = edx = 0;
|
||||
__cpuid(0x8000001e, eax, ebx, ecx, edx);
|
||||
|
||||
t->x2apic_id = eax;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!genuine_intel)
|
||||
return;
|
||||
|
||||
__cpuid(0, max_level, ebx, ecx, edx);
|
||||
|
||||
__cpuid(1, eax, ebx, ecx, edx);
|
||||
t->apic_id = (ebx >> 24) & 0xf;
|
||||
|
||||
if (max_level < 0xb)
|
||||
return;
|
||||
|
||||
if (!DO_BIC(BIC_X2APIC))
|
||||
return;
|
||||
|
||||
ecx = 0;
|
||||
__cpuid(0xb, eax, ebx, ecx, edx);
|
||||
t->x2apic_id = edx;
|
||||
|
||||
if (debug && (t->apic_id != t->x2apic_id))
|
||||
fprintf(outf, "cpu%d: apic 0x%x x2apic 0x%x\n", t->cpu_id, t->apic_id, t->x2apic_id);
|
||||
if (debug && (t->apic_id != (t->x2apic_id & 0xff)))
|
||||
fprintf(outf, "cpu%d: BIOS BUG: apic 0x%x x2apic 0x%x\n",
|
||||
t->cpu_id, t->apic_id, t->x2apic_id);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1953,11 +1976,12 @@ done:
|
||||
#define PCL_7S 11 /* PC7 Shrink */
|
||||
#define PCL__8 12 /* PC8 */
|
||||
#define PCL__9 13 /* PC9 */
|
||||
#define PCLUNL 14 /* Unlimited */
|
||||
#define PCL_10 14 /* PC10 */
|
||||
#define PCLUNL 15 /* Unlimited */
|
||||
|
||||
int pkg_cstate_limit = PCLUKN;
|
||||
char *pkg_cstate_limit_strings[] = { "reserved", "unknown", "pc0", "pc1", "pc2",
|
||||
"pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "pc8", "pc9", "unlimited"};
|
||||
"pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "pc8", "pc9", "pc10", "unlimited"};
|
||||
|
||||
int nhm_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCL__3, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
int snb_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCL__7, PCL_7S, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
@ -1965,7 +1989,7 @@ int hsw_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S,
|
||||
int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7};
|
||||
int amt_pkg_cstate_limits[16] = {PCLUNL, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
int bxt_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
int glm_pkg_cstate_limits[16] = {PCLUNL, PCL__1, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9, PCL_10, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
int skx_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
|
||||
|
||||
|
||||
@ -3113,13 +3137,8 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||
bclk = discover_bclk(family, model);
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_NEHALEM_EP: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */
|
||||
case INTEL_FAM6_NEHALEM: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */
|
||||
case 0x1F: /* Core i7 and i5 Processor - Nehalem */
|
||||
case INTEL_FAM6_WESTMERE: /* Westmere Client - Clarkdale, Arrandale */
|
||||
case INTEL_FAM6_WESTMERE_EP: /* Westmere EP - Gulftown */
|
||||
case INTEL_FAM6_NEHALEM_EX: /* Nehalem-EX Xeon - Beckton */
|
||||
case INTEL_FAM6_WESTMERE_EX: /* Westmere-EX Xeon - Eagleton */
|
||||
pkg_cstate_limits = nhm_pkg_cstate_limits;
|
||||
break;
|
||||
case INTEL_FAM6_SANDYBRIDGE: /* SNB */
|
||||
@ -3131,16 +3150,11 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||
break;
|
||||
case INTEL_FAM6_HASWELL_CORE: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_X: /* HSX */
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_GT3E: /* HSW */
|
||||
case INTEL_FAM6_BROADWELL_CORE: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_X: /* BDX */
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
pkg_cstate_limits = hsw_pkg_cstate_limits;
|
||||
has_misc_feature_control = 1;
|
||||
@ -3159,13 +3173,12 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||
no_MSR_MISC_PWR_MGMT = 1;
|
||||
break;
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* PHI */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
pkg_cstate_limits = phi_pkg_cstate_limits;
|
||||
break;
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_X: /* DNV */
|
||||
pkg_cstate_limits = bxt_pkg_cstate_limits;
|
||||
pkg_cstate_limits = glm_pkg_cstate_limits;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
@ -3220,7 +3233,6 @@ int is_bdx(unsigned int family, unsigned int model)
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_BROADWELL_X:
|
||||
case INTEL_FAM6_BROADWELL_XEON_D:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -3246,9 +3258,7 @@ int has_turbo_ratio_limit(unsigned int family, unsigned int model)
|
||||
switch (model) {
|
||||
/* Nehalem compatible, but do not include turbo-ratio limit support */
|
||||
case INTEL_FAM6_NEHALEM_EX: /* Nehalem-EX Xeon - Beckton */
|
||||
case INTEL_FAM6_WESTMERE_EX: /* Westmere-EX Xeon - Eagleton */
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* PHI - Knights Landing (different MSR definition) */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return 0;
|
||||
default:
|
||||
return 1;
|
||||
@ -3303,7 +3313,6 @@ int has_knl_turbo_ratio_limit(unsigned int family, unsigned int model)
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* Knights Landing */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
@ -3337,21 +3346,15 @@ int has_config_tdp(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_IVYBRIDGE: /* IVB */
|
||||
case INTEL_FAM6_HASWELL_CORE: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_X: /* HSX */
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_GT3E: /* HSW */
|
||||
case INTEL_FAM6_BROADWELL_CORE: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_X: /* BDX */
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
case INTEL_FAM6_SKYLAKE_X: /* SKX */
|
||||
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* Knights Landing */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
@ -3744,9 +3747,7 @@ rapl_dram_energy_units_probe(int model, double rapl_energy_units)
|
||||
switch (model) {
|
||||
case INTEL_FAM6_HASWELL_X: /* HSX */
|
||||
case INTEL_FAM6_BROADWELL_X: /* BDX */
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* KNL */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return (rapl_dram_energy_units = 15.3 / 1000000);
|
||||
default:
|
||||
return (rapl_energy_units);
|
||||
@ -3775,7 +3776,6 @@ void rapl_probe(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_SANDYBRIDGE:
|
||||
case INTEL_FAM6_IVYBRIDGE:
|
||||
case INTEL_FAM6_HASWELL_CORE: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_GT3E: /* HSW */
|
||||
case INTEL_FAM6_BROADWELL_CORE: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
|
||||
@ -3799,9 +3799,6 @@ void rapl_probe(unsigned int family, unsigned int model)
|
||||
BIC_PRESENT(BIC_PkgWatt);
|
||||
break;
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO;
|
||||
BIC_PRESENT(BIC_PKG__);
|
||||
@ -3820,10 +3817,8 @@ void rapl_probe(unsigned int family, unsigned int model)
|
||||
break;
|
||||
case INTEL_FAM6_HASWELL_X: /* HSX */
|
||||
case INTEL_FAM6_BROADWELL_X: /* BDX */
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
case INTEL_FAM6_SKYLAKE_X: /* SKX */
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* KNL */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO;
|
||||
BIC_PRESENT(BIC_PKG__);
|
||||
BIC_PRESENT(BIC_RAM__);
|
||||
@ -3916,7 +3911,6 @@ void perf_limit_reasons_probe(unsigned int family, unsigned int model)
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_HASWELL_CORE: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_GT3E: /* HSW */
|
||||
do_gfx_perf_limit_reasons = 1;
|
||||
case INTEL_FAM6_HASWELL_X: /* HSX */
|
||||
@ -4128,16 +4122,11 @@ int has_snb_msrs(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_IVYBRIDGE_X: /* IVB Xeon */
|
||||
case INTEL_FAM6_HASWELL_CORE: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_X: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_GT3E: /* HSW */
|
||||
case INTEL_FAM6_BROADWELL_CORE: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
|
||||
case INTEL_FAM6_BROADWELL_X: /* BDX */
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
case INTEL_FAM6_SKYLAKE_X: /* SKX */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
@ -4166,12 +4155,9 @@ int has_hsw_msrs(unsigned int family, unsigned int model)
|
||||
return 0;
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_HASWELL_ULT: /* HSW */
|
||||
case INTEL_FAM6_HASWELL_CORE:
|
||||
case INTEL_FAM6_BROADWELL_CORE: /* BDW */
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
|
||||
@ -4195,9 +4181,6 @@ int has_skl_msrs(unsigned int family, unsigned int model)
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
|
||||
return 1;
|
||||
}
|
||||
@ -4222,7 +4205,6 @@ int is_knl(unsigned int family, unsigned int model)
|
||||
return 0;
|
||||
switch (model) {
|
||||
case INTEL_FAM6_XEON_PHI_KNL: /* KNL */
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -4436,18 +4418,56 @@ void decode_c6_demotion_policy_msr(void)
|
||||
base_cpu, msr, msr & (1 << 0) ? "EN" : "DIS");
|
||||
}
|
||||
|
||||
/*
|
||||
* When models are the same, for the purpose of turbostat, reuse
|
||||
*/
|
||||
unsigned int intel_model_duplicates(unsigned int model)
|
||||
{
|
||||
|
||||
switch(model) {
|
||||
case INTEL_FAM6_NEHALEM_EP: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */
|
||||
case INTEL_FAM6_NEHALEM: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */
|
||||
case 0x1F: /* Core i7 and i5 Processor - Nehalem */
|
||||
case INTEL_FAM6_WESTMERE: /* Westmere Client - Clarkdale, Arrandale */
|
||||
case INTEL_FAM6_WESTMERE_EP: /* Westmere EP - Gulftown */
|
||||
return INTEL_FAM6_NEHALEM;
|
||||
|
||||
case INTEL_FAM6_NEHALEM_EX: /* Nehalem-EX Xeon - Beckton */
|
||||
case INTEL_FAM6_WESTMERE_EX: /* Westmere-EX Xeon - Eagleton */
|
||||
return INTEL_FAM6_NEHALEM_EX;
|
||||
|
||||
case INTEL_FAM6_XEON_PHI_KNM:
|
||||
return INTEL_FAM6_XEON_PHI_KNL;
|
||||
|
||||
case INTEL_FAM6_HASWELL_ULT:
|
||||
return INTEL_FAM6_HASWELL_CORE;
|
||||
|
||||
case INTEL_FAM6_BROADWELL_X:
|
||||
case INTEL_FAM6_BROADWELL_XEON_D: /* BDX-DE */
|
||||
return INTEL_FAM6_BROADWELL_X;
|
||||
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE:
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP:
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE:
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP:
|
||||
return INTEL_FAM6_SKYLAKE_MOBILE;
|
||||
}
|
||||
return model;
|
||||
}
|
||||
void process_cpuid()
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx, max_level, max_extended_level;
|
||||
unsigned int fms, family, model, stepping;
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
unsigned int fms, family, model, stepping, ecx_flags, edx_flags;
|
||||
unsigned int has_turbo;
|
||||
|
||||
eax = ebx = ecx = edx = 0;
|
||||
|
||||
__cpuid(0, max_level, ebx, ecx, edx);
|
||||
|
||||
if (ebx == 0x756e6547 && edx == 0x49656e69 && ecx == 0x6c65746e)
|
||||
if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
|
||||
genuine_intel = 1;
|
||||
else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
|
||||
authentic_amd = 1;
|
||||
|
||||
if (!quiet)
|
||||
fprintf(outf, "CPUID(0): %.4s%.4s%.4s ",
|
||||
@ -4461,25 +4481,8 @@ void process_cpuid()
|
||||
family += (fms >> 20) & 0xff;
|
||||
if (family >= 6)
|
||||
model += ((fms >> 16) & 0xf) << 4;
|
||||
|
||||
if (!quiet) {
|
||||
fprintf(outf, "%d CPUID levels; family:model:stepping 0x%x:%x:%x (%d:%d:%d)\n",
|
||||
max_level, family, model, stepping, family, model, stepping);
|
||||
fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n",
|
||||
ecx & (1 << 0) ? "SSE3" : "-",
|
||||
ecx & (1 << 3) ? "MONITOR" : "-",
|
||||
ecx & (1 << 6) ? "SMX" : "-",
|
||||
ecx & (1 << 7) ? "EIST" : "-",
|
||||
ecx & (1 << 8) ? "TM2" : "-",
|
||||
edx & (1 << 4) ? "TSC" : "-",
|
||||
edx & (1 << 5) ? "MSR" : "-",
|
||||
edx & (1 << 22) ? "ACPI-TM" : "-",
|
||||
edx & (1 << 28) ? "HT" : "-",
|
||||
edx & (1 << 29) ? "TM" : "-");
|
||||
}
|
||||
|
||||
if (!(edx & (1 << 5)))
|
||||
errx(1, "CPUID: no MSR");
|
||||
ecx_flags = ecx;
|
||||
edx_flags = edx;
|
||||
|
||||
/*
|
||||
* check max extended function levels of CPUID.
|
||||
@ -4489,6 +4492,27 @@ void process_cpuid()
|
||||
ebx = ecx = edx = 0;
|
||||
__cpuid(0x80000000, max_extended_level, ebx, ecx, edx);
|
||||
|
||||
if (!quiet) {
|
||||
fprintf(outf, "0x%x CPUID levels; 0x%x xlevels; family:model:stepping 0x%x:%x:%x (%d:%d:%d)\n",
|
||||
max_level, max_extended_level, family, model, stepping, family, model, stepping);
|
||||
fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n",
|
||||
ecx_flags & (1 << 0) ? "SSE3" : "-",
|
||||
ecx_flags & (1 << 3) ? "MONITOR" : "-",
|
||||
ecx_flags & (1 << 6) ? "SMX" : "-",
|
||||
ecx_flags & (1 << 7) ? "EIST" : "-",
|
||||
ecx_flags & (1 << 8) ? "TM2" : "-",
|
||||
edx_flags & (1 << 4) ? "TSC" : "-",
|
||||
edx_flags & (1 << 5) ? "MSR" : "-",
|
||||
edx_flags & (1 << 22) ? "ACPI-TM" : "-",
|
||||
edx_flags & (1 << 28) ? "HT" : "-",
|
||||
edx_flags & (1 << 29) ? "TM" : "-");
|
||||
}
|
||||
if (genuine_intel)
|
||||
model = intel_model_duplicates(model);
|
||||
|
||||
if (!(edx_flags & (1 << 5)))
|
||||
errx(1, "CPUID: no MSR");
|
||||
|
||||
if (max_extended_level >= 0x80000007) {
|
||||
|
||||
/*
|
||||
@ -4576,9 +4600,6 @@ void process_cpuid()
|
||||
if (crystal_hz == 0)
|
||||
switch(model) {
|
||||
case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
|
||||
case INTEL_FAM6_SKYLAKE_DESKTOP: /* SKL */
|
||||
case INTEL_FAM6_KABYLAKE_MOBILE: /* KBL */
|
||||
case INTEL_FAM6_KABYLAKE_DESKTOP: /* KBL */
|
||||
crystal_hz = 24000000; /* 24.0 MHz */
|
||||
break;
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_X: /* DNV */
|
||||
@ -4860,6 +4881,8 @@ void topology_probe()
|
||||
return;
|
||||
|
||||
for (i = 0; i <= topo.max_cpu_num; ++i) {
|
||||
if (cpu_is_not_present(i))
|
||||
continue;
|
||||
fprintf(outf,
|
||||
"cpu %d pkg %d node %d lnode %d core %d thread %d\n",
|
||||
i, cpus[i].physical_package_id,
|
||||
|
Loading…
Reference in New Issue
Block a user