cpuid leaf : CPUID_LEAF_MWAIT
drivers/acpi/acpi_pad.c
#define CPUID_LEAF_MWAIT 0x05
cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
寄存器 值 (十六进制) 含义 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ EAX 0x40 (64) MWAIT 最小轮询周期 (TSC 计数值) EBX 0x40 (64) MWAIT 最大轮询周期 (TSC 计数值) ECX 0x3 支持的扩展特性 EDX 0x11 支持的 C-state 子状态信息
如果在经典 hygon 机器上测试:
• eax = 0x40 • ebx = 0x40 • ecx = 0x3 • edx = 0x11
这里的 edx 说明就是只有 C0 是支持的
使用 cpuid -1 -r -l 5 的结果
0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00000011
cpuid -1 -l 5
MONITOR/MWAIT (5):
smallest monitor-line size (bytes) = 0x40 (64)
largest monitor-line size (bytes) = 0x40 (64)
enum of Monitor-MWAIT exts supported = true
supports intrs as break-event for MWAIT = true
monitorless MWAIT supported = false
number of C0 sub C-states using MWAIT = 0x1 (1)
number of C1 sub C-states using MWAIT = 0x1 (1)
number of C2 sub C-states using MWAIT = 0x0 (0)
number of C3 sub C-states using MWAIT = 0x0 (0)
number of C4 sub C-states using MWAIT = 0x0 (0)
number of C5 sub C-states using MWAIT = 0x0 (0)
number of C6 sub C-states using MWAIT = 0x0 (0)
number of C7 sub C-states using MWAIT = 0x0 (0)
13900k
CPU:
0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x10102020
CPU:
MONITOR/MWAIT (5):
smallest monitor-line size (bytes) = 0x40 (64)
largest monitor-line size (bytes) = 0x40 (64)
enum of Monitor-MWAIT exts supported = true
supports intrs as break-event for MWAIT = true
monitorless MWAIT supported = false
number of C0 sub C-states using MWAIT = 0x0 (0)
number of C1 sub C-states using MWAIT = 0x2 (2)
number of C2 sub C-states using MWAIT = 0x0 (0)
number of C3 sub C-states using MWAIT = 0x2 (2)
number of C4 sub C-states using MWAIT = 0x0 (0)
number of C5 sub C-states using MWAIT = 0x1 (1)
number of C6 sub C-states using MWAIT = 0x0 (0)
number of C7 sub C-states using MWAIT = 0x1 (1)
intel sdm
17.7 MWAIT EXTENSIONS FOR ADVANCED POWER MANAGEMENT
这个检查结果很全过程
结果发现,有的加载,有的不加载,不是说一定加载的:
lsmod_node-67-77.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-67-76.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-67-75.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-129-196.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002120
lsmod_node-128-104.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-129-193.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002120
lsmod_node-128-102.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00000011
lsmod_node-132-141.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-67-58.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-73.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00000011
lsmod_node-128-101.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00000011
lsmod_node-67-57.txt
2: 0x00000005 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00002020
lsmod_node-132-143.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-106.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-132-144.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-115.txt
2: 0x00000005 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00000000
lsmod_node-128-110.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-107.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-129-194.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002120
lsmod_node-129-195.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002120
lsmod_node-128-83.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002120
lsmod_node-128-103.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00000011
lsmod_node-128-109.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-105.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-128-81.txt
2: 0x00000005 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00002020
lsmod_node-128-82.txt
2: 0x00000005 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00002020
lsmod_node-128-108.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
lsmod_node-67-74.txt
2: 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x00002020
其实未必可以加载的:
$ lsmod | grep acpi
acpi_power_meter 20480 0
acpi_ipmi 20480 0
ipmi_msghandler 126976 3 ipmi_devintf,ipmi_si,acpi_ipmi
$ sudo modprobe acpi_pad
$ lsmod | grep acpi
acpi_pad 184320 0
acpi_power_meter 20480 0
acpi_ipmi 20480 0
ipmi_msghandler 126976 3 ipmi_devintf,ipmi_si,acpi_ipmi
具体代码分析为:
power_saving_mwait_init 中的内容,如果只有最低两位有,那么就跳过:
edx >>= MWAIT_SUBSTATE_SIZE;
for (i = 0; i < 7 && edx; i++, edx >>= MWAIT_SUBSTATE_SIZE) {
if (edx & MWAIT_SUBSTATE_MASK) {
highest_cstate = i;
highest_subcstate = edx & MWAIT_SUBSTATE_MASK;
}
}
power_saving_mwait_eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) |
(highest_subcstate - 1);
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。