Subject: Re: Status report: sysmon_cpufreq(9) + powerctl(8)
To: None <tech-kern@netbsd.org>
From: Juan RP <juan@xtrarom.org>
List: tech-kern
Date: 09/12/2006 22:21:55
On Tue, 12 Sep 2006 21:59:44 +0200
Juan RP <juan@xtrarom.org> wrote:

> 
> Hi!
> 
> After two weeks of work, I have the sysmon_cpufreq(9) working
> with a simple driver that will return "hardcoded" values.
> 
> I made a LKM to test the API:
> 
> http://www.xtrarom.org/~juan/sysmon_cpufreq/cpufreq_lkm/
> 
> The kernel part:
> 
> http://www.xtrarom.org/~juan/sysmon_cpufreq/cpufreq.diff
> 
> And powerctl(8), the userland part:
> 
> http://www.xtrarom.org/~juan/sysmon_cpufreq/powerctl/

Forgot to say... when requested freq is not in the valid array created
by sysmon_cpufreq_mkdictionary(), it will fail with EOPNOTSUPP:

[juan@nocturno][~]> ./sysmon_cpufreq/powerctl/powerctl -f 8000
powerctl: error: Operation not supported
[juan@nocturno][~]>

dmesg output:

smcf_name: cpufreq_lkm
sysmonioctl_cpufreq: copyin_ioctl done (error: 0)
sysmonioctl_cpufreq: cpufreq-new-frequency done.
sysmonioctl_cpufreq: newfreq: 8000 cfreq.cf_curfreq: 800
sysmonioctl_cpufreq: frequencies and fqlobj done.
sysmonioctl_cpufreq: mycnt: 4
sysmonioctl_cpufreq: newfreq: 8000 cf_fqlist[i]: 800
sysmonioctl_cpufreq: newfreq: 8000 cf_fqlist[i]: 1200
sysmonioctl_cpufreq: newfreq: 8000 cf_fqlist[i]: 1400
sysmonioctl_cpufreq: newfreq: 8000 cf_fqlist[i]: 1600
sysmonioctl_cpufreq: freqfound: 0
sysmonioctl_cpufreq: releasing objects.

And when requested freq is the same than current freq returns EINVAL:

[juan@nocturno][~]> ./sysmon_cpufreq/powerctl/powerctl        
cpu0
        current:        800 MHz [998 mV]
        frequencies:    800 1200 1400 1600 (in MHz)
        voltages:       998 1004 1120 1190 (in mV)
[juan@nocturno][~]>

[juan@nocturno][~]> ./sysmon_cpufreq/powerctl/powerctl -f 800
powerctl: error: Invalid argument
[juan@nocturno][~]>

dmesg output:

smcf_name: cpufreq_lkm
sysmonioctl_cpufreq: copyin_ioctl done (error: 0)
sysmonioctl_cpufreq: cpufreq-new-frequency done.
sysmonioctl_cpufreq: newfreq: 800 cfreq.cf_curfreq: 800

--

IMHO this is the right way to check for valid values.