Lines Matching +full:smc +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
3 * System Control and Management Interface (SCMI) Message SMC/HVC
9 #include <linux/arm-smccc.h>
26 * smc/hvc call to keep it uniform across smc32/smc64 conventions.
30 * scmi instances that are using the same smc-id.
38 #define SHMEM_OFFSET(x) ((x) & (SHMEM_SIZE - 1))
41 * struct scmi_smc - Structure representing a SCMI smc transport
50 * @func_id: smc/hvc call function id
72 scmi_rx_callback(scmi_info->cinfo, in smc_msg_done_isr()
73 shmem_read_header(scmi_info->shmem), NULL); in smc_msg_done_isr()
91 atomic_set(&scmi_info->inflight, INFLIGHT_NONE); in smc_channel_lock_init()
93 mutex_init(&scmi_info->shmem_lock); in smc_channel_lock_init()
100 ret = atomic_cmpxchg(inflight, INFLIGHT_NONE, xfer->hdr.seq); in smc_xfer_inflight()
110 spin_until_cond(smc_xfer_inflight(xfer, &scmi_info->inflight)); in smc_channel_lock_acquire()
112 mutex_lock(&scmi_info->shmem_lock); in smc_channel_lock_acquire()
118 atomic_set(&scmi_info->inflight, INFLIGHT_NONE); in smc_channel_lock_release()
120 mutex_unlock(&scmi_info->shmem_lock); in smc_channel_lock_release()
126 struct device *cdev = cinfo->dev; in smc_chan_setup()
135 return -ENODEV; in smc_chan_setup()
139 return -ENOMEM; in smc_chan_setup()
141 np = of_parse_phandle(cdev->of_node, "shmem", 0); in smc_chan_setup()
142 if (!of_device_is_compatible(np, "arm,scmi-shmem")) { in smc_chan_setup()
144 return -ENXIO; in smc_chan_setup()
155 scmi_info->shmem = devm_ioremap(dev, res.start, size); in smc_chan_setup()
156 if (!scmi_info->shmem) { in smc_chan_setup()
158 return -EADDRNOTAVAIL; in smc_chan_setup()
161 ret = of_property_read_u32(dev->of_node, "arm,smc-id", &func_id); in smc_chan_setup()
165 if (of_device_is_compatible(dev->of_node, "arm,scmi-smc-param")) { in smc_chan_setup()
166 scmi_info->param_page = SHMEM_PAGE(res.start); in smc_chan_setup()
167 scmi_info->param_offset = SHMEM_OFFSET(res.start); in smc_chan_setup()
172 * the return of the SMC call. in smc_chan_setup()
174 scmi_info->irq = of_irq_get_byname(cdev->of_node, "a2p"); in smc_chan_setup()
175 if (scmi_info->irq > 0) { in smc_chan_setup()
176 ret = request_irq(scmi_info->irq, smc_msg_done_isr, in smc_chan_setup()
179 dev_err(dev, "failed to setup SCMI smc irq\n"); in smc_chan_setup()
183 cinfo->no_completion_irq = true; in smc_chan_setup()
186 scmi_info->func_id = func_id; in smc_chan_setup()
187 scmi_info->cinfo = cinfo; in smc_chan_setup()
189 cinfo->transport_info = scmi_info; in smc_chan_setup()
194 static int smc_chan_free(int id, void *p, void *data) in smc_chan_free() argument
197 struct scmi_smc *scmi_info = cinfo->transport_info; in smc_chan_free()
200 if (scmi_info->irq > 0) in smc_chan_free()
201 free_irq(scmi_info->irq, scmi_info); in smc_chan_free()
203 cinfo->transport_info = NULL; in smc_chan_free()
204 scmi_info->cinfo = NULL; in smc_chan_free()
212 struct scmi_smc *scmi_info = cinfo->transport_info; in smc_send_message()
214 unsigned long page = scmi_info->param_page; in smc_send_message()
215 unsigned long offset = scmi_info->param_offset; in smc_send_message()
223 shmem_tx_prepare(scmi_info->shmem, xfer, cinfo); in smc_send_message()
225 arm_smccc_1_1_invoke(scmi_info->func_id, page, offset, 0, 0, 0, 0, 0, in smc_send_message()
231 return -EOPNOTSUPP; in smc_send_message()
240 struct scmi_smc *scmi_info = cinfo->transport_info; in smc_fetch_response()
242 shmem_fetch_response(scmi_info->shmem, xfer); in smc_fetch_response()
248 struct scmi_smc *scmi_info = cinfo->transport_info; in smc_mark_txdone()
268 * Setting .sync_cmds_atomic_replies to true for SMC assumes that,
269 * once the SMC instruction has completed successfully, the issued