Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/firmware/arm_scmi/raw_mode.c
26428 views
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 *
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
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
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
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*
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
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
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 *
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
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
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 *
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
*/
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,
479
ret, scmi_inflight_count(raw->handle));
480
481
/* Wait also for an async delayed response if needed */
482
if (!ret && xfer->async_done) {
483
unsigned long tmo = msecs_to_jiffies(SCMI_MAX_RESPONSE_TIMEOUT);
484
485
if (!wait_for_completion_timeout(xfer->async_done, tmo))
486
dev_err(dev,
487
"timed out in RAW delayed resp - HDR:%08X\n",
488
pack_scmi_header(&xfer->hdr));
489
}
490
491
/* Release waiter and xfer */
492
scmi_xfer_raw_put(raw->handle, xfer);
493
scmi_xfer_raw_waiter_put(raw, rw);
494
} while (1);
495
}
496
497
static void scmi_xfer_raw_reset(struct scmi_raw_mode_info *raw)
498
{
499
int i;
500
501
dev_info(raw->handle->dev, "Resetting SCMI Raw stack.\n");
502
503
for (i = 0; i < SCMI_RAW_MAX_QUEUE; i++)
504
scmi_raw_buffer_queue_flush(raw->q[i]);
505
}
506
507
/**
508
* scmi_xfer_raw_get_init - An helper to build a valid xfer from the provided
509
* bare SCMI message.
510
*
511
* @raw: A reference to the Raw instance.
512
* @buf: A buffer containing the whole SCMI message to send (including the
513
* header) in little-endian binary formmat.
514
* @len: Length of the message in @buf.
515
* @p: A pointer to return the initialized Raw xfer.
516
*
517
* After an xfer is picked from the TX pool and filled in with the message
518
* content, the xfer is registered as pending with the core in the usual way
519
* using the original sequence number provided by the user with the message.
520
*
521
* Note that, in case the testing user application is NOT using distinct
522
* sequence-numbers between successive SCMI messages such registration could
523
* fail temporarily if the previous message, using the same sequence number,
524
* had still not released; in such a case we just wait and retry.
525
*
526
* Return: 0 on Success
527
*/
528
static int scmi_xfer_raw_get_init(struct scmi_raw_mode_info *raw, void *buf,
529
size_t len, struct scmi_xfer **p)
530
{
531
u32 msg_hdr;
532
size_t tx_size;
533
struct scmi_xfer *xfer;
534
int ret, retry = SCMI_XFER_RAW_MAX_RETRIES;
535
struct device *dev = raw->handle->dev;
536
537
if (!buf || len < sizeof(u32))
538
return -EINVAL;
539
540
tx_size = len - sizeof(u32);
541
/* Ensure we have sane transfer sizes */
542
if (tx_size > raw->desc->max_msg_size)
543
return -ERANGE;
544
545
xfer = scmi_xfer_raw_get(raw->handle);
546
if (IS_ERR(xfer)) {
547
dev_warn(dev, "RAW - Cannot get a free RAW xfer !\n");
548
return PTR_ERR(xfer);
549
}
550
551
/* Build xfer from the provided SCMI bare LE message */
552
msg_hdr = le32_to_cpu(*((__le32 *)buf));
553
unpack_scmi_header(msg_hdr, &xfer->hdr);
554
xfer->hdr.seq = (u16)MSG_XTRACT_TOKEN(msg_hdr);
555
/* Polling not supported */
556
xfer->hdr.poll_completion = false;
557
xfer->hdr.status = SCMI_SUCCESS;
558
xfer->tx.len = tx_size;
559
xfer->rx.len = raw->desc->max_msg_size;
560
/* Clear the whole TX buffer */
561
memset(xfer->tx.buf, 0x00, raw->desc->max_msg_size);
562
if (xfer->tx.len)
563
memcpy(xfer->tx.buf, (u8 *)buf + sizeof(msg_hdr), xfer->tx.len);
564
*p = xfer;
565
566
/*
567
* In flight registration can temporarily fail in case of Raw messages
568
* if the user injects messages without using monotonically increasing
569
* sequence numbers since, in Raw mode, the xfer (and the token) is
570
* finally released later by a deferred worker. Just retry for a while.
571
*/
572
do {
573
ret = scmi_xfer_raw_inflight_register(raw->handle, xfer);
574
if (ret) {
575
dev_dbg(dev,
576
"...retrying[%d] inflight registration\n",
577
retry);
578
msleep(raw->desc->max_rx_timeout_ms /
579
SCMI_XFER_RAW_MAX_RETRIES);
580
}
581
} while (ret && --retry);
582
583
if (ret) {
584
dev_warn(dev,
585
"RAW - Could NOT register xfer %d in-flight HDR:0x%08X\n",
586
xfer->hdr.seq, msg_hdr);
587
scmi_xfer_raw_put(raw->handle, xfer);
588
}
589
590
return ret;
591
}
592
593
/**
594
* scmi_do_xfer_raw_start - An helper to send a valid raw xfer
595
*
596
* @raw: A reference to the Raw instance.
597
* @xfer: The xfer to send
598
* @chan_id: The channel ID to use, if zero the channels is automatically
599
* selected based on the protocol used.
600
* @async: A flag stating if an asynchronous command is required.
601
*
602
* This function send a previously built raw xfer using an appropriate channel
603
* and queues the related waiting work.
604
*
605
* Note that we need to know explicitly if the required command is meant to be
606
* asynchronous in kind since we have to properly setup the waiter.
607
* (and deducing this from the payload is weak and do not scale given there is
608
* NOT a common header-flag stating if the command is asynchronous or not)
609
*
610
* Return: 0 on Success
611
*/
612
static int scmi_do_xfer_raw_start(struct scmi_raw_mode_info *raw,
613
struct scmi_xfer *xfer, u8 chan_id,
614
bool async)
615
{
616
int ret;
617
struct scmi_chan_info *cinfo;
618
struct scmi_xfer_raw_waiter *rw;
619
struct device *dev = raw->handle->dev;
620
621
if (!chan_id)
622
chan_id = xfer->hdr.protocol_id;
623
else
624
xfer->flags |= SCMI_XFER_FLAG_CHAN_SET;
625
626
cinfo = scmi_xfer_raw_channel_get(raw->handle, chan_id);
627
if (IS_ERR(cinfo))
628
return PTR_ERR(cinfo);
629
630
rw = scmi_xfer_raw_waiter_get(raw, xfer, cinfo, async);
631
if (!rw) {
632
dev_warn(dev, "RAW - Cannot get a free waiter !\n");
633
return -ENOMEM;
634
}
635
636
/* True ONLY if also supported by transport. */
637
if (is_polling_enabled(cinfo, raw->desc))
638
xfer->hdr.poll_completion = true;
639
640
reinit_completion(&xfer->done);
641
/* Make sure xfer state update is visible before sending */
642
smp_store_mb(xfer->state, SCMI_XFER_SENT_OK);
643
644
trace_scmi_xfer_begin(xfer->transfer_id, xfer->hdr.id,
645
xfer->hdr.protocol_id, xfer->hdr.seq,
646
xfer->hdr.poll_completion,
647
scmi_inflight_count(raw->handle));
648
649
ret = raw->desc->ops->send_message(rw->cinfo, xfer);
650
if (ret) {
651
dev_err(dev, "Failed to send RAW message %d\n", ret);
652
scmi_xfer_raw_waiter_put(raw, rw);
653
return ret;
654
}
655
656
trace_scmi_msg_dump(raw->id, cinfo->id, xfer->hdr.protocol_id,
657
xfer->hdr.id, "cmnd", xfer->hdr.seq,
658
xfer->hdr.status,
659
xfer->tx.buf, xfer->tx.len);
660
661
scmi_xfer_raw_waiter_enqueue(raw, rw);
662
663
return ret;
664
}
665
666
/**
667
* scmi_raw_message_send - An helper to build and send an SCMI command using
668
* the provided SCMI bare message buffer
669
*
670
* @raw: A reference to the Raw instance.
671
* @buf: A buffer containing the whole SCMI message to send (including the
672
* header) in little-endian binary format.
673
* @len: Length of the message in @buf.
674
* @chan_id: The channel ID to use.
675
* @async: A flag stating if an asynchronous command is required.
676
* @poll: A flag stating if a polling transmission is required.
677
*
678
* Return: 0 on Success
679
*/
680
static int scmi_raw_message_send(struct scmi_raw_mode_info *raw,
681
void *buf, size_t len, u8 chan_id,
682
bool async, bool poll)
683
{
684
int ret;
685
struct scmi_xfer *xfer;
686
687
ret = scmi_xfer_raw_get_init(raw, buf, len, &xfer);
688
if (ret)
689
return ret;
690
691
if (poll) {
692
if (is_transport_polling_capable(raw->desc)) {
693
xfer->hdr.poll_completion = true;
694
} else {
695
dev_err(raw->handle->dev,
696
"Failed to send RAW message - Polling NOT supported\n");
697
return -EINVAL;
698
}
699
}
700
701
ret = scmi_do_xfer_raw_start(raw, xfer, chan_id, async);
702
if (ret)
703
scmi_xfer_raw_put(raw->handle, xfer);
704
705
return ret;
706
}
707
708
static struct scmi_raw_buffer *
709
scmi_raw_message_dequeue(struct scmi_raw_queue *q, bool o_nonblock)
710
{
711
unsigned long flags;
712
struct scmi_raw_buffer *rb;
713
714
spin_lock_irqsave(&q->msg_q_lock, flags);
715
while (list_empty(&q->msg_q)) {
716
spin_unlock_irqrestore(&q->msg_q_lock, flags);
717
718
if (o_nonblock)
719
return ERR_PTR(-EAGAIN);
720
721
if (wait_event_interruptible(q->wq, !list_empty(&q->msg_q)))
722
return ERR_PTR(-ERESTARTSYS);
723
724
spin_lock_irqsave(&q->msg_q_lock, flags);
725
}
726
727
rb = scmi_raw_buffer_dequeue_unlocked(q);
728
729
spin_unlock_irqrestore(&q->msg_q_lock, flags);
730
731
return rb;
732
}
733
734
/**
735
* scmi_raw_message_receive - An helper to dequeue and report the next
736
* available enqueued raw message payload that has been collected.
737
*
738
* @raw: A reference to the Raw instance.
739
* @buf: A buffer to get hold of the whole SCMI message received and represented
740
* in little-endian binary format.
741
* @len: Length of @buf.
742
* @size: The effective size of the message copied into @buf
743
* @idx: The index of the queue to pick the next queued message from.
744
* @chan_id: The channel ID to use.
745
* @o_nonblock: A flag to request a non-blocking message dequeue.
746
*
747
* Return: 0 on Success
748
*/
749
static int scmi_raw_message_receive(struct scmi_raw_mode_info *raw,
750
void *buf, size_t len, size_t *size,
751
unsigned int idx, unsigned int chan_id,
752
bool o_nonblock)
753
{
754
int ret = 0;
755
struct scmi_raw_buffer *rb;
756
struct scmi_raw_queue *q;
757
758
q = scmi_raw_queue_select(raw, idx, chan_id);
759
if (!q)
760
return -ENODEV;
761
762
rb = scmi_raw_message_dequeue(q, o_nonblock);
763
if (IS_ERR(rb)) {
764
dev_dbg(raw->handle->dev, "RAW - No message available!\n");
765
return PTR_ERR(rb);
766
}
767
768
if (rb->msg.len <= len) {
769
memcpy(buf, rb->msg.buf, rb->msg.len);
770
*size = rb->msg.len;
771
} else {
772
ret = -ENOSPC;
773
}
774
775
scmi_raw_buffer_put(q, rb);
776
777
return ret;
778
}
779
780
/* SCMI Raw debugfs helpers */
781
782
static ssize_t scmi_dbg_raw_mode_common_read(struct file *filp,
783
char __user *buf,
784
size_t count, loff_t *ppos,
785
unsigned int idx)
786
{
787
ssize_t cnt;
788
struct scmi_dbg_raw_data *rd = filp->private_data;
789
790
if (!rd->rx_size) {
791
int ret;
792
793
ret = scmi_raw_message_receive(rd->raw, rd->rx.buf, rd->rx.len,
794
&rd->rx_size, idx, rd->chan_id,
795
filp->f_flags & O_NONBLOCK);
796
if (ret) {
797
rd->rx_size = 0;
798
return ret;
799
}
800
801
/* Reset any previous filepos change, including writes */
802
*ppos = 0;
803
} else if (*ppos == rd->rx_size) {
804
/* Return EOF once all the message has been read-out */
805
rd->rx_size = 0;
806
return 0;
807
}
808
809
cnt = simple_read_from_buffer(buf, count, ppos,
810
rd->rx.buf, rd->rx_size);
811
812
return cnt;
813
}
814
815
static ssize_t scmi_dbg_raw_mode_common_write(struct file *filp,
816
const char __user *buf,
817
size_t count, loff_t *ppos,
818
bool async, bool poll)
819
{
820
int ret;
821
struct scmi_dbg_raw_data *rd = filp->private_data;
822
823
if (count > rd->tx.len - rd->tx_size)
824
return -ENOSPC;
825
826
/* On first write attempt @count carries the total full message size. */
827
if (!rd->tx_size)
828
rd->tx_req_size = count;
829
830
/*
831
* Gather a full message, possibly across multiple interrupted wrrtes,
832
* before sending it with a single RAW xfer.
833
*/
834
if (rd->tx_size < rd->tx_req_size) {
835
ssize_t cnt;
836
837
cnt = simple_write_to_buffer(rd->tx.buf, rd->tx.len, ppos,
838
buf, count);
839
if (cnt < 0)
840
return cnt;
841
842
rd->tx_size += cnt;
843
if (cnt < count)
844
return cnt;
845
}
846
847
ret = scmi_raw_message_send(rd->raw, rd->tx.buf, rd->tx_size,
848
rd->chan_id, async, poll);
849
850
/* Reset ppos for next message ... */
851
rd->tx_size = 0;
852
*ppos = 0;
853
854
return ret ?: count;
855
}
856
857
static __poll_t scmi_test_dbg_raw_common_poll(struct file *filp,
858
struct poll_table_struct *wait,
859
unsigned int idx)
860
{
861
unsigned long flags;
862
struct scmi_dbg_raw_data *rd = filp->private_data;
863
struct scmi_raw_queue *q;
864
__poll_t mask = 0;
865
866
q = scmi_raw_queue_select(rd->raw, idx, rd->chan_id);
867
if (!q)
868
return mask;
869
870
poll_wait(filp, &q->wq, wait);
871
872
spin_lock_irqsave(&q->msg_q_lock, flags);
873
if (!list_empty(&q->msg_q))
874
mask = EPOLLIN | EPOLLRDNORM;
875
spin_unlock_irqrestore(&q->msg_q_lock, flags);
876
877
return mask;
878
}
879
880
static ssize_t scmi_dbg_raw_mode_message_read(struct file *filp,
881
char __user *buf,
882
size_t count, loff_t *ppos)
883
{
884
return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
885
SCMI_RAW_REPLY_QUEUE);
886
}
887
888
static ssize_t scmi_dbg_raw_mode_message_write(struct file *filp,
889
const char __user *buf,
890
size_t count, loff_t *ppos)
891
{
892
return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos,
893
false, false);
894
}
895
896
static __poll_t scmi_dbg_raw_mode_message_poll(struct file *filp,
897
struct poll_table_struct *wait)
898
{
899
return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_REPLY_QUEUE);
900
}
901
902
static int scmi_dbg_raw_mode_open(struct inode *inode, struct file *filp)
903
{
904
struct scmi_raw_mode_info *raw;
905
struct scmi_dbg_raw_data *rd;
906
907
if (!inode->i_private)
908
return -ENODEV;
909
910
raw = inode->i_private;
911
rd = kzalloc(sizeof(*rd), GFP_KERNEL);
912
if (!rd)
913
return -ENOMEM;
914
915
rd->rx.len = raw->desc->max_msg_size + sizeof(u32);
916
rd->rx.buf = kzalloc(rd->rx.len, GFP_KERNEL);
917
if (!rd->rx.buf) {
918
kfree(rd);
919
return -ENOMEM;
920
}
921
922
rd->tx.len = raw->desc->max_msg_size + sizeof(u32);
923
rd->tx.buf = kzalloc(rd->tx.len, GFP_KERNEL);
924
if (!rd->tx.buf) {
925
kfree(rd->rx.buf);
926
kfree(rd);
927
return -ENOMEM;
928
}
929
930
/* Grab channel ID from debugfs entry naming if any */
931
/* not set - reassing 0 we already had after kzalloc() */
932
rd->chan_id = debugfs_get_aux_num(filp);
933
934
rd->raw = raw;
935
filp->private_data = rd;
936
937
return nonseekable_open(inode, filp);
938
}
939
940
static int scmi_dbg_raw_mode_release(struct inode *inode, struct file *filp)
941
{
942
struct scmi_dbg_raw_data *rd = filp->private_data;
943
944
kfree(rd->rx.buf);
945
kfree(rd->tx.buf);
946
kfree(rd);
947
948
return 0;
949
}
950
951
static ssize_t scmi_dbg_raw_mode_reset_write(struct file *filp,
952
const char __user *buf,
953
size_t count, loff_t *ppos)
954
{
955
struct scmi_dbg_raw_data *rd = filp->private_data;
956
957
scmi_xfer_raw_reset(rd->raw);
958
959
return count;
960
}
961
962
static const struct file_operations scmi_dbg_raw_mode_reset_fops = {
963
.open = scmi_dbg_raw_mode_open,
964
.release = scmi_dbg_raw_mode_release,
965
.write = scmi_dbg_raw_mode_reset_write,
966
.owner = THIS_MODULE,
967
};
968
969
static const struct file_operations scmi_dbg_raw_mode_message_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_write,
974
.poll = scmi_dbg_raw_mode_message_poll,
975
.owner = THIS_MODULE,
976
};
977
978
static ssize_t scmi_dbg_raw_mode_message_async_write(struct file *filp,
979
const char __user *buf,
980
size_t count, loff_t *ppos)
981
{
982
return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos,
983
true, false);
984
}
985
986
static const struct file_operations scmi_dbg_raw_mode_message_async_fops = {
987
.open = scmi_dbg_raw_mode_open,
988
.release = scmi_dbg_raw_mode_release,
989
.read = scmi_dbg_raw_mode_message_read,
990
.write = scmi_dbg_raw_mode_message_async_write,
991
.poll = scmi_dbg_raw_mode_message_poll,
992
.owner = THIS_MODULE,
993
};
994
995
static ssize_t scmi_dbg_raw_mode_message_poll_write(struct file *filp,
996
const char __user *buf,
997
size_t count, loff_t *ppos)
998
{
999
return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos,
1000
false, true);
1001
}
1002
1003
static const struct file_operations scmi_dbg_raw_mode_message_poll_fops = {
1004
.open = scmi_dbg_raw_mode_open,
1005
.release = scmi_dbg_raw_mode_release,
1006
.read = scmi_dbg_raw_mode_message_read,
1007
.write = scmi_dbg_raw_mode_message_poll_write,
1008
.poll = scmi_dbg_raw_mode_message_poll,
1009
.owner = THIS_MODULE,
1010
};
1011
1012
static ssize_t scmi_dbg_raw_mode_message_poll_async_write(struct file *filp,
1013
const char __user *buf,
1014
size_t count, loff_t *ppos)
1015
{
1016
return scmi_dbg_raw_mode_common_write(filp, buf, count, ppos,
1017
true, true);
1018
}
1019
1020
static const struct file_operations scmi_dbg_raw_mode_message_poll_async_fops = {
1021
.open = scmi_dbg_raw_mode_open,
1022
.release = scmi_dbg_raw_mode_release,
1023
.read = scmi_dbg_raw_mode_message_read,
1024
.write = scmi_dbg_raw_mode_message_poll_async_write,
1025
.poll = scmi_dbg_raw_mode_message_poll,
1026
.owner = THIS_MODULE,
1027
};
1028
1029
static ssize_t scmi_test_dbg_raw_mode_notif_read(struct file *filp,
1030
char __user *buf,
1031
size_t count, loff_t *ppos)
1032
{
1033
return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
1034
SCMI_RAW_NOTIF_QUEUE);
1035
}
1036
1037
static __poll_t
1038
scmi_test_dbg_raw_mode_notif_poll(struct file *filp,
1039
struct poll_table_struct *wait)
1040
{
1041
return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_NOTIF_QUEUE);
1042
}
1043
1044
static const struct file_operations scmi_dbg_raw_mode_notification_fops = {
1045
.open = scmi_dbg_raw_mode_open,
1046
.release = scmi_dbg_raw_mode_release,
1047
.read = scmi_test_dbg_raw_mode_notif_read,
1048
.poll = scmi_test_dbg_raw_mode_notif_poll,
1049
.owner = THIS_MODULE,
1050
};
1051
1052
static ssize_t scmi_test_dbg_raw_mode_errors_read(struct file *filp,
1053
char __user *buf,
1054
size_t count, loff_t *ppos)
1055
{
1056
return scmi_dbg_raw_mode_common_read(filp, buf, count, ppos,
1057
SCMI_RAW_ERRS_QUEUE);
1058
}
1059
1060
static __poll_t
1061
scmi_test_dbg_raw_mode_errors_poll(struct file *filp,
1062
struct poll_table_struct *wait)
1063
{
1064
return scmi_test_dbg_raw_common_poll(filp, wait, SCMI_RAW_ERRS_QUEUE);
1065
}
1066
1067
static const struct file_operations scmi_dbg_raw_mode_errors_fops = {
1068
.open = scmi_dbg_raw_mode_open,
1069
.release = scmi_dbg_raw_mode_release,
1070
.read = scmi_test_dbg_raw_mode_errors_read,
1071
.poll = scmi_test_dbg_raw_mode_errors_poll,
1072
.owner = THIS_MODULE,
1073
};
1074
1075
static struct scmi_raw_queue *
1076
scmi_raw_queue_init(struct scmi_raw_mode_info *raw)
1077
{
1078
int i;
1079
struct scmi_raw_buffer *rb;
1080
struct device *dev = raw->handle->dev;
1081
struct scmi_raw_queue *q;
1082
1083
q = devm_kzalloc(dev, sizeof(*q), GFP_KERNEL);
1084
if (!q)
1085
return ERR_PTR(-ENOMEM);
1086
1087
rb = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rb), GFP_KERNEL);
1088
if (!rb)
1089
return ERR_PTR(-ENOMEM);
1090
1091
spin_lock_init(&q->free_bufs_lock);
1092
INIT_LIST_HEAD(&q->free_bufs);
1093
for (i = 0; i < raw->tx_max_msg; i++, rb++) {
1094
rb->max_len = raw->desc->max_msg_size + sizeof(u32);
1095
rb->msg.buf = devm_kzalloc(dev, rb->max_len, GFP_KERNEL);
1096
if (!rb->msg.buf)
1097
return ERR_PTR(-ENOMEM);
1098
scmi_raw_buffer_put(q, rb);
1099
}
1100
1101
spin_lock_init(&q->msg_q_lock);
1102
INIT_LIST_HEAD(&q->msg_q);
1103
init_waitqueue_head(&q->wq);
1104
1105
return q;
1106
}
1107
1108
static int scmi_xfer_raw_worker_init(struct scmi_raw_mode_info *raw)
1109
{
1110
int i;
1111
struct scmi_xfer_raw_waiter *rw;
1112
struct device *dev = raw->handle->dev;
1113
1114
rw = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rw), GFP_KERNEL);
1115
if (!rw)
1116
return -ENOMEM;
1117
1118
raw->wait_wq = alloc_workqueue("scmi-raw-wait-wq-%d",
1119
WQ_UNBOUND | WQ_FREEZABLE |
1120
WQ_HIGHPRI | WQ_SYSFS, 0, raw->id);
1121
if (!raw->wait_wq)
1122
return -ENOMEM;
1123
1124
mutex_init(&raw->free_mtx);
1125
INIT_LIST_HEAD(&raw->free_waiters);
1126
mutex_init(&raw->active_mtx);
1127
INIT_LIST_HEAD(&raw->active_waiters);
1128
1129
for (i = 0; i < raw->tx_max_msg; i++, rw++) {
1130
init_completion(&rw->async_response);
1131
scmi_xfer_raw_waiter_put(raw, rw);
1132
}
1133
INIT_WORK(&raw->waiters_work, scmi_xfer_raw_worker);
1134
1135
return 0;
1136
}
1137
1138
static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw,
1139
u8 *channels, int num_chans)
1140
{
1141
int ret, idx;
1142
void *gid;
1143
struct device *dev = raw->handle->dev;
1144
1145
gid = devres_open_group(dev, NULL, GFP_KERNEL);
1146
if (!gid)
1147
return -ENOMEM;
1148
1149
for (idx = 0; idx < SCMI_RAW_MAX_QUEUE; idx++) {
1150
raw->q[idx] = scmi_raw_queue_init(raw);
1151
if (IS_ERR(raw->q[idx])) {
1152
ret = PTR_ERR(raw->q[idx]);
1153
goto err;
1154
}
1155
}
1156
1157
xa_init(&raw->chans_q);
1158
if (num_chans > 1) {
1159
int i;
1160
1161
for (i = 0; i < num_chans; i++) {
1162
struct scmi_raw_queue *q;
1163
1164
q = scmi_raw_queue_init(raw);
1165
if (IS_ERR(q)) {
1166
ret = PTR_ERR(q);
1167
goto err_xa;
1168
}
1169
1170
ret = xa_insert(&raw->chans_q, channels[i], q,
1171
GFP_KERNEL);
1172
if (ret) {
1173
dev_err(dev,
1174
"Fail to allocate Raw queue 0x%02X\n",
1175
channels[i]);
1176
goto err_xa;
1177
}
1178
}
1179
}
1180
1181
ret = scmi_xfer_raw_worker_init(raw);
1182
if (ret)
1183
goto err_xa;
1184
1185
devres_close_group(dev, gid);
1186
raw->gid = gid;
1187
1188
return 0;
1189
1190
err_xa:
1191
xa_destroy(&raw->chans_q);
1192
err:
1193
devres_release_group(dev, gid);
1194
return ret;
1195
}
1196
1197
/**
1198
* scmi_raw_mode_init - Function to initialize the SCMI Raw stack
1199
*
1200
* @handle: Pointer to SCMI entity handle
1201
* @top_dentry: A reference to the top Raw debugfs dentry
1202
* @instance_id: The ID of the underlying SCMI platform instance represented by
1203
* this Raw instance
1204
* @channels: The list of the existing channels
1205
* @num_chans: The number of entries in @channels
1206
* @desc: Reference to the transport operations
1207
* @tx_max_msg: Max number of in-flight messages allowed by the transport
1208
*
1209
* This function prepare the SCMI Raw stack and creates the debugfs API.
1210
*
1211
* Return: An opaque handle to the Raw instance on Success, an ERR_PTR otherwise
1212
*/
1213
void *scmi_raw_mode_init(const struct scmi_handle *handle,
1214
struct dentry *top_dentry, int instance_id,
1215
u8 *channels, int num_chans,
1216
const struct scmi_desc *desc, int tx_max_msg)
1217
{
1218
int ret;
1219
struct scmi_raw_mode_info *raw;
1220
struct device *dev;
1221
1222
if (!handle || !desc)
1223
return ERR_PTR(-EINVAL);
1224
1225
dev = handle->dev;
1226
raw = devm_kzalloc(dev, sizeof(*raw), GFP_KERNEL);
1227
if (!raw)
1228
return ERR_PTR(-ENOMEM);
1229
1230
raw->handle = handle;
1231
raw->desc = desc;
1232
raw->tx_max_msg = tx_max_msg;
1233
raw->id = instance_id;
1234
1235
ret = scmi_raw_mode_setup(raw, channels, num_chans);
1236
if (ret) {
1237
devm_kfree(dev, raw);
1238
return ERR_PTR(ret);
1239
}
1240
1241
raw->dentry = debugfs_create_dir("raw", top_dentry);
1242
1243
debugfs_create_file("reset", 0200, raw->dentry, raw,
1244
&scmi_dbg_raw_mode_reset_fops);
1245
1246
debugfs_create_file("message", 0600, raw->dentry, raw,
1247
&scmi_dbg_raw_mode_message_fops);
1248
1249
debugfs_create_file("message_async", 0600, raw->dentry, raw,
1250
&scmi_dbg_raw_mode_message_async_fops);
1251
1252
debugfs_create_file("message_poll", 0600, raw->dentry, raw,
1253
&scmi_dbg_raw_mode_message_poll_fops);
1254
1255
debugfs_create_file("message_poll_async", 0600, raw->dentry, raw,
1256
&scmi_dbg_raw_mode_message_poll_async_fops);
1257
1258
debugfs_create_file("notification", 0400, raw->dentry, raw,
1259
&scmi_dbg_raw_mode_notification_fops);
1260
1261
debugfs_create_file("errors", 0400, raw->dentry, raw,
1262
&scmi_dbg_raw_mode_errors_fops);
1263
1264
/*
1265
* Expose per-channel entries if multiple channels available.
1266
* Just ignore errors while setting up these interfaces since we
1267
* have anyway already a working core Raw support.
1268
*/
1269
if (num_chans > 1) {
1270
int i;
1271
struct dentry *top_chans;
1272
1273
top_chans = debugfs_create_dir("channels", raw->dentry);
1274
1275
for (i = 0; i < num_chans; i++) {
1276
char cdir[8];
1277
struct dentry *chd;
1278
1279
snprintf(cdir, 8, "0x%02X", channels[i]);
1280
chd = debugfs_create_dir(cdir, top_chans);
1281
1282
debugfs_create_file_aux_num("message", 0600, chd,
1283
raw, channels[i],
1284
&scmi_dbg_raw_mode_message_fops);
1285
1286
debugfs_create_file_aux_num("message_async", 0600, chd,
1287
raw, channels[i],
1288
&scmi_dbg_raw_mode_message_async_fops);
1289
1290
debugfs_create_file_aux_num("message_poll", 0600, chd,
1291
raw, channels[i],
1292
&scmi_dbg_raw_mode_message_poll_fops);
1293
1294
debugfs_create_file_aux_num("message_poll_async", 0600,
1295
chd, raw, channels[i],
1296
&scmi_dbg_raw_mode_message_poll_async_fops);
1297
}
1298
}
1299
1300
dev_info(dev, "SCMI RAW Mode initialized for instance %d\n", raw->id);
1301
1302
return raw;
1303
}
1304
1305
/**
1306
* scmi_raw_mode_cleanup - Function to cleanup the SCMI Raw stack
1307
*
1308
* @r: An opaque handle to an initialized SCMI Raw instance
1309
*/
1310
void scmi_raw_mode_cleanup(void *r)
1311
{
1312
struct scmi_raw_mode_info *raw = r;
1313
1314
if (!raw)
1315
return;
1316
1317
debugfs_remove_recursive(raw->dentry);
1318
1319
cancel_work_sync(&raw->waiters_work);
1320
destroy_workqueue(raw->wait_wq);
1321
xa_destroy(&raw->chans_q);
1322
}
1323
1324
static int scmi_xfer_raw_collect(void *msg, size_t *msg_len,
1325
struct scmi_xfer *xfer)
1326
{
1327
__le32 *m;
1328
size_t msg_size;
1329
1330
if (!xfer || !msg || !msg_len)
1331
return -EINVAL;
1332
1333
/* Account for hdr ...*/
1334
msg_size = xfer->rx.len + sizeof(u32);
1335
/* ... and status if needed */
1336
if (xfer->hdr.type != MSG_TYPE_NOTIFICATION)
1337
msg_size += sizeof(u32);
1338
1339
if (msg_size > *msg_len)
1340
return -ENOSPC;
1341
1342
m = msg;
1343
*m = cpu_to_le32(pack_scmi_header(&xfer->hdr));
1344
if (xfer->hdr.type != MSG_TYPE_NOTIFICATION)
1345
*++m = cpu_to_le32(xfer->hdr.status);
1346
1347
memcpy(++m, xfer->rx.buf, xfer->rx.len);
1348
1349
*msg_len = msg_size;
1350
1351
return 0;
1352
}
1353
1354
/**
1355
* scmi_raw_message_report - Helper to report back valid reponses/notifications
1356
* to raw message requests.
1357
*
1358
* @r: An opaque reference to the raw instance configuration
1359
* @xfer: The xfer containing the message to be reported
1360
* @idx: The index of the queue.
1361
* @chan_id: The channel ID to use.
1362
*
1363
* If Raw mode is enabled, this is called from the SCMI core on the regular RX
1364
* path to save and enqueue the response/notification payload carried by this
1365
* xfer into a dedicated scmi_raw_buffer for later consumption by the user.
1366
*
1367
* This way the caller can free the related xfer immediately afterwards and the
1368
* user can read back the raw message payload at its own pace (if ever) without
1369
* holding an xfer for too long.
1370
*/
1371
void scmi_raw_message_report(void *r, struct scmi_xfer *xfer,
1372
unsigned int idx, unsigned int chan_id)
1373
{
1374
int ret;
1375
unsigned long flags;
1376
struct scmi_raw_buffer *rb;
1377
struct device *dev;
1378
struct scmi_raw_queue *q;
1379
struct scmi_raw_mode_info *raw = r;
1380
1381
if (!raw || (idx == SCMI_RAW_REPLY_QUEUE && !SCMI_XFER_IS_RAW(xfer)))
1382
return;
1383
1384
dev = raw->handle->dev;
1385
q = scmi_raw_queue_select(raw, idx,
1386
SCMI_XFER_IS_CHAN_SET(xfer) ? chan_id : 0);
1387
if (!q) {
1388
dev_warn(dev,
1389
"RAW[%d] - NO queue for chan 0x%X. Dropping report.\n",
1390
idx, chan_id);
1391
return;
1392
}
1393
1394
/*
1395
* Grab the msg_q_lock upfront to avoid a possible race between
1396
* realizing the free list was empty and effectively picking the next
1397
* buffer to use from the oldest one enqueued and still unread on this
1398
* msg_q.
1399
*
1400
* Note that nowhere else these locks are taken together, so no risk of
1401
* deadlocks du eto inversion.
1402
*/
1403
spin_lock_irqsave(&q->msg_q_lock, flags);
1404
rb = scmi_raw_buffer_get(q);
1405
if (!rb) {
1406
/*
1407
* Immediate and delayed replies to previously injected Raw
1408
* commands MUST be read back from userspace to free the buffers:
1409
* if this is not happening something is seriously broken and
1410
* must be fixed at the application level: complain loudly.
1411
*/
1412
if (idx == SCMI_RAW_REPLY_QUEUE) {
1413
spin_unlock_irqrestore(&q->msg_q_lock, flags);
1414
dev_warn(dev,
1415
"RAW[%d] - Buffers exhausted. Dropping report.\n",
1416
idx);
1417
return;
1418
}
1419
1420
/*
1421
* Notifications and errors queues are instead handled in a
1422
* circular manner: unread old buffers are just overwritten by
1423
* newer ones.
1424
*
1425
* The main reason for this is that notifications originated
1426
* by Raw requests cannot be distinguished from normal ones, so
1427
* your Raw buffers queues risk to be flooded and depleted by
1428
* notifications if you left it mistakenly enabled or when in
1429
* coexistence mode.
1430
*/
1431
rb = scmi_raw_buffer_dequeue_unlocked(q);
1432
if (WARN_ON(!rb)) {
1433
spin_unlock_irqrestore(&q->msg_q_lock, flags);
1434
return;
1435
}
1436
1437
/* Reset to full buffer length */
1438
rb->msg.len = rb->max_len;
1439
1440
dev_warn_once(dev,
1441
"RAW[%d] - Buffers exhausted. Re-using oldest.\n",
1442
idx);
1443
}
1444
spin_unlock_irqrestore(&q->msg_q_lock, flags);
1445
1446
ret = scmi_xfer_raw_collect(rb->msg.buf, &rb->msg.len, xfer);
1447
if (ret) {
1448
dev_warn(dev, "RAW - Cannot collect xfer into buffer !\n");
1449
scmi_raw_buffer_put(q, rb);
1450
return;
1451
}
1452
1453
scmi_raw_buffer_enqueue(q, rb);
1454
}
1455
1456
static void scmi_xfer_raw_fill(struct scmi_raw_mode_info *raw,
1457
struct scmi_chan_info *cinfo,
1458
struct scmi_xfer *xfer, u32 msg_hdr)
1459
{
1460
/* Unpack received HDR as it is */
1461
unpack_scmi_header(msg_hdr, &xfer->hdr);
1462
xfer->hdr.seq = MSG_XTRACT_TOKEN(msg_hdr);
1463
1464
memset(xfer->rx.buf, 0x00, xfer->rx.len);
1465
1466
raw->desc->ops->fetch_response(cinfo, xfer);
1467
}
1468
1469
/**
1470
* scmi_raw_error_report - Helper to report back timed-out or generally
1471
* unexpected replies.
1472
*
1473
* @r: An opaque reference to the raw instance configuration
1474
* @cinfo: A reference to the channel to use to retrieve the broken xfer
1475
* @msg_hdr: The SCMI message header of the message to fetch and report
1476
* @priv: Any private data related to the xfer.
1477
*
1478
* If Raw mode is enabled, this is called from the SCMI core on the RX path in
1479
* case of errors to save and enqueue the bad message payload carried by the
1480
* message that has just been received.
1481
*
1482
* Note that we have to manually fetch any available payload into a temporary
1483
* xfer to be able to save and enqueue the message, since the regular RX error
1484
* path which had called this would have not fetched the message payload having
1485
* classified it as an error.
1486
*/
1487
void scmi_raw_error_report(void *r, struct scmi_chan_info *cinfo,
1488
u32 msg_hdr, void *priv)
1489
{
1490
struct scmi_xfer xfer;
1491
struct scmi_raw_mode_info *raw = r;
1492
1493
if (!raw)
1494
return;
1495
1496
xfer.rx.len = raw->desc->max_msg_size;
1497
xfer.rx.buf = kzalloc(xfer.rx.len, GFP_ATOMIC);
1498
if (!xfer.rx.buf) {
1499
dev_info(raw->handle->dev,
1500
"Cannot report Raw error for HDR:0x%X - ENOMEM\n",
1501
msg_hdr);
1502
return;
1503
}
1504
1505
/* Any transport-provided priv must be passed back down to transport */
1506
if (priv)
1507
/* Ensure priv is visible */
1508
smp_store_mb(xfer.priv, priv);
1509
1510
scmi_xfer_raw_fill(raw, cinfo, &xfer, msg_hdr);
1511
scmi_raw_message_report(raw, &xfer, SCMI_RAW_ERRS_QUEUE, 0);
1512
1513
kfree(xfer.rx.buf);
1514
}
1515
1516