Lines Matching +full:protocol +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
3 * System Control and Management Interface (SCMI) Message Protocol driver
5 * SCMI Message Protocol is used between the System Control Processor(SCP)
7 * provides a mechanism for inter-processor communication between SCP's
14 * Copyright (C) 2018-2020 ARM Ltd.
42 SCMI_ERR_SUPPORT = -1, /* Not supported */
43 SCMI_ERR_PARAMS = -2, /* Invalid Parameters */
44 SCMI_ERR_ACCESS = -3, /* Invalid access/permission denied */
45 SCMI_ERR_ENTRY = -4, /* Not found */
46 SCMI_ERR_RANGE = -5, /* Value out of range */
47 SCMI_ERR_BUSY = -6, /* Device busy */
48 SCMI_ERR_COMMS = -7, /* Communication Error */
49 SCMI_ERR_GENERIC = -8, /* Generic Error */
50 SCMI_ERR_HARDWARE = -9, /* Hardware Error */
51 SCMI_ERR_PROTOCOL = -10,/* Protocol Error */
58 /* Track the unique id for the transfers for debug & profiling purpose */
70 * struct scmi_xfers_info - Structure to manage transfer information
85 * struct scmi_protocol_instance - Describe an initialized protocol instance.
86 * @handle: Reference to the SCMI handle associated to this protocol instance.
87 * @proto: A reference to the protocol descriptor.
88 * @gid: A reference for per-protocol devres management.
89 * @users: A refcount to track effective users of this protocol.
90 * @priv: Reference for optional protocol private data.
91 * @ph: An embedded protocol handle that will be passed down to protocol
94 * Each protocol is initialized independently once for each SCMI platform in
109 * struct scmi_info - Structure representing a SCMI instance
113 * @version: SCMI revision information containing protocol version,
114 * implementation version and (sub-)vendor identification.
118 * @tx_idr: IDR object to map protocol id to Tx channel info pointer
119 * @rx_idr: IDR object to map protocol id to Rx channel info pointer
121 * this SCMI instance: populated on protocol's first attempted
125 * MAX_PROTOCOLS_IMP elements allocated by the base protocol
156 -EOPNOTSUPP, /* SCMI_ERR_SUPPORT */
157 -EINVAL, /* SCMI_ERR_PARAM */
158 -EACCES, /* SCMI_ERR_ACCESS */
159 -ENOENT, /* SCMI_ERR_ENTRY */
160 -ERANGE, /* SCMI_ERR_RANGE */
161 -EBUSY, /* SCMI_ERR_BUSY */
162 -ECOMM, /* SCMI_ERR_COMMS */
163 -EIO, /* SCMI_ERR_GENERIC */
164 -EREMOTEIO, /* SCMI_ERR_HARDWARE */
165 -EPROTO, /* SCMI_ERR_PROTOCOL */
170 int err_idx = -errno; in scmi_to_linux_errno()
174 return -EIO; in scmi_to_linux_errno()
178 * scmi_dump_header_dbg() - Helper to dump a message header.
186 dev_dbg(dev, "Message ID: %x Sequence ID: %x Protocol: %x\n", in scmi_dump_header_dbg()
187 hdr->id, hdr->seq, hdr->protocol_id); in scmi_dump_header_dbg()
195 info->notify_priv = priv; in scmi_set_notification_instance_data()
196 /* Ensure updated protocol private date are visible */ in scmi_set_notification_instance_data()
206 return info->notify_priv; in scmi_get_notification_instance_data()
210 * scmi_xfer_get() - Allocate one message
233 spin_lock_irqsave(&minfo->xfer_lock, flags); in scmi_xfer_get()
234 bit_pos = find_first_zero_bit(minfo->xfer_alloc_table, in scmi_xfer_get()
235 info->desc->max_msg); in scmi_xfer_get()
236 if (bit_pos == info->desc->max_msg) { in scmi_xfer_get()
237 spin_unlock_irqrestore(&minfo->xfer_lock, flags); in scmi_xfer_get()
238 return ERR_PTR(-ENOMEM); in scmi_xfer_get()
240 set_bit(bit_pos, minfo->xfer_alloc_table); in scmi_xfer_get()
241 spin_unlock_irqrestore(&minfo->xfer_lock, flags); in scmi_xfer_get()
245 xfer = &minfo->xfer_block[xfer_id]; in scmi_xfer_get()
246 xfer->hdr.seq = xfer_id; in scmi_xfer_get()
247 reinit_completion(&xfer->done); in scmi_xfer_get()
248 xfer->transfer_id = atomic_inc_return(&transfer_last_id); in scmi_xfer_get()
254 * __scmi_xfer_put() - Release a message
271 spin_lock_irqsave(&minfo->xfer_lock, flags); in __scmi_xfer_put()
272 clear_bit(xfer->hdr.seq, minfo->xfer_alloc_table); in __scmi_xfer_put()
273 spin_unlock_irqrestore(&minfo->xfer_lock, flags); in __scmi_xfer_put()
279 struct device *dev = cinfo->dev; in scmi_handle_notification()
280 struct scmi_info *info = handle_to_scmi_info(cinfo->handle); in scmi_handle_notification()
281 struct scmi_xfers_info *minfo = &info->rx_minfo; in scmi_handle_notification()
285 xfer = scmi_xfer_get(cinfo->handle, minfo); in scmi_handle_notification()
289 info->desc->ops->clear_channel(cinfo); in scmi_handle_notification()
293 unpack_scmi_header(msg_hdr, &xfer->hdr); in scmi_handle_notification()
294 scmi_dump_header_dbg(dev, &xfer->hdr); in scmi_handle_notification()
295 info->desc->ops->fetch_notification(cinfo, info->desc->max_msg_size, in scmi_handle_notification()
297 scmi_notify(cinfo->handle, xfer->hdr.protocol_id, in scmi_handle_notification()
298 xfer->hdr.id, xfer->rx.buf, xfer->rx.len, ts); in scmi_handle_notification()
300 trace_scmi_rx_done(xfer->transfer_id, xfer->hdr.id, in scmi_handle_notification()
301 xfer->hdr.protocol_id, xfer->hdr.seq, in scmi_handle_notification()
306 info->desc->ops->clear_channel(cinfo); in scmi_handle_notification()
313 struct device *dev = cinfo->dev; in scmi_handle_response()
314 struct scmi_info *info = handle_to_scmi_info(cinfo->handle); in scmi_handle_response()
315 struct scmi_xfers_info *minfo = &info->tx_minfo; in scmi_handle_response()
318 if (!test_bit(xfer_id, minfo->xfer_alloc_table)) { in scmi_handle_response()
320 info->desc->ops->clear_channel(cinfo); in scmi_handle_response()
324 xfer = &minfo->xfer_block[xfer_id]; in scmi_handle_response()
328 * delayed response we're not prepared to handle: bail-out safely in scmi_handle_response()
331 if (unlikely(msg_type == MSG_TYPE_DELAYED_RESP && !xfer->async_done)) { in scmi_handle_response()
335 info->desc->ops->clear_channel(cinfo); in scmi_handle_response()
343 xfer->rx.len = info->desc->max_msg_size; in scmi_handle_response()
345 scmi_dump_header_dbg(dev, &xfer->hdr); in scmi_handle_response()
347 info->desc->ops->fetch_response(cinfo, xfer); in scmi_handle_response()
349 trace_scmi_rx_done(xfer->transfer_id, xfer->hdr.id, in scmi_handle_response()
350 xfer->hdr.protocol_id, xfer->hdr.seq, in scmi_handle_response()
354 info->desc->ops->clear_channel(cinfo); in scmi_handle_response()
355 complete(xfer->async_done); in scmi_handle_response()
357 complete(&xfer->done); in scmi_handle_response()
362 * scmi_rx_callback() - callback for receiving messages
393 * xfer_put() - Release a transmit message
395 * @ph: Pointer to SCMI protocol handle
402 struct scmi_info *info = handle_to_scmi_info(pi->handle); in xfer_put()
404 __scmi_xfer_put(&info->tx_minfo, xfer); in xfer_put()
412 struct scmi_info *info = handle_to_scmi_info(cinfo->handle); in scmi_xfer_done_no_timeout()
414 return info->desc->ops->poll_done(cinfo, xfer) || in scmi_xfer_done_no_timeout()
419 * do_xfer() - Do one transfer
421 * @ph: Pointer to SCMI protocol handle
424 * Return: -ETIMEDOUT in case of no response, if transmit error,
434 struct scmi_info *info = handle_to_scmi_info(pi->handle); in do_xfer()
435 struct device *dev = info->dev; in do_xfer()
439 * Re-instate protocol id here from protocol handle so that cannot be in do_xfer()
440 * overridden by mistake (or malice) by the protocol code mangling with in do_xfer()
443 xfer->hdr.protocol_id = pi->proto->id; in do_xfer()
445 cinfo = idr_find(&info->tx_idr, xfer->hdr.protocol_id); in do_xfer()
447 return -EINVAL; in do_xfer()
449 trace_scmi_xfer_begin(xfer->transfer_id, xfer->hdr.id, in do_xfer()
450 xfer->hdr.protocol_id, xfer->hdr.seq, in do_xfer()
451 xfer->hdr.poll_completion); in do_xfer()
453 ret = info->desc->ops->send_message(cinfo, xfer); in do_xfer()
459 if (xfer->hdr.poll_completion) { in do_xfer()
465 info->desc->ops->fetch_response(cinfo, xfer); in do_xfer()
467 ret = -ETIMEDOUT; in do_xfer()
470 timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms); in do_xfer()
472 if (!wait_for_completion_timeout(&xfer->done, timeout)) { in do_xfer()
475 ret = -ETIMEDOUT; in do_xfer()
479 if (!ret && xfer->hdr.status) in do_xfer()
480 ret = scmi_to_linux_errno(xfer->hdr.status); in do_xfer()
482 if (info->desc->ops->mark_txdone) in do_xfer()
483 info->desc->ops->mark_txdone(cinfo, ret); in do_xfer()
485 trace_scmi_xfer_end(xfer->transfer_id, xfer->hdr.id, in do_xfer()
486 xfer->hdr.protocol_id, xfer->hdr.seq, ret); in do_xfer()
495 struct scmi_info *info = handle_to_scmi_info(pi->handle); in reset_rx_to_maxsz()
497 xfer->rx.len = info->desc->max_msg_size; in reset_rx_to_maxsz()
503 * do_xfer_with_response() - Do one transfer and wait until the delayed
506 * @ph: Pointer to SCMI protocol handle
509 * Return: -ETIMEDOUT in case of no delayed response, if transmit error,
519 xfer->hdr.protocol_id = pi->proto->id; in do_xfer_with_response()
521 xfer->async_done = &async_response; in do_xfer_with_response()
525 if (!wait_for_completion_timeout(xfer->async_done, timeout)) in do_xfer_with_response()
526 ret = -ETIMEDOUT; in do_xfer_with_response()
527 else if (xfer->hdr.status) in do_xfer_with_response()
528 ret = scmi_to_linux_errno(xfer->hdr.status); in do_xfer_with_response()
531 xfer->async_done = NULL; in do_xfer_with_response()
536 * xfer_get_init() - Allocate and initialise one message for transmit
538 * @ph: Pointer to SCMI protocol handle
557 struct scmi_info *info = handle_to_scmi_info(pi->handle); in xfer_get_init()
558 struct scmi_xfers_info *minfo = &info->tx_minfo; in xfer_get_init()
559 struct device *dev = info->dev; in xfer_get_init()
562 if (rx_size > info->desc->max_msg_size || in xfer_get_init()
563 tx_size > info->desc->max_msg_size) in xfer_get_init()
564 return -ERANGE; in xfer_get_init()
566 xfer = scmi_xfer_get(pi->handle, minfo); in xfer_get_init()
573 xfer->tx.len = tx_size; in xfer_get_init()
574 xfer->rx.len = rx_size ? : info->desc->max_msg_size; in xfer_get_init()
575 xfer->hdr.id = msg_id; in xfer_get_init()
576 xfer->hdr.protocol_id = pi->proto->id; in xfer_get_init()
577 xfer->hdr.poll_completion = false; in xfer_get_init()
585 * version_get() - command to get the revision of the SCMI entity
587 * @ph: Pointer to SCMI protocol handle
588 * @version: Holds returned version of protocol.
606 rev_info = t->rx.buf; in version_get()
615 * scmi_set_protocol_priv - Set protocol specific data at init time
617 * @ph: A reference to the protocol handle.
627 pi->priv = priv; in scmi_set_protocol_priv()
633 * scmi_get_protocol_priv - Set protocol specific data at init time
635 * @ph: A reference to the protocol handle.
637 * Return: Protocol private data if any was set.
643 return pi->priv; in scmi_get_protocol_priv()
656 * scmi_get_revision_area - Retrieve version memory area.
658 * @ph: A reference to the protocol handle.
660 * A helper to grab the version memory area reference during SCMI Base protocol
664 * instance underlying this protocol handle.
671 return pi->handle->version; in scmi_get_revision_area()
675 * scmi_get_protocol_instance - Protocol initialization helper.
677 * @protocol_id: The protocol being requested.
679 * In case the required protocol has never been requested before for this
681 * resource allocation with a dedicated per-protocol devres subgroup.
683 * Return: A reference to an initialized protocol instance or error on failure.
688 int ret = -ENOMEM; in scmi_get_protocol_instance()
693 mutex_lock(&info->protocols_mtx); in scmi_get_protocol_instance()
694 pi = idr_find(&info->protocols, protocol_id); in scmi_get_protocol_instance()
697 refcount_inc(&pi->users); in scmi_get_protocol_instance()
701 /* Fail if protocol not registered on bus */ in scmi_get_protocol_instance()
704 ret = -EPROBE_DEFER; in scmi_get_protocol_instance()
708 /* Protocol specific devres group */ in scmi_get_protocol_instance()
709 gid = devres_open_group(handle->dev, NULL, GFP_KERNEL); in scmi_get_protocol_instance()
713 pi = devm_kzalloc(handle->dev, sizeof(*pi), GFP_KERNEL); in scmi_get_protocol_instance()
717 pi->gid = gid; in scmi_get_protocol_instance()
718 pi->proto = proto; in scmi_get_protocol_instance()
719 pi->handle = handle; in scmi_get_protocol_instance()
720 pi->ph.dev = handle->dev; in scmi_get_protocol_instance()
721 pi->ph.xops = &xfer_ops; in scmi_get_protocol_instance()
722 pi->ph.set_priv = scmi_set_protocol_priv; in scmi_get_protocol_instance()
723 pi->ph.get_priv = scmi_get_protocol_priv; in scmi_get_protocol_instance()
724 refcount_set(&pi->users, 1); in scmi_get_protocol_instance()
725 /* proto->init is assured NON NULL by scmi_protocol_register */ in scmi_get_protocol_instance()
726 ret = pi->proto->init_instance(&pi->ph); in scmi_get_protocol_instance()
730 ret = idr_alloc(&info->protocols, pi, in scmi_get_protocol_instance()
735 if (pi->proto->events) in scmi_get_protocol_instance()
736 scmi_register_protocol_events(handle, pi->proto->id, in scmi_get_protocol_instance()
737 &pi->ph, in scmi_get_protocol_instance()
738 pi->proto->events); in scmi_get_protocol_instance()
740 devres_close_group(handle->dev, pi->gid); in scmi_get_protocol_instance()
741 dev_dbg(handle->dev, "Initialized protocol: 0x%X\n", in scmi_get_protocol_instance()
744 mutex_unlock(&info->protocols_mtx); in scmi_get_protocol_instance()
750 devres_release_group(handle->dev, gid); in scmi_get_protocol_instance()
752 mutex_unlock(&info->protocols_mtx); in scmi_get_protocol_instance()
757 * scmi_acquire_protocol - Protocol acquire
759 * @protocol_id: The protocol being requested.
761 * Register a new user for the requested protocol on the specified SCMI
764 * Return: 0 if protocol was acquired successfully.
772 * scmi_release_protocol - Protocol de-initialization helper.
774 * @protocol_id: The protocol being requested.
776 * Remove one user for the specified protocol and triggers de-initialization
777 * and resources de-allocation once the last user has gone.
784 mutex_lock(&info->protocols_mtx); in scmi_release_protocol()
785 pi = idr_find(&info->protocols, protocol_id); in scmi_release_protocol()
789 if (refcount_dec_and_test(&pi->users)) { in scmi_release_protocol()
790 void *gid = pi->gid; in scmi_release_protocol()
792 if (pi->proto->events) in scmi_release_protocol()
795 if (pi->proto->deinit_instance) in scmi_release_protocol()
796 pi->proto->deinit_instance(&pi->ph); in scmi_release_protocol()
798 idr_remove(&info->protocols, protocol_id); in scmi_release_protocol()
802 devres_release_group(handle->dev, gid); in scmi_release_protocol()
803 dev_dbg(handle->dev, "De-Initialized protocol: 0x%X\n", in scmi_release_protocol()
808 mutex_unlock(&info->protocols_mtx); in scmi_release_protocol()
815 struct scmi_info *info = handle_to_scmi_info(pi->handle); in scmi_setup_protocol_implemented()
817 info->protocols_imp = prot_imp; in scmi_setup_protocol_implemented()
826 if (!info->protocols_imp) in scmi_is_protocol_implemented()
830 if (info->protocols_imp[i] == prot_id) in scmi_is_protocol_implemented()
844 scmi_release_protocol(dres->handle, dres->protocol_id); in scmi_devm_release_protocol()
856 return ERR_PTR(-ENOMEM); in __scmi_devres_get_protocol_instance()
858 pi = scmi_get_protocol_instance(sdev->handle, protocol_id); in __scmi_devres_get_protocol_instance()
864 dres->handle = sdev->handle; in __scmi_devres_get_protocol_instance()
865 dres->protocol_id = protocol_id; in __scmi_devres_get_protocol_instance()
866 devres_add(&sdev->dev, dres); in __scmi_devres_get_protocol_instance()
872 * scmi_devm_get_protocol - Devres managed get protocol operations and handle
875 * @protocol_id: The protocol being requested.
876 * @ph: A pointer reference used to pass back the associated protocol handle.
878 * Get hold of a protocol accounting for its usage, eventually triggering its
879 * initialization, and returning the protocol specific operations and related
880 * protocol handle which will be used as first argument in most of the
882 * Being a devres based managed method, protocol hold will be automatically
883 * released, and possibly de-initialized on last user, once the SCMI driver
886 * Return: A reference to the requested protocol operations or error.
896 return ERR_PTR(-EINVAL); in scmi_devm_get_protocol()
902 *ph = &pi->ph; in scmi_devm_get_protocol()
904 return pi->proto->ops; in scmi_devm_get_protocol()
908 * scmi_devm_acquire_protocol - Devres managed helper to get hold of a protocol
911 * @protocol_id: The protocol being requested.
913 * Get hold of a protocol accounting for its usage, possibly triggering its
914 * initialization but without getting access to its protocol specific operations
917 * Being a devres based managed method, protocol hold will be automatically
918 * released, and possibly de-initialized on last user, once the SCMI driver
942 return dres->protocol_id == *((u8 *)data); in scmi_devm_protocol_match()
946 * scmi_devm_put_protocol - Devres managed put protocol operations and handle
949 * @protocol_id: The protocol being requested.
951 * Explicitly release a protocol hold previously obtained calling the above
958 ret = devres_release(&sdev->dev, scmi_devm_release_protocol, in scmi_devm_put_protocol()
966 info->users++; in scmi_handle_get_from_info()
967 return &info->handle; in scmi_handle_get_from_info()
971 * scmi_handle_get() - Get the SCMI handle for a device
976 * and is expected to be maintained by caller of SCMI protocol library.
990 if (dev->parent == info->dev) { in scmi_handle_get()
1001 * scmi_handle_put() - Release the handle acquired by scmi_handle_get
1006 * and is expected to be maintained by caller of SCMI protocol library.
1010 * if null was passed, it returns -EINVAL;
1017 return -EINVAL; in scmi_handle_put()
1021 if (!WARN_ON(!info->users)) in scmi_handle_put()
1022 info->users--; in scmi_handle_put()
1033 struct device *dev = sinfo->dev; in __scmi_xfer_info_init()
1034 const struct scmi_desc *desc = sinfo->desc; in __scmi_xfer_info_init()
1036 /* Pre-allocated messages, no more than what hdr.seq can support */ in __scmi_xfer_info_init()
1037 if (WARN_ON(!desc->max_msg || desc->max_msg > MSG_TOKEN_MAX)) { in __scmi_xfer_info_init()
1039 "Invalid maximum messages %d, not in range [1 - %lu]\n", in __scmi_xfer_info_init()
1040 desc->max_msg, MSG_TOKEN_MAX); in __scmi_xfer_info_init()
1041 return -EINVAL; in __scmi_xfer_info_init()
1044 info->xfer_block = devm_kcalloc(dev, desc->max_msg, in __scmi_xfer_info_init()
1045 sizeof(*info->xfer_block), GFP_KERNEL); in __scmi_xfer_info_init()
1046 if (!info->xfer_block) in __scmi_xfer_info_init()
1047 return -ENOMEM; in __scmi_xfer_info_init()
1049 info->xfer_alloc_table = devm_kcalloc(dev, BITS_TO_LONGS(desc->max_msg), in __scmi_xfer_info_init()
1051 if (!info->xfer_alloc_table) in __scmi_xfer_info_init()
1052 return -ENOMEM; in __scmi_xfer_info_init()
1054 /* Pre-initialize the buffer pointer to pre-allocated buffers */ in __scmi_xfer_info_init()
1055 for (i = 0, xfer = info->xfer_block; i < desc->max_msg; i++, xfer++) { in __scmi_xfer_info_init()
1056 xfer->rx.buf = devm_kcalloc(dev, sizeof(u8), desc->max_msg_size, in __scmi_xfer_info_init()
1058 if (!xfer->rx.buf) in __scmi_xfer_info_init()
1059 return -ENOMEM; in __scmi_xfer_info_init()
1061 xfer->tx.buf = xfer->rx.buf; in __scmi_xfer_info_init()
1062 init_completion(&xfer->done); in __scmi_xfer_info_init()
1065 spin_lock_init(&info->xfer_lock); in __scmi_xfer_info_init()
1072 int ret = __scmi_xfer_info_init(sinfo, &sinfo->tx_minfo); in scmi_xfer_info_init()
1074 if (!ret && idr_find(&sinfo->rx_idr, SCMI_PROTOCOL_BASE)) in scmi_xfer_info_init()
1075 ret = __scmi_xfer_info_init(sinfo, &sinfo->rx_minfo); in scmi_xfer_info_init()
1089 idr = tx ? &info->tx_idr : &info->rx_idr; in scmi_chan_setup()
1091 /* check if already allocated, used for multiple device per protocol */ in scmi_chan_setup()
1096 if (!info->desc->ops->chan_available(dev, idx)) { in scmi_chan_setup()
1099 return -EINVAL; in scmi_chan_setup()
1103 cinfo = devm_kzalloc(info->dev, sizeof(*cinfo), GFP_KERNEL); in scmi_chan_setup()
1105 return -ENOMEM; in scmi_chan_setup()
1107 cinfo->dev = dev; in scmi_chan_setup()
1109 ret = info->desc->ops->chan_setup(cinfo, info->dev, tx); in scmi_chan_setup()
1120 cinfo->handle = &info->handle; in scmi_chan_setup()
1132 if (ret && ret != -ENOMEM) in scmi_txrx_setup()
1140 * scmi_get_protocol_device - Helper to get/create an SCMI device.
1146 * @prot_id: The protocol ID.
1162 sdev = scmi_find_child_dev(info->dev, prot_id, name); in scmi_get_protocol_device()
1166 pr_debug("Creating SCMI device (%s) for protocol %x\n", name, prot_id); in scmi_get_protocol_device()
1168 sdev = scmi_device_create(np, info->dev, prot_id, name); in scmi_get_protocol_device()
1170 dev_err(info->dev, "failed to create %d protocol device\n", in scmi_get_protocol_device()
1175 if (scmi_txrx_setup(info, &sdev->dev, prot_id)) { in scmi_get_protocol_device()
1176 dev_err(&sdev->dev, "failed to setup transport\n"); in scmi_get_protocol_device()
1199 * scmi_create_protocol_devices - Create devices for all pending requests for
1202 * @np: The device node describing the protocol
1204 * @prot_id: The protocol ID
1221 rdev->id_table->name); in scmi_create_protocol_devices()
1227 * scmi_request_protocol_device - Helper to request a device
1229 * @id_table: A protocol/name pair descriptor for the device to be created.
1234 * The requested device name MUST NOT be already existent for any protocol;
1239 * This way the requested device is created straight-away for all the already
1252 unsigned int id = 0; in scmi_request_protocol_device() local
1257 pr_debug("Requesting SCMI device (%s) for protocol %x\n", in scmi_request_protocol_device()
1258 id_table->name, id_table->protocol_id); in scmi_request_protocol_device()
1261 * Search for the matching protocol rdev list and then search in scmi_request_protocol_device()
1265 idr_for_each_entry(&scmi_requested_devices, head, id) { in scmi_request_protocol_device()
1270 if (rdev->id_table->protocol_id == in scmi_request_protocol_device()
1271 id_table->protocol_id) in scmi_request_protocol_device()
1275 if (!strcmp(rdev->id_table->name, id_table->name)) { in scmi_request_protocol_device()
1277 rdev->id_table->protocol_id, in scmi_request_protocol_device()
1278 rdev->id_table->name); in scmi_request_protocol_device()
1279 ret = -EINVAL; in scmi_request_protocol_device()
1291 ret = -ENOMEM; in scmi_request_protocol_device()
1294 rdev->id_table = id_table; in scmi_request_protocol_device()
1298 * related protocol list, eventually creating such head if not already in scmi_request_protocol_device()
1305 ret = -ENOMEM; in scmi_request_protocol_device()
1311 id_table->protocol_id, in scmi_request_protocol_device()
1312 id_table->protocol_id + 1, GFP_KERNEL); in scmi_request_protocol_device()
1313 if (ret != id_table->protocol_id) { in scmi_request_protocol_device()
1314 pr_err("Failed to save SCMI device - ret:%d\n", ret); in scmi_request_protocol_device()
1317 ret = -EINVAL; in scmi_request_protocol_device()
1322 list_add(&rdev->node, phead); in scmi_request_protocol_device()
1327 * protocol as a valid active one: i.e. defined in DT and supported by in scmi_request_protocol_device()
1334 child = idr_find(&info->active_protocols, in scmi_request_protocol_device()
1335 id_table->protocol_id); in scmi_request_protocol_device()
1340 id_table->protocol_id, in scmi_request_protocol_device()
1341 id_table->name); in scmi_request_protocol_device()
1343 if (sdev && !sdev->handle) in scmi_request_protocol_device()
1344 sdev->handle = scmi_handle_get_from_info(info); in scmi_request_protocol_device()
1346 dev_err(info->dev, in scmi_request_protocol_device()
1347 "Failed. SCMI protocol %d not active.\n", in scmi_request_protocol_device()
1348 id_table->protocol_id); in scmi_request_protocol_device()
1360 * scmi_unrequest_protocol_device - Helper to unrequest a device
1362 * @id_table: A protocol/name pair descriptor for the device to be unrequested.
1377 pr_debug("Unrequesting SCMI device (%s) for protocol %x\n", in scmi_unrequest_protocol_device()
1378 id_table->name, id_table->protocol_id); in scmi_unrequest_protocol_device()
1381 phead = idr_find(&scmi_requested_devices, id_table->protocol_id); in scmi_unrequest_protocol_device()
1386 if (!strcmp(victim->id_table->name, id_table->name)) { in scmi_unrequest_protocol_device()
1387 list_del(&victim->node); in scmi_unrequest_protocol_device()
1395 id_table->protocol_id); in scmi_unrequest_protocol_device()
1405 struct idr *idr = &info->tx_idr; in scmi_cleanup_txrx_channels()
1407 ret = idr_for_each(idr, info->desc->ops->chan_free, idr); in scmi_cleanup_txrx_channels()
1408 idr_destroy(&info->tx_idr); in scmi_cleanup_txrx_channels()
1410 idr = &info->rx_idr; in scmi_cleanup_txrx_channels()
1411 ret = idr_for_each(idr, info->desc->ops->chan_free, idr); in scmi_cleanup_txrx_channels()
1412 idr_destroy(&info->rx_idr); in scmi_cleanup_txrx_channels()
1423 struct device *dev = &pdev->dev; in scmi_probe()
1424 struct device_node *child, *np = dev->of_node; in scmi_probe()
1428 return -EINVAL; in scmi_probe()
1432 return -ENOMEM; in scmi_probe()
1434 info->dev = dev; in scmi_probe()
1435 info->desc = desc; in scmi_probe()
1436 INIT_LIST_HEAD(&info->node); in scmi_probe()
1437 idr_init(&info->protocols); in scmi_probe()
1438 mutex_init(&info->protocols_mtx); in scmi_probe()
1439 idr_init(&info->active_protocols); in scmi_probe()
1442 idr_init(&info->tx_idr); in scmi_probe()
1443 idr_init(&info->rx_idr); in scmi_probe()
1445 handle = &info->handle; in scmi_probe()
1446 handle->dev = info->dev; in scmi_probe()
1447 handle->version = &info->version; in scmi_probe()
1448 handle->devm_acquire_protocol = scmi_devm_acquire_protocol; in scmi_probe()
1449 handle->devm_get_protocol = scmi_devm_get_protocol; in scmi_probe()
1450 handle->devm_put_protocol = scmi_devm_put_protocol; in scmi_probe()
1464 * Trigger SCMI Base protocol initialization. in scmi_probe()
1475 list_add_tail(&info->node, &scmi_list); in scmi_probe()
1485 dev_err(dev, "Out of range protocol %d\n", prot_id); in scmi_probe()
1488 dev_err(dev, "SCMI protocol %d not implemented\n", in scmi_probe()
1494 * Save this valid DT protocol descriptor amongst in scmi_probe()
1497 ret = idr_alloc(&info->active_protocols, child, in scmi_probe()
1500 dev_err(dev, "SCMI protocol %d already activated. Skip\n", in scmi_probe()
1512 scmi_notification_exit(&info->handle); in scmi_probe()
1518 void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id) in scmi_free_channel() argument
1520 idr_remove(idr, id); in scmi_free_channel()
1525 int ret = 0, id; in scmi_remove() local
1530 if (info->users) in scmi_remove()
1531 ret = -EBUSY; in scmi_remove()
1533 list_del(&info->node); in scmi_remove()
1539 scmi_notification_exit(&info->handle); in scmi_remove()
1541 mutex_lock(&info->protocols_mtx); in scmi_remove()
1542 idr_destroy(&info->protocols); in scmi_remove()
1543 mutex_unlock(&info->protocols_mtx); in scmi_remove()
1545 idr_for_each_entry(&info->active_protocols, child, id) in scmi_remove()
1547 idr_destroy(&info->active_protocols); in scmi_remove()
1558 return sprintf(buf, "%u.%u\n", info->version.major_ver, in protocol_version_show()
1559 info->version.minor_ver); in protocol_version_show()
1568 return sprintf(buf, "0x%x\n", info->version.impl_ver); in firmware_version_show()
1577 return sprintf(buf, "%s\n", info->version.vendor_id); in vendor_id_show()
1586 return sprintf(buf, "%s\n", info->version.sub_vendor_id); in sub_vendor_id_show()
1605 { .compatible = "arm,scmi-smc", .data = &scmi_smc_desc},
1614 .name = "arm-scmi",
1659 MODULE_ALIAS("platform:arm-scmi");
1661 MODULE_DESCRIPTION("ARM SCMI protocol driver");