Subject: Re: Making a common API for cpu frequency drivers
To: None <tech-kern@netbsd.org>
From: Juan RP <juan@xtrarom.org>
List: tech-kern
Date: 09/02/2006 19:46:35
On Fri, 1 Sep 2006 09:03:56 +0200
Juan RP <juan@xtrarom.org> wrote:

> 
> Hi,
> 
> Cube suggested that the way to go for drivers changing CPU frequency
> (speedstep, powernow, longrun, etc) is to use a new sysmon object.
> 
> Before starting the work, I would like to know what do I need exactly.
> I've come up with the following plan:

I need more help, see the following:

struct sysmon_cpufreq {
        const char *smcf_name;  /* cpufreq device name */
        uint8_t smcf_refcnt;    /* references */

        /* 
         * callback to a function that will give us the array that
         * will contain the frequencies stored in integer objects.
         */
        prop_array_t (*smcpufreq_gdata)(struct sysmon_cpufreq *);

        /* callback to a function that will give us the current frequency */
        prop_number_t (*smcpufreq_gcurfreq)(struct sysmon_cpufreq *);

        /* callback to a function that will set new frequency */
        int (*smcpufreq_snewfreq)(struct sysmon_cpufreq *);

        LIST_ENTRY(sysmon_cpufreq) smcpufreq_list;
};

int     sysmonopen_cpufreq(dev_t, int, int, struct lwp *);
int     sysmonclose_cpufreq(dev_t, int, int, struct lwp *);
int     sysmonioctl_cpufreq(dev_t, u_long, caddr_t, int, struct lwp *);

int     sysmon_cpufreq_register(struct sysmon_cpufreq *);
void    sysmon_cpufreq_unregister(struct sysmon_cpufreq *);

--

And I think that adding just one ioctl (I named SMCPUFREQ_GDICT) is
enough because it will return a dictionary (which has the key of the
array and the array with the integers returned by the function callbacks).

The ioctl SMCPUFREQ_GDICT in sysmon_cpufreq.c will return to
userland the dictionary via prop_dictionary_copyout_ioctl().

Now I'm not sure if the function callback to get the current frequency:

prop_number_t (*smcpufreq_gcurfreq)(struct sysmon_cpufreq *);

needs to return prop_number_t or just an unsigned int and convert to
a prop_number_t in sysmon_cpufreq.

What do you think about this? do you have any suggestion?

Thanks.