| .. | .. |
|---|
| 1 | | -// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 2 | 2 | /* |
|---|
| 3 | 3 | * SCMI Message Protocol driver header |
|---|
| 4 | 4 | * |
|---|
| 5 | 5 | * Copyright (C) 2018 ARM Ltd. |
|---|
| 6 | 6 | */ |
|---|
| 7 | + |
|---|
| 8 | +#ifndef _LINUX_SCMI_PROTOCOL_H |
|---|
| 9 | +#define _LINUX_SCMI_PROTOCOL_H |
|---|
| 10 | + |
|---|
| 11 | +#include <linux/bitfield.h> |
|---|
| 7 | 12 | #include <linux/device.h> |
|---|
| 13 | +#include <linux/notifier.h> |
|---|
| 8 | 14 | #include <linux/types.h> |
|---|
| 15 | +#include <linux/android_kabi.h> |
|---|
| 9 | 16 | |
|---|
| 10 | 17 | #define SCMI_MAX_STR_SIZE 16 |
|---|
| 11 | 18 | #define SCMI_MAX_NUM_RATES 16 |
|---|
| .. | .. |
|---|
| 51 | 58 | }; |
|---|
| 52 | 59 | |
|---|
| 53 | 60 | struct scmi_handle; |
|---|
| 61 | +struct scmi_device; |
|---|
| 62 | +struct scmi_protocol_handle; |
|---|
| 54 | 63 | |
|---|
| 55 | 64 | /** |
|---|
| 56 | | - * struct scmi_clk_ops - represents the various operations provided |
|---|
| 65 | + * struct scmi_clk_proto_ops - represents the various operations provided |
|---|
| 57 | 66 | * by SCMI Clock Protocol |
|---|
| 58 | 67 | * |
|---|
| 59 | 68 | * @count_get: get the count of clocks provided by SCMI |
|---|
| .. | .. |
|---|
| 63 | 72 | * @enable: enables the specified clock |
|---|
| 64 | 73 | * @disable: disables the specified clock |
|---|
| 65 | 74 | */ |
|---|
| 66 | | -struct scmi_clk_ops { |
|---|
| 67 | | - int (*count_get)(const struct scmi_handle *handle); |
|---|
| 75 | +struct scmi_clk_proto_ops { |
|---|
| 76 | + int (*count_get)(const struct scmi_protocol_handle *ph); |
|---|
| 68 | 77 | |
|---|
| 69 | 78 | const struct scmi_clock_info *(*info_get) |
|---|
| 70 | | - (const struct scmi_handle *handle, u32 clk_id); |
|---|
| 71 | | - int (*rate_get)(const struct scmi_handle *handle, u32 clk_id, |
|---|
| 79 | + (const struct scmi_protocol_handle *ph, u32 clk_id); |
|---|
| 80 | + int (*rate_get)(const struct scmi_protocol_handle *ph, u32 clk_id, |
|---|
| 72 | 81 | u64 *rate); |
|---|
| 73 | | - int (*rate_set)(const struct scmi_handle *handle, u32 clk_id, |
|---|
| 82 | + int (*rate_set)(const struct scmi_protocol_handle *ph, u32 clk_id, |
|---|
| 74 | 83 | u64 rate); |
|---|
| 75 | | - int (*enable)(const struct scmi_handle *handle, u32 clk_id); |
|---|
| 76 | | - int (*disable)(const struct scmi_handle *handle, u32 clk_id); |
|---|
| 84 | + int (*enable)(const struct scmi_protocol_handle *ph, u32 clk_id); |
|---|
| 85 | + int (*disable)(const struct scmi_protocol_handle *ph, u32 clk_id); |
|---|
| 86 | + |
|---|
| 87 | + ANDROID_KABI_RESERVE(1); |
|---|
| 77 | 88 | }; |
|---|
| 78 | 89 | |
|---|
| 79 | 90 | /** |
|---|
| 80 | | - * struct scmi_perf_ops - represents the various operations provided |
|---|
| 91 | + * struct scmi_perf_proto_ops - represents the various operations provided |
|---|
| 81 | 92 | * by SCMI Performance Protocol |
|---|
| 82 | 93 | * |
|---|
| 83 | 94 | * @limits_set: sets limits on the performance level of a domain |
|---|
| .. | .. |
|---|
| 94 | 105 | * @est_power_get: gets the estimated power cost for a given performance domain |
|---|
| 95 | 106 | * at a given frequency |
|---|
| 96 | 107 | */ |
|---|
| 97 | | -struct scmi_perf_ops { |
|---|
| 98 | | - int (*limits_set)(const struct scmi_handle *handle, u32 domain, |
|---|
| 108 | +struct scmi_perf_proto_ops { |
|---|
| 109 | + int (*limits_set)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 99 | 110 | u32 max_perf, u32 min_perf); |
|---|
| 100 | | - int (*limits_get)(const struct scmi_handle *handle, u32 domain, |
|---|
| 111 | + int (*limits_get)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 101 | 112 | u32 *max_perf, u32 *min_perf); |
|---|
| 102 | | - int (*level_set)(const struct scmi_handle *handle, u32 domain, |
|---|
| 113 | + int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 103 | 114 | u32 level, bool poll); |
|---|
| 104 | | - int (*level_get)(const struct scmi_handle *handle, u32 domain, |
|---|
| 115 | + int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 105 | 116 | u32 *level, bool poll); |
|---|
| 106 | 117 | int (*device_domain_id)(struct device *dev); |
|---|
| 107 | | - int (*transition_latency_get)(const struct scmi_handle *handle, |
|---|
| 118 | + int (*transition_latency_get)(const struct scmi_protocol_handle *ph, |
|---|
| 108 | 119 | struct device *dev); |
|---|
| 109 | | - int (*device_opps_add)(const struct scmi_handle *handle, |
|---|
| 120 | + int (*device_opps_add)(const struct scmi_protocol_handle *ph, |
|---|
| 110 | 121 | struct device *dev); |
|---|
| 111 | | - int (*freq_set)(const struct scmi_handle *handle, u32 domain, |
|---|
| 122 | + int (*freq_set)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 112 | 123 | unsigned long rate, bool poll); |
|---|
| 113 | | - int (*freq_get)(const struct scmi_handle *handle, u32 domain, |
|---|
| 124 | + int (*freq_get)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 114 | 125 | unsigned long *rate, bool poll); |
|---|
| 115 | | - int (*est_power_get)(const struct scmi_handle *handle, u32 domain, |
|---|
| 126 | + int (*est_power_get)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 116 | 127 | unsigned long *rate, unsigned long *power); |
|---|
| 128 | + bool (*fast_switch_possible)(const struct scmi_protocol_handle *ph, |
|---|
| 129 | + struct device *dev); |
|---|
| 130 | + bool (*power_scale_mw_get)(const struct scmi_protocol_handle *ph); |
|---|
| 131 | + |
|---|
| 132 | + ANDROID_KABI_RESERVE(1); |
|---|
| 117 | 133 | }; |
|---|
| 118 | 134 | |
|---|
| 119 | 135 | /** |
|---|
| 120 | | - * struct scmi_power_ops - represents the various operations provided |
|---|
| 136 | + * struct scmi_power_proto_ops - represents the various operations provided |
|---|
| 121 | 137 | * by SCMI Power Protocol |
|---|
| 122 | 138 | * |
|---|
| 123 | 139 | * @num_domains_get: get the count of power domains provided by SCMI |
|---|
| .. | .. |
|---|
| 125 | 141 | * @state_set: sets the power state of a power domain |
|---|
| 126 | 142 | * @state_get: gets the power state of a power domain |
|---|
| 127 | 143 | */ |
|---|
| 128 | | -struct scmi_power_ops { |
|---|
| 129 | | - int (*num_domains_get)(const struct scmi_handle *handle); |
|---|
| 130 | | - char *(*name_get)(const struct scmi_handle *handle, u32 domain); |
|---|
| 144 | +struct scmi_power_proto_ops { |
|---|
| 145 | + int (*num_domains_get)(const struct scmi_protocol_handle *ph); |
|---|
| 146 | + char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 131 | 147 | #define SCMI_POWER_STATE_TYPE_SHIFT 30 |
|---|
| 132 | 148 | #define SCMI_POWER_STATE_ID_MASK (BIT(28) - 1) |
|---|
| 133 | 149 | #define SCMI_POWER_STATE_PARAM(type, id) \ |
|---|
| .. | .. |
|---|
| 135 | 151 | ((id) & SCMI_POWER_STATE_ID_MASK)) |
|---|
| 136 | 152 | #define SCMI_POWER_STATE_GENERIC_ON SCMI_POWER_STATE_PARAM(0, 0) |
|---|
| 137 | 153 | #define SCMI_POWER_STATE_GENERIC_OFF SCMI_POWER_STATE_PARAM(1, 0) |
|---|
| 138 | | - int (*state_set)(const struct scmi_handle *handle, u32 domain, |
|---|
| 154 | + int (*state_set)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 139 | 155 | u32 state); |
|---|
| 140 | | - int (*state_get)(const struct scmi_handle *handle, u32 domain, |
|---|
| 156 | + int (*state_get)(const struct scmi_protocol_handle *ph, u32 domain, |
|---|
| 141 | 157 | u32 *state); |
|---|
| 158 | + |
|---|
| 159 | + ANDROID_KABI_RESERVE(1); |
|---|
| 142 | 160 | }; |
|---|
| 143 | 161 | |
|---|
| 144 | | -struct scmi_sensor_info { |
|---|
| 145 | | - u32 id; |
|---|
| 146 | | - u8 type; |
|---|
| 147 | | - s8 scale; |
|---|
| 148 | | - u8 num_trip_points; |
|---|
| 149 | | - bool async; |
|---|
| 162 | +/** |
|---|
| 163 | + * scmi_sensor_reading - represent a timestamped read |
|---|
| 164 | + * |
|---|
| 165 | + * Used by @reading_get_timestamped method. |
|---|
| 166 | + * |
|---|
| 167 | + * @value: The signed value sensor read. |
|---|
| 168 | + * @timestamp: An unsigned timestamp for the sensor read, as provided by |
|---|
| 169 | + * SCMI platform. Set to zero when not available. |
|---|
| 170 | + */ |
|---|
| 171 | +struct scmi_sensor_reading { |
|---|
| 172 | + long long value; |
|---|
| 173 | + unsigned long long timestamp; |
|---|
| 174 | +}; |
|---|
| 175 | + |
|---|
| 176 | +/** |
|---|
| 177 | + * scmi_range_attrs - specifies a sensor or axis values' range |
|---|
| 178 | + * @min_range: The minimum value which can be represented by the sensor/axis. |
|---|
| 179 | + * @max_range: The maximum value which can be represented by the sensor/axis. |
|---|
| 180 | + */ |
|---|
| 181 | +struct scmi_range_attrs { |
|---|
| 182 | + long long min_range; |
|---|
| 183 | + long long max_range; |
|---|
| 184 | +}; |
|---|
| 185 | + |
|---|
| 186 | +/** |
|---|
| 187 | + * scmi_sensor_axis_info - describes one sensor axes |
|---|
| 188 | + * @id: The axes ID. |
|---|
| 189 | + * @type: Axes type. Chosen amongst one of @enum scmi_sensor_class. |
|---|
| 190 | + * @scale: Power-of-10 multiplier applied to the axis unit. |
|---|
| 191 | + * @name: NULL-terminated string representing axes name as advertised by |
|---|
| 192 | + * SCMI platform. |
|---|
| 193 | + * @extended_attrs: Flag to indicate the presence of additional extended |
|---|
| 194 | + * attributes for this axes. |
|---|
| 195 | + * @resolution: Extended attribute representing the resolution of the axes. |
|---|
| 196 | + * Set to 0 if not reported by this axes. |
|---|
| 197 | + * @exponent: Extended attribute representing the power-of-10 multiplier that |
|---|
| 198 | + * is applied to the resolution field. Set to 0 if not reported by |
|---|
| 199 | + * this axes. |
|---|
| 200 | + * @attrs: Extended attributes representing minimum and maximum values |
|---|
| 201 | + * measurable by this axes. Set to 0 if not reported by this sensor. |
|---|
| 202 | + */ |
|---|
| 203 | +struct scmi_sensor_axis_info { |
|---|
| 204 | + unsigned int id; |
|---|
| 205 | + unsigned int type; |
|---|
| 206 | + int scale; |
|---|
| 150 | 207 | char name[SCMI_MAX_STR_SIZE]; |
|---|
| 208 | + bool extended_attrs; |
|---|
| 209 | + unsigned int resolution; |
|---|
| 210 | + int exponent; |
|---|
| 211 | + struct scmi_range_attrs attrs; |
|---|
| 212 | +}; |
|---|
| 213 | + |
|---|
| 214 | +/** |
|---|
| 215 | + * scmi_sensor_intervals_info - describes number and type of available update |
|---|
| 216 | + * intervals |
|---|
| 217 | + * @segmented: Flag for segmented intervals' representation. When True there |
|---|
| 218 | + * will be exactly 3 intervals in @desc, with each entry |
|---|
| 219 | + * representing a member of a segment in this order: |
|---|
| 220 | + * {lowest update interval, highest update interval, step size} |
|---|
| 221 | + * @count: Number of intervals described in @desc. |
|---|
| 222 | + * @desc: Array of @count interval descriptor bitmask represented as detailed in |
|---|
| 223 | + * the SCMI specification: it can be accessed using the accompanying |
|---|
| 224 | + * macros. |
|---|
| 225 | + * @prealloc_pool: A minimal preallocated pool of desc entries used to avoid |
|---|
| 226 | + * lesser-than-64-bytes dynamic allocation for small @count |
|---|
| 227 | + * values. |
|---|
| 228 | + */ |
|---|
| 229 | +struct scmi_sensor_intervals_info { |
|---|
| 230 | + bool segmented; |
|---|
| 231 | + unsigned int count; |
|---|
| 232 | +#define SCMI_SENS_INTVL_SEGMENT_LOW 0 |
|---|
| 233 | +#define SCMI_SENS_INTVL_SEGMENT_HIGH 1 |
|---|
| 234 | +#define SCMI_SENS_INTVL_SEGMENT_STEP 2 |
|---|
| 235 | + unsigned int *desc; |
|---|
| 236 | +#define SCMI_SENS_INTVL_GET_SECS(x) FIELD_GET(GENMASK(20, 5), (x)) |
|---|
| 237 | +#define SCMI_SENS_INTVL_GET_EXP(x) \ |
|---|
| 238 | + ({ \ |
|---|
| 239 | + int __signed_exp = FIELD_GET(GENMASK(4, 0), (x)); \ |
|---|
| 240 | + \ |
|---|
| 241 | + if (__signed_exp & BIT(4)) \ |
|---|
| 242 | + __signed_exp |= GENMASK(31, 5); \ |
|---|
| 243 | + __signed_exp; \ |
|---|
| 244 | + }) |
|---|
| 245 | +#define SCMI_MAX_PREALLOC_POOL 16 |
|---|
| 246 | + unsigned int prealloc_pool[SCMI_MAX_PREALLOC_POOL]; |
|---|
| 247 | +}; |
|---|
| 248 | + |
|---|
| 249 | +/** |
|---|
| 250 | + * struct scmi_sensor_info - represents information related to one of the |
|---|
| 251 | + * available sensors. |
|---|
| 252 | + * @id: Sensor ID. |
|---|
| 253 | + * @type: Sensor type. Chosen amongst one of @enum scmi_sensor_class. |
|---|
| 254 | + * @scale: Power-of-10 multiplier applied to the sensor unit. |
|---|
| 255 | + * @num_trip_points: Number of maximum configurable trip points. |
|---|
| 256 | + * @async: Flag for asynchronous read support. |
|---|
| 257 | + * @update: Flag for continuouos update notification support. |
|---|
| 258 | + * @timestamped: Flag for timestamped read support. |
|---|
| 259 | + * @tstamp_scale: Power-of-10 multiplier applied to the sensor timestamps to |
|---|
| 260 | + * represent it in seconds. |
|---|
| 261 | + * @num_axis: Number of supported axis if any. Reported as 0 for scalar sensors. |
|---|
| 262 | + * @axis: Pointer to an array of @num_axis descriptors. |
|---|
| 263 | + * @intervals: Descriptor of available update intervals. |
|---|
| 264 | + * @sensor_config: A bitmask reporting the current sensor configuration as |
|---|
| 265 | + * detailed in the SCMI specification: it can accessed and |
|---|
| 266 | + * modified through the accompanying macros. |
|---|
| 267 | + * @name: NULL-terminated string representing sensor name as advertised by |
|---|
| 268 | + * SCMI platform. |
|---|
| 269 | + * @extended_scalar_attrs: Flag to indicate the presence of additional extended |
|---|
| 270 | + * attributes for this sensor. |
|---|
| 271 | + * @sensor_power: Extended attribute representing the average power |
|---|
| 272 | + * consumed by the sensor in microwatts (uW) when it is active. |
|---|
| 273 | + * Reported here only for scalar sensors. |
|---|
| 274 | + * Set to 0 if not reported by this sensor. |
|---|
| 275 | + * @resolution: Extended attribute representing the resolution of the sensor. |
|---|
| 276 | + * Reported here only for scalar sensors. |
|---|
| 277 | + * Set to 0 if not reported by this sensor. |
|---|
| 278 | + * @exponent: Extended attribute representing the power-of-10 multiplier that is |
|---|
| 279 | + * applied to the resolution field. |
|---|
| 280 | + * Reported here only for scalar sensors. |
|---|
| 281 | + * Set to 0 if not reported by this sensor. |
|---|
| 282 | + * @scalar_attrs: Extended attributes representing minimum and maximum |
|---|
| 283 | + * measurable values by this sensor. |
|---|
| 284 | + * Reported here only for scalar sensors. |
|---|
| 285 | + * Set to 0 if not reported by this sensor. |
|---|
| 286 | + */ |
|---|
| 287 | +struct scmi_sensor_info { |
|---|
| 288 | + unsigned int id; |
|---|
| 289 | + unsigned int type; |
|---|
| 290 | + int scale; |
|---|
| 291 | + unsigned int num_trip_points; |
|---|
| 292 | + bool async; |
|---|
| 293 | + bool update; |
|---|
| 294 | + bool timestamped; |
|---|
| 295 | + int tstamp_scale; |
|---|
| 296 | + unsigned int num_axis; |
|---|
| 297 | + struct scmi_sensor_axis_info *axis; |
|---|
| 298 | + struct scmi_sensor_intervals_info intervals; |
|---|
| 299 | + unsigned int sensor_config; |
|---|
| 300 | +#define SCMI_SENS_CFG_UPDATE_SECS_MASK GENMASK(31, 16) |
|---|
| 301 | +#define SCMI_SENS_CFG_GET_UPDATE_SECS(x) \ |
|---|
| 302 | + FIELD_GET(SCMI_SENS_CFG_UPDATE_SECS_MASK, (x)) |
|---|
| 303 | + |
|---|
| 304 | +#define SCMI_SENS_CFG_UPDATE_EXP_MASK GENMASK(15, 11) |
|---|
| 305 | +#define SCMI_SENS_CFG_GET_UPDATE_EXP(x) \ |
|---|
| 306 | + ({ \ |
|---|
| 307 | + int __signed_exp = \ |
|---|
| 308 | + FIELD_GET(SCMI_SENS_CFG_UPDATE_EXP_MASK, (x)); \ |
|---|
| 309 | + \ |
|---|
| 310 | + if (__signed_exp & BIT(4)) \ |
|---|
| 311 | + __signed_exp |= GENMASK(31, 5); \ |
|---|
| 312 | + __signed_exp; \ |
|---|
| 313 | + }) |
|---|
| 314 | + |
|---|
| 315 | +#define SCMI_SENS_CFG_ROUND_MASK GENMASK(10, 9) |
|---|
| 316 | +#define SCMI_SENS_CFG_ROUND_AUTO 2 |
|---|
| 317 | +#define SCMI_SENS_CFG_ROUND_UP 1 |
|---|
| 318 | +#define SCMI_SENS_CFG_ROUND_DOWN 0 |
|---|
| 319 | + |
|---|
| 320 | +#define SCMI_SENS_CFG_TSTAMP_ENABLED_MASK BIT(1) |
|---|
| 321 | +#define SCMI_SENS_CFG_TSTAMP_ENABLE 1 |
|---|
| 322 | +#define SCMI_SENS_CFG_TSTAMP_DISABLE 0 |
|---|
| 323 | +#define SCMI_SENS_CFG_IS_TSTAMP_ENABLED(x) \ |
|---|
| 324 | + FIELD_GET(SCMI_SENS_CFG_TSTAMP_ENABLED_MASK, (x)) |
|---|
| 325 | + |
|---|
| 326 | +#define SCMI_SENS_CFG_SENSOR_ENABLED_MASK BIT(0) |
|---|
| 327 | +#define SCMI_SENS_CFG_SENSOR_ENABLE 1 |
|---|
| 328 | +#define SCMI_SENS_CFG_SENSOR_DISABLE 0 |
|---|
| 329 | + char name[SCMI_MAX_STR_SIZE]; |
|---|
| 330 | +#define SCMI_SENS_CFG_IS_ENABLED(x) FIELD_GET(BIT(0), (x)) |
|---|
| 331 | + bool extended_scalar_attrs; |
|---|
| 332 | + unsigned int sensor_power; |
|---|
| 333 | + unsigned int resolution; |
|---|
| 334 | + int exponent; |
|---|
| 335 | + struct scmi_range_attrs scalar_attrs; |
|---|
| 336 | + |
|---|
| 337 | + ANDROID_KABI_RESERVE(1); |
|---|
| 151 | 338 | }; |
|---|
| 152 | 339 | |
|---|
| 153 | 340 | /* |
|---|
| .. | .. |
|---|
| 156 | 343 | */ |
|---|
| 157 | 344 | enum scmi_sensor_class { |
|---|
| 158 | 345 | NONE = 0x0, |
|---|
| 346 | + UNSPEC = 0x1, |
|---|
| 159 | 347 | TEMPERATURE_C = 0x2, |
|---|
| 348 | + TEMPERATURE_F = 0x3, |
|---|
| 349 | + TEMPERATURE_K = 0x4, |
|---|
| 160 | 350 | VOLTAGE = 0x5, |
|---|
| 161 | 351 | CURRENT = 0x6, |
|---|
| 162 | 352 | POWER = 0x7, |
|---|
| 163 | 353 | ENERGY = 0x8, |
|---|
| 354 | + CHARGE = 0x9, |
|---|
| 355 | + VOLTAMPERE = 0xA, |
|---|
| 356 | + NITS = 0xB, |
|---|
| 357 | + LUMENS = 0xC, |
|---|
| 358 | + LUX = 0xD, |
|---|
| 359 | + CANDELAS = 0xE, |
|---|
| 360 | + KPA = 0xF, |
|---|
| 361 | + PSI = 0x10, |
|---|
| 362 | + NEWTON = 0x11, |
|---|
| 363 | + CFM = 0x12, |
|---|
| 364 | + RPM = 0x13, |
|---|
| 365 | + HERTZ = 0x14, |
|---|
| 366 | + SECS = 0x15, |
|---|
| 367 | + MINS = 0x16, |
|---|
| 368 | + HOURS = 0x17, |
|---|
| 369 | + DAYS = 0x18, |
|---|
| 370 | + WEEKS = 0x19, |
|---|
| 371 | + MILS = 0x1A, |
|---|
| 372 | + INCHES = 0x1B, |
|---|
| 373 | + FEET = 0x1C, |
|---|
| 374 | + CUBIC_INCHES = 0x1D, |
|---|
| 375 | + CUBIC_FEET = 0x1E, |
|---|
| 376 | + METERS = 0x1F, |
|---|
| 377 | + CUBIC_CM = 0x20, |
|---|
| 378 | + CUBIC_METERS = 0x21, |
|---|
| 379 | + LITERS = 0x22, |
|---|
| 380 | + FLUID_OUNCES = 0x23, |
|---|
| 381 | + RADIANS = 0x24, |
|---|
| 382 | + STERADIANS = 0x25, |
|---|
| 383 | + REVOLUTIONS = 0x26, |
|---|
| 384 | + CYCLES = 0x27, |
|---|
| 385 | + GRAVITIES = 0x28, |
|---|
| 386 | + OUNCES = 0x29, |
|---|
| 387 | + POUNDS = 0x2A, |
|---|
| 388 | + FOOT_POUNDS = 0x2B, |
|---|
| 389 | + OUNCE_INCHES = 0x2C, |
|---|
| 390 | + GAUSS = 0x2D, |
|---|
| 391 | + GILBERTS = 0x2E, |
|---|
| 392 | + HENRIES = 0x2F, |
|---|
| 393 | + FARADS = 0x30, |
|---|
| 394 | + OHMS = 0x31, |
|---|
| 395 | + SIEMENS = 0x32, |
|---|
| 396 | + MOLES = 0x33, |
|---|
| 397 | + BECQUERELS = 0x34, |
|---|
| 398 | + PPM = 0x35, |
|---|
| 399 | + DECIBELS = 0x36, |
|---|
| 400 | + DBA = 0x37, |
|---|
| 401 | + DBC = 0x38, |
|---|
| 402 | + GRAYS = 0x39, |
|---|
| 403 | + SIEVERTS = 0x3A, |
|---|
| 404 | + COLOR_TEMP_K = 0x3B, |
|---|
| 405 | + BITS = 0x3C, |
|---|
| 406 | + BYTES = 0x3D, |
|---|
| 407 | + WORDS = 0x3E, |
|---|
| 408 | + DWORDS = 0x3F, |
|---|
| 409 | + QWORDS = 0x40, |
|---|
| 410 | + PERCENTAGE = 0x41, |
|---|
| 411 | + PASCALS = 0x42, |
|---|
| 412 | + COUNTS = 0x43, |
|---|
| 413 | + GRAMS = 0x44, |
|---|
| 414 | + NEWTON_METERS = 0x45, |
|---|
| 415 | + HITS = 0x46, |
|---|
| 416 | + MISSES = 0x47, |
|---|
| 417 | + RETRIES = 0x48, |
|---|
| 418 | + OVERRUNS = 0x49, |
|---|
| 419 | + UNDERRUNS = 0x4A, |
|---|
| 420 | + COLLISIONS = 0x4B, |
|---|
| 421 | + PACKETS = 0x4C, |
|---|
| 422 | + MESSAGES = 0x4D, |
|---|
| 423 | + CHARS = 0x4E, |
|---|
| 424 | + ERRORS = 0x4F, |
|---|
| 425 | + CORRECTED_ERRS = 0x50, |
|---|
| 426 | + UNCORRECTABLE_ERRS = 0x51, |
|---|
| 427 | + SQ_MILS = 0x52, |
|---|
| 428 | + SQ_INCHES = 0x53, |
|---|
| 429 | + SQ_FEET = 0x54, |
|---|
| 430 | + SQ_CM = 0x55, |
|---|
| 431 | + SQ_METERS = 0x56, |
|---|
| 432 | + RADIANS_SEC = 0x57, |
|---|
| 433 | + BPM = 0x58, |
|---|
| 434 | + METERS_SEC_SQUARED = 0x59, |
|---|
| 435 | + METERS_SEC = 0x5A, |
|---|
| 436 | + CUBIC_METERS_SEC = 0x5B, |
|---|
| 437 | + MM_MERCURY = 0x5C, |
|---|
| 438 | + RADIANS_SEC_SQUARED = 0x5D, |
|---|
| 439 | + OEM_UNIT = 0xFF |
|---|
| 164 | 440 | }; |
|---|
| 165 | 441 | |
|---|
| 166 | 442 | /** |
|---|
| 167 | | - * struct scmi_sensor_ops - represents the various operations provided |
|---|
| 443 | + * struct scmi_sensor_proto_ops - represents the various operations provided |
|---|
| 168 | 444 | * by SCMI Sensor Protocol |
|---|
| 169 | 445 | * |
|---|
| 170 | 446 | * @count_get: get the count of sensors provided by SCMI |
|---|
| 171 | 447 | * @info_get: get the information of the specified sensor |
|---|
| 172 | | - * @trip_point_notify: control notifications on cross-over events for |
|---|
| 173 | | - * the trip-points |
|---|
| 174 | 448 | * @trip_point_config: selects and configures a trip-point of interest |
|---|
| 175 | 449 | * @reading_get: gets the current value of the sensor |
|---|
| 450 | + * @reading_get_timestamped: gets the current value and timestamp, when |
|---|
| 451 | + * available, of the sensor. (as of v3.0 spec) |
|---|
| 452 | + * Supports multi-axis sensors for sensors which |
|---|
| 453 | + * supports it and if the @reading array size of |
|---|
| 454 | + * @count entry equals the sensor num_axis |
|---|
| 455 | + * @config_get: Get sensor current configuration |
|---|
| 456 | + * @config_set: Set sensor current configuration |
|---|
| 176 | 457 | */ |
|---|
| 177 | | -struct scmi_sensor_ops { |
|---|
| 178 | | - int (*count_get)(const struct scmi_handle *handle); |
|---|
| 179 | | - |
|---|
| 458 | +struct scmi_sensor_proto_ops { |
|---|
| 459 | + int (*count_get)(const struct scmi_protocol_handle *ph); |
|---|
| 180 | 460 | const struct scmi_sensor_info *(*info_get) |
|---|
| 181 | | - (const struct scmi_handle *handle, u32 sensor_id); |
|---|
| 182 | | - int (*trip_point_notify)(const struct scmi_handle *handle, |
|---|
| 183 | | - u32 sensor_id, bool enable); |
|---|
| 184 | | - int (*trip_point_config)(const struct scmi_handle *handle, |
|---|
| 461 | + (const struct scmi_protocol_handle *ph, u32 sensor_id); |
|---|
| 462 | + int (*trip_point_config)(const struct scmi_protocol_handle *ph, |
|---|
| 185 | 463 | u32 sensor_id, u8 trip_id, u64 trip_value); |
|---|
| 186 | | - int (*reading_get)(const struct scmi_handle *handle, u32 sensor_id, |
|---|
| 464 | + int (*reading_get)(const struct scmi_protocol_handle *ph, u32 sensor_id, |
|---|
| 187 | 465 | u64 *value); |
|---|
| 466 | + int (*reading_get_timestamped)(const struct scmi_protocol_handle *ph, |
|---|
| 467 | + u32 sensor_id, u8 count, |
|---|
| 468 | + struct scmi_sensor_reading *readings); |
|---|
| 469 | + int (*config_get)(const struct scmi_protocol_handle *ph, |
|---|
| 470 | + u32 sensor_id, u32 *sensor_config); |
|---|
| 471 | + int (*config_set)(const struct scmi_protocol_handle *ph, |
|---|
| 472 | + u32 sensor_id, u32 sensor_config); |
|---|
| 473 | + |
|---|
| 474 | + ANDROID_KABI_RESERVE(1); |
|---|
| 188 | 475 | }; |
|---|
| 189 | 476 | |
|---|
| 190 | 477 | /** |
|---|
| 191 | | - * struct scmi_reset_ops - represents the various operations provided |
|---|
| 478 | + * struct scmi_reset_proto_ops - represents the various operations provided |
|---|
| 192 | 479 | * by SCMI Reset Protocol |
|---|
| 193 | 480 | * |
|---|
| 194 | 481 | * @num_domains_get: get the count of reset domains provided by SCMI |
|---|
| .. | .. |
|---|
| 198 | 485 | * @assert: explicitly assert reset signal of the specified reset domain |
|---|
| 199 | 486 | * @deassert: explicitly deassert reset signal of the specified reset domain |
|---|
| 200 | 487 | */ |
|---|
| 201 | | -struct scmi_reset_ops { |
|---|
| 202 | | - int (*num_domains_get)(const struct scmi_handle *handle); |
|---|
| 203 | | - char *(*name_get)(const struct scmi_handle *handle, u32 domain); |
|---|
| 204 | | - int (*latency_get)(const struct scmi_handle *handle, u32 domain); |
|---|
| 205 | | - int (*reset)(const struct scmi_handle *handle, u32 domain); |
|---|
| 206 | | - int (*assert)(const struct scmi_handle *handle, u32 domain); |
|---|
| 207 | | - int (*deassert)(const struct scmi_handle *handle, u32 domain); |
|---|
| 488 | +struct scmi_reset_proto_ops { |
|---|
| 489 | + int (*num_domains_get)(const struct scmi_protocol_handle *ph); |
|---|
| 490 | + char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 491 | + int (*latency_get)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 492 | + int (*reset)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 493 | + int (*assert)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 494 | + int (*deassert)(const struct scmi_protocol_handle *ph, u32 domain); |
|---|
| 495 | + |
|---|
| 496 | + ANDROID_KABI_RESERVE(1); |
|---|
| 497 | +}; |
|---|
| 498 | + |
|---|
| 499 | +/** |
|---|
| 500 | + * struct scmi_voltage_info - describe one available SCMI Voltage Domain |
|---|
| 501 | + * |
|---|
| 502 | + * @id: the domain ID as advertised by the platform |
|---|
| 503 | + * @segmented: defines the layout of the entries of array @levels_uv. |
|---|
| 504 | + * - when True the entries are to be interpreted as triplets, |
|---|
| 505 | + * each defining a segment representing a range of equally |
|---|
| 506 | + * space voltages: <lowest_volts>, <highest_volt>, <step_uV> |
|---|
| 507 | + * - when False the entries simply represent a single discrete |
|---|
| 508 | + * supported voltage level |
|---|
| 509 | + * @negative_volts_allowed: True if any of the entries of @levels_uv represent |
|---|
| 510 | + * a negative voltage. |
|---|
| 511 | + * @attributes: represents Voltage Domain advertised attributes |
|---|
| 512 | + * @name: name assigned to the Voltage Domain by platform |
|---|
| 513 | + * @num_levels: number of total entries in @levels_uv. |
|---|
| 514 | + * @levels_uv: array of entries describing the available voltage levels for |
|---|
| 515 | + * this domain. |
|---|
| 516 | + */ |
|---|
| 517 | +struct scmi_voltage_info { |
|---|
| 518 | + unsigned int id; |
|---|
| 519 | + bool segmented; |
|---|
| 520 | + bool negative_volts_allowed; |
|---|
| 521 | + unsigned int attributes; |
|---|
| 522 | + char name[SCMI_MAX_STR_SIZE]; |
|---|
| 523 | + unsigned int num_levels; |
|---|
| 524 | +#define SCMI_VOLTAGE_SEGMENT_LOW 0 |
|---|
| 525 | +#define SCMI_VOLTAGE_SEGMENT_HIGH 1 |
|---|
| 526 | +#define SCMI_VOLTAGE_SEGMENT_STEP 2 |
|---|
| 527 | + int *levels_uv; |
|---|
| 528 | +}; |
|---|
| 529 | + |
|---|
| 530 | +/** |
|---|
| 531 | + * struct scmi_voltage_proto_ops - represents the various operations provided |
|---|
| 532 | + * by SCMI Voltage Protocol |
|---|
| 533 | + * |
|---|
| 534 | + * @num_domains_get: get the count of voltage domains provided by SCMI |
|---|
| 535 | + * @info_get: get the information of the specified domain |
|---|
| 536 | + * @config_set: set the config for the specified domain |
|---|
| 537 | + * @config_get: get the config of the specified domain |
|---|
| 538 | + * @level_set: set the voltage level for the specified domain |
|---|
| 539 | + * @level_get: get the voltage level of the specified domain |
|---|
| 540 | + */ |
|---|
| 541 | +struct scmi_voltage_proto_ops { |
|---|
| 542 | + int (*num_domains_get)(const struct scmi_protocol_handle *ph); |
|---|
| 543 | + const struct scmi_voltage_info __must_check *(*info_get) |
|---|
| 544 | + (const struct scmi_protocol_handle *ph, u32 domain_id); |
|---|
| 545 | + int (*config_set)(const struct scmi_protocol_handle *ph, u32 domain_id, |
|---|
| 546 | + u32 config); |
|---|
| 547 | +#define SCMI_VOLTAGE_ARCH_STATE_OFF 0x0 |
|---|
| 548 | +#define SCMI_VOLTAGE_ARCH_STATE_ON 0x7 |
|---|
| 549 | + int (*config_get)(const struct scmi_protocol_handle *ph, u32 domain_id, |
|---|
| 550 | + u32 *config); |
|---|
| 551 | + int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain_id, |
|---|
| 552 | + u32 flags, s32 volt_uV); |
|---|
| 553 | + int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain_id, |
|---|
| 554 | + s32 *volt_uV); |
|---|
| 555 | +}; |
|---|
| 556 | + |
|---|
| 557 | +/** |
|---|
| 558 | + * struct scmi_notify_ops - represents notifications' operations provided by |
|---|
| 559 | + * SCMI core |
|---|
| 560 | + * @devm_register_event_notifier: Managed registration of a notifier_block for |
|---|
| 561 | + * the requested event |
|---|
| 562 | + * @devm_unregister_event_notifier: Managed unregistration of a notifier_block |
|---|
| 563 | + * for the requested event |
|---|
| 564 | + * @register_event_notifier: Register a notifier_block for the requested event |
|---|
| 565 | + * @unregister_event_notifier: Unregister a notifier_block for the requested |
|---|
| 566 | + * event |
|---|
| 567 | + * |
|---|
| 568 | + * A user can register/unregister its own notifier_block against the wanted |
|---|
| 569 | + * platform instance regarding the desired event identified by the |
|---|
| 570 | + * tuple: (proto_id, evt_id, src_id) using the provided register/unregister |
|---|
| 571 | + * interface where: |
|---|
| 572 | + * |
|---|
| 573 | + * @sdev: The scmi_device to use when calling the devres managed ops devm_ |
|---|
| 574 | + * @handle: The handle identifying the platform instance to use, when not |
|---|
| 575 | + * calling the managed ops devm_ |
|---|
| 576 | + * @proto_id: The protocol ID as in SCMI Specification |
|---|
| 577 | + * @evt_id: The message ID of the desired event as in SCMI Specification |
|---|
| 578 | + * @src_id: A pointer to the desired source ID if different sources are |
|---|
| 579 | + * possible for the protocol (like domain_id, sensor_id...etc) |
|---|
| 580 | + * |
|---|
| 581 | + * @src_id can be provided as NULL if it simply does NOT make sense for |
|---|
| 582 | + * the protocol at hand, OR if the user is explicitly interested in |
|---|
| 583 | + * receiving notifications from ANY existent source associated to the |
|---|
| 584 | + * specified proto_id / evt_id. |
|---|
| 585 | + * |
|---|
| 586 | + * Received notifications are finally delivered to the registered users, |
|---|
| 587 | + * invoking the callback provided with the notifier_block *nb as follows: |
|---|
| 588 | + * |
|---|
| 589 | + * int user_cb(nb, evt_id, report) |
|---|
| 590 | + * |
|---|
| 591 | + * with: |
|---|
| 592 | + * |
|---|
| 593 | + * @nb: The notifier block provided by the user |
|---|
| 594 | + * @evt_id: The message ID of the delivered event |
|---|
| 595 | + * @report: A custom struct describing the specific event delivered |
|---|
| 596 | + */ |
|---|
| 597 | +struct scmi_notify_ops { |
|---|
| 598 | + int (*devm_register_event_notifier)(struct scmi_device *sdev, |
|---|
| 599 | + u8 proto_id, u8 evt_id, u32 *src_id, |
|---|
| 600 | + struct notifier_block *nb); |
|---|
| 601 | + int (*devm_unregister_event_notifier)(struct scmi_device *sdev, |
|---|
| 602 | + u8 proto_id, u8 evt_id, |
|---|
| 603 | + u32 *src_id, |
|---|
| 604 | + struct notifier_block *nb); |
|---|
| 605 | + int (*register_event_notifier)(const struct scmi_handle *handle, |
|---|
| 606 | + u8 proto_id, u8 evt_id, u32 *src_id, |
|---|
| 607 | + struct notifier_block *nb); |
|---|
| 608 | + int (*unregister_event_notifier)(const struct scmi_handle *handle, |
|---|
| 609 | + u8 proto_id, u8 evt_id, u32 *src_id, |
|---|
| 610 | + struct notifier_block *nb); |
|---|
| 208 | 611 | }; |
|---|
| 209 | 612 | |
|---|
| 210 | 613 | /** |
|---|
| .. | .. |
|---|
| 212 | 615 | * |
|---|
| 213 | 616 | * @dev: pointer to the SCMI device |
|---|
| 214 | 617 | * @version: pointer to the structure containing SCMI version information |
|---|
| 215 | | - * @power_ops: pointer to set of power protocol operations |
|---|
| 216 | | - * @perf_ops: pointer to set of performance protocol operations |
|---|
| 217 | | - * @clk_ops: pointer to set of clock protocol operations |
|---|
| 218 | | - * @sensor_ops: pointer to set of sensor protocol operations |
|---|
| 219 | | - * @reset_ops: pointer to set of reset protocol operations |
|---|
| 220 | | - * @perf_priv: pointer to private data structure specific to performance |
|---|
| 221 | | - * protocol(for internal use only) |
|---|
| 222 | | - * @clk_priv: pointer to private data structure specific to clock |
|---|
| 223 | | - * protocol(for internal use only) |
|---|
| 224 | | - * @power_priv: pointer to private data structure specific to power |
|---|
| 225 | | - * protocol(for internal use only) |
|---|
| 226 | | - * @sensor_priv: pointer to private data structure specific to sensors |
|---|
| 227 | | - * protocol(for internal use only) |
|---|
| 228 | | - * @reset_priv: pointer to private data structure specific to reset |
|---|
| 229 | | - * protocol(for internal use only) |
|---|
| 618 | + * @devm_acquire_protocol: devres managed method to get hold of a protocol, |
|---|
| 619 | + * causing its initialization and related resource |
|---|
| 620 | + * accounting |
|---|
| 621 | + * @devm_get_protocol: devres managed method to acquire a protocol, causing |
|---|
| 622 | + * its initialization and resource accounting, while getting |
|---|
| 623 | + * protocol specific operations and a dedicated protocol |
|---|
| 624 | + * handler |
|---|
| 625 | + * @devm_put_protocol: devres managed method to release a protocol acquired |
|---|
| 626 | + * with devm_acquire/get_protocol |
|---|
| 627 | + * @notify_ops: pointer to set of notifications related operations |
|---|
| 230 | 628 | */ |
|---|
| 231 | 629 | struct scmi_handle { |
|---|
| 232 | 630 | struct device *dev; |
|---|
| 233 | 631 | struct scmi_revision_info *version; |
|---|
| 234 | | - struct scmi_perf_ops *perf_ops; |
|---|
| 235 | | - struct scmi_clk_ops *clk_ops; |
|---|
| 236 | | - struct scmi_power_ops *power_ops; |
|---|
| 237 | | - struct scmi_sensor_ops *sensor_ops; |
|---|
| 238 | | - struct scmi_reset_ops *reset_ops; |
|---|
| 239 | | - /* for protocol internal use */ |
|---|
| 240 | | - void *perf_priv; |
|---|
| 241 | | - void *clk_priv; |
|---|
| 242 | | - void *power_priv; |
|---|
| 243 | | - void *sensor_priv; |
|---|
| 244 | | - void *reset_priv; |
|---|
| 632 | + |
|---|
| 633 | + int __must_check (*devm_acquire_protocol)(struct scmi_device *sdev, |
|---|
| 634 | + u8 proto); |
|---|
| 635 | + const void __must_check * |
|---|
| 636 | + (*devm_get_protocol)(struct scmi_device *sdev, u8 proto, |
|---|
| 637 | + struct scmi_protocol_handle **ph); |
|---|
| 638 | + void (*devm_put_protocol)(struct scmi_device *sdev, u8 proto); |
|---|
| 639 | + |
|---|
| 640 | + const struct scmi_notify_ops *notify_ops; |
|---|
| 641 | + |
|---|
| 642 | + ANDROID_KABI_RESERVE(1); |
|---|
| 245 | 643 | }; |
|---|
| 246 | 644 | |
|---|
| 247 | 645 | enum scmi_std_protocol { |
|---|
| .. | .. |
|---|
| 252 | 650 | SCMI_PROTOCOL_CLOCK = 0x14, |
|---|
| 253 | 651 | SCMI_PROTOCOL_SENSOR = 0x15, |
|---|
| 254 | 652 | SCMI_PROTOCOL_RESET = 0x16, |
|---|
| 653 | + SCMI_PROTOCOL_VOLTAGE = 0x17, |
|---|
| 654 | +}; |
|---|
| 655 | + |
|---|
| 656 | +enum scmi_system_events { |
|---|
| 657 | + SCMI_SYSTEM_SHUTDOWN, |
|---|
| 658 | + SCMI_SYSTEM_COLDRESET, |
|---|
| 659 | + SCMI_SYSTEM_WARMRESET, |
|---|
| 660 | + SCMI_SYSTEM_POWERUP, |
|---|
| 661 | + SCMI_SYSTEM_SUSPEND, |
|---|
| 662 | + SCMI_SYSTEM_MAX |
|---|
| 255 | 663 | }; |
|---|
| 256 | 664 | |
|---|
| 257 | 665 | struct scmi_device { |
|---|
| .. | .. |
|---|
| 260 | 668 | const char *name; |
|---|
| 261 | 669 | struct device dev; |
|---|
| 262 | 670 | struct scmi_handle *handle; |
|---|
| 671 | + |
|---|
| 672 | + ANDROID_KABI_RESERVE(1); |
|---|
| 263 | 673 | }; |
|---|
| 264 | 674 | |
|---|
| 265 | 675 | #define to_scmi_dev(d) container_of(d, struct scmi_device, dev) |
|---|
| .. | .. |
|---|
| 285 | 695 | |
|---|
| 286 | 696 | #define to_scmi_driver(d) container_of(d, struct scmi_driver, driver) |
|---|
| 287 | 697 | |
|---|
| 288 | | -#ifdef CONFIG_ARM_SCMI_PROTOCOL |
|---|
| 698 | +#if IS_REACHABLE(CONFIG_ARM_SCMI_PROTOCOL) |
|---|
| 289 | 699 | int scmi_driver_register(struct scmi_driver *driver, |
|---|
| 290 | 700 | struct module *owner, const char *mod_name); |
|---|
| 291 | 701 | void scmi_driver_unregister(struct scmi_driver *driver); |
|---|
| .. | .. |
|---|
| 316 | 726 | #define module_scmi_driver(__scmi_driver) \ |
|---|
| 317 | 727 | module_driver(__scmi_driver, scmi_register, scmi_unregister) |
|---|
| 318 | 728 | |
|---|
| 319 | | -typedef int (*scmi_prot_init_fn_t)(struct scmi_handle *); |
|---|
| 320 | | -int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn); |
|---|
| 321 | | -void scmi_protocol_unregister(int protocol_id); |
|---|
| 729 | +/** |
|---|
| 730 | + * module_scmi_protocol() - Helper macro for registering a scmi protocol |
|---|
| 731 | + * @__scmi_protocol: scmi_protocol structure |
|---|
| 732 | + * |
|---|
| 733 | + * Helper macro for scmi drivers to set up proper module init / exit |
|---|
| 734 | + * functions. Replaces module_init() and module_exit() and keeps people from |
|---|
| 735 | + * printing pointless things to the kernel log when their driver is loaded. |
|---|
| 736 | + */ |
|---|
| 737 | +#define module_scmi_protocol(__scmi_protocol) \ |
|---|
| 738 | + module_driver(__scmi_protocol, \ |
|---|
| 739 | + scmi_protocol_register, scmi_protocol_unregister) |
|---|
| 740 | + |
|---|
| 741 | +struct scmi_protocol; |
|---|
| 742 | +int scmi_protocol_register(const struct scmi_protocol *proto); |
|---|
| 743 | +void scmi_protocol_unregister(const struct scmi_protocol *proto); |
|---|
| 744 | + |
|---|
| 745 | +/* SCMI Notification API - Custom Event Reports */ |
|---|
| 746 | +enum scmi_notification_events { |
|---|
| 747 | + SCMI_EVENT_POWER_STATE_CHANGED = 0x0, |
|---|
| 748 | + SCMI_EVENT_PERFORMANCE_LIMITS_CHANGED = 0x0, |
|---|
| 749 | + SCMI_EVENT_PERFORMANCE_LEVEL_CHANGED = 0x1, |
|---|
| 750 | + SCMI_EVENT_SENSOR_TRIP_POINT_EVENT = 0x0, |
|---|
| 751 | + SCMI_EVENT_SENSOR_UPDATE = 0x1, |
|---|
| 752 | + SCMI_EVENT_RESET_ISSUED = 0x0, |
|---|
| 753 | + SCMI_EVENT_BASE_ERROR_EVENT = 0x0, |
|---|
| 754 | + SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER = 0x0, |
|---|
| 755 | +}; |
|---|
| 756 | + |
|---|
| 757 | +struct scmi_power_state_changed_report { |
|---|
| 758 | + ktime_t timestamp; |
|---|
| 759 | + unsigned int agent_id; |
|---|
| 760 | + unsigned int domain_id; |
|---|
| 761 | + unsigned int power_state; |
|---|
| 762 | +}; |
|---|
| 763 | + |
|---|
| 764 | +struct scmi_system_power_state_notifier_report { |
|---|
| 765 | + ktime_t timestamp; |
|---|
| 766 | + unsigned int agent_id; |
|---|
| 767 | + unsigned int flags; |
|---|
| 768 | + unsigned int system_state; |
|---|
| 769 | +}; |
|---|
| 770 | + |
|---|
| 771 | +struct scmi_perf_limits_report { |
|---|
| 772 | + ktime_t timestamp; |
|---|
| 773 | + unsigned int agent_id; |
|---|
| 774 | + unsigned int domain_id; |
|---|
| 775 | + unsigned int range_max; |
|---|
| 776 | + unsigned int range_min; |
|---|
| 777 | +}; |
|---|
| 778 | + |
|---|
| 779 | +struct scmi_perf_level_report { |
|---|
| 780 | + ktime_t timestamp; |
|---|
| 781 | + unsigned int agent_id; |
|---|
| 782 | + unsigned int domain_id; |
|---|
| 783 | + unsigned int performance_level; |
|---|
| 784 | +}; |
|---|
| 785 | + |
|---|
| 786 | +struct scmi_sensor_trip_point_report { |
|---|
| 787 | + ktime_t timestamp; |
|---|
| 788 | + unsigned int agent_id; |
|---|
| 789 | + unsigned int sensor_id; |
|---|
| 790 | + unsigned int trip_point_desc; |
|---|
| 791 | +}; |
|---|
| 792 | + |
|---|
| 793 | +struct scmi_sensor_update_report { |
|---|
| 794 | + ktime_t timestamp; |
|---|
| 795 | + unsigned int agent_id; |
|---|
| 796 | + unsigned int sensor_id; |
|---|
| 797 | + unsigned int readings_count; |
|---|
| 798 | + struct scmi_sensor_reading readings[]; |
|---|
| 799 | +}; |
|---|
| 800 | + |
|---|
| 801 | +struct scmi_reset_issued_report { |
|---|
| 802 | + ktime_t timestamp; |
|---|
| 803 | + unsigned int agent_id; |
|---|
| 804 | + unsigned int domain_id; |
|---|
| 805 | + unsigned int reset_state; |
|---|
| 806 | +}; |
|---|
| 807 | + |
|---|
| 808 | +struct scmi_base_error_report { |
|---|
| 809 | + ktime_t timestamp; |
|---|
| 810 | + unsigned int agent_id; |
|---|
| 811 | + bool fatal; |
|---|
| 812 | + unsigned int cmd_count; |
|---|
| 813 | + unsigned long long reports[]; |
|---|
| 814 | +}; |
|---|
| 815 | + |
|---|
| 816 | +#endif /* _LINUX_SCMI_PROTOCOL_H */ |
|---|