1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __ACPI_ACPI_THERMAL_H |
3 | #define __ACPI_ACPI_THERMAL_H |
4 | |
5 | #include <asm/ioctl.h> |
6 | |
7 | #define ACPI_THERMAL_MAGIC 's' |
8 | |
9 | #define ACPI_THERMAL_GET_TRT_LEN _IOR(ACPI_THERMAL_MAGIC, 1, unsigned long) |
10 | #define ACPI_THERMAL_GET_ART_LEN _IOR(ACPI_THERMAL_MAGIC, 2, unsigned long) |
11 | #define ACPI_THERMAL_GET_TRT_COUNT _IOR(ACPI_THERMAL_MAGIC, 3, unsigned long) |
12 | #define ACPI_THERMAL_GET_ART_COUNT _IOR(ACPI_THERMAL_MAGIC, 4, unsigned long) |
13 | |
14 | #define ACPI_THERMAL_GET_TRT _IOR(ACPI_THERMAL_MAGIC, 5, unsigned long) |
15 | #define ACPI_THERMAL_GET_ART _IOR(ACPI_THERMAL_MAGIC, 6, unsigned long) |
16 | |
17 | /* |
18 | * ACPI_THERMAL_GET_PSVT_COUNT = Number of PSVT entries |
19 | * ACPI_THERMAL_GET_PSVT_LEN = Total return data size (PSVT count x each |
20 | * PSVT entry size) |
21 | * ACPI_THERMAL_GET_PSVT = Get the data as an array of psvt_objects |
22 | */ |
23 | #define ACPI_THERMAL_GET_PSVT_LEN _IOR(ACPI_THERMAL_MAGIC, 7, unsigned long) |
24 | #define ACPI_THERMAL_GET_PSVT_COUNT _IOR(ACPI_THERMAL_MAGIC, 8, unsigned long) |
25 | #define ACPI_THERMAL_GET_PSVT _IOR(ACPI_THERMAL_MAGIC, 9, unsigned long) |
26 | |
27 | struct art { |
28 | acpi_handle source; |
29 | acpi_handle target; |
30 | struct_group(data, |
31 | u64 weight; |
32 | u64 ac0_max; |
33 | u64 ac1_max; |
34 | u64 ac2_max; |
35 | u64 ac3_max; |
36 | u64 ac4_max; |
37 | u64 ac5_max; |
38 | u64 ac6_max; |
39 | u64 ac7_max; |
40 | u64 ac8_max; |
41 | u64 ac9_max; |
42 | ); |
43 | } __packed; |
44 | |
45 | struct trt { |
46 | acpi_handle source; |
47 | acpi_handle target; |
48 | u64 influence; |
49 | u64 sample_period; |
50 | u64 reserved1; |
51 | u64 reserved2; |
52 | u64 reserved3; |
53 | u64 reserved4; |
54 | } __packed; |
55 | |
56 | #define ACPI_NR_PSVT_ELEMENTS 12 |
57 | #define ACPI_PSVT_CONTROL_KNOB 7 |
58 | #define ACPI_LIMIT_STR_MAX_LEN 8 |
59 | |
60 | struct psvt { |
61 | acpi_handle source; |
62 | acpi_handle target; |
63 | u64 priority; |
64 | u64 sample_period; |
65 | u64 passive_temp; |
66 | u64 source_domain; |
67 | u64 control_knob; |
68 | union { |
69 | /* For limit_type = ACPI_TYPE_INTEGER */ |
70 | u64 integer; |
71 | /* For limit_type = ACPI_TYPE_STRING */ |
72 | char string[ACPI_LIMIT_STR_MAX_LEN]; |
73 | char *str_ptr; |
74 | } limit; |
75 | u64 step_size; |
76 | u64 limit_coeff; |
77 | u64 unlimit_coeff; |
78 | /* Spec calls this field reserved, so we borrow it for type info */ |
79 | u64 control_knob_type; /* ACPI_TYPE_STRING or ACPI_TYPE_INTEGER */ |
80 | } __packed; |
81 | |
82 | #define ACPI_NR_ART_ELEMENTS 13 |
83 | /* for usrspace */ |
84 | union art_object { |
85 | struct { |
86 | char source_device[8]; /* ACPI single name */ |
87 | char target_device[8]; /* ACPI single name */ |
88 | struct_group(data, |
89 | u64 weight; |
90 | u64 ac0_max_level; |
91 | u64 ac1_max_level; |
92 | u64 ac2_max_level; |
93 | u64 ac3_max_level; |
94 | u64 ac4_max_level; |
95 | u64 ac5_max_level; |
96 | u64 ac6_max_level; |
97 | u64 ac7_max_level; |
98 | u64 ac8_max_level; |
99 | u64 ac9_max_level; |
100 | ); |
101 | }; |
102 | u64 __data[ACPI_NR_ART_ELEMENTS]; |
103 | }; |
104 | |
105 | union trt_object { |
106 | struct { |
107 | char source_device[8]; /* ACPI single name */ |
108 | char target_device[8]; /* ACPI single name */ |
109 | u64 influence; |
110 | u64 sample_period; |
111 | u64 reserved[4]; |
112 | }; |
113 | u64 __data[8]; |
114 | }; |
115 | |
116 | union psvt_object { |
117 | struct { |
118 | char source_device[8]; |
119 | char target_device[8]; |
120 | u64 priority; |
121 | u64 sample_period; |
122 | u64 passive_temp; |
123 | u64 source_domain; |
124 | u64 control_knob; |
125 | union { |
126 | u64 integer; |
127 | char string[ACPI_LIMIT_STR_MAX_LEN]; |
128 | } limit; |
129 | u64 step_size; |
130 | u64 limit_coeff; |
131 | u64 unlimit_coeff; |
132 | u64 control_knob_type; |
133 | }; |
134 | u64 __data[ACPI_NR_PSVT_ELEMENTS]; |
135 | }; |
136 | |
137 | #ifdef __KERNEL__ |
138 | int acpi_thermal_rel_misc_device_add(acpi_handle handle); |
139 | int acpi_thermal_rel_misc_device_remove(acpi_handle handle); |
140 | int acpi_parse_art(acpi_handle handle, int *art_count, struct art **arts, |
141 | bool create_dev); |
142 | int acpi_parse_trt(acpi_handle handle, int *trt_count, struct trt **trts, |
143 | bool create_dev); |
144 | #endif |
145 | |
146 | #endif /* __ACPI_ACPI_THERMAL_H */ |
147 | |