1#ifndef _MSM_THERMAL_IOCTL_H
2#define _MSM_THERMAL_IOCTL_H
3
4#include <linux/ioctl.h>
5
6#define MSM_THERMAL_IOCTL_NAME "msm_thermal_query"
7#define MSM_IOCTL_FREQ_SIZE 16
8
9struct __attribute__((__packed__)) cpu_freq_arg {
10	uint32_t cpu_num;
11	uint32_t freq_req;
12};
13
14struct __attribute__((__packed__)) clock_plan_arg {
15	uint32_t cluster_num;
16	/*
17	** A value of zero for freq_table_len, will fetch the length of the
18	** cluster frequency table. A non-zero value will fetch the frequency
19	** table contents.
20	*/
21	uint32_t freq_table_len;
22	/*
23	** For clusters with frequency table length greater than
24	** MSM_IOCTL_FREQ_SIZE, the frequency table is fetched from kernel
25	** in multiple sets or iterations. The set_idx variable,
26	** indicates, which set/part of frequency table the user is requesting.
27	** The set index value starts from zero. A set index value of 'Z',
28	** will fetch MSM_IOCTL_FREQ_SIZE or maximum available number of
29	** frequency values (if it is less than MSM_IOCTL_FREQ_SIZE)
30	** from the frequency table, starting from the index
31	** (Z * MSM_IOCTL_FREQ_SIZE).
32	** For example, in a device supporting 19 different frequencies, a set
33	** index value of 0 will fetch the first 16 (MSM_IOCTL_FREQ_SIZE)
34	** frequencies starting from the index 0 and a set value of 1 will fetch
35	** the remaining 3 frequencies starting from the index 16.
36	** A successful get, will populate the freq_table_len with the
37	** number of frequency table entries fetched.
38	*/
39	uint32_t set_idx;
40	unsigned int freq_table[MSM_IOCTL_FREQ_SIZE];
41};
42
43struct __attribute__((__packed__)) voltage_plan_arg {
44	uint32_t cluster_num;
45	uint32_t voltage_table_len;
46	uint32_t set_idx;
47	uint32_t voltage_table[MSM_IOCTL_FREQ_SIZE];
48};
49
50struct __attribute__((__packed__)) msm_thermal_ioctl {
51	uint32_t size;
52	union {
53		struct cpu_freq_arg cpu_freq;
54		struct clock_plan_arg clock_freq;
55		struct voltage_plan_arg voltage;
56	};
57};
58
59enum {
60	/*Set CPU Frequency*/
61	MSM_SET_CPU_MAX_FREQ = 0x00,
62	MSM_SET_CPU_MIN_FREQ = 0x01,
63	/*Set cluster frequency*/
64	MSM_SET_CLUSTER_MAX_FREQ = 0x02,
65	MSM_SET_CLUSTER_MIN_FREQ = 0x03,
66	/*Get cluster frequency plan*/
67	MSM_GET_CLUSTER_FREQ_PLAN = 0x04,
68	/*Get cluster voltage plan */
69	MSM_GET_CLUSTER_VOLTAGE_PLAN = 0x05,
70	MSM_CMD_MAX_NR,
71};
72
73#define MSM_THERMAL_MAGIC_NUM 0xCA /*Unique magic number*/
74
75#define MSM_THERMAL_SET_CPU_MAX_FREQUENCY _IOW(MSM_THERMAL_MAGIC_NUM,\
76		MSM_SET_CPU_MAX_FREQ, struct msm_thermal_ioctl)
77
78#define MSM_THERMAL_SET_CPU_MIN_FREQUENCY _IOW(MSM_THERMAL_MAGIC_NUM,\
79		MSM_SET_CPU_MIN_FREQ, struct msm_thermal_ioctl)
80
81#define MSM_THERMAL_SET_CLUSTER_MAX_FREQUENCY _IOW(MSM_THERMAL_MAGIC_NUM,\
82		MSM_SET_CLUSTER_MAX_FREQ, struct msm_thermal_ioctl)
83
84#define MSM_THERMAL_SET_CLUSTER_MIN_FREQUENCY _IOW(MSM_THERMAL_MAGIC_NUM,\
85		MSM_SET_CLUSTER_MIN_FREQ, struct msm_thermal_ioctl)
86
87#define MSM_THERMAL_GET_CLUSTER_FREQUENCY_PLAN _IOR(MSM_THERMAL_MAGIC_NUM,\
88		MSM_GET_CLUSTER_FREQ_PLAN, struct msm_thermal_ioctl)
89
90#define MSM_THERMAL_GET_CLUSTER_VOLTAGE_PLAN _IOR(MSM_THERMAL_MAGIC_NUM,\
91		MSM_GET_CLUSTER_VOLTAGE_PLAN, struct msm_thermal_ioctl)
92#ifdef __KERNEL__
93extern int msm_thermal_ioctl_init(void);
94extern void msm_thermal_ioctl_cleanup(void);
95#endif
96
97#endif
98