firmware: arm_scmi: Add checks for min/max limits in PERFORMANCE_LIMITS_SET
[linux-block.git] / include / linux / scmi_protocol.h
CommitLineData
4752544a 1/* SPDX-License-Identifier: GPL-2.0-only */
aa4f886f
SH
2/*
3 * SCMI Message Protocol driver header
4 *
48dc16e2 5 * Copyright (C) 2018-2021 ARM Ltd.
aa4f886f 6 */
70771c69
SH
7
8#ifndef _LINUX_SCMI_PROTOCOL_H
9#define _LINUX_SCMI_PROTOCOL_H
10
1fe00b8b 11#include <linux/bitfield.h>
933c5044 12#include <linux/device.h>
e7c215f3 13#include <linux/notifier.h>
aa4f886f
SH
14#include <linux/types.h>
15
b260fcca 16#define SCMI_MAX_STR_SIZE 64
5f6c6430 17#define SCMI_MAX_NUM_RATES 16
b6f20ff8
SH
18
19/**
20 * struct scmi_revision_info - version information structure
21 *
22 * @major_ver: Major ABI version. Change here implies risk of backward
23 * compatibility break.
24 * @minor_ver: Minor ABI version. Change here implies new feature addition,
25 * or compatible change in ABI.
26 * @num_protocols: Number of protocols that are implemented, excluding the
27 * base protocol.
28 * @num_agents: Number of agents in the system.
29 * @impl_ver: A vendor-specific implementation version.
30 * @vendor_id: A vendor identifier(Null terminated ASCII string)
31 * @sub_vendor_id: A sub-vendor identifier(Null terminated ASCII string)
32 */
33struct scmi_revision_info {
34 u16 major_ver;
35 u16 minor_ver;
36 u8 num_protocols;
37 u8 num_agents;
38 u32 impl_ver;
39 char vendor_id[SCMI_MAX_STR_SIZE];
40 char sub_vendor_id[SCMI_MAX_STR_SIZE];
41};
42
5f6c6430
SH
43struct scmi_clock_info {
44 char name[SCMI_MAX_STR_SIZE];
18f295b7 45 unsigned int enable_latency;
5f6c6430
SH
46 bool rate_discrete;
47 union {
48 struct {
49 int num_rates;
50 u64 rates[SCMI_MAX_NUM_RATES];
51 } list;
52 struct {
53 u64 min_rate;
54 u64 max_rate;
55 u64 step_size;
56 } range;
57 };
58};
59
a9e3fbfa 60struct scmi_handle;
23934efe
CM
61struct scmi_device;
62struct scmi_protocol_handle;
a9e3fbfa 63
5f6c6430 64/**
887281c7 65 * struct scmi_clk_proto_ops - represents the various operations provided
5f6c6430
SH
66 * by SCMI Clock Protocol
67 *
68 * @count_get: get the count of clocks provided by SCMI
69 * @info_get: get the information of the specified clock
70 * @rate_get: request the current clock rate of a clock
71 * @rate_set: set the clock rate of a clock
72 * @enable: enables the specified clock
73 * @disable: disables the specified clock
74 */
887281c7
CM
75struct scmi_clk_proto_ops {
76 int (*count_get)(const struct scmi_protocol_handle *ph);
77
78 const struct scmi_clock_info *(*info_get)
79 (const struct scmi_protocol_handle *ph, u32 clk_id);
80 int (*rate_get)(const struct scmi_protocol_handle *ph, u32 clk_id,
81 u64 *rate);
82 int (*rate_set)(const struct scmi_protocol_handle *ph, u32 clk_id,
83 u64 rate);
84 int (*enable)(const struct scmi_protocol_handle *ph, u32 clk_id);
85 int (*disable)(const struct scmi_protocol_handle *ph, u32 clk_id);
b7bd36f2
CM
86 int (*enable_atomic)(const struct scmi_protocol_handle *ph, u32 clk_id);
87 int (*disable_atomic)(const struct scmi_protocol_handle *ph,
88 u32 clk_id);
887281c7
CM
89};
90
a9e3fbfa 91/**
1fec5e6b 92 * struct scmi_perf_proto_ops - represents the various operations provided
a9e3fbfa
SH
93 * by SCMI Performance Protocol
94 *
95 * @limits_set: sets limits on the performance level of a domain
96 * @limits_get: gets limits on the performance level of a domain
97 * @level_set: sets the performance level of a domain
98 * @level_get: gets the performance level of a domain
99 * @device_domain_id: gets the scmi domain id for a given device
7859e08c
SH
100 * @transition_latency_get: gets the DVFS transition latency for a given device
101 * @device_opps_add: adds all the OPPs for a given device
a9e3fbfa
SH
102 * @freq_set: sets the frequency for a given device using sustained frequency
103 * to sustained performance level mapping
104 * @freq_get: gets the frequency for a given device using sustained frequency
105 * to sustained performance level mapping
1a63fe9a
QP
106 * @est_power_get: gets the estimated power cost for a given performance domain
107 * at a given frequency
52f83955
SH
108 * @fast_switch_possible: indicates if fast DVFS switching is possible or not
109 * for a given device
110 * @power_scale_mw_get: indicates if the power values provided are in milliWatts
111 * or in some other (abstract) scale
a9e3fbfa 112 */
1fec5e6b
CM
113struct scmi_perf_proto_ops {
114 int (*limits_set)(const struct scmi_protocol_handle *ph, u32 domain,
115 u32 max_perf, u32 min_perf);
116 int (*limits_get)(const struct scmi_protocol_handle *ph, u32 domain,
117 u32 *max_perf, u32 *min_perf);
118 int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain,
119 u32 level, bool poll);
120 int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain,
121 u32 *level, bool poll);
122 int (*device_domain_id)(struct device *dev);
123 int (*transition_latency_get)(const struct scmi_protocol_handle *ph,
124 struct device *dev);
125 int (*device_opps_add)(const struct scmi_protocol_handle *ph,
126 struct device *dev);
127 int (*freq_set)(const struct scmi_protocol_handle *ph, u32 domain,
128 unsigned long rate, bool poll);
129 int (*freq_get)(const struct scmi_protocol_handle *ph, u32 domain,
130 unsigned long *rate, bool poll);
131 int (*est_power_get)(const struct scmi_protocol_handle *ph, u32 domain,
132 unsigned long *rate, unsigned long *power);
133 bool (*fast_switch_possible)(const struct scmi_protocol_handle *ph,
134 struct device *dev);
135 bool (*power_scale_mw_get)(const struct scmi_protocol_handle *ph);
136};
137
76a65509 138/**
9bc8069c 139 * struct scmi_power_proto_ops - represents the various operations provided
76a65509
SH
140 * by SCMI Power Protocol
141 *
142 * @num_domains_get: get the count of power domains provided by SCMI
143 * @name_get: gets the name of a power domain
144 * @state_set: sets the power state of a power domain
145 * @state_get: gets the power state of a power domain
146 */
9bc8069c
CM
147struct scmi_power_proto_ops {
148 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
992be5d3
CM
149 const char *(*name_get)(const struct scmi_protocol_handle *ph,
150 u32 domain);
76a65509
SH
151#define SCMI_POWER_STATE_TYPE_SHIFT 30
152#define SCMI_POWER_STATE_ID_MASK (BIT(28) - 1)
153#define SCMI_POWER_STATE_PARAM(type, id) \
154 ((((type) & BIT(0)) << SCMI_POWER_STATE_TYPE_SHIFT) | \
155 ((id) & SCMI_POWER_STATE_ID_MASK))
156#define SCMI_POWER_STATE_GENERIC_ON SCMI_POWER_STATE_PARAM(0, 0)
157#define SCMI_POWER_STATE_GENERIC_OFF SCMI_POWER_STATE_PARAM(1, 0)
9bc8069c
CM
158 int (*state_set)(const struct scmi_protocol_handle *ph, u32 domain,
159 u32 state);
160 int (*state_get)(const struct scmi_protocol_handle *ph, u32 domain,
161 u32 *state);
162};
163
e2083d36 164/**
52f83955 165 * struct scmi_sensor_reading - represent a timestamped read
e2083d36
CM
166 *
167 * Used by @reading_get_timestamped method.
168 *
169 * @value: The signed value sensor read.
170 * @timestamp: An unsigned timestamp for the sensor read, as provided by
171 * SCMI platform. Set to zero when not available.
172 */
173struct scmi_sensor_reading {
174 long long value;
175 unsigned long long timestamp;
176};
177
1fe00b8b 178/**
52f83955 179 * struct scmi_range_attrs - specifies a sensor or axis values' range
1fe00b8b
CM
180 * @min_range: The minimum value which can be represented by the sensor/axis.
181 * @max_range: The maximum value which can be represented by the sensor/axis.
182 */
183struct scmi_range_attrs {
184 long long min_range;
185 long long max_range;
186};
187
188/**
52f83955 189 * struct scmi_sensor_axis_info - describes one sensor axes
1fe00b8b
CM
190 * @id: The axes ID.
191 * @type: Axes type. Chosen amongst one of @enum scmi_sensor_class.
192 * @scale: Power-of-10 multiplier applied to the axis unit.
193 * @name: NULL-terminated string representing axes name as advertised by
194 * SCMI platform.
195 * @extended_attrs: Flag to indicate the presence of additional extended
196 * attributes for this axes.
197 * @resolution: Extended attribute representing the resolution of the axes.
198 * Set to 0 if not reported by this axes.
199 * @exponent: Extended attribute representing the power-of-10 multiplier that
200 * is applied to the resolution field. Set to 0 if not reported by
201 * this axes.
202 * @attrs: Extended attributes representing minimum and maximum values
203 * measurable by this axes. Set to 0 if not reported by this sensor.
204 */
205struct scmi_sensor_axis_info {
206 unsigned int id;
207 unsigned int type;
208 int scale;
209 char name[SCMI_MAX_STR_SIZE];
210 bool extended_attrs;
211 unsigned int resolution;
212 int exponent;
213 struct scmi_range_attrs attrs;
214};
215
216/**
52f83955
SH
217 * struct scmi_sensor_intervals_info - describes number and type of available
218 * update intervals
1fe00b8b
CM
219 * @segmented: Flag for segmented intervals' representation. When True there
220 * will be exactly 3 intervals in @desc, with each entry
221 * representing a member of a segment in this order:
222 * {lowest update interval, highest update interval, step size}
223 * @count: Number of intervals described in @desc.
224 * @desc: Array of @count interval descriptor bitmask represented as detailed in
225 * the SCMI specification: it can be accessed using the accompanying
226 * macros.
227 * @prealloc_pool: A minimal preallocated pool of desc entries used to avoid
228 * lesser-than-64-bytes dynamic allocation for small @count
229 * values.
230 */
231struct scmi_sensor_intervals_info {
232 bool segmented;
233 unsigned int count;
234#define SCMI_SENS_INTVL_SEGMENT_LOW 0
235#define SCMI_SENS_INTVL_SEGMENT_HIGH 1
236#define SCMI_SENS_INTVL_SEGMENT_STEP 2
237 unsigned int *desc;
238#define SCMI_SENS_INTVL_GET_SECS(x) FIELD_GET(GENMASK(20, 5), (x))
239#define SCMI_SENS_INTVL_GET_EXP(x) \
240 ({ \
241 int __signed_exp = FIELD_GET(GENMASK(4, 0), (x)); \
242 \
243 if (__signed_exp & BIT(4)) \
244 __signed_exp |= GENMASK(31, 5); \
245 __signed_exp; \
246 })
247#define SCMI_MAX_PREALLOC_POOL 16
248 unsigned int prealloc_pool[SCMI_MAX_PREALLOC_POOL];
249};
250
251/**
252 * struct scmi_sensor_info - represents information related to one of the
253 * available sensors.
254 * @id: Sensor ID.
255 * @type: Sensor type. Chosen amongst one of @enum scmi_sensor_class.
256 * @scale: Power-of-10 multiplier applied to the sensor unit.
257 * @num_trip_points: Number of maximum configurable trip points.
258 * @async: Flag for asynchronous read support.
259 * @update: Flag for continuouos update notification support.
260 * @timestamped: Flag for timestamped read support.
261 * @tstamp_scale: Power-of-10 multiplier applied to the sensor timestamps to
262 * represent it in seconds.
263 * @num_axis: Number of supported axis if any. Reported as 0 for scalar sensors.
264 * @axis: Pointer to an array of @num_axis descriptors.
265 * @intervals: Descriptor of available update intervals.
266 * @sensor_config: A bitmask reporting the current sensor configuration as
267 * detailed in the SCMI specification: it can accessed and
268 * modified through the accompanying macros.
269 * @name: NULL-terminated string representing sensor name as advertised by
270 * SCMI platform.
271 * @extended_scalar_attrs: Flag to indicate the presence of additional extended
272 * attributes for this sensor.
273 * @sensor_power: Extended attribute representing the average power
274 * consumed by the sensor in microwatts (uW) when it is active.
275 * Reported here only for scalar sensors.
276 * Set to 0 if not reported by this sensor.
277 * @resolution: Extended attribute representing the resolution of the sensor.
278 * Reported here only for scalar sensors.
279 * Set to 0 if not reported by this sensor.
280 * @exponent: Extended attribute representing the power-of-10 multiplier that is
281 * applied to the resolution field.
282 * Reported here only for scalar sensors.
283 * Set to 0 if not reported by this sensor.
284 * @scalar_attrs: Extended attributes representing minimum and maximum
285 * measurable values by this sensor.
286 * Reported here only for scalar sensors.
287 * Set to 0 if not reported by this sensor.
288 */
5179c523 289struct scmi_sensor_info {
1fe00b8b
CM
290 unsigned int id;
291 unsigned int type;
292 int scale;
293 unsigned int num_trip_points;
d09aac0e 294 bool async;
1fe00b8b
CM
295 bool update;
296 bool timestamped;
297 int tstamp_scale;
298 unsigned int num_axis;
299 struct scmi_sensor_axis_info *axis;
300 struct scmi_sensor_intervals_info intervals;
7b83c5f4
CM
301 unsigned int sensor_config;
302#define SCMI_SENS_CFG_UPDATE_SECS_MASK GENMASK(31, 16)
303#define SCMI_SENS_CFG_GET_UPDATE_SECS(x) \
304 FIELD_GET(SCMI_SENS_CFG_UPDATE_SECS_MASK, (x))
305
306#define SCMI_SENS_CFG_UPDATE_EXP_MASK GENMASK(15, 11)
307#define SCMI_SENS_CFG_GET_UPDATE_EXP(x) \
308 ({ \
309 int __signed_exp = \
310 FIELD_GET(SCMI_SENS_CFG_UPDATE_EXP_MASK, (x)); \
311 \
312 if (__signed_exp & BIT(4)) \
313 __signed_exp |= GENMASK(31, 5); \
314 __signed_exp; \
315 })
316
317#define SCMI_SENS_CFG_ROUND_MASK GENMASK(10, 9)
318#define SCMI_SENS_CFG_ROUND_AUTO 2
319#define SCMI_SENS_CFG_ROUND_UP 1
320#define SCMI_SENS_CFG_ROUND_DOWN 0
321
322#define SCMI_SENS_CFG_TSTAMP_ENABLED_MASK BIT(1)
323#define SCMI_SENS_CFG_TSTAMP_ENABLE 1
324#define SCMI_SENS_CFG_TSTAMP_DISABLE 0
325#define SCMI_SENS_CFG_IS_TSTAMP_ENABLED(x) \
326 FIELD_GET(SCMI_SENS_CFG_TSTAMP_ENABLED_MASK, (x))
327
328#define SCMI_SENS_CFG_SENSOR_ENABLED_MASK BIT(0)
329#define SCMI_SENS_CFG_SENSOR_ENABLE 1
330#define SCMI_SENS_CFG_SENSOR_DISABLE 0
5179c523 331 char name[SCMI_MAX_STR_SIZE];
7b83c5f4 332#define SCMI_SENS_CFG_IS_ENABLED(x) FIELD_GET(BIT(0), (x))
1fe00b8b
CM
333 bool extended_scalar_attrs;
334 unsigned int sensor_power;
335 unsigned int resolution;
336 int exponent;
337 struct scmi_range_attrs scalar_attrs;
5179c523
SH
338};
339
340/*
341 * Partial list from Distributed Management Task Force (DMTF) specification:
342 * DSP0249 (Platform Level Data Model specification)
343 */
344enum scmi_sensor_class {
345 NONE = 0x0,
607a4672 346 UNSPEC = 0x1,
5179c523 347 TEMPERATURE_C = 0x2,
607a4672
SH
348 TEMPERATURE_F = 0x3,
349 TEMPERATURE_K = 0x4,
5179c523
SH
350 VOLTAGE = 0x5,
351 CURRENT = 0x6,
352 POWER = 0x7,
353 ENERGY = 0x8,
607a4672
SH
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,
1fe00b8b
CM
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
5179c523
SH
440};
441
442/**
9694a7f6 443 * struct scmi_sensor_proto_ops - represents the various operations provided
5179c523
SH
444 * by SCMI Sensor Protocol
445 *
446 * @count_get: get the count of sensors provided by SCMI
447 * @info_get: get the information of the specified sensor
9eefa43a 448 * @trip_point_config: selects and configures a trip-point of interest
5179c523 449 * @reading_get: gets the current value of the sensor
e2083d36
CM
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
7b83c5f4
CM
455 * @config_get: Get sensor current configuration
456 * @config_set: Set sensor current configuration
5179c523 457 */
9694a7f6
CM
458struct scmi_sensor_proto_ops {
459 int (*count_get)(const struct scmi_protocol_handle *ph);
460 const struct scmi_sensor_info *(*info_get)
461 (const struct scmi_protocol_handle *ph, u32 sensor_id);
462 int (*trip_point_config)(const struct scmi_protocol_handle *ph,
463 u32 sensor_id, u8 trip_id, u64 trip_value);
464 int (*reading_get)(const struct scmi_protocol_handle *ph, u32 sensor_id,
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
95a15d80 475/**
7e029344 476 * struct scmi_reset_proto_ops - represents the various operations provided
95a15d80
SH
477 * by SCMI Reset Protocol
478 *
479 * @num_domains_get: get the count of reset domains provided by SCMI
480 * @name_get: gets the name of a reset domain
481 * @latency_get: gets the reset latency for the specified reset domain
482 * @reset: resets the specified reset domain
483 * @assert: explicitly assert reset signal of the specified reset domain
484 * @deassert: explicitly deassert reset signal of the specified reset domain
485 */
7e029344
CM
486struct scmi_reset_proto_ops {
487 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
992be5d3
CM
488 const char *(*name_get)(const struct scmi_protocol_handle *ph,
489 u32 domain);
7e029344
CM
490 int (*latency_get)(const struct scmi_protocol_handle *ph, u32 domain);
491 int (*reset)(const struct scmi_protocol_handle *ph, u32 domain);
492 int (*assert)(const struct scmi_protocol_handle *ph, u32 domain);
493 int (*deassert)(const struct scmi_protocol_handle *ph, u32 domain);
494};
495
2add5cac
CM
496/**
497 * struct scmi_voltage_info - describe one available SCMI Voltage Domain
498 *
499 * @id: the domain ID as advertised by the platform
500 * @segmented: defines the layout of the entries of array @levels_uv.
501 * - when True the entries are to be interpreted as triplets,
502 * each defining a segment representing a range of equally
503 * space voltages: <lowest_volts>, <highest_volt>, <step_uV>
504 * - when False the entries simply represent a single discrete
505 * supported voltage level
506 * @negative_volts_allowed: True if any of the entries of @levels_uv represent
507 * a negative voltage.
508 * @attributes: represents Voltage Domain advertised attributes
509 * @name: name assigned to the Voltage Domain by platform
510 * @num_levels: number of total entries in @levels_uv.
511 * @levels_uv: array of entries describing the available voltage levels for
512 * this domain.
513 */
514struct scmi_voltage_info {
515 unsigned int id;
516 bool segmented;
517 bool negative_volts_allowed;
518 unsigned int attributes;
519 char name[SCMI_MAX_STR_SIZE];
520 unsigned int num_levels;
521#define SCMI_VOLTAGE_SEGMENT_LOW 0
522#define SCMI_VOLTAGE_SEGMENT_HIGH 1
523#define SCMI_VOLTAGE_SEGMENT_STEP 2
524 int *levels_uv;
525};
526
527/**
fe4894d9 528 * struct scmi_voltage_proto_ops - represents the various operations provided
2add5cac
CM
529 * by SCMI Voltage Protocol
530 *
531 * @num_domains_get: get the count of voltage domains provided by SCMI
532 * @info_get: get the information of the specified domain
533 * @config_set: set the config for the specified domain
534 * @config_get: get the config of the specified domain
535 * @level_set: set the voltage level for the specified domain
536 * @level_get: get the voltage level of the specified domain
537 */
fe4894d9
CM
538struct scmi_voltage_proto_ops {
539 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
540 const struct scmi_voltage_info __must_check *(*info_get)
541 (const struct scmi_protocol_handle *ph, u32 domain_id);
542 int (*config_set)(const struct scmi_protocol_handle *ph, u32 domain_id,
543 u32 config);
544#define SCMI_VOLTAGE_ARCH_STATE_OFF 0x0
545#define SCMI_VOLTAGE_ARCH_STATE_ON 0x7
546 int (*config_get)(const struct scmi_protocol_handle *ph, u32 domain_id,
547 u32 *config);
548 int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain_id,
549 u32 flags, s32 volt_uV);
550 int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain_id,
551 s32 *volt_uV);
552};
553
e7c215f3
CM
554/**
555 * struct scmi_notify_ops - represents notifications' operations provided by
556 * SCMI core
5ad3d1cf
CM
557 * @devm_event_notifier_register: Managed registration of a notifier_block for
558 * the requested event
559 * @devm_event_notifier_unregister: Managed unregistration of a notifier_block
560 * for the requested event
aa1fd3e4
CM
561 * @event_notifier_register: Register a notifier_block for the requested event
562 * @event_notifier_unregister: Unregister a notifier_block for the requested
e7c215f3
CM
563 * event
564 *
565 * A user can register/unregister its own notifier_block against the wanted
566 * platform instance regarding the desired event identified by the
567 * tuple: (proto_id, evt_id, src_id) using the provided register/unregister
568 * interface where:
569 *
5ad3d1cf
CM
570 * @sdev: The scmi_device to use when calling the devres managed ops devm_
571 * @handle: The handle identifying the platform instance to use, when not
572 * calling the managed ops devm_
e7c215f3
CM
573 * @proto_id: The protocol ID as in SCMI Specification
574 * @evt_id: The message ID of the desired event as in SCMI Specification
575 * @src_id: A pointer to the desired source ID if different sources are
576 * possible for the protocol (like domain_id, sensor_id...etc)
577 *
578 * @src_id can be provided as NULL if it simply does NOT make sense for
579 * the protocol at hand, OR if the user is explicitly interested in
580 * receiving notifications from ANY existent source associated to the
581 * specified proto_id / evt_id.
582 *
583 * Received notifications are finally delivered to the registered users,
584 * invoking the callback provided with the notifier_block *nb as follows:
585 *
586 * int user_cb(nb, evt_id, report)
587 *
588 * with:
589 *
590 * @nb: The notifier block provided by the user
591 * @evt_id: The message ID of the delivered event
592 * @report: A custom struct describing the specific event delivered
593 */
594struct scmi_notify_ops {
5ad3d1cf
CM
595 int (*devm_event_notifier_register)(struct scmi_device *sdev,
596 u8 proto_id, u8 evt_id,
597 const u32 *src_id,
598 struct notifier_block *nb);
599 int (*devm_event_notifier_unregister)(struct scmi_device *sdev,
600 u8 proto_id, u8 evt_id,
601 const u32 *src_id,
602 struct notifier_block *nb);
aa1fd3e4 603 int (*event_notifier_register)(const struct scmi_handle *handle,
5ad3d1cf
CM
604 u8 proto_id, u8 evt_id,
605 const u32 *src_id,
e7c215f3 606 struct notifier_block *nb);
aa1fd3e4 607 int (*event_notifier_unregister)(const struct scmi_handle *handle,
5ad3d1cf
CM
608 u8 proto_id, u8 evt_id,
609 const u32 *src_id,
e7c215f3
CM
610 struct notifier_block *nb);
611};
612
aa4f886f
SH
613/**
614 * struct scmi_handle - Handle returned to ARM SCMI clients for usage.
615 *
616 * @dev: pointer to the SCMI device
b6f20ff8 617 * @version: pointer to the structure containing SCMI version information
23934efe
CM
618 * @devm_protocol_get: devres managed method to acquire a protocol and get specific
619 * operations and a dedicated protocol handler
620 * @devm_protocol_put: devres managed method to release a protocol
69255e74
CM
621 * @is_transport_atomic: method to check if the underlying transport for this
622 * instance handle is configured to support atomic
623 * transactions for commands.
624 * Some users of the SCMI stack in the upper layers could
625 * be interested to know if they can assume SCMI
626 * command transactions associated to this handle will
627 * never sleep and act accordingly.
05976c5f
CM
628 * An optional atomic threshold value could be returned
629 * where configured.
e7c215f3 630 * @notify_ops: pointer to set of notifications related operations
aa4f886f
SH
631 */
632struct scmi_handle {
633 struct device *dev;
b6f20ff8 634 struct scmi_revision_info *version;
23934efe
CM
635
636 const void __must_check *
637 (*devm_protocol_get)(struct scmi_device *sdev, u8 proto,
638 struct scmi_protocol_handle **ph);
639 void (*devm_protocol_put)(struct scmi_device *sdev, u8 proto);
05976c5f
CM
640 bool (*is_transport_atomic)(const struct scmi_handle *handle,
641 unsigned int *atomic_threshold);
23934efe 642
82894c1d 643 const struct scmi_notify_ops *notify_ops;
b6f20ff8
SH
644};
645
646enum scmi_std_protocol {
647 SCMI_PROTOCOL_BASE = 0x10,
648 SCMI_PROTOCOL_POWER = 0x11,
649 SCMI_PROTOCOL_SYSTEM = 0x12,
650 SCMI_PROTOCOL_PERF = 0x13,
651 SCMI_PROTOCOL_CLOCK = 0x14,
652 SCMI_PROTOCOL_SENSOR = 0x15,
95a15d80 653 SCMI_PROTOCOL_RESET = 0x16,
2add5cac 654 SCMI_PROTOCOL_VOLTAGE = 0x17,
aa4f886f 655};
933c5044 656
a8803055
CM
657enum scmi_system_events {
658 SCMI_SYSTEM_SHUTDOWN,
659 SCMI_SYSTEM_COLDRESET,
660 SCMI_SYSTEM_WARMRESET,
661 SCMI_SYSTEM_POWERUP,
662 SCMI_SYSTEM_SUSPEND,
663 SCMI_SYSTEM_MAX
664};
665
933c5044
SH
666struct scmi_device {
667 u32 id;
668 u8 protocol_id;
ee7a9c9f 669 const char *name;
933c5044
SH
670 struct device dev;
671 struct scmi_handle *handle;
672};
673
674#define to_scmi_dev(d) container_of(d, struct scmi_device, dev)
675
676struct scmi_device *
ee7a9c9f
SH
677scmi_device_create(struct device_node *np, struct device *parent, int protocol,
678 const char *name);
933c5044
SH
679void scmi_device_destroy(struct scmi_device *scmi_dev);
680
681struct scmi_device_id {
682 u8 protocol_id;
ee7a9c9f 683 const char *name;
933c5044
SH
684};
685
686struct scmi_driver {
687 const char *name;
688 int (*probe)(struct scmi_device *sdev);
689 void (*remove)(struct scmi_device *sdev);
690 const struct scmi_device_id *id_table;
691
692 struct device_driver driver;
693};
694
695#define to_scmi_driver(d) container_of(d, struct scmi_driver, driver)
696
66d90f6e 697#if IS_REACHABLE(CONFIG_ARM_SCMI_PROTOCOL)
933c5044
SH
698int scmi_driver_register(struct scmi_driver *driver,
699 struct module *owner, const char *mod_name);
700void scmi_driver_unregister(struct scmi_driver *driver);
701#else
702static inline int
703scmi_driver_register(struct scmi_driver *driver, struct module *owner,
704 const char *mod_name)
705{
706 return -EINVAL;
707}
708
709static inline void scmi_driver_unregister(struct scmi_driver *driver) {}
710#endif /* CONFIG_ARM_SCMI_PROTOCOL */
711
712#define scmi_register(driver) \
713 scmi_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
714#define scmi_unregister(driver) \
715 scmi_driver_unregister(driver)
716
717/**
718 * module_scmi_driver() - Helper macro for registering a scmi driver
719 * @__scmi_driver: scmi_driver structure
720 *
721 * Helper macro for scmi drivers to set up proper module init / exit
722 * functions. Replaces module_init() and module_exit() and keeps people from
723 * printing pointless things to the kernel log when their driver is loaded.
724 */
725#define module_scmi_driver(__scmi_driver) \
726 module_driver(__scmi_driver, scmi_register, scmi_unregister)
727
f5800e0b
CM
728/**
729 * module_scmi_protocol() - Helper macro for registering a scmi protocol
730 * @__scmi_protocol: scmi_protocol structure
731 *
732 * Helper macro for scmi drivers to set up proper module init / exit
733 * functions. Replaces module_init() and module_exit() and keeps people from
734 * printing pointless things to the kernel log when their driver is loaded.
735 */
736#define module_scmi_protocol(__scmi_protocol) \
737 module_driver(__scmi_protocol, \
738 scmi_protocol_register, scmi_protocol_unregister)
739
48dc16e2
CM
740struct scmi_protocol;
741int scmi_protocol_register(const struct scmi_protocol *proto);
742void scmi_protocol_unregister(const struct scmi_protocol *proto);
70771c69 743
e27077bc
CM
744/* SCMI Notification API - Custom Event Reports */
745enum scmi_notification_events {
746 SCMI_EVENT_POWER_STATE_CHANGED = 0x0,
fb5086dc
CM
747 SCMI_EVENT_PERFORMANCE_LIMITS_CHANGED = 0x0,
748 SCMI_EVENT_PERFORMANCE_LEVEL_CHANGED = 0x1,
128e3e93 749 SCMI_EVENT_SENSOR_TRIP_POINT_EVENT = 0x0,
e3811190 750 SCMI_EVENT_SENSOR_UPDATE = 0x1,
469ca182 751 SCMI_EVENT_RESET_ISSUED = 0x0,
585dfab3 752 SCMI_EVENT_BASE_ERROR_EVENT = 0x0,
a8803055 753 SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER = 0x0,
e27077bc
CM
754};
755
756struct scmi_power_state_changed_report {
72a5eb9d
CM
757 ktime_t timestamp;
758 unsigned int agent_id;
759 unsigned int domain_id;
760 unsigned int power_state;
e27077bc
CM
761};
762
a8803055
CM
763struct scmi_system_power_state_notifier_report {
764 ktime_t timestamp;
765 unsigned int agent_id;
766 unsigned int flags;
767 unsigned int system_state;
768};
769
fb5086dc 770struct scmi_perf_limits_report {
72a5eb9d
CM
771 ktime_t timestamp;
772 unsigned int agent_id;
773 unsigned int domain_id;
774 unsigned int range_max;
775 unsigned int range_min;
fb5086dc
CM
776};
777
778struct scmi_perf_level_report {
72a5eb9d
CM
779 ktime_t timestamp;
780 unsigned int agent_id;
781 unsigned int domain_id;
782 unsigned int performance_level;
fb5086dc
CM
783};
784
128e3e93 785struct scmi_sensor_trip_point_report {
72a5eb9d
CM
786 ktime_t timestamp;
787 unsigned int agent_id;
788 unsigned int sensor_id;
789 unsigned int trip_point_desc;
128e3e93
CM
790};
791
e3811190
CM
792struct scmi_sensor_update_report {
793 ktime_t timestamp;
794 unsigned int agent_id;
795 unsigned int sensor_id;
796 unsigned int readings_count;
797 struct scmi_sensor_reading readings[];
798};
799
469ca182 800struct scmi_reset_issued_report {
72a5eb9d
CM
801 ktime_t timestamp;
802 unsigned int agent_id;
803 unsigned int domain_id;
804 unsigned int reset_state;
469ca182
CM
805};
806
585dfab3 807struct scmi_base_error_report {
72a5eb9d
CM
808 ktime_t timestamp;
809 unsigned int agent_id;
810 bool fatal;
811 unsigned int cmd_count;
812 unsigned long long reports[];
585dfab3
CM
813};
814
70771c69 815#endif /* _LINUX_SCMI_PROTOCOL_H */