Merge tag 'x86_misc_for_v6.9_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / firmware / arm_scmi / clock.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * System Control and Management Interface (SCMI) Clock Protocol
4  *
5  * Copyright (C) 2018-2022 ARM Ltd.
6  */
7
8 #include <linux/module.h>
9 #include <linux/limits.h>
10 #include <linux/sort.h>
11
12 #include "protocols.h"
13 #include "notify.h"
14
15 /* Updated only after ALL the mandatory features for that version are merged */
16 #define SCMI_PROTOCOL_SUPPORTED_VERSION         0x20000
17
18 enum scmi_clock_protocol_cmd {
19         CLOCK_ATTRIBUTES = 0x3,
20         CLOCK_DESCRIBE_RATES = 0x4,
21         CLOCK_RATE_SET = 0x5,
22         CLOCK_RATE_GET = 0x6,
23         CLOCK_CONFIG_SET = 0x7,
24         CLOCK_NAME_GET = 0x8,
25         CLOCK_RATE_NOTIFY = 0x9,
26         CLOCK_RATE_CHANGE_REQUESTED_NOTIFY = 0xA,
27         CLOCK_CONFIG_GET = 0xB,
28         CLOCK_POSSIBLE_PARENTS_GET = 0xC,
29         CLOCK_PARENT_SET = 0xD,
30         CLOCK_PARENT_GET = 0xE,
31 };
32
33 enum clk_state {
34         CLK_STATE_DISABLE,
35         CLK_STATE_ENABLE,
36         CLK_STATE_RESERVED,
37         CLK_STATE_UNCHANGED,
38 };
39
40 struct scmi_msg_resp_clock_protocol_attributes {
41         __le16 num_clocks;
42         u8 max_async_req;
43         u8 reserved;
44 };
45
46 struct scmi_msg_resp_clock_attributes {
47         __le32 attributes;
48 #define SUPPORTS_RATE_CHANGED_NOTIF(x)          ((x) & BIT(31))
49 #define SUPPORTS_RATE_CHANGE_REQUESTED_NOTIF(x) ((x) & BIT(30))
50 #define SUPPORTS_EXTENDED_NAMES(x)              ((x) & BIT(29))
51 #define SUPPORTS_PARENT_CLOCK(x)                ((x) & BIT(28))
52         u8 name[SCMI_SHORT_NAME_MAX_SIZE];
53         __le32 clock_enable_latency;
54 };
55
56 struct scmi_msg_clock_possible_parents {
57         __le32 id;
58         __le32 skip_parents;
59 };
60
61 struct scmi_msg_resp_clock_possible_parents {
62         __le32 num_parent_flags;
63 #define NUM_PARENTS_RETURNED(x)         ((x) & 0xff)
64 #define NUM_PARENTS_REMAINING(x)        ((x) >> 24)
65         __le32 possible_parents[];
66 };
67
68 struct scmi_msg_clock_set_parent {
69         __le32 id;
70         __le32 parent_id;
71 };
72
73 struct scmi_msg_clock_config_set {
74         __le32 id;
75         __le32 attributes;
76 };
77
78 /* Valid only from SCMI clock v2.1 */
79 struct scmi_msg_clock_config_set_v2 {
80         __le32 id;
81         __le32 attributes;
82 #define NULL_OEM_TYPE                   0
83 #define REGMASK_OEM_TYPE_SET            GENMASK(23, 16)
84 #define REGMASK_CLK_STATE               GENMASK(1, 0)
85         __le32 oem_config_val;
86 };
87
88 struct scmi_msg_clock_config_get {
89         __le32 id;
90         __le32 flags;
91 #define REGMASK_OEM_TYPE_GET            GENMASK(7, 0)
92 };
93
94 struct scmi_msg_resp_clock_config_get {
95         __le32 attributes;
96         __le32 config;
97 #define IS_CLK_ENABLED(x)               le32_get_bits((x), BIT(0))
98         __le32 oem_config_val;
99 };
100
101 struct scmi_msg_clock_describe_rates {
102         __le32 id;
103         __le32 rate_index;
104 };
105
106 struct scmi_msg_resp_clock_describe_rates {
107         __le32 num_rates_flags;
108 #define NUM_RETURNED(x)         ((x) & 0xfff)
109 #define RATE_DISCRETE(x)        !((x) & BIT(12))
110 #define NUM_REMAINING(x)        ((x) >> 16)
111         struct {
112                 __le32 value_low;
113                 __le32 value_high;
114         } rate[];
115 #define RATE_TO_U64(X)          \
116 ({                              \
117         typeof(X) x = (X);      \
118         le32_to_cpu((x).value_low) | (u64)le32_to_cpu((x).value_high) << 32; \
119 })
120 };
121
122 struct scmi_clock_set_rate {
123         __le32 flags;
124 #define CLOCK_SET_ASYNC         BIT(0)
125 #define CLOCK_SET_IGNORE_RESP   BIT(1)
126 #define CLOCK_SET_ROUND_UP      BIT(2)
127 #define CLOCK_SET_ROUND_AUTO    BIT(3)
128         __le32 id;
129         __le32 value_low;
130         __le32 value_high;
131 };
132
133 struct scmi_msg_resp_set_rate_complete {
134         __le32 id;
135         __le32 rate_low;
136         __le32 rate_high;
137 };
138
139 struct scmi_msg_clock_rate_notify {
140         __le32 clk_id;
141         __le32 notify_enable;
142 };
143
144 struct scmi_clock_rate_notify_payld {
145         __le32 agent_id;
146         __le32 clock_id;
147         __le32 rate_low;
148         __le32 rate_high;
149 };
150
151 struct clock_info {
152         u32 version;
153         int num_clocks;
154         int max_async_req;
155         atomic_t cur_async_req;
156         struct scmi_clock_info *clk;
157         int (*clock_config_set)(const struct scmi_protocol_handle *ph,
158                                 u32 clk_id, enum clk_state state,
159                                 u8 oem_type, u32 oem_val, bool atomic);
160         int (*clock_config_get)(const struct scmi_protocol_handle *ph,
161                                 u32 clk_id, u8 oem_type, u32 *attributes,
162                                 bool *enabled, u32 *oem_val, bool atomic);
163 };
164
165 static enum scmi_clock_protocol_cmd evt_2_cmd[] = {
166         CLOCK_RATE_NOTIFY,
167         CLOCK_RATE_CHANGE_REQUESTED_NOTIFY,
168 };
169
170 static int
171 scmi_clock_protocol_attributes_get(const struct scmi_protocol_handle *ph,
172                                    struct clock_info *ci)
173 {
174         int ret;
175         struct scmi_xfer *t;
176         struct scmi_msg_resp_clock_protocol_attributes *attr;
177
178         ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES,
179                                       0, sizeof(*attr), &t);
180         if (ret)
181                 return ret;
182
183         attr = t->rx.buf;
184
185         ret = ph->xops->do_xfer(ph, t);
186         if (!ret) {
187                 ci->num_clocks = le16_to_cpu(attr->num_clocks);
188                 ci->max_async_req = attr->max_async_req;
189         }
190
191         ph->xops->xfer_put(ph, t);
192         return ret;
193 }
194
195 struct scmi_clk_ipriv {
196         struct device *dev;
197         u32 clk_id;
198         struct scmi_clock_info *clk;
199 };
200
201 static void iter_clk_possible_parents_prepare_message(void *message, unsigned int desc_index,
202                                                       const void *priv)
203 {
204         struct scmi_msg_clock_possible_parents *msg = message;
205         const struct scmi_clk_ipriv *p = priv;
206
207         msg->id = cpu_to_le32(p->clk_id);
208         /* Set the number of OPPs to be skipped/already read */
209         msg->skip_parents = cpu_to_le32(desc_index);
210 }
211
212 static int iter_clk_possible_parents_update_state(struct scmi_iterator_state *st,
213                                                   const void *response, void *priv)
214 {
215         const struct scmi_msg_resp_clock_possible_parents *r = response;
216         struct scmi_clk_ipriv *p = priv;
217         struct device *dev = ((struct scmi_clk_ipriv *)p)->dev;
218         u32 flags;
219
220         flags = le32_to_cpu(r->num_parent_flags);
221         st->num_returned = NUM_PARENTS_RETURNED(flags);
222         st->num_remaining = NUM_PARENTS_REMAINING(flags);
223
224         /*
225          * num parents is not declared previously anywhere so we
226          * assume it's returned+remaining on first call.
227          */
228         if (!st->max_resources) {
229                 p->clk->num_parents = st->num_returned + st->num_remaining;
230                 p->clk->parents = devm_kcalloc(dev, p->clk->num_parents,
231                                                sizeof(*p->clk->parents),
232                                                GFP_KERNEL);
233                 if (!p->clk->parents) {
234                         p->clk->num_parents = 0;
235                         return -ENOMEM;
236                 }
237                 st->max_resources = st->num_returned + st->num_remaining;
238         }
239
240         return 0;
241 }
242
243 static int iter_clk_possible_parents_process_response(const struct scmi_protocol_handle *ph,
244                                                       const void *response,
245                                                       struct scmi_iterator_state *st,
246                                                       void *priv)
247 {
248         const struct scmi_msg_resp_clock_possible_parents *r = response;
249         struct scmi_clk_ipriv *p = priv;
250
251         u32 *parent = &p->clk->parents[st->desc_index + st->loop_idx];
252
253         *parent = le32_to_cpu(r->possible_parents[st->loop_idx]);
254
255         return 0;
256 }
257
258 static int scmi_clock_possible_parents(const struct scmi_protocol_handle *ph, u32 clk_id,
259                                        struct scmi_clock_info *clk)
260 {
261         struct scmi_iterator_ops ops = {
262                 .prepare_message = iter_clk_possible_parents_prepare_message,
263                 .update_state = iter_clk_possible_parents_update_state,
264                 .process_response = iter_clk_possible_parents_process_response,
265         };
266
267         struct scmi_clk_ipriv ppriv = {
268                 .clk_id = clk_id,
269                 .clk = clk,
270                 .dev = ph->dev,
271         };
272         void *iter;
273         int ret;
274
275         iter = ph->hops->iter_response_init(ph, &ops, 0,
276                                             CLOCK_POSSIBLE_PARENTS_GET,
277                                             sizeof(struct scmi_msg_clock_possible_parents),
278                                             &ppriv);
279         if (IS_ERR(iter))
280                 return PTR_ERR(iter);
281
282         ret = ph->hops->iter_response_run(iter);
283
284         return ret;
285 }
286
287 static int scmi_clock_attributes_get(const struct scmi_protocol_handle *ph,
288                                      u32 clk_id, struct scmi_clock_info *clk,
289                                      u32 version)
290 {
291         int ret;
292         u32 attributes;
293         struct scmi_xfer *t;
294         struct scmi_msg_resp_clock_attributes *attr;
295
296         ret = ph->xops->xfer_get_init(ph, CLOCK_ATTRIBUTES,
297                                       sizeof(clk_id), sizeof(*attr), &t);
298         if (ret)
299                 return ret;
300
301         put_unaligned_le32(clk_id, t->tx.buf);
302         attr = t->rx.buf;
303
304         ret = ph->xops->do_xfer(ph, t);
305         if (!ret) {
306                 u32 latency = 0;
307                 attributes = le32_to_cpu(attr->attributes);
308                 strscpy(clk->name, attr->name, SCMI_SHORT_NAME_MAX_SIZE);
309                 /* clock_enable_latency field is present only since SCMI v3.1 */
310                 if (PROTOCOL_REV_MAJOR(version) >= 0x2)
311                         latency = le32_to_cpu(attr->clock_enable_latency);
312                 clk->enable_latency = latency ? : U32_MAX;
313         }
314
315         ph->xops->xfer_put(ph, t);
316
317         /*
318          * If supported overwrite short name with the extended one;
319          * on error just carry on and use already provided short name.
320          */
321         if (!ret && PROTOCOL_REV_MAJOR(version) >= 0x2) {
322                 if (SUPPORTS_EXTENDED_NAMES(attributes))
323                         ph->hops->extended_name_get(ph, CLOCK_NAME_GET, clk_id,
324                                                     NULL, clk->name,
325                                                     SCMI_MAX_STR_SIZE);
326
327                 if (SUPPORTS_RATE_CHANGED_NOTIF(attributes))
328                         clk->rate_changed_notifications = true;
329                 if (SUPPORTS_RATE_CHANGE_REQUESTED_NOTIF(attributes))
330                         clk->rate_change_requested_notifications = true;
331                 if (SUPPORTS_PARENT_CLOCK(attributes))
332                         scmi_clock_possible_parents(ph, clk_id, clk);
333         }
334
335         return ret;
336 }
337
338 static int rate_cmp_func(const void *_r1, const void *_r2)
339 {
340         const u64 *r1 = _r1, *r2 = _r2;
341
342         if (*r1 < *r2)
343                 return -1;
344         else if (*r1 == *r2)
345                 return 0;
346         else
347                 return 1;
348 }
349
350 static void iter_clk_describe_prepare_message(void *message,
351                                               const unsigned int desc_index,
352                                               const void *priv)
353 {
354         struct scmi_msg_clock_describe_rates *msg = message;
355         const struct scmi_clk_ipriv *p = priv;
356
357         msg->id = cpu_to_le32(p->clk_id);
358         /* Set the number of rates to be skipped/already read */
359         msg->rate_index = cpu_to_le32(desc_index);
360 }
361
362 static int
363 iter_clk_describe_update_state(struct scmi_iterator_state *st,
364                                const void *response, void *priv)
365 {
366         u32 flags;
367         struct scmi_clk_ipriv *p = priv;
368         const struct scmi_msg_resp_clock_describe_rates *r = response;
369
370         flags = le32_to_cpu(r->num_rates_flags);
371         st->num_remaining = NUM_REMAINING(flags);
372         st->num_returned = NUM_RETURNED(flags);
373         p->clk->rate_discrete = RATE_DISCRETE(flags);
374
375         /* Warn about out of spec replies ... */
376         if (!p->clk->rate_discrete &&
377             (st->num_returned != 3 || st->num_remaining != 0)) {
378                 dev_warn(p->dev,
379                          "Out-of-spec CLOCK_DESCRIBE_RATES reply for %s - returned:%d remaining:%d rx_len:%zd\n",
380                          p->clk->name, st->num_returned, st->num_remaining,
381                          st->rx_len);
382
383                 /*
384                  * A known quirk: a triplet is returned but num_returned != 3
385                  * Check for a safe payload size and fix.
386                  */
387                 if (st->num_returned != 3 && st->num_remaining == 0 &&
388                     st->rx_len == sizeof(*r) + sizeof(__le32) * 2 * 3) {
389                         st->num_returned = 3;
390                         st->num_remaining = 0;
391                 } else {
392                         dev_err(p->dev,
393                                 "Cannot fix out-of-spec reply !\n");
394                         return -EPROTO;
395                 }
396         }
397
398         return 0;
399 }
400
401 static int
402 iter_clk_describe_process_response(const struct scmi_protocol_handle *ph,
403                                    const void *response,
404                                    struct scmi_iterator_state *st, void *priv)
405 {
406         int ret = 0;
407         struct scmi_clk_ipriv *p = priv;
408         const struct scmi_msg_resp_clock_describe_rates *r = response;
409
410         if (!p->clk->rate_discrete) {
411                 switch (st->desc_index + st->loop_idx) {
412                 case 0:
413                         p->clk->range.min_rate = RATE_TO_U64(r->rate[0]);
414                         break;
415                 case 1:
416                         p->clk->range.max_rate = RATE_TO_U64(r->rate[1]);
417                         break;
418                 case 2:
419                         p->clk->range.step_size = RATE_TO_U64(r->rate[2]);
420                         break;
421                 default:
422                         ret = -EINVAL;
423                         break;
424                 }
425         } else {
426                 u64 *rate = &p->clk->list.rates[st->desc_index + st->loop_idx];
427
428                 *rate = RATE_TO_U64(r->rate[st->loop_idx]);
429                 p->clk->list.num_rates++;
430         }
431
432         return ret;
433 }
434
435 static int
436 scmi_clock_describe_rates_get(const struct scmi_protocol_handle *ph, u32 clk_id,
437                               struct scmi_clock_info *clk)
438 {
439         int ret;
440         void *iter;
441         struct scmi_iterator_ops ops = {
442                 .prepare_message = iter_clk_describe_prepare_message,
443                 .update_state = iter_clk_describe_update_state,
444                 .process_response = iter_clk_describe_process_response,
445         };
446         struct scmi_clk_ipriv cpriv = {
447                 .clk_id = clk_id,
448                 .clk = clk,
449                 .dev = ph->dev,
450         };
451
452         iter = ph->hops->iter_response_init(ph, &ops, SCMI_MAX_NUM_RATES,
453                                             CLOCK_DESCRIBE_RATES,
454                                             sizeof(struct scmi_msg_clock_describe_rates),
455                                             &cpriv);
456         if (IS_ERR(iter))
457                 return PTR_ERR(iter);
458
459         ret = ph->hops->iter_response_run(iter);
460         if (ret)
461                 return ret;
462
463         if (!clk->rate_discrete) {
464                 dev_dbg(ph->dev, "Min %llu Max %llu Step %llu Hz\n",
465                         clk->range.min_rate, clk->range.max_rate,
466                         clk->range.step_size);
467         } else if (clk->list.num_rates) {
468                 sort(clk->list.rates, clk->list.num_rates,
469                      sizeof(clk->list.rates[0]), rate_cmp_func, NULL);
470         }
471
472         return ret;
473 }
474
475 static int
476 scmi_clock_rate_get(const struct scmi_protocol_handle *ph,
477                     u32 clk_id, u64 *value)
478 {
479         int ret;
480         struct scmi_xfer *t;
481
482         ret = ph->xops->xfer_get_init(ph, CLOCK_RATE_GET,
483                                       sizeof(__le32), sizeof(u64), &t);
484         if (ret)
485                 return ret;
486
487         put_unaligned_le32(clk_id, t->tx.buf);
488
489         ret = ph->xops->do_xfer(ph, t);
490         if (!ret)
491                 *value = get_unaligned_le64(t->rx.buf);
492
493         ph->xops->xfer_put(ph, t);
494         return ret;
495 }
496
497 static int scmi_clock_rate_set(const struct scmi_protocol_handle *ph,
498                                u32 clk_id, u64 rate)
499 {
500         int ret;
501         u32 flags = 0;
502         struct scmi_xfer *t;
503         struct scmi_clock_set_rate *cfg;
504         struct clock_info *ci = ph->get_priv(ph);
505
506         ret = ph->xops->xfer_get_init(ph, CLOCK_RATE_SET, sizeof(*cfg), 0, &t);
507         if (ret)
508                 return ret;
509
510         if (ci->max_async_req &&
511             atomic_inc_return(&ci->cur_async_req) < ci->max_async_req)
512                 flags |= CLOCK_SET_ASYNC;
513
514         cfg = t->tx.buf;
515         cfg->flags = cpu_to_le32(flags);
516         cfg->id = cpu_to_le32(clk_id);
517         cfg->value_low = cpu_to_le32(rate & 0xffffffff);
518         cfg->value_high = cpu_to_le32(rate >> 32);
519
520         if (flags & CLOCK_SET_ASYNC) {
521                 ret = ph->xops->do_xfer_with_response(ph, t);
522                 if (!ret) {
523                         struct scmi_msg_resp_set_rate_complete *resp;
524
525                         resp = t->rx.buf;
526                         if (le32_to_cpu(resp->id) == clk_id)
527                                 dev_dbg(ph->dev,
528                                         "Clk ID %d set async to %llu\n", clk_id,
529                                         get_unaligned_le64(&resp->rate_low));
530                         else
531                                 ret = -EPROTO;
532                 }
533         } else {
534                 ret = ph->xops->do_xfer(ph, t);
535         }
536
537         if (ci->max_async_req)
538                 atomic_dec(&ci->cur_async_req);
539
540         ph->xops->xfer_put(ph, t);
541         return ret;
542 }
543
544 static int
545 scmi_clock_config_set(const struct scmi_protocol_handle *ph, u32 clk_id,
546                       enum clk_state state, u8 __unused0, u32 __unused1,
547                       bool atomic)
548 {
549         int ret;
550         struct scmi_xfer *t;
551         struct scmi_msg_clock_config_set *cfg;
552
553         if (state >= CLK_STATE_RESERVED)
554                 return -EINVAL;
555
556         ret = ph->xops->xfer_get_init(ph, CLOCK_CONFIG_SET,
557                                       sizeof(*cfg), 0, &t);
558         if (ret)
559                 return ret;
560
561         t->hdr.poll_completion = atomic;
562
563         cfg = t->tx.buf;
564         cfg->id = cpu_to_le32(clk_id);
565         cfg->attributes = cpu_to_le32(state);
566
567         ret = ph->xops->do_xfer(ph, t);
568
569         ph->xops->xfer_put(ph, t);
570         return ret;
571 }
572
573 static int
574 scmi_clock_set_parent(const struct scmi_protocol_handle *ph, u32 clk_id,
575                       u32 parent_id)
576 {
577         int ret;
578         struct scmi_xfer *t;
579         struct scmi_msg_clock_set_parent *cfg;
580         struct clock_info *ci = ph->get_priv(ph);
581         struct scmi_clock_info *clk;
582
583         if (clk_id >= ci->num_clocks)
584                 return -EINVAL;
585
586         clk = ci->clk + clk_id;
587
588         if (parent_id >= clk->num_parents)
589                 return -EINVAL;
590
591         ret = ph->xops->xfer_get_init(ph, CLOCK_PARENT_SET,
592                                       sizeof(*cfg), 0, &t);
593         if (ret)
594                 return ret;
595
596         t->hdr.poll_completion = false;
597
598         cfg = t->tx.buf;
599         cfg->id = cpu_to_le32(clk_id);
600         cfg->parent_id = cpu_to_le32(clk->parents[parent_id]);
601
602         ret = ph->xops->do_xfer(ph, t);
603
604         ph->xops->xfer_put(ph, t);
605
606         return ret;
607 }
608
609 static int
610 scmi_clock_get_parent(const struct scmi_protocol_handle *ph, u32 clk_id,
611                       u32 *parent_id)
612 {
613         int ret;
614         struct scmi_xfer *t;
615
616         ret = ph->xops->xfer_get_init(ph, CLOCK_PARENT_GET,
617                                       sizeof(__le32), sizeof(u32), &t);
618         if (ret)
619                 return ret;
620
621         put_unaligned_le32(clk_id, t->tx.buf);
622
623         ret = ph->xops->do_xfer(ph, t);
624         if (!ret)
625                 *parent_id = get_unaligned_le32(t->rx.buf);
626
627         ph->xops->xfer_put(ph, t);
628         return ret;
629 }
630
631 /* For SCMI clock v2.1 and onwards */
632 static int
633 scmi_clock_config_set_v2(const struct scmi_protocol_handle *ph, u32 clk_id,
634                          enum clk_state state, u8 oem_type, u32 oem_val,
635                          bool atomic)
636 {
637         int ret;
638         u32 attrs;
639         struct scmi_xfer *t;
640         struct scmi_msg_clock_config_set_v2 *cfg;
641
642         if (state == CLK_STATE_RESERVED ||
643             (!oem_type && state == CLK_STATE_UNCHANGED))
644                 return -EINVAL;
645
646         ret = ph->xops->xfer_get_init(ph, CLOCK_CONFIG_SET,
647                                       sizeof(*cfg), 0, &t);
648         if (ret)
649                 return ret;
650
651         t->hdr.poll_completion = atomic;
652
653         attrs = FIELD_PREP(REGMASK_OEM_TYPE_SET, oem_type) |
654                  FIELD_PREP(REGMASK_CLK_STATE, state);
655
656         cfg = t->tx.buf;
657         cfg->id = cpu_to_le32(clk_id);
658         cfg->attributes = cpu_to_le32(attrs);
659         /* Clear in any case */
660         cfg->oem_config_val = cpu_to_le32(0);
661         if (oem_type)
662                 cfg->oem_config_val = cpu_to_le32(oem_val);
663
664         ret = ph->xops->do_xfer(ph, t);
665
666         ph->xops->xfer_put(ph, t);
667         return ret;
668 }
669
670 static int scmi_clock_enable(const struct scmi_protocol_handle *ph, u32 clk_id,
671                              bool atomic)
672 {
673         struct clock_info *ci = ph->get_priv(ph);
674
675         return ci->clock_config_set(ph, clk_id, CLK_STATE_ENABLE,
676                                     NULL_OEM_TYPE, 0, atomic);
677 }
678
679 static int scmi_clock_disable(const struct scmi_protocol_handle *ph, u32 clk_id,
680                               bool atomic)
681 {
682         struct clock_info *ci = ph->get_priv(ph);
683
684         return ci->clock_config_set(ph, clk_id, CLK_STATE_DISABLE,
685                                     NULL_OEM_TYPE, 0, atomic);
686 }
687
688 /* For SCMI clock v2.1 and onwards */
689 static int
690 scmi_clock_config_get_v2(const struct scmi_protocol_handle *ph, u32 clk_id,
691                          u8 oem_type, u32 *attributes, bool *enabled,
692                          u32 *oem_val, bool atomic)
693 {
694         int ret;
695         u32 flags;
696         struct scmi_xfer *t;
697         struct scmi_msg_clock_config_get *cfg;
698
699         ret = ph->xops->xfer_get_init(ph, CLOCK_CONFIG_GET,
700                                       sizeof(*cfg), 0, &t);
701         if (ret)
702                 return ret;
703
704         t->hdr.poll_completion = atomic;
705
706         flags = FIELD_PREP(REGMASK_OEM_TYPE_GET, oem_type);
707
708         cfg = t->tx.buf;
709         cfg->id = cpu_to_le32(clk_id);
710         cfg->flags = cpu_to_le32(flags);
711
712         ret = ph->xops->do_xfer(ph, t);
713         if (!ret) {
714                 struct scmi_msg_resp_clock_config_get *resp = t->rx.buf;
715
716                 if (attributes)
717                         *attributes = le32_to_cpu(resp->attributes);
718
719                 if (enabled)
720                         *enabled = IS_CLK_ENABLED(resp->config);
721
722                 if (oem_val && oem_type)
723                         *oem_val = le32_to_cpu(resp->oem_config_val);
724         }
725
726         ph->xops->xfer_put(ph, t);
727
728         return ret;
729 }
730
731 static int
732 scmi_clock_config_get(const struct scmi_protocol_handle *ph, u32 clk_id,
733                       u8 oem_type, u32 *attributes, bool *enabled,
734                       u32 *oem_val, bool atomic)
735 {
736         int ret;
737         struct scmi_xfer *t;
738         struct scmi_msg_resp_clock_attributes *resp;
739
740         if (!enabled)
741                 return -EINVAL;
742
743         ret = ph->xops->xfer_get_init(ph, CLOCK_ATTRIBUTES,
744                                       sizeof(clk_id), sizeof(*resp), &t);
745         if (ret)
746                 return ret;
747
748         t->hdr.poll_completion = atomic;
749         put_unaligned_le32(clk_id, t->tx.buf);
750         resp = t->rx.buf;
751
752         ret = ph->xops->do_xfer(ph, t);
753         if (!ret)
754                 *enabled = IS_CLK_ENABLED(resp->attributes);
755
756         ph->xops->xfer_put(ph, t);
757
758         return ret;
759 }
760
761 static int scmi_clock_state_get(const struct scmi_protocol_handle *ph,
762                                 u32 clk_id, bool *enabled, bool atomic)
763 {
764         struct clock_info *ci = ph->get_priv(ph);
765
766         return ci->clock_config_get(ph, clk_id, NULL_OEM_TYPE, NULL,
767                                     enabled, NULL, atomic);
768 }
769
770 static int scmi_clock_config_oem_set(const struct scmi_protocol_handle *ph,
771                                      u32 clk_id, u8 oem_type, u32 oem_val,
772                                      bool atomic)
773 {
774         struct clock_info *ci = ph->get_priv(ph);
775
776         return ci->clock_config_set(ph, clk_id, CLK_STATE_UNCHANGED,
777                                     oem_type, oem_val, atomic);
778 }
779
780 static int scmi_clock_config_oem_get(const struct scmi_protocol_handle *ph,
781                                      u32 clk_id, u8 oem_type, u32 *oem_val,
782                                      u32 *attributes, bool atomic)
783 {
784         struct clock_info *ci = ph->get_priv(ph);
785
786         return ci->clock_config_get(ph, clk_id, oem_type, attributes,
787                                     NULL, oem_val, atomic);
788 }
789
790 static int scmi_clock_count_get(const struct scmi_protocol_handle *ph)
791 {
792         struct clock_info *ci = ph->get_priv(ph);
793
794         return ci->num_clocks;
795 }
796
797 static const struct scmi_clock_info *
798 scmi_clock_info_get(const struct scmi_protocol_handle *ph, u32 clk_id)
799 {
800         struct scmi_clock_info *clk;
801         struct clock_info *ci = ph->get_priv(ph);
802
803         if (clk_id >= ci->num_clocks)
804                 return NULL;
805
806         clk = ci->clk + clk_id;
807         if (!clk->name[0])
808                 return NULL;
809
810         return clk;
811 }
812
813 static const struct scmi_clk_proto_ops clk_proto_ops = {
814         .count_get = scmi_clock_count_get,
815         .info_get = scmi_clock_info_get,
816         .rate_get = scmi_clock_rate_get,
817         .rate_set = scmi_clock_rate_set,
818         .enable = scmi_clock_enable,
819         .disable = scmi_clock_disable,
820         .state_get = scmi_clock_state_get,
821         .config_oem_get = scmi_clock_config_oem_get,
822         .config_oem_set = scmi_clock_config_oem_set,
823         .parent_set = scmi_clock_set_parent,
824         .parent_get = scmi_clock_get_parent,
825 };
826
827 static int scmi_clk_rate_notify(const struct scmi_protocol_handle *ph,
828                                 u32 clk_id, int message_id, bool enable)
829 {
830         int ret;
831         struct scmi_xfer *t;
832         struct scmi_msg_clock_rate_notify *notify;
833
834         ret = ph->xops->xfer_get_init(ph, message_id, sizeof(*notify), 0, &t);
835         if (ret)
836                 return ret;
837
838         notify = t->tx.buf;
839         notify->clk_id = cpu_to_le32(clk_id);
840         notify->notify_enable = enable ? cpu_to_le32(BIT(0)) : 0;
841
842         ret = ph->xops->do_xfer(ph, t);
843
844         ph->xops->xfer_put(ph, t);
845         return ret;
846 }
847
848 static int scmi_clk_set_notify_enabled(const struct scmi_protocol_handle *ph,
849                                        u8 evt_id, u32 src_id, bool enable)
850 {
851         int ret, cmd_id;
852
853         if (evt_id >= ARRAY_SIZE(evt_2_cmd))
854                 return -EINVAL;
855
856         cmd_id = evt_2_cmd[evt_id];
857         ret = scmi_clk_rate_notify(ph, src_id, cmd_id, enable);
858         if (ret)
859                 pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n",
860                          evt_id, src_id, ret);
861
862         return ret;
863 }
864
865 static void *scmi_clk_fill_custom_report(const struct scmi_protocol_handle *ph,
866                                          u8 evt_id, ktime_t timestamp,
867                                          const void *payld, size_t payld_sz,
868                                          void *report, u32 *src_id)
869 {
870         const struct scmi_clock_rate_notify_payld *p = payld;
871         struct scmi_clock_rate_notif_report *r = report;
872
873         if (sizeof(*p) != payld_sz ||
874             (evt_id != SCMI_EVENT_CLOCK_RATE_CHANGED &&
875              evt_id != SCMI_EVENT_CLOCK_RATE_CHANGE_REQUESTED))
876                 return NULL;
877
878         r->timestamp = timestamp;
879         r->agent_id = le32_to_cpu(p->agent_id);
880         r->clock_id = le32_to_cpu(p->clock_id);
881         r->rate = get_unaligned_le64(&p->rate_low);
882         *src_id = r->clock_id;
883
884         return r;
885 }
886
887 static int scmi_clk_get_num_sources(const struct scmi_protocol_handle *ph)
888 {
889         struct clock_info *ci = ph->get_priv(ph);
890
891         if (!ci)
892                 return -EINVAL;
893
894         return ci->num_clocks;
895 }
896
897 static const struct scmi_event clk_events[] = {
898         {
899                 .id = SCMI_EVENT_CLOCK_RATE_CHANGED,
900                 .max_payld_sz = sizeof(struct scmi_clock_rate_notify_payld),
901                 .max_report_sz = sizeof(struct scmi_clock_rate_notif_report),
902         },
903         {
904                 .id = SCMI_EVENT_CLOCK_RATE_CHANGE_REQUESTED,
905                 .max_payld_sz = sizeof(struct scmi_clock_rate_notify_payld),
906                 .max_report_sz = sizeof(struct scmi_clock_rate_notif_report),
907         },
908 };
909
910 static const struct scmi_event_ops clk_event_ops = {
911         .get_num_sources = scmi_clk_get_num_sources,
912         .set_notify_enabled = scmi_clk_set_notify_enabled,
913         .fill_custom_report = scmi_clk_fill_custom_report,
914 };
915
916 static const struct scmi_protocol_events clk_protocol_events = {
917         .queue_sz = SCMI_PROTO_QUEUE_SZ,
918         .ops = &clk_event_ops,
919         .evts = clk_events,
920         .num_events = ARRAY_SIZE(clk_events),
921 };
922
923 static int scmi_clock_protocol_init(const struct scmi_protocol_handle *ph)
924 {
925         u32 version;
926         int clkid, ret;
927         struct clock_info *cinfo;
928
929         ret = ph->xops->version_get(ph, &version);
930         if (ret)
931                 return ret;
932
933         dev_dbg(ph->dev, "Clock Version %d.%d\n",
934                 PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version));
935
936         cinfo = devm_kzalloc(ph->dev, sizeof(*cinfo), GFP_KERNEL);
937         if (!cinfo)
938                 return -ENOMEM;
939
940         ret = scmi_clock_protocol_attributes_get(ph, cinfo);
941         if (ret)
942                 return ret;
943
944         cinfo->clk = devm_kcalloc(ph->dev, cinfo->num_clocks,
945                                   sizeof(*cinfo->clk), GFP_KERNEL);
946         if (!cinfo->clk)
947                 return -ENOMEM;
948
949         for (clkid = 0; clkid < cinfo->num_clocks; clkid++) {
950                 struct scmi_clock_info *clk = cinfo->clk + clkid;
951
952                 ret = scmi_clock_attributes_get(ph, clkid, clk, version);
953                 if (!ret)
954                         scmi_clock_describe_rates_get(ph, clkid, clk);
955         }
956
957         if (PROTOCOL_REV_MAJOR(version) >= 0x3) {
958                 cinfo->clock_config_set = scmi_clock_config_set_v2;
959                 cinfo->clock_config_get = scmi_clock_config_get_v2;
960         } else {
961                 cinfo->clock_config_set = scmi_clock_config_set;
962                 cinfo->clock_config_get = scmi_clock_config_get;
963         }
964
965         cinfo->version = version;
966         return ph->set_priv(ph, cinfo, version);
967 }
968
969 static const struct scmi_protocol scmi_clock = {
970         .id = SCMI_PROTOCOL_CLOCK,
971         .owner = THIS_MODULE,
972         .instance_init = &scmi_clock_protocol_init,
973         .ops = &clk_proto_ops,
974         .events = &clk_protocol_events,
975         .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION,
976 };
977
978 DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(clock, scmi_clock)