1/* $NetBSD: cpufreq.h,v 1.5 2011/10/27 05:13:04 jruoho Exp $ */
2
3/*-
4 * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jukka Ruohonen.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32#ifndef _SYS_CPUFREQ_H_
33#define _SYS_CPUFREQ_H_
34
35#ifndef _KERNEL
36#include <stdbool.h>
37#endif
38
39#ifdef _KERNEL
40#ifndef _SYS_XCALL_H_
41#include <sys/xcall.h>
42#endif
43#endif
44
45#define CPUFREQ_NAME_MAX 16
46#define CPUFREQ_STATE_MAX 32
47#define CPUFREQ_LATENCY_MAX UINT32_MAX
48
49#define CPUFREQ_STATE_ENABLED UINT32_MAX
50#define CPUFREQ_STATE_DISABLED UINT32_MAX - 1
51
52struct cpufreq_state {
53 uint32_t cfs_freq; /* MHz */
54 uint32_t cfs_power; /* mW */
55 uint32_t cfs_latency; /* usec */
56 uint32_t cfs_index;
57 uint32_t cfs_reserved[5];
58};
59
60struct cpufreq {
61 char cf_name[CPUFREQ_NAME_MAX];
62 uint32_t cf_state_count;
63 uint32_t cf_state_target;
64 uint32_t cf_state_current;
65 uint32_t cf_reserved[5];
66 u_int cf_index;
67
68#ifdef _KERNEL
69 bool cf_mp;
70 bool cf_init;
71 void *cf_cookie;
72 xcfunc_t cf_get_freq;
73 xcfunc_t cf_set_freq;
74 uint32_t cf_state_saved;
75 struct cpufreq_state cf_state[CPUFREQ_STATE_MAX];
76#endif /* _KERNEL */
77};
78
79#ifdef _KERNEL
80void cpufreq_init(void);
81int cpufreq_register(struct cpufreq *);
82void cpufreq_deregister(void);
83void cpufreq_suspend(struct cpu_info *);
84void cpufreq_resume(struct cpu_info *);
85uint32_t cpufreq_get(struct cpu_info *);
86int cpufreq_get_backend(struct cpufreq *);
87int cpufreq_get_state(uint32_t, struct cpufreq_state *);
88int cpufreq_get_state_index(uint32_t, struct cpufreq_state *);
89void cpufreq_set(struct cpu_info *, uint32_t);
90void cpufreq_set_all(uint32_t);
91#endif /* _KERNEL */
92
93#endif /* _SYS_CPUFREQ_H_ */
94