1
2
3
4
5
6
7
8#ifndef _LINUX_SCMI_PROTOCOL_H
9#define _LINUX_SCMI_PROTOCOL_H
10
11#include <linux/bitfield.h>
12#include <linux/device.h>
13#include <linux/notifier.h>
14#include <linux/types.h>
15
16#define SCMI_MAX_STR_SIZE 16
17#define SCMI_MAX_NUM_RATES 16
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
43struct scmi_clock_info {
44 char name[SCMI_MAX_STR_SIZE];
45 bool rate_discrete;
46 union {
47 struct {
48 int num_rates;
49 u64 rates[SCMI_MAX_NUM_RATES];
50 } list;
51 struct {
52 u64 min_rate;
53 u64 max_rate;
54 u64 step_size;
55 } range;
56 };
57};
58
59struct scmi_handle;
60struct scmi_device;
61struct scmi_protocol_handle;
62
63
64
65
66
67
68
69
70
71
72
73
74struct scmi_clk_proto_ops {
75 int (*count_get)(const struct scmi_protocol_handle *ph);
76
77 const struct scmi_clock_info *(*info_get)
78 (const struct scmi_protocol_handle *ph, u32 clk_id);
79 int (*rate_get)(const struct scmi_protocol_handle *ph, u32 clk_id,
80 u64 *rate);
81 int (*rate_set)(const struct scmi_protocol_handle *ph, u32 clk_id,
82 u64 rate);
83 int (*enable)(const struct scmi_protocol_handle *ph, u32 clk_id);
84 int (*disable)(const struct scmi_protocol_handle *ph, u32 clk_id);
85};
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109struct scmi_perf_proto_ops {
110 int (*limits_set)(const struct scmi_protocol_handle *ph, u32 domain,
111 u32 max_perf, u32 min_perf);
112 int (*limits_get)(const struct scmi_protocol_handle *ph, u32 domain,
113 u32 *max_perf, u32 *min_perf);
114 int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain,
115 u32 level, bool poll);
116 int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain,
117 u32 *level, bool poll);
118 int (*device_domain_id)(struct device *dev);
119 int (*transition_latency_get)(const struct scmi_protocol_handle *ph,
120 struct device *dev);
121 int (*device_opps_add)(const struct scmi_protocol_handle *ph,
122 struct device *dev);
123 int (*freq_set)(const struct scmi_protocol_handle *ph, u32 domain,
124 unsigned long rate, bool poll);
125 int (*freq_get)(const struct scmi_protocol_handle *ph, u32 domain,
126 unsigned long *rate, bool poll);
127 int (*est_power_get)(const struct scmi_protocol_handle *ph, u32 domain,
128 unsigned long *rate, unsigned long *power);
129 bool (*fast_switch_possible)(const struct scmi_protocol_handle *ph,
130 struct device *dev);
131 bool (*power_scale_mw_get)(const struct scmi_protocol_handle *ph);
132};
133
134
135
136
137
138
139
140
141
142
143struct scmi_power_proto_ops {
144 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
145 char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain);
146#define SCMI_POWER_STATE_TYPE_SHIFT 30
147#define SCMI_POWER_STATE_ID_MASK (BIT(28) - 1)
148#define SCMI_POWER_STATE_PARAM(type, id) \
149 ((((type) & BIT(0)) << SCMI_POWER_STATE_TYPE_SHIFT) | \
150 ((id) & SCMI_POWER_STATE_ID_MASK))
151#define SCMI_POWER_STATE_GENERIC_ON SCMI_POWER_STATE_PARAM(0, 0)
152#define SCMI_POWER_STATE_GENERIC_OFF SCMI_POWER_STATE_PARAM(1, 0)
153 int (*state_set)(const struct scmi_protocol_handle *ph, u32 domain,
154 u32 state);
155 int (*state_get)(const struct scmi_protocol_handle *ph, u32 domain,
156 u32 *state);
157};
158
159
160
161
162
163
164
165
166
167
168struct scmi_sensor_reading {
169 long long value;
170 unsigned long long timestamp;
171};
172
173
174
175
176
177
178struct scmi_range_attrs {
179 long long min_range;
180 long long max_range;
181};
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200struct scmi_sensor_axis_info {
201 unsigned int id;
202 unsigned int type;
203 int scale;
204 char name[SCMI_MAX_STR_SIZE];
205 bool extended_attrs;
206 unsigned int resolution;
207 int exponent;
208 struct scmi_range_attrs attrs;
209};
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226struct scmi_sensor_intervals_info {
227 bool segmented;
228 unsigned int count;
229#define SCMI_SENS_INTVL_SEGMENT_LOW 0
230#define SCMI_SENS_INTVL_SEGMENT_HIGH 1
231#define SCMI_SENS_INTVL_SEGMENT_STEP 2
232 unsigned int *desc;
233#define SCMI_SENS_INTVL_GET_SECS(x) FIELD_GET(GENMASK(20, 5), (x))
234#define SCMI_SENS_INTVL_GET_EXP(x) \
235 ({ \
236 int __signed_exp = FIELD_GET(GENMASK(4, 0), (x)); \
237 \
238 if (__signed_exp & BIT(4)) \
239 __signed_exp |= GENMASK(31, 5); \
240 __signed_exp; \
241 })
242#define SCMI_MAX_PREALLOC_POOL 16
243 unsigned int prealloc_pool[SCMI_MAX_PREALLOC_POOL];
244};
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284struct scmi_sensor_info {
285 unsigned int id;
286 unsigned int type;
287 int scale;
288 unsigned int num_trip_points;
289 bool async;
290 bool update;
291 bool timestamped;
292 int tstamp_scale;
293 unsigned int num_axis;
294 struct scmi_sensor_axis_info *axis;
295 struct scmi_sensor_intervals_info intervals;
296 unsigned int sensor_config;
297#define SCMI_SENS_CFG_UPDATE_SECS_MASK GENMASK(31, 16)
298#define SCMI_SENS_CFG_GET_UPDATE_SECS(x) \
299 FIELD_GET(SCMI_SENS_CFG_UPDATE_SECS_MASK, (x))
300
301#define SCMI_SENS_CFG_UPDATE_EXP_MASK GENMASK(15, 11)
302#define SCMI_SENS_CFG_GET_UPDATE_EXP(x) \
303 ({ \
304 int __signed_exp = \
305 FIELD_GET(SCMI_SENS_CFG_UPDATE_EXP_MASK, (x)); \
306 \
307 if (__signed_exp & BIT(4)) \
308 __signed_exp |= GENMASK(31, 5); \
309 __signed_exp; \
310 })
311
312#define SCMI_SENS_CFG_ROUND_MASK GENMASK(10, 9)
313#define SCMI_SENS_CFG_ROUND_AUTO 2
314#define SCMI_SENS_CFG_ROUND_UP 1
315#define SCMI_SENS_CFG_ROUND_DOWN 0
316
317#define SCMI_SENS_CFG_TSTAMP_ENABLED_MASK BIT(1)
318#define SCMI_SENS_CFG_TSTAMP_ENABLE 1
319#define SCMI_SENS_CFG_TSTAMP_DISABLE 0
320#define SCMI_SENS_CFG_IS_TSTAMP_ENABLED(x) \
321 FIELD_GET(SCMI_SENS_CFG_TSTAMP_ENABLED_MASK, (x))
322
323#define SCMI_SENS_CFG_SENSOR_ENABLED_MASK BIT(0)
324#define SCMI_SENS_CFG_SENSOR_ENABLE 1
325#define SCMI_SENS_CFG_SENSOR_DISABLE 0
326 char name[SCMI_MAX_STR_SIZE];
327#define SCMI_SENS_CFG_IS_ENABLED(x) FIELD_GET(BIT(0), (x))
328 bool extended_scalar_attrs;
329 unsigned int sensor_power;
330 unsigned int resolution;
331 int exponent;
332 struct scmi_range_attrs scalar_attrs;
333};
334
335
336
337
338
339enum scmi_sensor_class {
340 NONE = 0x0,
341 UNSPEC = 0x1,
342 TEMPERATURE_C = 0x2,
343 TEMPERATURE_F = 0x3,
344 TEMPERATURE_K = 0x4,
345 VOLTAGE = 0x5,
346 CURRENT = 0x6,
347 POWER = 0x7,
348 ENERGY = 0x8,
349 CHARGE = 0x9,
350 VOLTAMPERE = 0xA,
351 NITS = 0xB,
352 LUMENS = 0xC,
353 LUX = 0xD,
354 CANDELAS = 0xE,
355 KPA = 0xF,
356 PSI = 0x10,
357 NEWTON = 0x11,
358 CFM = 0x12,
359 RPM = 0x13,
360 HERTZ = 0x14,
361 SECS = 0x15,
362 MINS = 0x16,
363 HOURS = 0x17,
364 DAYS = 0x18,
365 WEEKS = 0x19,
366 MILS = 0x1A,
367 INCHES = 0x1B,
368 FEET = 0x1C,
369 CUBIC_INCHES = 0x1D,
370 CUBIC_FEET = 0x1E,
371 METERS = 0x1F,
372 CUBIC_CM = 0x20,
373 CUBIC_METERS = 0x21,
374 LITERS = 0x22,
375 FLUID_OUNCES = 0x23,
376 RADIANS = 0x24,
377 STERADIANS = 0x25,
378 REVOLUTIONS = 0x26,
379 CYCLES = 0x27,
380 GRAVITIES = 0x28,
381 OUNCES = 0x29,
382 POUNDS = 0x2A,
383 FOOT_POUNDS = 0x2B,
384 OUNCE_INCHES = 0x2C,
385 GAUSS = 0x2D,
386 GILBERTS = 0x2E,
387 HENRIES = 0x2F,
388 FARADS = 0x30,
389 OHMS = 0x31,
390 SIEMENS = 0x32,
391 MOLES = 0x33,
392 BECQUERELS = 0x34,
393 PPM = 0x35,
394 DECIBELS = 0x36,
395 DBA = 0x37,
396 DBC = 0x38,
397 GRAYS = 0x39,
398 SIEVERTS = 0x3A,
399 COLOR_TEMP_K = 0x3B,
400 BITS = 0x3C,
401 BYTES = 0x3D,
402 WORDS = 0x3E,
403 DWORDS = 0x3F,
404 QWORDS = 0x40,
405 PERCENTAGE = 0x41,
406 PASCALS = 0x42,
407 COUNTS = 0x43,
408 GRAMS = 0x44,
409 NEWTON_METERS = 0x45,
410 HITS = 0x46,
411 MISSES = 0x47,
412 RETRIES = 0x48,
413 OVERRUNS = 0x49,
414 UNDERRUNS = 0x4A,
415 COLLISIONS = 0x4B,
416 PACKETS = 0x4C,
417 MESSAGES = 0x4D,
418 CHARS = 0x4E,
419 ERRORS = 0x4F,
420 CORRECTED_ERRS = 0x50,
421 UNCORRECTABLE_ERRS = 0x51,
422 SQ_MILS = 0x52,
423 SQ_INCHES = 0x53,
424 SQ_FEET = 0x54,
425 SQ_CM = 0x55,
426 SQ_METERS = 0x56,
427 RADIANS_SEC = 0x57,
428 BPM = 0x58,
429 METERS_SEC_SQUARED = 0x59,
430 METERS_SEC = 0x5A,
431 CUBIC_METERS_SEC = 0x5B,
432 MM_MERCURY = 0x5C,
433 RADIANS_SEC_SQUARED = 0x5D,
434 OEM_UNIT = 0xFF
435};
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453struct scmi_sensor_proto_ops {
454 int (*count_get)(const struct scmi_protocol_handle *ph);
455 const struct scmi_sensor_info *(*info_get)
456 (const struct scmi_protocol_handle *ph, u32 sensor_id);
457 int (*trip_point_config)(const struct scmi_protocol_handle *ph,
458 u32 sensor_id, u8 trip_id, u64 trip_value);
459 int (*reading_get)(const struct scmi_protocol_handle *ph, u32 sensor_id,
460 u64 *value);
461 int (*reading_get_timestamped)(const struct scmi_protocol_handle *ph,
462 u32 sensor_id, u8 count,
463 struct scmi_sensor_reading *readings);
464 int (*config_get)(const struct scmi_protocol_handle *ph,
465 u32 sensor_id, u32 *sensor_config);
466 int (*config_set)(const struct scmi_protocol_handle *ph,
467 u32 sensor_id, u32 sensor_config);
468};
469
470
471
472
473
474
475
476
477
478
479
480
481struct scmi_reset_proto_ops {
482 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
483 char *(*name_get)(const struct scmi_protocol_handle *ph, u32 domain);
484 int (*latency_get)(const struct scmi_protocol_handle *ph, u32 domain);
485 int (*reset)(const struct scmi_protocol_handle *ph, u32 domain);
486 int (*assert)(const struct scmi_protocol_handle *ph, u32 domain);
487 int (*deassert)(const struct scmi_protocol_handle *ph, u32 domain);
488};
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508struct scmi_voltage_info {
509 unsigned int id;
510 bool segmented;
511 bool negative_volts_allowed;
512 unsigned int attributes;
513 char name[SCMI_MAX_STR_SIZE];
514 unsigned int num_levels;
515#define SCMI_VOLTAGE_SEGMENT_LOW 0
516#define SCMI_VOLTAGE_SEGMENT_HIGH 1
517#define SCMI_VOLTAGE_SEGMENT_STEP 2
518 int *levels_uv;
519};
520
521
522
523
524
525
526
527
528
529
530
531
532struct scmi_voltage_proto_ops {
533 int (*num_domains_get)(const struct scmi_protocol_handle *ph);
534 const struct scmi_voltage_info __must_check *(*info_get)
535 (const struct scmi_protocol_handle *ph, u32 domain_id);
536 int (*config_set)(const struct scmi_protocol_handle *ph, u32 domain_id,
537 u32 config);
538#define SCMI_VOLTAGE_ARCH_STATE_OFF 0x0
539#define SCMI_VOLTAGE_ARCH_STATE_ON 0x7
540 int (*config_get)(const struct scmi_protocol_handle *ph, u32 domain_id,
541 u32 *config);
542 int (*level_set)(const struct scmi_protocol_handle *ph, u32 domain_id,
543 u32 flags, s32 volt_uV);
544 int (*level_get)(const struct scmi_protocol_handle *ph, u32 domain_id,
545 s32 *volt_uV);
546};
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588struct scmi_notify_ops {
589 int (*devm_event_notifier_register)(struct scmi_device *sdev,
590 u8 proto_id, u8 evt_id,
591 const u32 *src_id,
592 struct notifier_block *nb);
593 int (*devm_event_notifier_unregister)(struct scmi_device *sdev,
594 u8 proto_id, u8 evt_id,
595 const u32 *src_id,
596 struct notifier_block *nb);
597 int (*event_notifier_register)(const struct scmi_handle *handle,
598 u8 proto_id, u8 evt_id,
599 const u32 *src_id,
600 struct notifier_block *nb);
601 int (*event_notifier_unregister)(const struct scmi_handle *handle,
602 u8 proto_id, u8 evt_id,
603 const u32 *src_id,
604 struct notifier_block *nb);
605};
606
607
608
609
610
611
612
613
614
615
616
617struct scmi_handle {
618 struct device *dev;
619 struct scmi_revision_info *version;
620
621 const void __must_check *
622 (*devm_protocol_get)(struct scmi_device *sdev, u8 proto,
623 struct scmi_protocol_handle **ph);
624 void (*devm_protocol_put)(struct scmi_device *sdev, u8 proto);
625
626 const struct scmi_notify_ops *notify_ops;
627};
628
629enum scmi_std_protocol {
630 SCMI_PROTOCOL_BASE = 0x10,
631 SCMI_PROTOCOL_POWER = 0x11,
632 SCMI_PROTOCOL_SYSTEM = 0x12,
633 SCMI_PROTOCOL_PERF = 0x13,
634 SCMI_PROTOCOL_CLOCK = 0x14,
635 SCMI_PROTOCOL_SENSOR = 0x15,
636 SCMI_PROTOCOL_RESET = 0x16,
637 SCMI_PROTOCOL_VOLTAGE = 0x17,
638};
639
640enum scmi_system_events {
641 SCMI_SYSTEM_SHUTDOWN,
642 SCMI_SYSTEM_COLDRESET,
643 SCMI_SYSTEM_WARMRESET,
644 SCMI_SYSTEM_POWERUP,
645 SCMI_SYSTEM_SUSPEND,
646 SCMI_SYSTEM_MAX
647};
648
649struct scmi_device {
650 u32 id;
651 u8 protocol_id;
652 const char *name;
653 struct device dev;
654 struct scmi_handle *handle;
655};
656
657#define to_scmi_dev(d) container_of(d, struct scmi_device, dev)
658
659struct scmi_device *
660scmi_device_create(struct device_node *np, struct device *parent, int protocol,
661 const char *name);
662void scmi_device_destroy(struct scmi_device *scmi_dev);
663
664struct scmi_device_id {
665 u8 protocol_id;
666 const char *name;
667};
668
669struct scmi_driver {
670 const char *name;
671 int (*probe)(struct scmi_device *sdev);
672 void (*remove)(struct scmi_device *sdev);
673 const struct scmi_device_id *id_table;
674
675 struct device_driver driver;
676};
677
678#define to_scmi_driver(d) container_of(d, struct scmi_driver, driver)
679
680#if IS_REACHABLE(CONFIG_ARM_SCMI_PROTOCOL)
681int scmi_driver_register(struct scmi_driver *driver,
682 struct module *owner, const char *mod_name);
683void scmi_driver_unregister(struct scmi_driver *driver);
684#else
685static inline int
686scmi_driver_register(struct scmi_driver *driver, struct module *owner,
687 const char *mod_name)
688{
689 return -EINVAL;
690}
691
692static inline void scmi_driver_unregister(struct scmi_driver *driver) {}
693#endif
694
695#define scmi_register(driver) \
696 scmi_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
697#define scmi_unregister(driver) \
698 scmi_driver_unregister(driver)
699
700
701
702
703
704
705
706
707
708#define module_scmi_driver(__scmi_driver) \
709 module_driver(__scmi_driver, scmi_register, scmi_unregister)
710
711
712
713
714
715
716
717
718
719#define module_scmi_protocol(__scmi_protocol) \
720 module_driver(__scmi_protocol, \
721 scmi_protocol_register, scmi_protocol_unregister)
722
723struct scmi_protocol;
724int scmi_protocol_register(const struct scmi_protocol *proto);
725void scmi_protocol_unregister(const struct scmi_protocol *proto);
726
727
728enum scmi_notification_events {
729 SCMI_EVENT_POWER_STATE_CHANGED = 0x0,
730 SCMI_EVENT_PERFORMANCE_LIMITS_CHANGED = 0x0,
731 SCMI_EVENT_PERFORMANCE_LEVEL_CHANGED = 0x1,
732 SCMI_EVENT_SENSOR_TRIP_POINT_EVENT = 0x0,
733 SCMI_EVENT_SENSOR_UPDATE = 0x1,
734 SCMI_EVENT_RESET_ISSUED = 0x0,
735 SCMI_EVENT_BASE_ERROR_EVENT = 0x0,
736 SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER = 0x0,
737};
738
739struct scmi_power_state_changed_report {
740 ktime_t timestamp;
741 unsigned int agent_id;
742 unsigned int domain_id;
743 unsigned int power_state;
744};
745
746struct scmi_system_power_state_notifier_report {
747 ktime_t timestamp;
748 unsigned int agent_id;
749 unsigned int flags;
750 unsigned int system_state;
751};
752
753struct scmi_perf_limits_report {
754 ktime_t timestamp;
755 unsigned int agent_id;
756 unsigned int domain_id;
757 unsigned int range_max;
758 unsigned int range_min;
759};
760
761struct scmi_perf_level_report {
762 ktime_t timestamp;
763 unsigned int agent_id;
764 unsigned int domain_id;
765 unsigned int performance_level;
766};
767
768struct scmi_sensor_trip_point_report {
769 ktime_t timestamp;
770 unsigned int agent_id;
771 unsigned int sensor_id;
772 unsigned int trip_point_desc;
773};
774
775struct scmi_sensor_update_report {
776 ktime_t timestamp;
777 unsigned int agent_id;
778 unsigned int sensor_id;
779 unsigned int readings_count;
780 struct scmi_sensor_reading readings[];
781};
782
783struct scmi_reset_issued_report {
784 ktime_t timestamp;
785 unsigned int agent_id;
786 unsigned int domain_id;
787 unsigned int reset_state;
788};
789
790struct scmi_base_error_report {
791 ktime_t timestamp;
792 unsigned int agent_id;
793 bool fatal;
794 unsigned int cmd_count;
795 unsigned long long reports[];
796};
797
798#endif
799