1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * System Control and Management Interface (SCMI) Raw mode support
4 *
5 * Copyright (C) 2022 ARM Ltd.
6 */
7 /**
8 * DOC: Theory of operation
9 *
10 * When enabled the SCMI Raw mode support exposes a userspace API which allows
11 * to send and receive SCMI commands, replies and notifications from a user
12 * application through injection and snooping of bare SCMI messages in binary
13 * little-endian format.
14 *
15 * Such injected SCMI transactions will then be routed through the SCMI core
16 * stack towards the SCMI backend server using whatever SCMI transport is
17 * currently configured on the system under test.
18 *
19 * It is meant to help in running any sort of SCMI backend server testing, no
20 * matter where the server is placed, as long as it is normally reachable via
21 * the transport configured on the system.
22 *
23 * It is activated by a Kernel configuration option since it is NOT meant to
24 * be used in production but only during development and in CI deployments.
25 *
26 * In order to avoid possible interferences between the SCMI Raw transactions
27 * originated from a test-suite and the normal operations of the SCMI drivers,
28 * when Raw mode is enabled, by default, all the regular SCMI drivers are
29 * inhibited, unless CONFIG_ARM_SCMI_RAW_MODE_SUPPORT_COEX is enabled: in this
30 * latter case the regular SCMI stack drivers will be loaded as usual and it is
31 * up to the user of this interface to take care of manually inhibiting the
32 * regular SCMI drivers in order to avoid interferences during the test runs.
33 *
34 * The exposed API is as follows.
35 *
36 * All SCMI Raw entries are rooted under a common top /raw debugfs top directory
37 * which in turn is rooted under the corresponding underlying SCMI instance.
38 *
39 * /sys/kernel/debug/scmi/
40 * `-- 0
41 * |-- atomic_threshold_us
42 * |-- instance_name
43 * |-- raw
44 * | |-- channels
45 * | | |-- 0x10
46 * | | | |-- message
47 * | | | `-- message_async
48 * | | `-- 0x13
49 * | | |-- message
50 * | | `-- message_async
51 * | |-- errors
52 * | |-- message
53 * | |-- message_async
54 * | |-- notification
55 * | `-- reset
56 * `-- transport
57 * |-- is_atomic
58 * |-- max_msg_size
59 * |-- max_rx_timeout_ms
60 * |-- rx_max_msg
61 * |-- tx_max_msg
62 * `-- type
63 *
64 * where:
65 *
66 * - errors: used to read back timed-out and unexpected replies
67 * - message*: used to send sync/async commands and read back immediate and
68 * delayed reponses (if any)
69 * - notification: used to read any notification being emitted by the system
70 * (if previously enabled by the user app)
71 * - reset: used to flush the queues of messages (of any kind) still pending
72 * to be read; this is useful at test-suite start/stop to get
73 * rid of any unread messages from the previous run.
74 *
75 * with the per-channel entries rooted at /channels being present only on a
76 * system where multiple transport channels have been configured.
77 *
78 * Such per-channel entries can be used to explicitly choose a specific channel
79 * for SCMI bare message injection, in contrast with the general entries above
80 * where, instead, the selection of the proper channel to use is automatically
81 * performed based the protocol embedded in the injected message and on how the
82 * transport is configured on the system.
83 *
84 * Note that other common general entries are available under transport/ to let
85 * the user applications properly make up their expectations in terms of
86 * timeouts and message characteristics.
87 *
88 * Each write to the message* entries causes one command request to be built
89 * and sent while the replies or delayed response are read back from those same
90 * entries one message at time (receiving an EOF at each message boundary).
91 *
92 * The user application running the test is in charge of handling timeouts
93 * on replies and properly choosing SCMI sequence numbers for the outgoing
94 * requests (using the same sequence number is supported but discouraged).
95 *
96 * Injection of multiple in-flight requests is supported as long as the user
97 * application uses properly distinct sequence numbers for concurrent requests
98 * and takes care to properly manage all the related issues about concurrency
99 * and command/reply pairing. Keep in mind that, anyway, the real level of
100 * parallelism attainable in such scenario is dependent on the characteristics
101 * of the underlying transport being used.
102 *
103 * Since the SCMI core regular stack is partially used to deliver and collect
104 * the messages, late replies arrived after timeouts and any other sort of
105 * unexpected message can be identified by the SCMI core as usual and they will
106 * be reported as messages under "errors" for later analysis.
107 */
108
109 #include <linux/bitmap.h>
110 #include <linux/debugfs.h>
111 #include <linux/delay.h>
112 #include <linux/device.h>
113 #include <linux/export.h>
114 #include <linux/io.h>
115 #include <linux/kernel.h>
116 #include <linux/fs.h>
117 #include <linux/list.h>
118 #include <linux/module.h>
119 #include <linux/poll.h>
120 #include <linux/of.h>
121 #include <linux/slab.h>
122 #include <linux/xarray.h>
123
124 #include "common.h"
125
126 #include "raw_mode.h"
127
128 #include <trace/events/scmi.h>
129
130 #define SCMI_XFER_RAW_MAX_RETRIES 10
131
132 /**
133 * struct scmi_raw_queue - Generic Raw queue descriptor
134 *
135 * @free_bufs: A freelists listhead used to keep unused raw buffers
136 * @free_bufs_lock: Spinlock used to protect access to @free_bufs
137 * @msg_q: A listhead to a queue of snooped messages waiting to be read out
138 * @msg_q_lock: Spinlock used to protect access to @msg_q
139 * @wq: A waitqueue used to wait and poll on related @msg_q
140 */
141 struct scmi_raw_queue {
142 struct list_head free_bufs;
143 /* Protect free_bufs[] lists */
144 spinlock_t free_bufs_lock;
145 struct list_head msg_q;
146 /* Protect msg_q[] lists */
147 spinlock_t msg_q_lock;
148 wait_queue_head_t wq;
149 };
150
151 /**
152 * struct scmi_raw_mode_info - Structure holding SCMI Raw instance data
153 *
154 * @id: Sequential Raw instance ID.
155 * @handle: Pointer to SCMI entity handle to use
156 * @desc: Pointer to the transport descriptor to use
157 * @tx_max_msg: Maximum number of concurrent TX in-flight messages
158 * @q: An array of Raw queue descriptors
159 * @chans_q: An XArray mapping optional additional per-channel queues
160 * @free_waiters: Head of freelist for unused waiters
161 * @free_mtx: A mutex to protect the waiters freelist
162 * @active_waiters: Head of list for currently active and used waiters
163 * @active_mtx: A mutex to protect the active waiters list
164 * @waiters_work: A work descriptor to be used with the workqueue machinery
165 * @wait_wq: A workqueue reference to the created workqueue
166 * @dentry: Top debugfs root dentry for SCMI Raw
167 * @gid: A group ID used for devres accounting
168 *
169 * Note that this descriptor is passed back to the core after SCMI Raw is
170 * initialized as an opaque handle to use by subsequent SCMI Raw call hooks.
171 *
172 */
173 struct scmi_raw_mode_info {
174 unsigned int id;
175 const struct scmi_handle *handle;
176 const struct scmi_desc *desc;
177 int tx_max_msg;
178 struct scmi_raw_queue *q[SCMI_RAW_MAX_QUEUE];
179 struct xarray chans_q;
180 struct list_head free_waiters;
181 /* Protect free_waiters list */
182 struct mutex free_mtx;
183 struct list_head active_waiters;
184 /* Protect active_waiters list */
185 struct mutex active_mtx;
186 struct work_struct waiters_work;
187 struct workqueue_struct *wait_wq;
188 struct dentry *dentry;
189 void *gid;
190 };
191
192 /**
193 * struct scmi_xfer_raw_waiter - Structure to describe an xfer to be waited for
194 *
195 * @start_jiffies: The timestamp in jiffies of when this structure was queued.
196 * @cinfo: A reference to the channel to use for this transaction
197 * @xfer: A reference to the xfer to be waited for
198 * @async_response: A completion to be, optionally, used for async waits: it
199 * will be setup by @scmi_do_xfer_raw_start, if needed, to be
200 * pointed at by xfer->async_done.
201 * @node: A list node.
202 */
203 struct scmi_xfer_raw_waiter {
204 unsigned long start_jiffies;
205 struct scmi_chan_info *cinfo;
206 struct scmi_xfer *xfer;
207 struct completion async_response;
208 struct list_head node;
209 };
210
211 /**
212 * struct scmi_raw_buffer - Structure to hold a full SCMI message
213 *
214 * @max_len: The maximum allowed message size (header included) that can be
215 * stored into @msg
216 * @msg: A message buffer used to collect a full message grabbed from an xfer.
217 * @node: A list node.
218 */
219 struct scmi_raw_buffer {
220 size_t max_len;
221 struct scmi_msg msg;
222 struct list_head node;
223 };
224
225 /**
226 * struct scmi_dbg_raw_data - Structure holding data needed by the debugfs
227 * layer
228 *
229 * @chan_id: The preferred channel to use: if zero the channel is automatically
230 * selected based on protocol.
231 * @raw: A reference to the Raw instance.
232 * @tx: A message buffer used to collect TX message on write.
233 * @tx_size: The effective size of the TX message.
234 * @tx_req_size: The final expected size of the complete TX message.
235 * @rx: A message buffer to collect RX message on read.
236 * @rx_size: The effective size of the RX message.
237 */
238 struct scmi_dbg_raw_data {
239 u8 chan_id;
240 struct scmi_raw_mode_info *raw;
241 struct scmi_msg tx;
242 size_t tx_size;
243 size_t tx_req_size;
244 struct scmi_msg rx;
245 size_t rx_size;
246 };
247
248 static struct scmi_raw_queue *
scmi_raw_queue_select(struct scmi_raw_mode_info * raw,unsigned int idx,unsigned int chan_id)249 scmi_raw_queue_select(struct scmi_raw_mode_info *raw, unsigned int idx,
250 unsigned int chan_id)
251 {
252 if (!chan_id)
253 return raw->q[idx];
254
255 return xa_load(&raw->chans_q, chan_id);
256 }
257
scmi_raw_buffer_get(struct scmi_raw_queue * q)258 static struct scmi_raw_buffer *scmi_raw_buffer_get(struct scmi_raw_queue *q)
259 {
260 unsigned long flags;
261 struct scmi_raw_buffer *rb = NULL;
262 struct list_head *head = &q->free_bufs;
263
264 spin_lock_irqsave(&q->free_bufs_lock, flags);
265 if (!list_empty(head)) {
266 rb = list_first_entry(head, struct scmi_raw_buffer, node);
267 list_del_init(&rb->node);
268 }
269 spin_unlock_irqrestore(&q->free_bufs_lock, flags);
270
271 return rb;
272 }
273
scmi_raw_buffer_put(struct scmi_raw_queue * q,struct scmi_raw_buffer * rb)274 static void scmi_raw_buffer_put(struct scmi_raw_queue *q,
275 struct scmi_raw_buffer *rb)
276 {
277 unsigned long flags;
278
279 /* Reset to full buffer length */
280 rb->msg.len = rb->max_len;
281
282 spin_lock_irqsave(&q->free_bufs_lock, flags);
283 list_add_tail(&rb->node, &q->free_bufs);
284 spin_unlock_irqrestore(&q->free_bufs_lock, flags);
285 }
286
scmi_raw_buffer_enqueue(struct scmi_raw_queue * q,struct scmi_raw_buffer * rb)287 static void scmi_raw_buffer_enqueue(struct scmi_raw_queue *q,
288 struct scmi_raw_buffer *rb)
289 {
290 unsigned long flags;
291
292 spin_lock_irqsave(&q->msg_q_lock, flags);
293 list_add_tail(&rb->node, &q->msg_q);
294 spin_unlock_irqrestore(&q->msg_q_lock, flags);
295
296 wake_up_interruptible(&q->wq);
297 }
298
299 static struct scmi_raw_buffer*
scmi_raw_buffer_dequeue_unlocked(struct scmi_raw_queue * q)300 scmi_raw_buffer_dequeue_unlocked(struct scmi_raw_queue *q)
301 {
302 struct scmi_raw_buffer *rb = NULL;
303
304 if (!list_empty(&q->msg_q)) {
305 rb = list_first_entry(&q->msg_q, struct scmi_raw_buffer, node);
306 list_del_init(&rb->node);
307 }
308
309 return rb;
310 }
311
scmi_raw_buffer_dequeue(struct scmi_raw_queue * q)312 static struct scmi_raw_buffer *scmi_raw_buffer_dequeue(struct scmi_raw_queue *q)
313 {
314 unsigned long flags;
315 struct scmi_raw_buffer *rb;
316
317 spin_lock_irqsave(&q->msg_q_lock, flags);
318 rb = scmi_raw_buffer_dequeue_unlocked(q);
319 spin_unlock_irqrestore(&q->msg_q_lock, flags);
320
321 return rb;
322 }
323
scmi_raw_buffer_queue_flush(struct scmi_raw_queue * q)324 static void scmi_raw_buffer_queue_flush(struct scmi_raw_queue *q)
325 {
326 struct scmi_raw_buffer *rb;
327
328 do {
329 rb = scmi_raw_buffer_dequeue(q);
330 if (rb)
331 scmi_raw_buffer_put(q, rb);
332 } while (rb);
333 }
334
335 static struct scmi_xfer_raw_waiter *
scmi_xfer_raw_waiter_get(struct scmi_raw_mode_info * raw,struct scmi_xfer * xfer,struct scmi_chan_info * cinfo,bool async)336 scmi_xfer_raw_waiter_get(struct scmi_raw_mode_info *raw, struct scmi_xfer *xfer,
337 struct scmi_chan_info *cinfo, bool async)
338 {
339 struct scmi_xfer_raw_waiter *rw = NULL;
340
341 mutex_lock(&raw->free_mtx);
342 if (!list_empty(&raw->free_waiters)) {
343 rw = list_first_entry(&raw->free_waiters,
344 struct scmi_xfer_raw_waiter, node);
345 list_del_init(&rw->node);
346
347 if (async) {
348 reinit_completion(&rw->async_response);
349 xfer->async_done = &rw->async_response;
350 }
351
352 rw->cinfo = cinfo;
353 rw->xfer = xfer;
354 }
355 mutex_unlock(&raw->free_mtx);
356
357 return rw;
358 }
359
scmi_xfer_raw_waiter_put(struct scmi_raw_mode_info * raw,struct scmi_xfer_raw_waiter * rw)360 static void scmi_xfer_raw_waiter_put(struct scmi_raw_mode_info *raw,
361 struct scmi_xfer_raw_waiter *rw)
362 {
363 if (rw->xfer) {
364 rw->xfer->async_done = NULL;
365 rw->xfer = NULL;
366 }
367
368 mutex_lock(&raw->free_mtx);
369 list_add_tail(&rw->node, &raw->free_waiters);
370 mutex_unlock(&raw->free_mtx);
371 }
372
scmi_xfer_raw_waiter_enqueue(struct scmi_raw_mode_info * raw,struct scmi_xfer_raw_waiter * rw)373 static void scmi_xfer_raw_waiter_enqueue(struct scmi_raw_mode_info *raw,
374 struct scmi_xfer_raw_waiter *rw)
375 {
376 /* A timestamp for the deferred worker to know how much this has aged */
377 rw->start_jiffies = jiffies;
378
379 trace_scmi_xfer_response_wait(rw->xfer->transfer_id, rw->xfer->hdr.id,
380 rw->xfer->hdr.protocol_id,
381 rw->xfer->hdr.seq,
382 raw->desc->max_rx_timeout_ms,
383 rw->xfer->hdr.poll_completion);
384
385 mutex_lock(&raw->active_mtx);
386 list_add_tail(&rw->node, &raw->active_waiters);
387 mutex_unlock(&raw->active_mtx);
388
389 /* kick waiter work */
390 queue_work(raw->wait_wq, &raw->waiters_work);
391 }
392
393 static struct scmi_xfer_raw_waiter *
scmi_xfer_raw_waiter_dequeue(struct scmi_raw_mode_info * raw)394 scmi_xfer_raw_waiter_dequeue(struct scmi_raw_mode_info *raw)
395 {
396 struct scmi_xfer_raw_waiter *rw = NULL;
397
398 mutex_lock(&raw->active_mtx);
399 if (!list_empty(&raw->active_waiters)) {
400 rw = list_first_entry(&raw->active_waiters,
401 struct scmi_xfer_raw_waiter, node);
402 list_del_init(&rw->node);
403 }
404 mutex_unlock(&raw->active_mtx);
405
406 return rw;
407 }
408
409 /**
410 * scmi_xfer_raw_worker - Work function to wait for Raw xfers completions
411 *
412 * @work: A reference to the work.
413 *
414 * In SCMI Raw mode, once a user-provided injected SCMI message is sent, we
415 * cannot wait to receive its response (if any) in the context of the injection
416 * routines so as not to leave the userspace write syscall, which delivered the
417 * SCMI message to send, pending till eventually a reply is received.
418 * Userspace should and will poll/wait instead on the read syscalls which will
419 * be in charge of reading a received reply (if any).
420 *
421 * Even though reply messages are collected and reported into the SCMI Raw layer
422 * on the RX path, nonetheless we have to properly wait for their completion as
423 * usual (and async_completion too if needed) in order to properly release the
424 * xfer structure at the end: to do this out of the context of the write/send
425 * these waiting jobs are delegated to this deferred worker.
426 *
427 * Any sent xfer, to be waited for, is timestamped and queued for later
428 * consumption by this worker: queue aging is accounted for while choosing a
429 * timeout for the completion, BUT we do not really care here if we end up
430 * accidentally waiting for a bit too long.
431 */
scmi_xfer_raw_worker(struct work_struct * work)432 static void scmi_xfer_raw_worker(struct work_struct *work)
433 {
434 struct scmi_raw_mode_info *raw;
435 struct device *dev;
436 unsigned long max_tmo;
437
438 raw = container_of(work, struct scmi_raw_mode_info, waiters_work);
439 dev = raw->handle->dev;
440 max_tmo = msecs_to_jiffies(raw->desc->max_rx_timeout_ms);
441
442 do {
443 int ret = 0;
444 unsigned int timeout_ms;
445 unsigned long aging;
446 struct scmi_xfer *xfer;
447 struct scmi_xfer_raw_waiter *rw;
448 struct scmi_chan_info *cinfo;
449
450 rw = scmi_xfer_raw_waiter_dequeue(raw);
451 if (!rw)
452 return;
453
454 cinfo = rw->cinfo;
455 xfer = rw->xfer;
456 /*
457 * Waiters are queued by wait-deadline at the end, so some of
458 * them could have been already expired when processed, BUT we
459 * have to check the completion status anyway just in case a
460 * virtually expired (aged) transaction was indeed completed
461 * fine and we'll have to wait for the asynchronous part (if
462 * any): for this reason a 1 ms timeout is used for already
463 * expired/aged xfers.
464 */
465 aging = jiffies - rw->start_jiffies;
466 timeout_ms = max_tmo > aging ?
467 jiffies_to_msecs(max_tmo - aging) : 1;
468
469 ret = scmi_xfer_raw_wait_for_message_response(cinfo, xfer,
470 timeout_ms);
471 if (!ret && xfer->hdr.status)
472 ret = scmi_to_linux_errno(xfer->hdr.status);
473
474 if (raw->desc->ops->mark_txdone)
475 raw->desc->ops->mark_txdone(rw->cinfo, ret, xfer);
476
477 trace_scmi_xfer_end(xfer->transfer_id, xfer->hdr.id,
478 xfer->hdr.protocol_id, xfer->hdr.seq, ret);
479
480 /* Wait also for an async delayed response if needed */
481 if (!ret && xfer->async_done) {
482 unsigned long tmo = msecs_to_jiffies(SCMI_MAX_RESPONSE_TIMEOUT);
483
484 if (!wait_for_completion_timeout(xfer->async_done, tmo))
485 dev_err(dev,
486 "timed out in RAW delayed resp - HDR:%08X\n",
487 pack_scmi_header(&xfer->hdr));
488 }
489
490 /* Release waiter and xfer */
491 scmi_xfer_raw_put(raw->handle, xfer);
492 scmi_xfer_raw_waiter_put(raw, rw);
493 } while (1);
494 }
495
scmi_xfer_raw_reset(struct scmi_raw_mode_info * raw)496 static void scmi_xfer_raw_reset(struct scmi_raw_mode_info *raw)
497 {
498 int i;
499
500 dev_info(raw->handle->dev, "Resetting SCMI Raw stack.\n");
501
502 for (i = 0; i < SCMI_RAW_MAX_QUEUE; i++)
503 scmi_raw_buffer_queue_flush(raw->q[i]);
504 }
505
506 /**
507 * scmi_xfer_raw_get_init - An helper to build a valid xfer from the provided
508 * bare SCMI message.
509 *
510 * @raw: A reference to the Raw instance.
511 * @buf: A buffer containing the whole SCMI message to send (including the
512 * header) in little-endian binary formmat.
513 * @len: Length of the message in @buf.
514 * @p: A pointer to return the initialized Raw xfer.
515 *
516 * After an xfer is picked from the TX pool and filled in with the message
517 * content, the xfer is registered as pending with the core in the usual way
518 * using the original sequence number provided by the user with the message.
519 *
520 * Note that, in case the testing user application is NOT using distinct
521 * sequence-numbers between successive SCMI messages such registration could
522 * fail temporarily if the previous message, using the same sequence number,
523 * had still not released; in such a case we just wait and retry.
524 *
525 * Return: 0 on Success
526 */
scmi_xfer_raw_get_init(struct scmi_raw_mode_info * raw,void * buf,size_t len,struct scmi_xfer ** p)527 static int scmi_xfer_raw_get_init(struct scmi_raw_mode_info *raw, void *buf,
528 size_t len, struct scmi_xfer **p)
529 {
530 u32 msg_hdr;
531 size_t tx_size;
532 struct scmi_xfer *xfer;
533 int ret, retry = SCMI_XFER_RAW_MAX_RETRIES;
534 struct device *dev = raw->handle->dev;
535
536 if (!buf || len < sizeof(u32))
537 return -EINVAL;
538
539 tx_size = len - sizeof(u32);
540 /* Ensure we have sane transfer sizes */
541 if (tx_size > raw->desc->max_msg_size)
542 return -ERANGE;
543
544 xfer = scmi_xfer_raw_get(raw->handle);
545 if (IS_ERR(xfer)) {
546 dev_warn(dev, "RAW - Cannot get a free RAW xfer !\n");
547 return PTR_ERR(xfer);
548 }
549
550 /* Build xfer from the provided SCMI bare LE message */
551 msg_hdr = le32_to_cpu(*((__le32 *)buf));
552 unpack_scmi_header(msg_hdr, &xfer->hdr);
553 xfer->hdr.seq = (u16)MSG_XTRACT_TOKEN(msg_hdr);
554 /* Polling not supported */
555 xfer->hdr.poll_completion = false;
556 xfer->hdr.status = SCMI_SUCCESS;
557 xfer->tx.len = tx_size;
558 xfer->rx.len = raw->desc->max_msg_size;
559 /* Clear the whole TX buffer */
560 memset(xfer->tx.buf, 0x00, raw->desc->max_msg_size);
561 if (xfer->tx.len)
562 memcpy(xfer->tx.buf, (u8 *)buf + sizeof(msg_hdr), xfer->tx.len);
563 *p = xfer;
564
565 /*
566 * In flight registration can temporarily fail in case of Raw messages
567 * if the user injects messages without using monotonically increasing
568 * sequence numbers since, in Raw mode, the xfer (and the token) is
569 * finally released later by a deferred worker. Just retry for a while.
570 */
571 do {
572 ret = scmi_xfer_raw_inflight_register(raw->handle, xfer);
573 if (ret) {
574 dev_dbg(dev,
575 "...retrying[%d] inflight registration\n",
576 retry);
577 msleep(raw->desc->max_rx_timeout_ms /
578 SCMI_XFER_RAW_MAX_RETRIES);
579 }
580 } while (ret && --retry);
581
582 if (ret) {
583 dev_warn(dev,
584 "RAW - Could NOT register xfer %d in-flight HDR:0x%08X\n",
585 xfer->hdr.seq, msg_hdr);
586 scmi_xfer_raw_put(raw->handle, xfer);
587 }
588
589 return ret;
590 }
591
592 /**
593 * scmi_do_xfer_raw_start - An helper to send a valid raw xfer
594 *
595 * @raw: A reference to the Raw instance.
596 * @xfer: The xfer to send
597 * @chan_id: The channel ID to use, if zero the channels is automatically
598 * selected based on the protocol used.
599 * @async: A flag stating if an asynchronous command is required.
600 *
601 * This function send a previously built raw xfer using an appropriate channel
602 * and queues the related waiting work.
603 *
604 * Note that we need to know explicitly if the required command is meant to be
605 * asynchronous in kind since we have to properly setup the waiter.
606 * (and deducing this from the payload is weak and do not scale given there is
607 * NOT a common header-flag stating if the command is asynchronous or not)
608 *
609 * Return: 0 on Success
610 */
scmi_do_xfer_raw_start(struct scmi_raw_mode_info * raw,struct scmi_xfer * xfer,u8 chan_id,bool async)611 static int scmi_do_xfer_raw_start(struct scmi_raw_mode_info *raw,
612 struct scmi_xfer *xfer, u8 chan_id,
613 bool async)
614 {
615 int ret;
616 struct scmi_chan_info *cinfo;
617 struct scmi_xfer_raw_waiter *rw;
618 struct device *dev = raw->handle->dev;
619
620 if (!chan_id)
621 chan_id = xfer->hdr.protocol_id;
622 else
623 xfer->flags |= SCMI_XFER_FLAG_CHAN_SET;
624
625 cinfo = scmi_xfer_raw_channel_get(raw->handle, chan_id);
626 if (IS_ERR(cinfo))
627 return PTR_ERR(cinfo);
628
629 rw = scmi_xfer_raw_waiter_get(raw, xfer, cinfo, async);
630 if (!rw) {
631 dev_warn(dev, "RAW - Cannot get a free waiter !\n");
632 return -ENOMEM;
633 }
634
635 /* True ONLY if also supported by transport. */
636 if (is_polling_enabled(cinfo, raw->desc))
637 xfer->hdr.poll_completion = true;
638
639 reinit_completion(&xfer->done);
640 /* Make sure xfer state update is visible before sending */
641 smp_store_mb(xfer->state, SCMI_XFER_SENT_OK);
642
643 trace_scmi_xfer_begin(xfer->transfer_id, xfer->hdr.id,
644 xfer->hdr.protocol_id, xfer->hdr.seq,
645 xfer->hdr.poll_completion);
646
647 ret = raw->desc->ops->send_message(rw->cinfo, xfer);
648 if (ret) {
649 dev_err(dev, "Failed to send RAW message %d\n", ret);
650 scmi_xfer_raw_waiter_put(raw, rw);
651 return ret;
652 }
653
654 trace_scmi_msg_dump(raw->id, cinfo->id, xfer->hdr.protocol_id,
655 xfer->hdr.id, "cmnd", xfer->hdr.seq,
656 xfer->hdr.status,
657 xfer->tx.buf, xfer->tx.len);
658
659 scmi_xfer_raw_waiter_enqueue(raw, rw);
660
661 return ret;
662 }
663
664 /**
665 * scmi_raw_message_send - An helper to build and send an SCMI command using
666 * the provided SCMI bare message buffer
667 *
668 * @raw: A reference to the Raw instance.
669 * @buf: A buffer containing the whole SCMI message to send (including the
670 * header) in little-endian binary format.
671 * @len: Length of the message in @buf.
672 * @chan_id: The channel ID to use.
673 * @async: A flag stating if an asynchronous command is required.
674 *
675 * Return: 0 on Success
676 */
scmi_raw_message_send(struct scmi_raw_mode_info * raw,void * buf,size_t len,u8 chan_id,bool async)677 static int scmi_raw_message_send(struct scmi_raw_mode_info *raw,
678 void *buf, size_t len, u8 chan_id, bool async)
679 {
680 int ret;
681 struct scmi_xfer *xfer;
682
683 ret = scmi_xfer_raw_get_init(raw, buf, len, &xfer);
684 if (ret)
685 return ret;
686
687 ret = scmi_do_xfer_raw_start(raw, xfer, chan_id, async);
688 if (ret)
689 scmi_xfer_raw_put(raw->handle, xfer);
690
691 return ret;
692 }
693
694 static struct scmi_raw_buffer *
scmi_raw_message_dequeue(struct scmi_raw_queue * q,bool o_nonblock)695 scmi_raw_message_dequeue(struct scmi_raw_queue *q, bool o_nonblock)
696 {
697 unsigned long flags;
698 struct scmi_raw_buffer *rb;
699
700 spin_lock_irqsave(&q->msg_q_lock, flags);
701 while (list_empty(&q->msg_q)) {
702 spin_unlock_irqrestore(&q->msg_q_lock, flags);
703
704 if (o_nonblock)
705 return ERR_PTR(-EAGAIN);
706
707 if (wait_event_interruptible(q->wq, !list_empty(&q->msg_q)))
708 return ERR_PTR(-ERESTARTSYS);
709
710 spin_lock_irqsave(&q->msg_q_lock, flags);
711 }
712
713 rb = scmi_raw_buffer_dequeue_unlocked(q);
714
715 spin_unlock_irqrestore(&q->msg_q_lock, flags);
716
717 return rb;
718 }
719
720 /**
721 * scmi_raw_message_receive - An helper to dequeue and report the next
722 * available enqueued raw message payload that has been collected.
723 *
724 * @raw: A reference to the Raw instance.
725 * @buf: A buffer to get hold of the whole SCMI message received and represented
726 * in little-endian binary format.
727 * @len: Length of @buf.
728 * @size: The effective size of the message copied into @buf
729 * @idx: The index of the queue to pick the next queued message from.
730 * @chan_id: The channel ID to use.
731 * @o_nonblock: A flag to request a non-blocking message dequeue.
732 *
733 * Return: 0 on Success
734 */
scmi_raw_message_receive(struct scmi_raw_mode_info * raw,void * buf,size_t len,size_t * size,unsigned int idx,unsigned int chan_id,bool o_nonblock)735 static int scmi_raw_message_receive(struct scmi_raw_mode_info *raw,
736 void *buf, size_t len, size_t *size,
737 unsigned int idx, unsigned int chan_id,
738 bool o_nonblock)
739 {
740 int ret = 0;
741 struct scmi_raw_buffer *rb;
742 struct scmi_raw_queue *q;
743
744 q = scmi_raw_queue_select(raw, idx, chan_id);
745 if (!q)
746 return -ENODEV;
747
748 rb = scmi_raw_message_dequeue(q, o_nonblock);
749 if (IS_ERR(rb)) {
750 dev_dbg(raw->handle->dev, "RAW - No message available!\n");
751 return PTR_ERR(rb);
752 }
753
754 if (rb->msg.len <= len) {
755 memcpy(buf, rb->msg.buf, rb->msg.len);
756 *size = rb->msg.len;
757 } else {
758 ret = -ENOSPC;
759 }
760
761 scmi_raw_buffer_put(q, rb);
762
763 return ret;
764 }
765
766 /* SCMI Raw debugfs helpers */
767
scmi_dbg_raw_mode_common_read(struct file * filp,char __user * buf,size_t count,loff_t * ppos,unsigned int idx)768 static ssize_t scmi_dbg_raw_mode_common_read(struct file *filp,
769 char __user *buf,
770 size_t count, loff_t *ppos,
771 unsigned int idx)
772 {
773 ssize_t cnt;
774 struct scmi_dbg_raw_data *rd = filp->private_data;
775
776 if (!rd->rx_size) {
777 int ret;
778
779 ret = scmi_raw_message_receive(rd->raw, rd->rx.buf, rd->rx.len,
780 &rd->rx_size, idx, rd->chan_id,
781 filp->f_flags & O_NONBLOCK);
782 if (ret) {
783 rd->rx_size = 0;
784 return ret;
785 }
786
787 /* Reset any previous filepos change, including writes */
788 *ppos = 0;
789 } else if (*ppos == rd->rx_size) {
790 /* Return EOF once all the message has been read-out */
791 rd->rx_size = 0;
792 return 0;
793 }
794
795 cnt = simple_read_from_buffer(buf, count, ppos,
796 rd->rx.buf, rd->rx_size);
797
798 return cnt;
799 }
800
scmi_dbg_raw_mode_common_write(struct file * filp,const char __user * buf,size_t count,loff_t * ppos,bool async)801 static ssize_t scmi_dbg_raw_mode_common_write(struct file *filp,
802 const char __user *buf,
803 size_t count, loff_t *ppos,
804 bool async)
805 {
806 int ret;
807 struct scmi_dbg_raw_data *rd = filp->private_data;
808
809 if (count > rd->tx.len - rd->tx_size)
810 return -ENOSPC;
811
812 /* On first write attempt @count carries the total full message size. */
813 if (!rd->tx_size)
814 rd->tx_req_size = count;
815
816 /*
817 * Gather a full message, possibly across multiple interrupted wrrtes,
818 * before sending it with a single RAW xfer.
819 */
820 if (rd->tx_size < rd->tx_req_size) {
821 size_t cnt;
822
823 cnt = simple_write_to_buffer(rd->tx.buf, rd->tx.len, ppos,
824 buf, count);
825 rd->tx_size += cnt;
826 if (cnt < count)
827 return cnt;
828 }
829
830 ret = scmi_raw_message_send(rd->raw, rd->tx.buf, rd->tx_size,
831 rd->chan_id, async);
832
833 /* Reset ppos for next message ... */
834 rd->tx_size = 0;
835 *ppos = 0;
836
837 return ret ?: count;
838 }
839
scmi_test_dbg_raw_common_poll(struct file * filp,struct poll_table_struct * wait,unsigned int idx)840 static __poll_t scmi_test_dbg_raw_common_poll(struct file *filp,
841 struct poll_table_struct *wait,
842 unsigned int idx)
843 {
844 unsigned long flags;
845 struct scmi_dbg_raw_data *rd = filp->private_data;
846 struct scmi_raw_queue *q;
847 __poll_t mask = 0;
848
849 q = scmi_raw_queue_select(rd->raw, idx, rd->chan_id);
850 if (!q)
851 return mask;
852
853 poll_wait(filp, &q->wq, wait);
854
855 spin_lock_irqsave(&q->msg_q_lock, flags);
856 if (!list_empty(&q->msg_q))
857 mask = EPOLLIN | EPOLLRDNORM;
858 spin_unlock_irqrestore(&q->msg_q_lock, flags);
859
860 return mask;
861 }
862
scmi_dbg_raw_mode_message_read(struct file * filp,char __user * buf,size_t count,loff_t * ppos)863 static ssize_t scmi_dbg_raw_mode_message_read(struct file *filp,
864 char __user *buf,
865 size_t count, loff_t *ppos)
866 {
867 return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
868 SCMI_RAW_REPLY_QUEUE);
869 }
870
scmi_dbg_raw_mode_message_write(struct file * filp,const char __user * buf,size_t count,loff_t * ppos)871 static ssize_t scmi_dbg_raw_mode_message_write(struct file *filp,
872 const char __user *buf,
873 size_t count, loff_t *ppos)
874 {
875 return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos, false);
876 }
877
scmi_dbg_raw_mode_message_poll(struct file * filp,struct poll_table_struct * wait)878 static __poll_t scmi_dbg_raw_mode_message_poll(struct file *filp,
879 struct poll_table_struct *wait)
880 {
881 return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_REPLY_QUEUE);
882 }
883
scmi_dbg_raw_mode_open(struct inode * inode,struct file * filp)884 static int scmi_dbg_raw_mode_open(struct inode *inode, struct file *filp)
885 {
886 u8 id;
887 struct scmi_raw_mode_info *raw;
888 struct scmi_dbg_raw_data *rd;
889 const char *id_str = filp->f_path.dentry->d_parent->d_name.name;
890
891 if (!inode->i_private)
892 return -ENODEV;
893
894 raw = inode->i_private;
895 rd = kzalloc(sizeof(*rd), GFP_KERNEL);
896 if (!rd)
897 return -ENOMEM;
898
899 rd->rx.len = raw->desc->max_msg_size + sizeof(u32);
900 rd->rx.buf = kzalloc(rd->rx.len, GFP_KERNEL);
901 if (!rd->rx.buf) {
902 kfree(rd);
903 return -ENOMEM;
904 }
905
906 rd->tx.len = raw->desc->max_msg_size + sizeof(u32);
907 rd->tx.buf = kzalloc(rd->tx.len, GFP_KERNEL);
908 if (!rd->tx.buf) {
909 kfree(rd->rx.buf);
910 kfree(rd);
911 return -ENOMEM;
912 }
913
914 /* Grab channel ID from debugfs entry naming if any */
915 if (!kstrtou8(id_str, 16, &id))
916 rd->chan_id = id;
917
918 rd->raw = raw;
919 filp->private_data = rd;
920
921 return 0;
922 }
923
scmi_dbg_raw_mode_release(struct inode * inode,struct file * filp)924 static int scmi_dbg_raw_mode_release(struct inode *inode, struct file *filp)
925 {
926 struct scmi_dbg_raw_data *rd = filp->private_data;
927
928 kfree(rd->rx.buf);
929 kfree(rd->tx.buf);
930 kfree(rd);
931
932 return 0;
933 }
934
scmi_dbg_raw_mode_reset_write(struct file * filp,const char __user * buf,size_t count,loff_t * ppos)935 static ssize_t scmi_dbg_raw_mode_reset_write(struct file *filp,
936 const char __user *buf,
937 size_t count, loff_t *ppos)
938 {
939 struct scmi_dbg_raw_data *rd = filp->private_data;
940
941 scmi_xfer_raw_reset(rd->raw);
942
943 return count;
944 }
945
946 static const struct file_operations scmi_dbg_raw_mode_reset_fops = {
947 .open = scmi_dbg_raw_mode_open,
948 .release = scmi_dbg_raw_mode_release,
949 .write = scmi_dbg_raw_mode_reset_write,
950 .owner = THIS_MODULE,
951 };
952
953 static const struct file_operations scmi_dbg_raw_mode_message_fops = {
954 .open = scmi_dbg_raw_mode_open,
955 .release = scmi_dbg_raw_mode_release,
956 .read = scmi_dbg_raw_mode_message_read,
957 .write = scmi_dbg_raw_mode_message_write,
958 .poll = scmi_dbg_raw_mode_message_poll,
959 .owner = THIS_MODULE,
960 };
961
scmi_dbg_raw_mode_message_async_write(struct file * filp,const char __user * buf,size_t count,loff_t * ppos)962 static ssize_t scmi_dbg_raw_mode_message_async_write(struct file *filp,
963 const char __user *buf,
964 size_t count, loff_t *ppos)
965 {
966 return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos, true);
967 }
968
969 static const struct file_operations scmi_dbg_raw_mode_message_async_fops = {
970 .open = scmi_dbg_raw_mode_open,
971 .release = scmi_dbg_raw_mode_release,
972 .read = scmi_dbg_raw_mode_message_read,
973 .write = scmi_dbg_raw_mode_message_async_write,
974 .poll = scmi_dbg_raw_mode_message_poll,
975 .owner = THIS_MODULE,
976 };
977
scmi_test_dbg_raw_mode_notif_read(struct file * filp,char __user * buf,size_t count,loff_t * ppos)978 static ssize_t scmi_test_dbg_raw_mode_notif_read(struct file *filp,
979 char __user *buf,
980 size_t count, loff_t *ppos)
981 {
982 return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
983 SCMI_RAW_NOTIF_QUEUE);
984 }
985
986 static __poll_t
scmi_test_dbg_raw_mode_notif_poll(struct file * filp,struct poll_table_struct * wait)987 scmi_test_dbg_raw_mode_notif_poll(struct file *filp,
988 struct poll_table_struct *wait)
989 {
990 return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_NOTIF_QUEUE);
991 }
992
993 static const struct file_operations scmi_dbg_raw_mode_notification_fops = {
994 .open = scmi_dbg_raw_mode_open,
995 .release = scmi_dbg_raw_mode_release,
996 .read = scmi_test_dbg_raw_mode_notif_read,
997 .poll = scmi_test_dbg_raw_mode_notif_poll,
998 .owner = THIS_MODULE,
999 };
1000
scmi_test_dbg_raw_mode_errors_read(struct file * filp,char __user * buf,size_t count,loff_t * ppos)1001 static ssize_t scmi_test_dbg_raw_mode_errors_read(struct file *filp,
1002 char __user *buf,
1003 size_t count, loff_t *ppos)
1004 {
1005 return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
1006 SCMI_RAW_ERRS_QUEUE);
1007 }
1008
1009 static __poll_t
scmi_test_dbg_raw_mode_errors_poll(struct file * filp,struct poll_table_struct * wait)1010 scmi_test_dbg_raw_mode_errors_poll(struct file *filp,
1011 struct poll_table_struct *wait)
1012 {
1013 return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_ERRS_QUEUE);
1014 }
1015
1016 static const struct file_operations scmi_dbg_raw_mode_errors_fops = {
1017 .open = scmi_dbg_raw_mode_open,
1018 .release = scmi_dbg_raw_mode_release,
1019 .read = scmi_test_dbg_raw_mode_errors_read,
1020 .poll = scmi_test_dbg_raw_mode_errors_poll,
1021 .owner = THIS_MODULE,
1022 };
1023
1024 static struct scmi_raw_queue *
scmi_raw_queue_init(struct scmi_raw_mode_info * raw)1025 scmi_raw_queue_init(struct scmi_raw_mode_info *raw)
1026 {
1027 int i;
1028 struct scmi_raw_buffer *rb;
1029 struct device *dev = raw->handle->dev;
1030 struct scmi_raw_queue *q;
1031
1032 q = devm_kzalloc(dev, sizeof(*q), GFP_KERNEL);
1033 if (!q)
1034 return ERR_PTR(-ENOMEM);
1035
1036 rb = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rb), GFP_KERNEL);
1037 if (!rb)
1038 return ERR_PTR(-ENOMEM);
1039
1040 spin_lock_init(&q->free_bufs_lock);
1041 INIT_LIST_HEAD(&q->free_bufs);
1042 for (i = 0; i < raw->tx_max_msg; i++, rb++) {
1043 rb->max_len = raw->desc->max_msg_size + sizeof(u32);
1044 rb->msg.buf = devm_kzalloc(dev, rb->max_len, GFP_KERNEL);
1045 if (!rb->msg.buf)
1046 return ERR_PTR(-ENOMEM);
1047 scmi_raw_buffer_put(q, rb);
1048 }
1049
1050 spin_lock_init(&q->msg_q_lock);
1051 INIT_LIST_HEAD(&q->msg_q);
1052 init_waitqueue_head(&q->wq);
1053
1054 return q;
1055 }
1056
scmi_xfer_raw_worker_init(struct scmi_raw_mode_info * raw)1057 static int scmi_xfer_raw_worker_init(struct scmi_raw_mode_info *raw)
1058 {
1059 int i;
1060 struct scmi_xfer_raw_waiter *rw;
1061 struct device *dev = raw->handle->dev;
1062
1063 rw = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rw), GFP_KERNEL);
1064 if (!rw)
1065 return -ENOMEM;
1066
1067 raw->wait_wq = alloc_workqueue("scmi-raw-wait-wq-%d",
1068 WQ_UNBOUND | WQ_FREEZABLE |
1069 WQ_HIGHPRI, WQ_SYSFS, raw->id);
1070 if (!raw->wait_wq)
1071 return -ENOMEM;
1072
1073 mutex_init(&raw->free_mtx);
1074 INIT_LIST_HEAD(&raw->free_waiters);
1075 mutex_init(&raw->active_mtx);
1076 INIT_LIST_HEAD(&raw->active_waiters);
1077
1078 for (i = 0; i < raw->tx_max_msg; i++, rw++) {
1079 init_completion(&rw->async_response);
1080 scmi_xfer_raw_waiter_put(raw, rw);
1081 }
1082 INIT_WORK(&raw->waiters_work, scmi_xfer_raw_worker);
1083
1084 return 0;
1085 }
1086
scmi_raw_mode_setup(struct scmi_raw_mode_info * raw,u8 * channels,int num_chans)1087 static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw,
1088 u8 *channels, int num_chans)
1089 {
1090 int ret, idx;
1091 void *gid;
1092 struct device *dev = raw->handle->dev;
1093
1094 gid = devres_open_group(dev, NULL, GFP_KERNEL);
1095 if (!gid)
1096 return -ENOMEM;
1097
1098 for (idx = 0; idx < SCMI_RAW_MAX_QUEUE; idx++) {
1099 raw->q[idx] = scmi_raw_queue_init(raw);
1100 if (IS_ERR(raw->q[idx])) {
1101 ret = PTR_ERR(raw->q[idx]);
1102 goto err;
1103 }
1104 }
1105
1106 xa_init(&raw->chans_q);
1107 if (num_chans > 1) {
1108 int i;
1109
1110 for (i = 0; i < num_chans; i++) {
1111 void *xret;
1112 struct scmi_raw_queue *q;
1113
1114 q = scmi_raw_queue_init(raw);
1115 if (IS_ERR(q)) {
1116 ret = PTR_ERR(q);
1117 goto err_xa;
1118 }
1119
1120 xret = xa_store(&raw->chans_q, channels[i], q,
1121 GFP_KERNEL);
1122 if (xa_err(xret)) {
1123 dev_err(dev,
1124 "Fail to allocate Raw queue 0x%02X\n",
1125 channels[i]);
1126 ret = xa_err(xret);
1127 goto err_xa;
1128 }
1129 }
1130 }
1131
1132 ret = scmi_xfer_raw_worker_init(raw);
1133 if (ret)
1134 goto err_xa;
1135
1136 devres_close_group(dev, gid);
1137 raw->gid = gid;
1138
1139 return 0;
1140
1141 err_xa:
1142 xa_destroy(&raw->chans_q);
1143 err:
1144 devres_release_group(dev, gid);
1145 return ret;
1146 }
1147
1148 /**
1149 * scmi_raw_mode_init - Function to initialize the SCMI Raw stack
1150 *
1151 * @handle: Pointer to SCMI entity handle
1152 * @top_dentry: A reference to the top Raw debugfs dentry
1153 * @instance_id: The ID of the underlying SCMI platform instance represented by
1154 * this Raw instance
1155 * @channels: The list of the existing channels
1156 * @num_chans: The number of entries in @channels
1157 * @desc: Reference to the transport operations
1158 * @tx_max_msg: Max number of in-flight messages allowed by the transport
1159 *
1160 * This function prepare the SCMI Raw stack and creates the debugfs API.
1161 *
1162 * Return: An opaque handle to the Raw instance on Success, an ERR_PTR otherwise
1163 */
scmi_raw_mode_init(const struct scmi_handle * handle,struct dentry * top_dentry,int instance_id,u8 * channels,int num_chans,const struct scmi_desc * desc,int tx_max_msg)1164 void *scmi_raw_mode_init(const struct scmi_handle *handle,
1165 struct dentry *top_dentry, int instance_id,
1166 u8 *channels, int num_chans,
1167 const struct scmi_desc *desc, int tx_max_msg)
1168 {
1169 int ret;
1170 struct scmi_raw_mode_info *raw;
1171 struct device *dev;
1172
1173 if (!handle || !desc)
1174 return ERR_PTR(-EINVAL);
1175
1176 dev = handle->dev;
1177 raw = devm_kzalloc(dev, sizeof(*raw), GFP_KERNEL);
1178 if (!raw)
1179 return ERR_PTR(-ENOMEM);
1180
1181 raw->handle = handle;
1182 raw->desc = desc;
1183 raw->tx_max_msg = tx_max_msg;
1184 raw->id = instance_id;
1185
1186 ret = scmi_raw_mode_setup(raw, channels, num_chans);
1187 if (ret) {
1188 devm_kfree(dev, raw);
1189 return ERR_PTR(ret);
1190 }
1191
1192 raw->dentry = debugfs_create_dir("raw", top_dentry);
1193
1194 debugfs_create_file("reset", 0200, raw->dentry, raw,
1195 &scmi_dbg_raw_mode_reset_fops);
1196
1197 debugfs_create_file("message", 0600, raw->dentry, raw,
1198 &scmi_dbg_raw_mode_message_fops);
1199
1200 debugfs_create_file("message_async", 0600, raw->dentry, raw,
1201 &scmi_dbg_raw_mode_message_async_fops);
1202
1203 debugfs_create_file("notification", 0400, raw->dentry, raw,
1204 &scmi_dbg_raw_mode_notification_fops);
1205
1206 debugfs_create_file("errors", 0400, raw->dentry, raw,
1207 &scmi_dbg_raw_mode_errors_fops);
1208
1209 /*
1210 * Expose per-channel entries if multiple channels available.
1211 * Just ignore errors while setting up these interfaces since we
1212 * have anyway already a working core Raw support.
1213 */
1214 if (num_chans > 1) {
1215 int i;
1216 struct dentry *top_chans;
1217
1218 top_chans = debugfs_create_dir("channels", raw->dentry);
1219
1220 for (i = 0; i < num_chans; i++) {
1221 char cdir[8];
1222 struct dentry *chd;
1223
1224 snprintf(cdir, 8, "0x%02X", channels[i]);
1225 chd = debugfs_create_dir(cdir, top_chans);
1226
1227 debugfs_create_file("message", 0600, chd, raw,
1228 &scmi_dbg_raw_mode_message_fops);
1229
1230 debugfs_create_file("message_async", 0600, chd, raw,
1231 &scmi_dbg_raw_mode_message_async_fops);
1232 }
1233 }
1234
1235 dev_info(dev, "SCMI RAW Mode initialized for instance %d\n", raw->id);
1236
1237 return raw;
1238 }
1239
1240 /**
1241 * scmi_raw_mode_cleanup - Function to cleanup the SCMI Raw stack
1242 *
1243 * @r: An opaque handle to an initialized SCMI Raw instance
1244 */
scmi_raw_mode_cleanup(void * r)1245 void scmi_raw_mode_cleanup(void *r)
1246 {
1247 struct scmi_raw_mode_info *raw = r;
1248
1249 if (!raw)
1250 return;
1251
1252 debugfs_remove_recursive(raw->dentry);
1253
1254 cancel_work_sync(&raw->waiters_work);
1255 destroy_workqueue(raw->wait_wq);
1256 xa_destroy(&raw->chans_q);
1257 }
1258
scmi_xfer_raw_collect(void * msg,size_t * msg_len,struct scmi_xfer * xfer)1259 static int scmi_xfer_raw_collect(void *msg, size_t *msg_len,
1260 struct scmi_xfer *xfer)
1261 {
1262 __le32 *m;
1263 size_t msg_size;
1264
1265 if (!xfer || !msg || !msg_len)
1266 return -EINVAL;
1267
1268 /* Account for hdr ...*/
1269 msg_size = xfer->rx.len + sizeof(u32);
1270 /* ... and status if needed */
1271 if (xfer->hdr.type != MSG_TYPE_NOTIFICATION)
1272 msg_size += sizeof(u32);
1273
1274 if (msg_size > *msg_len)
1275 return -ENOSPC;
1276
1277 m = msg;
1278 *m = cpu_to_le32(pack_scmi_header(&xfer->hdr));
1279 if (xfer->hdr.type != MSG_TYPE_NOTIFICATION)
1280 *++m = cpu_to_le32(xfer->hdr.status);
1281
1282 memcpy(++m, xfer->rx.buf, xfer->rx.len);
1283
1284 *msg_len = msg_size;
1285
1286 return 0;
1287 }
1288
1289 /**
1290 * scmi_raw_message_report - Helper to report back valid reponses/notifications
1291 * to raw message requests.
1292 *
1293 * @r: An opaque reference to the raw instance configuration
1294 * @xfer: The xfer containing the message to be reported
1295 * @idx: The index of the queue.
1296 * @chan_id: The channel ID to use.
1297 *
1298 * If Raw mode is enabled, this is called from the SCMI core on the regular RX
1299 * path to save and enqueue the response/notification payload carried by this
1300 * xfer into a dedicated scmi_raw_buffer for later consumption by the user.
1301 *
1302 * This way the caller can free the related xfer immediately afterwards and the
1303 * user can read back the raw message payload at its own pace (if ever) without
1304 * holding an xfer for too long.
1305 */
scmi_raw_message_report(void * r,struct scmi_xfer * xfer,unsigned int idx,unsigned int chan_id)1306 void scmi_raw_message_report(void *r, struct scmi_xfer *xfer,
1307 unsigned int idx, unsigned int chan_id)
1308 {
1309 int ret;
1310 unsigned long flags;
1311 struct scmi_raw_buffer *rb;
1312 struct device *dev;
1313 struct scmi_raw_queue *q;
1314 struct scmi_raw_mode_info *raw = r;
1315
1316 if (!raw || (idx == SCMI_RAW_REPLY_QUEUE && !SCMI_XFER_IS_RAW(xfer)))
1317 return;
1318
1319 dev = raw->handle->dev;
1320 q = scmi_raw_queue_select(raw, idx,
1321 SCMI_XFER_IS_CHAN_SET(xfer) ? chan_id : 0);
1322
1323 /*
1324 * Grab the msg_q_lock upfront to avoid a possible race between
1325 * realizing the free list was empty and effectively picking the next
1326 * buffer to use from the oldest one enqueued and still unread on this
1327 * msg_q.
1328 *
1329 * Note that nowhere else these locks are taken together, so no risk of
1330 * deadlocks du eto inversion.
1331 */
1332 spin_lock_irqsave(&q->msg_q_lock, flags);
1333 rb = scmi_raw_buffer_get(q);
1334 if (!rb) {
1335 /*
1336 * Immediate and delayed replies to previously injected Raw
1337 * commands MUST be read back from userspace to free the buffers:
1338 * if this is not happening something is seriously broken and
1339 * must be fixed at the application level: complain loudly.
1340 */
1341 if (idx == SCMI_RAW_REPLY_QUEUE) {
1342 spin_unlock_irqrestore(&q->msg_q_lock, flags);
1343 dev_warn(dev,
1344 "RAW[%d] - Buffers exhausted. Dropping report.\n",
1345 idx);
1346 return;
1347 }
1348
1349 /*
1350 * Notifications and errors queues are instead handled in a
1351 * circular manner: unread old buffers are just overwritten by
1352 * newer ones.
1353 *
1354 * The main reason for this is that notifications originated
1355 * by Raw requests cannot be distinguished from normal ones, so
1356 * your Raw buffers queues risk to be flooded and depleted by
1357 * notifications if you left it mistakenly enabled or when in
1358 * coexistence mode.
1359 */
1360 rb = scmi_raw_buffer_dequeue_unlocked(q);
1361 if (WARN_ON(!rb)) {
1362 spin_unlock_irqrestore(&q->msg_q_lock, flags);
1363 return;
1364 }
1365
1366 /* Reset to full buffer length */
1367 rb->msg.len = rb->max_len;
1368
1369 dev_warn_once(dev,
1370 "RAW[%d] - Buffers exhausted. Re-using oldest.\n",
1371 idx);
1372 }
1373 spin_unlock_irqrestore(&q->msg_q_lock, flags);
1374
1375 ret = scmi_xfer_raw_collect(rb->msg.buf, &rb->msg.len, xfer);
1376 if (ret) {
1377 dev_warn(dev, "RAW - Cannot collect xfer into buffer !\n");
1378 scmi_raw_buffer_put(q, rb);
1379 return;
1380 }
1381
1382 scmi_raw_buffer_enqueue(q, rb);
1383 }
1384
scmi_xfer_raw_fill(struct scmi_raw_mode_info * raw,struct scmi_chan_info * cinfo,struct scmi_xfer * xfer,u32 msg_hdr)1385 static void scmi_xfer_raw_fill(struct scmi_raw_mode_info *raw,
1386 struct scmi_chan_info *cinfo,
1387 struct scmi_xfer *xfer, u32 msg_hdr)
1388 {
1389 /* Unpack received HDR as it is */
1390 unpack_scmi_header(msg_hdr, &xfer->hdr);
1391 xfer->hdr.seq = MSG_XTRACT_TOKEN(msg_hdr);
1392
1393 memset(xfer->rx.buf, 0x00, xfer->rx.len);
1394
1395 raw->desc->ops->fetch_response(cinfo, xfer);
1396 }
1397
1398 /**
1399 * scmi_raw_error_report - Helper to report back timed-out or generally
1400 * unexpected replies.
1401 *
1402 * @r: An opaque reference to the raw instance configuration
1403 * @cinfo: A reference to the channel to use to retrieve the broken xfer
1404 * @msg_hdr: The SCMI message header of the message to fetch and report
1405 * @priv: Any private data related to the xfer.
1406 *
1407 * If Raw mode is enabled, this is called from the SCMI core on the RX path in
1408 * case of errors to save and enqueue the bad message payload carried by the
1409 * message that has just been received.
1410 *
1411 * Note that we have to manually fetch any available payload into a temporary
1412 * xfer to be able to save and enqueue the message, since the regular RX error
1413 * path which had called this would have not fetched the message payload having
1414 * classified it as an error.
1415 */
scmi_raw_error_report(void * r,struct scmi_chan_info * cinfo,u32 msg_hdr,void * priv)1416 void scmi_raw_error_report(void *r, struct scmi_chan_info *cinfo,
1417 u32 msg_hdr, void *priv)
1418 {
1419 struct scmi_xfer xfer;
1420 struct scmi_raw_mode_info *raw = r;
1421
1422 if (!raw)
1423 return;
1424
1425 xfer.rx.len = raw->desc->max_msg_size;
1426 xfer.rx.buf = kzalloc(xfer.rx.len, GFP_ATOMIC);
1427 if (!xfer.rx.buf) {
1428 dev_info(raw->handle->dev,
1429 "Cannot report Raw error for HDR:0x%X - ENOMEM\n",
1430 msg_hdr);
1431 return;
1432 }
1433
1434 /* Any transport-provided priv must be passed back down to transport */
1435 if (priv)
1436 /* Ensure priv is visible */
1437 smp_store_mb(xfer.priv, priv);
1438
1439 scmi_xfer_raw_fill(raw, cinfo, &xfer, msg_hdr);
1440 scmi_raw_message_report(raw, &xfer, SCMI_RAW_ERRS_QUEUE, 0);
1441
1442 kfree(xfer.rx.buf);
1443 }
1444