Lines Matching +full:glink +full:- +full:edge
1 // SPDX-License-Identifier: GPL-2.0
42 struct qcom_glink *glink; member
66 struct qcom_glink_smem *smem = pipe->smem; in glink_smem_rx_avail()
72 if (!pipe->fifo) { in glink_smem_rx_avail()
73 fifo = qcom_smem_get(smem->remote_pid, in glink_smem_rx_avail()
81 pipe->fifo = fifo; in glink_smem_rx_avail()
82 pipe->native.length = len; in glink_smem_rx_avail()
85 head = le32_to_cpu(*pipe->head); in glink_smem_rx_avail()
86 tail = le32_to_cpu(*pipe->tail); in glink_smem_rx_avail()
89 return pipe->native.length - tail + head; in glink_smem_rx_avail()
91 return head - tail; in glink_smem_rx_avail()
101 tail = le32_to_cpu(*pipe->tail); in glink_smem_rx_peek()
103 if (tail >= pipe->native.length) in glink_smem_rx_peek()
104 tail -= pipe->native.length; in glink_smem_rx_peek()
106 len = min_t(size_t, count, pipe->native.length - tail); in glink_smem_rx_peek()
108 memcpy_fromio(data, pipe->fifo + tail, len); in glink_smem_rx_peek()
111 memcpy_fromio(data + len, pipe->fifo, (count - len)); in glink_smem_rx_peek()
120 tail = le32_to_cpu(*pipe->tail); in glink_smem_rx_advance()
123 if (tail >= pipe->native.length) in glink_smem_rx_advance()
124 tail -= pipe->native.length; in glink_smem_rx_advance()
126 *pipe->tail = cpu_to_le32(tail); in glink_smem_rx_advance()
136 head = le32_to_cpu(*pipe->head); in glink_smem_tx_avail()
137 tail = le32_to_cpu(*pipe->tail); in glink_smem_tx_avail()
140 avail = pipe->native.length - head + tail; in glink_smem_tx_avail()
142 avail = tail - head; in glink_smem_tx_avail()
147 avail -= FIFO_FULL_RESERVE + TX_BLOCKED_CMD_RESERVE; in glink_smem_tx_avail()
158 len = min_t(size_t, count, pipe->native.length - head); in glink_smem_tx_write_one()
160 memcpy(pipe->fifo + head, data, len); in glink_smem_tx_write_one()
163 memcpy(pipe->fifo, data + len, count - len); in glink_smem_tx_write_one()
166 if (head >= pipe->native.length) in glink_smem_tx_write_one()
167 head -= pipe->native.length; in glink_smem_tx_write_one()
179 head = le32_to_cpu(*pipe->head); in glink_smem_tx_write()
186 if (head >= pipe->native.length) in glink_smem_tx_write()
187 head -= pipe->native.length; in glink_smem_tx_write()
192 *pipe->head = cpu_to_le32(head); in glink_smem_tx_write()
198 struct qcom_glink_smem *smem = pipe->smem; in glink_smem_tx_kick()
200 mbox_send_message(smem->mbox_chan, NULL); in glink_smem_tx_kick()
201 mbox_client_txdone(smem->mbox_chan, 0); in glink_smem_tx_kick()
208 qcom_glink_native_rx(smem->glink); in qcom_glink_smem_intr()
226 struct qcom_glink *glink; in qcom_glink_smem_register() local
235 return ERR_PTR(-ENOMEM); in qcom_glink_smem_register()
237 dev = &smem->dev; in qcom_glink_smem_register()
239 dev->parent = parent; in qcom_glink_smem_register()
240 dev->of_node = node; in qcom_glink_smem_register()
241 dev->release = qcom_glink_smem_release; in qcom_glink_smem_register()
242 dev_set_name(dev, "%s:%pOFn", dev_name(parent->parent), node); in qcom_glink_smem_register()
245 pr_err("failed to register glink edge\n"); in qcom_glink_smem_register()
250 ret = of_property_read_u32(dev->of_node, "qcom,remote-pid", in qcom_glink_smem_register()
253 dev_err(dev, "failed to parse qcom,remote-pid\n"); in qcom_glink_smem_register()
257 smem->remote_pid = remote_pid; in qcom_glink_smem_register()
262 ret = -ENOMEM; in qcom_glink_smem_register()
268 if (ret && ret != -EEXIST) { in qcom_glink_smem_register()
269 dev_err(dev, "failed to allocate glink descriptors\n"); in qcom_glink_smem_register()
282 dev_err(dev, "glink descriptor of invalid size\n"); in qcom_glink_smem_register()
283 ret = -EINVAL; in qcom_glink_smem_register()
287 tx_pipe->tail = &descs[0]; in qcom_glink_smem_register()
288 tx_pipe->head = &descs[1]; in qcom_glink_smem_register()
289 rx_pipe->tail = &descs[2]; in qcom_glink_smem_register()
290 rx_pipe->head = &descs[3]; in qcom_glink_smem_register()
294 if (ret && ret != -EEXIST) { in qcom_glink_smem_register()
299 tx_pipe->fifo = qcom_smem_get(remote_pid, SMEM_GLINK_NATIVE_XPRT_FIFO_0, in qcom_glink_smem_register()
300 &tx_pipe->native.length); in qcom_glink_smem_register()
301 if (IS_ERR(tx_pipe->fifo)) { in qcom_glink_smem_register()
303 ret = PTR_ERR(tx_pipe->fifo); in qcom_glink_smem_register()
307 smem->irq = of_irq_get(smem->dev.of_node, 0); in qcom_glink_smem_register()
308 ret = devm_request_irq(&smem->dev, smem->irq, qcom_glink_smem_intr, in qcom_glink_smem_register()
310 "glink-smem", smem); in qcom_glink_smem_register()
312 dev_err(&smem->dev, "failed to request IRQ\n"); in qcom_glink_smem_register()
316 smem->mbox_client.dev = &smem->dev; in qcom_glink_smem_register()
317 smem->mbox_client.knows_txdone = true; in qcom_glink_smem_register()
318 smem->mbox_chan = mbox_request_channel(&smem->mbox_client, 0); in qcom_glink_smem_register()
319 if (IS_ERR(smem->mbox_chan)) { in qcom_glink_smem_register()
320 ret = dev_err_probe(&smem->dev, PTR_ERR(smem->mbox_chan), in qcom_glink_smem_register()
325 rx_pipe->smem = smem; in qcom_glink_smem_register()
326 rx_pipe->native.avail = glink_smem_rx_avail; in qcom_glink_smem_register()
327 rx_pipe->native.peek = glink_smem_rx_peek; in qcom_glink_smem_register()
328 rx_pipe->native.advance = glink_smem_rx_advance; in qcom_glink_smem_register()
330 tx_pipe->smem = smem; in qcom_glink_smem_register()
331 tx_pipe->native.avail = glink_smem_tx_avail; in qcom_glink_smem_register()
332 tx_pipe->native.write = glink_smem_tx_write; in qcom_glink_smem_register()
333 tx_pipe->native.kick = glink_smem_tx_kick; in qcom_glink_smem_register()
335 *rx_pipe->tail = 0; in qcom_glink_smem_register()
336 *tx_pipe->head = 0; in qcom_glink_smem_register()
338 glink = qcom_glink_native_probe(dev, in qcom_glink_smem_register()
340 &rx_pipe->native, &tx_pipe->native, in qcom_glink_smem_register()
342 if (IS_ERR(glink)) { in qcom_glink_smem_register()
343 ret = PTR_ERR(glink); in qcom_glink_smem_register()
347 smem->glink = glink; in qcom_glink_smem_register()
349 enable_irq(smem->irq); in qcom_glink_smem_register()
354 mbox_free_channel(smem->mbox_chan); in qcom_glink_smem_register()
365 struct qcom_glink *glink = smem->glink; in qcom_glink_smem_unregister() local
367 disable_irq(smem->irq); in qcom_glink_smem_unregister()
369 qcom_glink_native_remove(glink); in qcom_glink_smem_unregister()
371 mbox_free_channel(smem->mbox_chan); in qcom_glink_smem_unregister()
372 device_unregister(&smem->dev); in qcom_glink_smem_unregister()
377 MODULE_DESCRIPTION("Qualcomm GLINK SMEM driver");