A new file, "cpuclk_cfg", is added under "/sys/devices/platform/eeepc" through which is possible to select one of the available predefined CPU clock configuration (FSB frequency and core voltage).
Reading from cpuclk_cfg returns two numbers: the first is the number of available "CPU clock configurations", the second is a non-negative number less than the first representing the current configuration. If the function is not supported (through ACPI) the string "<unsupported>" is returned instead.
Writing a number to cpuclk_cfg allows to change the current CPU clock configuration.
On the Eee PC 1000H there are three available clock configuration: 0 -> Super Performance Mode 1 -> High Performance Mode 2 -> Power Saving ModeThe selected configuration is saved into the NVRAM and restored after a reboot. This fact allowed me to use use /proc/cpuinfo to measure the CPU clock (while keeping SpeedStep disabled, i.e. at its maximum multiplier value):
0 -> cpu MHz: 1709.760 / bogomips: 3420.00 1 -> cpu MHz: 1595.736 / bogomips: 3192.45 2 -> cpu MHz: 1254.026 / bogomips: 2509.55The attached file is a dump of the DSDT taken from my EeePC 1000H I used as a reference to write the patch.
Here is the patch:diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
index 786ed86..d079d51 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -382,10 +382,40 @@ EEEPC_CREATE_DEVICE_ATTR(camera, CM_ASL_CAMERA); EEEPC_CREATE_DEVICE_ATTR(cardr, CM_ASL_CARDREADER); EEEPC_CREATE_DEVICE_ATTR(disp, CM_ASL_DISPLAYSWITCH); + +static ssize_t show_ckfg(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int n_of_cfgs,current_cfg; + current_cfg=get_acpi(CM_ASL_CPUFV); + if (current_cfg<0) + return sprintf(buf, "%s\n", "<unsupported>"); + n_of_cfgs=(current_cfg>>8)&0xff; + current_cfg&=0xff; + return sprintf(buf, "%d %d\n", n_of_cfgs, current_cfg); +} + +static ssize_t store_ckfg(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_sys_acpi(CM_ASL_CPUFV, buf, count); +} + +static struct device_attribute dev_attr_ckfg = { + .attr = { + .name = "cpuclk_cfg", + .mode = 0644 }, + .show = show_ckfg, + .store = store_ckfg +}; + static struct attribute *platform_attributes[] = { &dev_attr_camera.attr, &dev_attr_cardr.attr, &dev_attr_disp.attr, + &dev_attr_ckfg.attr, NULL }; -- Francesco Lattanzio <franz.lattanzio@xxxxxxxxx>
Attachment:
eeepc_1000h_dsdt.dsl.gz
Description: application/gzip