Lines Matching defs:raw
36 * All SCMI Raw entries are rooted under a common top /raw debugfs top directory
43 * |-- raw
135 * @free_bufs: A freelists listhead used to keep unused raw buffers
231 * @raw: A reference to the Raw instance.
240 struct scmi_raw_mode_info *raw;
249 scmi_raw_queue_select(struct scmi_raw_mode_info *raw, unsigned int idx,
253 return raw->q[idx];
255 return xa_load(&raw->chans_q, chan_id);
336 scmi_xfer_raw_waiter_get(struct scmi_raw_mode_info *raw, struct scmi_xfer *xfer,
341 mutex_lock(&raw->free_mtx);
342 if (!list_empty(&raw->free_waiters)) {
343 rw = list_first_entry(&raw->free_waiters,
355 mutex_unlock(&raw->free_mtx);
360 static void scmi_xfer_raw_waiter_put(struct scmi_raw_mode_info *raw,
368 mutex_lock(&raw->free_mtx);
369 list_add_tail(&rw->node, &raw->free_waiters);
370 mutex_unlock(&raw->free_mtx);
373 static void scmi_xfer_raw_waiter_enqueue(struct scmi_raw_mode_info *raw,
382 raw->desc->max_rx_timeout_ms,
385 mutex_lock(&raw->active_mtx);
386 list_add_tail(&rw->node, &raw->active_waiters);
387 mutex_unlock(&raw->active_mtx);
390 queue_work(raw->wait_wq, &raw->waiters_work);
394 scmi_xfer_raw_waiter_dequeue(struct scmi_raw_mode_info *raw)
398 mutex_lock(&raw->active_mtx);
399 if (!list_empty(&raw->active_waiters)) {
400 rw = list_first_entry(&raw->active_waiters,
404 mutex_unlock(&raw->active_mtx);
434 struct scmi_raw_mode_info *raw;
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);
450 rw = scmi_xfer_raw_waiter_dequeue(raw);
474 if (raw->desc->ops->mark_txdone)
475 raw->desc->ops->mark_txdone(rw->cinfo, ret, xfer);
491 scmi_xfer_raw_put(raw->handle, xfer);
492 scmi_xfer_raw_waiter_put(raw, rw);
496 static void scmi_xfer_raw_reset(struct scmi_raw_mode_info *raw)
500 dev_info(raw->handle->dev, "Resetting SCMI Raw stack.\n");
503 scmi_raw_buffer_queue_flush(raw->q[i]);
510 * @raw: A reference to the Raw instance.
527 static int scmi_xfer_raw_get_init(struct scmi_raw_mode_info *raw, void *buf,
534 struct device *dev = raw->handle->dev;
541 if (tx_size > raw->desc->max_msg_size)
544 xfer = scmi_xfer_raw_get(raw->handle);
558 xfer->rx.len = raw->desc->max_msg_size;
560 memset(xfer->tx.buf, 0x00, raw->desc->max_msg_size);
572 ret = scmi_xfer_raw_inflight_register(raw->handle, xfer);
577 msleep(raw->desc->max_rx_timeout_ms /
586 scmi_xfer_raw_put(raw->handle, xfer);
593 * scmi_do_xfer_raw_start - An helper to send a valid raw xfer
595 * @raw: A reference to the Raw instance.
601 * This function send a previously built raw xfer using an appropriate channel
611 static int scmi_do_xfer_raw_start(struct scmi_raw_mode_info *raw,
618 struct device *dev = raw->handle->dev;
625 cinfo = scmi_xfer_raw_channel_get(raw->handle, chan_id);
629 rw = scmi_xfer_raw_waiter_get(raw, xfer, cinfo, async);
636 if (is_polling_enabled(cinfo, raw->desc))
647 ret = raw->desc->ops->send_message(rw->cinfo, xfer);
650 scmi_xfer_raw_waiter_put(raw, rw);
654 trace_scmi_msg_dump(raw->id, cinfo->id, xfer->hdr.protocol_id,
659 scmi_xfer_raw_waiter_enqueue(raw, rw);
668 * @raw: A reference to the Raw instance.
677 static int scmi_raw_message_send(struct scmi_raw_mode_info *raw,
683 ret = scmi_xfer_raw_get_init(raw, buf, len, &xfer);
687 ret = scmi_do_xfer_raw_start(raw, xfer, chan_id, async);
689 scmi_xfer_raw_put(raw->handle, xfer);
722 * available enqueued raw message payload that has been collected.
724 * @raw: A reference to the Raw instance.
735 static int scmi_raw_message_receive(struct scmi_raw_mode_info *raw,
744 q = scmi_raw_queue_select(raw, idx, chan_id);
750 dev_dbg(raw->handle->dev, "RAW - No message available!\n");
779 ret = scmi_raw_message_receive(rd->raw, rd->rx.buf, rd->rx.len,
833 ret = scmi_raw_message_send(rd->raw, rd->tx.buf, rd->tx_size,
852 q = scmi_raw_queue_select(rd->raw, idx, rd->chan_id);
890 struct scmi_raw_mode_info *raw;
897 raw = inode->i_private;
902 rd->rx.len = raw->desc->max_msg_size + sizeof(u32);
909 rd->tx.len = raw->desc->max_msg_size + sizeof(u32);
921 rd->raw = raw;
944 scmi_xfer_raw_reset(rd->raw);
1028 scmi_raw_queue_init(struct scmi_raw_mode_info *raw)
1032 struct device *dev = raw->handle->dev;
1039 rb = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rb), GFP_KERNEL);
1045 for (i = 0; i < raw->tx_max_msg; i++, rb++) {
1046 rb->max_len = raw->desc->max_msg_size + sizeof(u32);
1060 static int scmi_xfer_raw_worker_init(struct scmi_raw_mode_info *raw)
1064 struct device *dev = raw->handle->dev;
1066 rw = devm_kcalloc(dev, raw->tx_max_msg, sizeof(*rw), GFP_KERNEL);
1070 raw->wait_wq = alloc_workqueue("scmi-raw-wait-wq-%d",
1072 WQ_HIGHPRI | WQ_SYSFS, 0, raw->id);
1073 if (!raw->wait_wq)
1076 mutex_init(&raw->free_mtx);
1077 INIT_LIST_HEAD(&raw->free_waiters);
1078 mutex_init(&raw->active_mtx);
1079 INIT_LIST_HEAD(&raw->active_waiters);
1081 for (i = 0; i < raw->tx_max_msg; i++, rw++) {
1083 scmi_xfer_raw_waiter_put(raw, rw);
1085 INIT_WORK(&raw->waiters_work, scmi_xfer_raw_worker);
1090 static int scmi_raw_mode_setup(struct scmi_raw_mode_info *raw,
1095 struct device *dev = raw->handle->dev;
1102 raw->q[idx] = scmi_raw_queue_init(raw);
1103 if (IS_ERR(raw->q[idx])) {
1104 ret = PTR_ERR(raw->q[idx]);
1109 xa_init(&raw->chans_q);
1116 q = scmi_raw_queue_init(raw);
1122 ret = xa_insert(&raw->chans_q, channels[i], q,
1133 ret = scmi_xfer_raw_worker_init(raw);
1138 raw->gid = gid;
1143 xa_destroy(&raw->chans_q);
1171 struct scmi_raw_mode_info *raw;
1178 raw = devm_kzalloc(dev, sizeof(*raw), GFP_KERNEL);
1179 if (!raw)
1182 raw->handle = handle;
1183 raw->desc = desc;
1184 raw->tx_max_msg = tx_max_msg;
1185 raw->id = instance_id;
1187 ret = scmi_raw_mode_setup(raw, channels, num_chans);
1189 devm_kfree(dev, raw);
1193 raw->dentry = debugfs_create_dir("raw", top_dentry);
1195 debugfs_create_file("reset", 0200, raw->dentry, raw,
1198 debugfs_create_file("message", 0600, raw->dentry, raw,
1201 debugfs_create_file("message_async", 0600, raw->dentry, raw,
1204 debugfs_create_file("notification", 0400, raw->dentry, raw,
1207 debugfs_create_file("errors", 0400, raw->dentry, raw,
1219 top_chans = debugfs_create_dir("channels", raw->dentry);
1228 debugfs_create_file("message", 0600, chd, raw,
1231 debugfs_create_file("message_async", 0600, chd, raw,
1236 dev_info(dev, "SCMI RAW Mode initialized for instance %d\n", raw->id);
1238 return raw;
1248 struct scmi_raw_mode_info *raw = r;
1250 if (!raw)
1253 debugfs_remove_recursive(raw->dentry);
1255 cancel_work_sync(&raw->waiters_work);
1256 destroy_workqueue(raw->wait_wq);
1257 xa_destroy(&raw->chans_q);
1292 * to raw message requests.
1294 * @r: An opaque reference to the raw instance configuration
1304 * user can read back the raw message payload at its own pace (if ever) without
1315 struct scmi_raw_mode_info *raw = r;
1317 if (!raw || (idx == SCMI_RAW_REPLY_QUEUE && !SCMI_XFER_IS_RAW(xfer)))
1320 dev = raw->handle->dev;
1321 q = scmi_raw_queue_select(raw, idx,
1392 static void scmi_xfer_raw_fill(struct scmi_raw_mode_info *raw,
1402 raw->desc->ops->fetch_response(cinfo, xfer);
1409 * @r: An opaque reference to the raw instance configuration
1427 struct scmi_raw_mode_info *raw = r;
1429 if (!raw)
1432 xfer.rx.len = raw->desc->max_msg_size;
1435 dev_info(raw->handle->dev,
1446 scmi_xfer_raw_fill(raw, cinfo, &xfer, msg_hdr);
1447 scmi_raw_message_report(raw, &xfer, SCMI_RAW_ERRS_QUEUE, 0);