Lines Matching full:raw

3  * System Control and Management Interface (SCMI) Raw mode support
10 * When enabled the SCMI Raw mode support exposes a userspace API which allows
26 * In order to avoid possible interferences between the SCMI Raw transactions
28 * when Raw mode is enabled, by default, all the regular SCMI drivers are
36 * All SCMI Raw entries are rooted under a common top /raw debugfs top directory
43 * |-- raw
133 * struct scmi_raw_queue - Generic Raw queue descriptor
135 * @free_bufs: A freelists listhead used to keep unused raw buffers
152 * struct scmi_raw_mode_info - Structure holding SCMI Raw instance data
154 * @id: Sequential Raw instance ID.
158 * @q: An array of Raw queue descriptors
166 * @dentry: Top debugfs root dentry for SCMI Raw
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.
231 * @raw: A reference to the Raw instance.
240 struct scmi_raw_mode_info *raw; member
249 scmi_raw_queue_select(struct scmi_raw_mode_info *raw, unsigned int idx, in scmi_raw_queue_select() argument
253 return raw->q[idx]; in scmi_raw_queue_select()
255 return xa_load(&raw->chans_q, chan_id); in scmi_raw_queue_select()
336 scmi_xfer_raw_waiter_get(struct scmi_raw_mode_info *raw, struct scmi_xfer *xfer, in scmi_xfer_raw_waiter_get() argument
341 mutex_lock(&raw->free_mtx); in scmi_xfer_raw_waiter_get()
342 if (!list_empty(&raw->free_waiters)) { in scmi_xfer_raw_waiter_get()
343 rw = list_first_entry(&raw->free_waiters, in scmi_xfer_raw_waiter_get()
355 mutex_unlock(&raw->free_mtx); in scmi_xfer_raw_waiter_get()
360 static void scmi_xfer_raw_waiter_put(struct scmi_raw_mode_info *raw, in scmi_xfer_raw_waiter_put() argument
368 mutex_lock(&raw->free_mtx); in scmi_xfer_raw_waiter_put()
369 list_add_tail(&rw->node, &raw->free_waiters); in scmi_xfer_raw_waiter_put()
370 mutex_unlock(&raw->free_mtx); in scmi_xfer_raw_waiter_put()
373 static void scmi_xfer_raw_waiter_enqueue(struct scmi_raw_mode_info *raw, in scmi_xfer_raw_waiter_enqueue() argument
382 raw->desc->max_rx_timeout_ms, in scmi_xfer_raw_waiter_enqueue()
385 mutex_lock(&raw->active_mtx); in scmi_xfer_raw_waiter_enqueue()
386 list_add_tail(&rw->node, &raw->active_waiters); in scmi_xfer_raw_waiter_enqueue()
387 mutex_unlock(&raw->active_mtx); in scmi_xfer_raw_waiter_enqueue()
390 queue_work(raw->wait_wq, &raw->waiters_work); in scmi_xfer_raw_waiter_enqueue()
394 scmi_xfer_raw_waiter_dequeue(struct scmi_raw_mode_info *raw) in scmi_xfer_raw_waiter_dequeue() argument
398 mutex_lock(&raw->active_mtx); in scmi_xfer_raw_waiter_dequeue()
399 if (!list_empty(&raw->active_waiters)) { in scmi_xfer_raw_waiter_dequeue()
400 rw = list_first_entry(&raw->active_waiters, in scmi_xfer_raw_waiter_dequeue()
404 mutex_unlock(&raw->active_mtx); in scmi_xfer_raw_waiter_dequeue()
410 * scmi_xfer_raw_worker - Work function to wait for Raw xfers completions
414 * In SCMI Raw mode, once a user-provided injected SCMI message is sent, we
421 * Even though reply messages are collected and reported into the SCMI Raw layer
434 struct scmi_raw_mode_info *raw; in scmi_xfer_raw_worker() local
438 raw = container_of(work, struct scmi_raw_mode_info, waiters_work); in scmi_xfer_raw_worker()
439 dev = raw->handle->dev; in scmi_xfer_raw_worker()
440 max_tmo = msecs_to_jiffies(raw->desc->max_rx_timeout_ms); in scmi_xfer_raw_worker()
450 rw = scmi_xfer_raw_waiter_dequeue(raw); in scmi_xfer_raw_worker()
474 if (raw->desc->ops->mark_txdone) in scmi_xfer_raw_worker()
475 raw->desc->ops->mark_txdone(rw->cinfo, ret, xfer); in scmi_xfer_raw_worker()
479 ret, scmi_inflight_count(raw->handle)); in scmi_xfer_raw_worker()
487 "timed out in RAW delayed resp - HDR:%08X\n", in scmi_xfer_raw_worker()
492 scmi_xfer_raw_put(raw->handle, xfer); in scmi_xfer_raw_worker()
493 scmi_xfer_raw_waiter_put(raw, rw); in scmi_xfer_raw_worker()
497 static void scmi_xfer_raw_reset(struct scmi_raw_mode_info *raw) in scmi_xfer_raw_reset() argument
501 dev_info(raw->handle->dev, "Resetting SCMI Raw stack.\n"); in scmi_xfer_raw_reset()
504 scmi_raw_buffer_queue_flush(raw->q[i]); in scmi_xfer_raw_reset()
511 * @raw: A reference to the Raw instance.
515 * @p: A pointer to return the initialized Raw xfer.
528 static int scmi_xfer_raw_get_init(struct scmi_raw_mode_info *raw, void *buf, in scmi_xfer_raw_get_init() argument
535 struct device *dev = raw->handle->dev; in scmi_xfer_raw_get_init()
542 if (tx_size > raw->desc->max_msg_size) in scmi_xfer_raw_get_init()
545 xfer = scmi_xfer_raw_get(raw->handle); in scmi_xfer_raw_get_init()
547 dev_warn(dev, "RAW - Cannot get a free RAW xfer !\n"); in scmi_xfer_raw_get_init()
559 xfer->rx.len = raw->desc->max_msg_size; in scmi_xfer_raw_get_init()
561 memset(xfer->tx.buf, 0x00, raw->desc->max_msg_size); in scmi_xfer_raw_get_init()
567 * In flight registration can temporarily fail in case of Raw messages in scmi_xfer_raw_get_init()
569 * sequence numbers since, in Raw mode, the xfer (and the token) is in scmi_xfer_raw_get_init()
573 ret = scmi_xfer_raw_inflight_register(raw->handle, xfer); in scmi_xfer_raw_get_init()
578 msleep(raw->desc->max_rx_timeout_ms / in scmi_xfer_raw_get_init()
585 "RAW - Could NOT register xfer %d in-flight HDR:0x%08X\n", in scmi_xfer_raw_get_init()
587 scmi_xfer_raw_put(raw->handle, xfer); in scmi_xfer_raw_get_init()
594 * scmi_do_xfer_raw_start - An helper to send a valid raw xfer
596 * @raw: A reference to the Raw instance.
602 * This function send a previously built raw xfer using an appropriate channel
612 static int scmi_do_xfer_raw_start(struct scmi_raw_mode_info *raw, in scmi_do_xfer_raw_start() argument
619 struct device *dev = raw->handle->dev; in scmi_do_xfer_raw_start()
626 cinfo = scmi_xfer_raw_channel_get(raw->handle, chan_id); in scmi_do_xfer_raw_start()
630 rw = scmi_xfer_raw_waiter_get(raw, xfer, cinfo, async); in scmi_do_xfer_raw_start()
632 dev_warn(dev, "RAW - Cannot get a free waiter !\n"); in scmi_do_xfer_raw_start()
637 if (is_polling_enabled(cinfo, raw->desc)) in scmi_do_xfer_raw_start()
647 scmi_inflight_count(raw->handle)); in scmi_do_xfer_raw_start()
649 ret = raw->desc->ops->send_message(rw->cinfo, xfer); in scmi_do_xfer_raw_start()
651 dev_err(dev, "Failed to send RAW message %d\n", ret); in scmi_do_xfer_raw_start()
652 scmi_xfer_raw_waiter_put(raw, rw); in scmi_do_xfer_raw_start()
656 trace_scmi_msg_dump(raw->id, cinfo->id, xfer->hdr.protocol_id, in scmi_do_xfer_raw_start()
661 scmi_xfer_raw_waiter_enqueue(raw, rw); in scmi_do_xfer_raw_start()
670 * @raw: A reference to the Raw instance.
680 static int scmi_raw_message_send(struct scmi_raw_mode_info *raw, in scmi_raw_message_send() argument
687 ret = scmi_xfer_raw_get_init(raw, buf, len, &xfer); in scmi_raw_message_send()
692 if (is_transport_polling_capable(raw->desc)) { in scmi_raw_message_send()
695 dev_err(raw->handle->dev, in scmi_raw_message_send()
696 "Failed to send RAW message - Polling NOT supported\n"); in scmi_raw_message_send()
701 ret = scmi_do_xfer_raw_start(raw, xfer, chan_id, async); in scmi_raw_message_send()
703 scmi_xfer_raw_put(raw->handle, xfer); in scmi_raw_message_send()
736 * available enqueued raw message payload that has been collected.
738 * @raw: A reference to the Raw instance.
749 static int scmi_raw_message_receive(struct scmi_raw_mode_info *raw, in scmi_raw_message_receive() argument
758 q = scmi_raw_queue_select(raw, idx, chan_id); in scmi_raw_message_receive()
764 dev_dbg(raw->handle->dev, "RAW - No message available!\n"); in scmi_raw_message_receive()
780 /* SCMI Raw debugfs helpers */
793 ret = scmi_raw_message_receive(rd->raw, rd->rx.buf, rd->rx.len, in scmi_dbg_raw_mode_common_read()
832 * before sending it with a single RAW xfer. in scmi_dbg_raw_mode_common_write()
847 ret = scmi_raw_message_send(rd->raw, rd->tx.buf, rd->tx_size, in scmi_dbg_raw_mode_common_write()
866 q = scmi_raw_queue_select(rd->raw, idx, rd->chan_id); in scmi_test_dbg_raw_common_poll()
904 struct scmi_raw_mode_info *raw; in scmi_dbg_raw_mode_open() local
910 raw = inode->i_private; in scmi_dbg_raw_mode_open()
915 rd->rx.len = raw->desc->max_msg_size + sizeof(u32); in scmi_dbg_raw_mode_open()
922 rd->tx.len = raw->desc->max_msg_size + sizeof(u32); in scmi_dbg_raw_mode_open()
934 rd->raw = raw; in scmi_dbg_raw_mode_open()
957 scmi_xfer_raw_reset(rd->raw); in scmi_dbg_raw_mode_reset_write()
1076 scmi_raw_queue_init(struct scmi_raw_mode_info *raw) in scmi_raw_queue_init() argument
1080 struct device *dev = raw->handle->dev; in scmi_raw_queue_init()
1087 rb = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rb), GFP_KERNEL); in scmi_raw_queue_init()
1093 for (i = 0; i < raw->tx_max_msg; i++, rb++) { in scmi_raw_queue_init()
1094 rb->max_len = raw->desc->max_msg_size + sizeof(u32); in scmi_raw_queue_init()
1108 static int scmi_xfer_raw_worker_init(struct scmi_raw_mode_info *raw) in scmi_xfer_raw_worker_init() argument
1112 struct device *dev = raw->handle->dev; in scmi_xfer_raw_worker_init()
1114 rw = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rw), GFP_KERNEL); in scmi_xfer_raw_worker_init()
1118 raw->wait_wq = alloc_workqueue("scmi-raw-wait-wq-%d", in scmi_xfer_raw_worker_init()
1120 WQ_HIGHPRI | WQ_SYSFS, 0, raw->id); in scmi_xfer_raw_worker_init()
1121 if (!raw->wait_wq) in scmi_xfer_raw_worker_init()
1124 mutex_init(&raw->free_mtx); in scmi_xfer_raw_worker_init()
1125 INIT_LIST_HEAD(&raw->free_waiters); in scmi_xfer_raw_worker_init()
1126 mutex_init(&raw->active_mtx); in scmi_xfer_raw_worker_init()
1127 INIT_LIST_HEAD(&raw->active_waiters); in scmi_xfer_raw_worker_init()
1129 for (i = 0; i < raw->tx_max_msg; i++, rw++) { in scmi_xfer_raw_worker_init()
1131 scmi_xfer_raw_waiter_put(raw, rw); in scmi_xfer_raw_worker_init()
1133 INIT_WORK(&raw->waiters_work, scmi_xfer_raw_worker); in scmi_xfer_raw_worker_init()
1138 static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw, in scmi_raw_mode_setup() argument
1143 struct device *dev = raw->handle->dev; in scmi_raw_mode_setup()
1150 raw->q[idx] = scmi_raw_queue_init(raw); in scmi_raw_mode_setup()
1151 if (IS_ERR(raw->q[idx])) { in scmi_raw_mode_setup()
1152 ret = PTR_ERR(raw->q[idx]); in scmi_raw_mode_setup()
1157 xa_init(&raw->chans_q); in scmi_raw_mode_setup()
1164 q = scmi_raw_queue_init(raw); in scmi_raw_mode_setup()
1170 ret = xa_insert(&raw->chans_q, channels[i], q, in scmi_raw_mode_setup()
1174 "Fail to allocate Raw queue 0x%02X\n", in scmi_raw_mode_setup()
1181 ret = scmi_xfer_raw_worker_init(raw); in scmi_raw_mode_setup()
1186 raw->gid = gid; in scmi_raw_mode_setup()
1191 xa_destroy(&raw->chans_q); in scmi_raw_mode_setup()
1198 * scmi_raw_mode_init - Function to initialize the SCMI Raw stack
1201 * @top_dentry: A reference to the top Raw debugfs dentry
1203 * this Raw instance
1209 * This function prepare the SCMI Raw stack and creates the debugfs API.
1211 * Return: An opaque handle to the Raw instance on Success, an ERR_PTR otherwise
1219 struct scmi_raw_mode_info *raw; in scmi_raw_mode_init() local
1226 raw = devm_kzalloc(dev, sizeof(*raw), GFP_KERNEL); in scmi_raw_mode_init()
1227 if (!raw) in scmi_raw_mode_init()
1230 raw->handle = handle; in scmi_raw_mode_init()
1231 raw->desc = desc; in scmi_raw_mode_init()
1232 raw->tx_max_msg = tx_max_msg; in scmi_raw_mode_init()
1233 raw->id = instance_id; in scmi_raw_mode_init()
1235 ret = scmi_raw_mode_setup(raw, channels, num_chans); in scmi_raw_mode_init()
1237 devm_kfree(dev, raw); in scmi_raw_mode_init()
1241 raw->dentry = debugfs_create_dir("raw", top_dentry); in scmi_raw_mode_init()
1243 debugfs_create_file("reset", 0200, raw->dentry, raw, in scmi_raw_mode_init()
1246 debugfs_create_file("message", 0600, raw->dentry, raw, in scmi_raw_mode_init()
1249 debugfs_create_file("message_async", 0600, raw->dentry, raw, in scmi_raw_mode_init()
1252 debugfs_create_file("message_poll", 0600, raw->dentry, raw, in scmi_raw_mode_init()
1255 debugfs_create_file("message_poll_async", 0600, raw->dentry, raw, in scmi_raw_mode_init()
1258 debugfs_create_file("notification", 0400, raw->dentry, raw, in scmi_raw_mode_init()
1261 debugfs_create_file("errors", 0400, raw->dentry, raw, in scmi_raw_mode_init()
1267 * have anyway already a working core Raw support. in scmi_raw_mode_init()
1273 top_chans = debugfs_create_dir("channels", raw->dentry); in scmi_raw_mode_init()
1283 raw, channels[i], in scmi_raw_mode_init()
1287 raw, channels[i], in scmi_raw_mode_init()
1291 raw, channels[i], in scmi_raw_mode_init()
1295 chd, raw, channels[i], in scmi_raw_mode_init()
1300 dev_info(dev, "SCMI RAW Mode initialized for instance %d\n", raw->id); in scmi_raw_mode_init()
1302 return raw; in scmi_raw_mode_init()
1306 * scmi_raw_mode_cleanup - Function to cleanup the SCMI Raw stack
1308 * @r: An opaque handle to an initialized SCMI Raw instance
1312 struct scmi_raw_mode_info *raw = r; in scmi_raw_mode_cleanup() local
1314 if (!raw) in scmi_raw_mode_cleanup()
1317 debugfs_remove_recursive(raw->dentry); in scmi_raw_mode_cleanup()
1319 cancel_work_sync(&raw->waiters_work); in scmi_raw_mode_cleanup()
1320 destroy_workqueue(raw->wait_wq); in scmi_raw_mode_cleanup()
1321 xa_destroy(&raw->chans_q); in scmi_raw_mode_cleanup()
1356 * to raw message requests.
1358 * @r: An opaque reference to the raw instance configuration
1363 * If Raw mode is enabled, this is called from the SCMI core on the regular RX
1368 * user can read back the raw message payload at its own pace (if ever) without
1379 struct scmi_raw_mode_info *raw = r; in scmi_raw_message_report() local
1381 if (!raw || (idx == SCMI_RAW_REPLY_QUEUE && !SCMI_XFER_IS_RAW(xfer))) in scmi_raw_message_report()
1384 dev = raw->handle->dev; in scmi_raw_message_report()
1385 q = scmi_raw_queue_select(raw, idx, in scmi_raw_message_report()
1389 "RAW[%d] - NO queue for chan 0x%X. Dropping report.\n", in scmi_raw_message_report()
1407 * Immediate and delayed replies to previously injected Raw in scmi_raw_message_report()
1415 "RAW[%d] - Buffers exhausted. Dropping report.\n", in scmi_raw_message_report()
1426 * by Raw requests cannot be distinguished from normal ones, so in scmi_raw_message_report()
1427 * your Raw buffers queues risk to be flooded and depleted by in scmi_raw_message_report()
1441 "RAW[%d] - Buffers exhausted. Re-using oldest.\n", in scmi_raw_message_report()
1448 dev_warn(dev, "RAW - Cannot collect xfer into buffer !\n"); in scmi_raw_message_report()
1456 static void scmi_xfer_raw_fill(struct scmi_raw_mode_info *raw, in scmi_xfer_raw_fill() argument
1466 raw->desc->ops->fetch_response(cinfo, xfer); in scmi_xfer_raw_fill()
1473 * @r: An opaque reference to the raw instance configuration
1478 * If Raw mode is enabled, this is called from the SCMI core on the RX path in
1491 struct scmi_raw_mode_info *raw = r; in scmi_raw_error_report() local
1493 if (!raw) in scmi_raw_error_report()
1496 xfer.rx.len = raw->desc->max_msg_size; in scmi_raw_error_report()
1499 dev_info(raw->handle->dev, in scmi_raw_error_report()
1500 "Cannot report Raw error for HDR:0x%X - ENOMEM\n", in scmi_raw_error_report()
1510 scmi_xfer_raw_fill(raw, cinfo, &xfer, msg_hdr); in scmi_raw_error_report()
1511 scmi_raw_message_report(raw, &xfer, SCMI_RAW_ERRS_QUEUE, 0); in scmi_raw_error_report()