Lines Matching defs:glink

131  * @glink:	qcom_glink context handle
156 struct qcom_glink *glink;
214 static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink,
223 /* Setup glink internal glink_channel data */
228 channel->glink = glink;
285 static size_t qcom_glink_rx_avail(struct qcom_glink *glink)
287 return glink->rx_pipe->avail(glink->rx_pipe);
290 static void qcom_glink_rx_peek(struct qcom_glink *glink,
293 glink->rx_pipe->peek(glink->rx_pipe, data, offset, count);
296 static void qcom_glink_rx_advance(struct qcom_glink *glink, size_t count)
298 glink->rx_pipe->advance(glink->rx_pipe, count);
301 static size_t qcom_glink_tx_avail(struct qcom_glink *glink)
303 return glink->tx_pipe->avail(glink->tx_pipe);
306 static void qcom_glink_tx_write(struct qcom_glink *glink,
310 glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen);
313 static void qcom_glink_tx_kick(struct qcom_glink *glink)
315 glink->tx_pipe->kick(glink->tx_pipe);
318 static void qcom_glink_send_read_notify(struct qcom_glink *glink)
326 qcom_glink_tx_write(glink, &msg, sizeof(msg), NULL, 0);
328 qcom_glink_tx_kick(glink);
331 static int qcom_glink_tx(struct qcom_glink *glink,
340 if (tlen >= glink->tx_pipe->length)
343 spin_lock_irqsave(&glink->tx_lock, flags);
345 if (glink->abort_tx) {
350 while (qcom_glink_tx_avail(glink) < tlen) {
356 if (glink->abort_tx) {
361 if (!glink->sent_read_notify) {
362 glink->sent_read_notify = true;
363 qcom_glink_send_read_notify(glink);
367 spin_unlock_irqrestore(&glink->tx_lock, flags);
369 wait_event_timeout(glink->tx_avail_notify,
370 qcom_glink_tx_avail(glink) >= tlen, 10 * HZ);
372 spin_lock_irqsave(&glink->tx_lock, flags);
374 if (qcom_glink_tx_avail(glink) >= tlen)
375 glink->sent_read_notify = false;
378 qcom_glink_tx_write(glink, hdr, hlen, data, dlen);
379 qcom_glink_tx_kick(glink);
382 spin_unlock_irqrestore(&glink->tx_lock, flags);
387 static int qcom_glink_send_version(struct qcom_glink *glink)
393 msg.param2 = cpu_to_le32(glink->features);
395 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
398 static void qcom_glink_send_version_ack(struct qcom_glink *glink)
404 msg.param2 = cpu_to_le32(glink->features);
406 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
409 static void qcom_glink_send_open_ack(struct qcom_glink *glink,
418 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
421 static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink,
427 spin_lock_irqsave(&glink->idr_lock, flags);
428 channel = idr_find(&glink->rcids, cid);
429 spin_unlock_irqrestore(&glink->idr_lock, flags);
431 dev_err(glink->dev, "unable to find channel\n");
447 * @glink: Ptr to the glink edge
455 static int qcom_glink_send_open_req(struct qcom_glink *glink,
469 spin_lock_irqsave(&glink->idr_lock, flags);
470 ret = idr_alloc_cyclic(&glink->lcids, channel,
473 spin_unlock_irqrestore(&glink->idr_lock, flags);
484 ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true);
491 spin_lock_irqsave(&glink->idr_lock, flags);
492 idr_remove(&glink->lcids, channel->lcid);
494 spin_unlock_irqrestore(&glink->idr_lock, flags);
499 static void qcom_glink_send_close_req(struct qcom_glink *glink,
508 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
511 static void qcom_glink_send_close_ack(struct qcom_glink *glink,
520 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
527 struct qcom_glink *glink = channel->glink;
551 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
561 static void qcom_glink_rx_done(struct qcom_glink *glink,
566 if (glink->intentless) {
590 * @glink: pointer to transport interface
597 static void qcom_glink_receive_version(struct qcom_glink *glink,
605 glink->features &= features;
608 qcom_glink_send_version_ack(glink);
616 * @glink: pointer to transport interface
624 static void qcom_glink_receive_version_ack(struct qcom_glink *glink,
633 if (features == glink->features)
636 glink->features &= features;
639 qcom_glink_send_version(glink);
647 * @glink: The transport to transmit on.
648 * @channel: The glink channel
653 static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink,
663 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
671 * @glink: The transport to transmit on.
677 static int qcom_glink_advertise_intent(struct qcom_glink *glink,
696 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
702 qcom_glink_alloc_intent(struct qcom_glink *glink,
740 static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
748 spin_lock_irqsave(&glink->idr_lock, flags);
749 channel = idr_find(&glink->rcids, cid);
750 spin_unlock_irqrestore(&glink->idr_lock, flags);
752 dev_err(glink->dev, "invalid channel id received\n");
761 dev_err(glink->dev, "invalid intent id received\n");
782 * @glink: Pointer to the transport interface
789 static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
796 spin_lock_irqsave(&glink->idr_lock, flags);
797 channel = idr_find(&glink->rcids, cid);
798 spin_unlock_irqrestore(&glink->idr_lock, flags);
805 intent = qcom_glink_alloc_intent(glink, channel, size, false);
807 qcom_glink_advertise_intent(glink, channel, intent);
809 qcom_glink_send_intent_req_ack(glink, channel, !!intent);
812 static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra)
818 if (qcom_glink_rx_avail(glink) < sizeof(struct glink_msg) + extra) {
819 dev_dbg(glink->dev, "Insufficient data in rx fifo");
829 qcom_glink_rx_peek(glink, &dcmd->msg, 0, sizeof(dcmd->msg) + extra);
831 spin_lock(&glink->rx_lock);
832 list_add_tail(&dcmd->node, &glink->rx_queue);
833 spin_unlock(&glink->rx_lock);
835 schedule_work(&glink->rx_work);
836 qcom_glink_rx_advance(glink, sizeof(dcmd->msg) + extra);
841 static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
858 dev_dbg(glink->dev, "Not enough data in fifo\n");
862 qcom_glink_rx_peek(glink, &hdr, 0, sizeof(hdr));
867 dev_dbg(glink->dev, "Payload not yet in fifo\n");
872 spin_lock_irqsave(&glink->idr_lock, flags);
873 channel = idr_find(&glink->rcids, rcid);
874 spin_unlock_irqrestore(&glink->idr_lock, flags);
876 dev_dbg(glink->dev, "Data on non-existing channel\n");
882 if (glink->intentless) {
912 dev_err(glink->dev,
921 dev_err(glink->dev, "Insufficient space in intent\n");
927 qcom_glink_rx_peek(glink, intent->data + intent->offset,
946 qcom_glink_rx_done(glink, channel, intent);
950 qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8));
955 static void qcom_glink_handle_intent(struct qcom_glink *glink,
978 dev_dbg(glink->dev, "Not enough data in fifo\n");
982 spin_lock_irqsave(&glink->idr_lock, flags);
983 channel = idr_find(&glink->rcids, cid);
984 spin_unlock_irqrestore(&glink->idr_lock, flags);
986 dev_err(glink->dev, "intents for non-existing channel\n");
987 qcom_glink_rx_advance(glink, ALIGN(msglen, 8));
995 qcom_glink_rx_peek(glink, msg, 0, msglen);
1011 dev_err(glink->dev, "failed to store remote intent\n");
1018 qcom_glink_rx_advance(glink, ALIGN(msglen, 8));
1021 static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
1025 spin_lock(&glink->idr_lock);
1026 channel = idr_find(&glink->lcids, lcid);
1027 spin_unlock(&glink->idr_lock);
1029 dev_err(glink->dev, "Invalid open ack packet\n");
1049 struct qcom_glink *glink = channel->glink;
1060 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
1063 static void qcom_glink_handle_signals(struct qcom_glink *glink,
1070 spin_lock_irqsave(&glink->idr_lock, flags);
1071 channel = idr_find(&glink->rcids, rcid);
1072 spin_unlock_irqrestore(&glink->idr_lock, flags);
1074 dev_err(glink->dev, "signal for non-existing channel\n");
1084 void qcom_glink_native_rx(struct qcom_glink *glink)
1094 wake_up_all(&glink->tx_avail_notify);
1097 avail = qcom_glink_rx_avail(glink);
1101 qcom_glink_rx_peek(glink, &msg, 0, sizeof(msg));
1113 ret = qcom_glink_rx_defer(glink, 0);
1116 ret = qcom_glink_rx_open_ack(glink, param1);
1117 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1120 ret = qcom_glink_rx_defer(glink, param2);
1124 ret = qcom_glink_rx_data(glink, avail);
1127 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1128 qcom_glink_tx_kick(glink);
1131 qcom_glink_handle_intent(glink, param1, param2, avail);
1134 qcom_glink_handle_rx_done(glink, param1, param2, false);
1135 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1138 qcom_glink_handle_rx_done(glink, param1, param2, true);
1139 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1142 qcom_glink_handle_intent_req_ack(glink, param1, param2);
1143 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1146 qcom_glink_handle_signals(glink, param1, param2);
1147 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1150 dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
1162 static struct glink_channel *qcom_glink_create_local(struct qcom_glink *glink,
1169 channel = qcom_glink_alloc_channel(glink, name);
1173 ret = qcom_glink_send_open_req(glink, channel);
1185 qcom_glink_send_open_ack(glink, channel);
1191 spin_lock_irqsave(&glink->idr_lock, flags);
1192 idr_remove(&glink->lcids, channel->lcid);
1193 spin_unlock_irqrestore(&glink->idr_lock, flags);
1205 static int qcom_glink_create_remote(struct qcom_glink *glink,
1210 qcom_glink_send_open_ack(glink, channel);
1212 ret = qcom_glink_send_open_req(glink, channel);
1231 qcom_glink_send_close_req(glink, channel);
1244 struct qcom_glink *glink = parent->glink;
1251 spin_lock_irqsave(&glink->idr_lock, flags);
1252 idr_for_each_entry(&glink->rcids, channel, cid) {
1256 spin_unlock_irqrestore(&glink->idr_lock, flags);
1259 channel = qcom_glink_create_local(glink, name);
1263 ret = qcom_glink_create_remote(glink, channel);
1281 struct qcom_glink *glink = channel->glink;
1290 if (glink->intentless || !completion_done(&channel->open_ack))
1304 intent = qcom_glink_alloc_intent(glink, channel, size,
1309 qcom_glink_advertise_intent(glink, channel, intent);
1318 struct qcom_glink *glink = channel->glink;
1328 qcom_glink_send_close_req(glink, channel);
1331 static int qcom_glink_request_intent(struct qcom_glink *glink,
1352 ret = qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
1361 dev_err(glink->dev, "intent request timed out\n");
1375 struct qcom_glink *glink = channel->glink;
1389 if (!glink->intentless) {
1413 ret = qcom_glink_request_intent(glink, channel, len);
1432 ret = qcom_glink_tx(glink, &req, sizeof(req), data + offset, chunk_size, wait);
1475 * Finds the device_node for the glink child interested in this channel.
1486 key = "qcom,glink-channels";
1520 static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
1531 spin_lock_irqsave(&glink->idr_lock, flags);
1532 idr_for_each_entry(&glink->lcids, channel, lcid) {
1536 spin_unlock_irqrestore(&glink->idr_lock, flags);
1539 channel = qcom_glink_alloc_channel(glink, name);
1547 spin_lock_irqsave(&glink->idr_lock, flags);
1548 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
1550 dev_err(glink->dev, "Unable to insert channel into rcid list\n");
1551 spin_unlock_irqrestore(&glink->idr_lock, flags);
1555 spin_unlock_irqrestore(&glink->idr_lock, flags);
1572 node = qcom_glink_match_channel(glink->dev->of_node, name);
1574 rpdev->dev.parent = glink->dev;
1587 spin_lock_irqsave(&glink->idr_lock, flags);
1588 idr_remove(&glink->rcids, channel->rcid);
1590 spin_unlock_irqrestore(&glink->idr_lock, flags);
1599 static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
1605 spin_lock_irqsave(&glink->idr_lock, flags);
1606 channel = idr_find(&glink->rcids, rcid);
1607 spin_unlock_irqrestore(&glink->idr_lock, flags);
1619 rpmsg_unregister_device(glink->dev, &chinfo);
1623 qcom_glink_send_close_ack(glink, channel->rcid);
1625 spin_lock_irqsave(&glink->idr_lock, flags);
1626 idr_remove(&glink->rcids, channel->rcid);
1628 spin_unlock_irqrestore(&glink->idr_lock, flags);
1633 static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid)
1640 wake_up_all(&glink->tx_avail_notify);
1642 spin_lock_irqsave(&glink->idr_lock, flags);
1643 channel = idr_find(&glink->lcids, lcid);
1645 spin_unlock_irqrestore(&glink->idr_lock, flags);
1649 idr_remove(&glink->lcids, channel->lcid);
1651 spin_unlock_irqrestore(&glink->idr_lock, flags);
1659 rpmsg_unregister_device(glink->dev, &chinfo);
1668 struct qcom_glink *glink = container_of(work, struct qcom_glink,
1678 spin_lock_irqsave(&glink->rx_lock, flags);
1679 if (list_empty(&glink->rx_queue)) {
1680 spin_unlock_irqrestore(&glink->rx_lock, flags);
1683 dcmd = list_first_entry(&glink->rx_queue,
1686 spin_unlock_irqrestore(&glink->rx_lock, flags);
1695 qcom_glink_receive_version(glink, param1, param2);
1698 qcom_glink_receive_version_ack(glink, param1, param2);
1701 qcom_glink_rx_open(glink, param1, msg->data);
1704 qcom_glink_rx_close(glink, param1);
1707 qcom_glink_rx_close_ack(glink, param1);
1710 qcom_glink_handle_intent_req(glink, param1, param2);
1721 static void qcom_glink_cancel_rx_work(struct qcom_glink *glink)
1727 cancel_work_sync(&glink->rx_work);
1729 list_for_each_entry_safe(dcmd, tmp, &glink->rx_queue, node)
1764 static int qcom_glink_create_chrdev(struct qcom_glink *glink)
1773 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev");
1782 rpdev->dev.parent = glink->dev;
1795 struct qcom_glink *glink;
1797 glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL);
1798 if (!glink)
1801 glink->dev = dev;
1802 glink->tx_pipe = tx;
1803 glink->rx_pipe = rx;
1805 glink->features = features;
1806 glink->intentless = intentless;
1808 spin_lock_init(&glink->tx_lock);
1809 spin_lock_init(&glink->rx_lock);
1810 INIT_LIST_HEAD(&glink->rx_queue);
1811 INIT_WORK(&glink->rx_work, qcom_glink_work);
1812 init_waitqueue_head(&glink->tx_avail_notify);
1814 spin_lock_init(&glink->idr_lock);
1815 idr_init(&glink->lcids);
1816 idr_init(&glink->rcids);
1818 glink->dev->groups = qcom_glink_groups;
1824 ret = qcom_glink_send_version(glink);
1828 ret = qcom_glink_create_chrdev(glink);
1830 dev_err(glink->dev, "failed to register chrdev\n");
1832 return glink;
1843 void qcom_glink_native_remove(struct qcom_glink *glink)
1850 qcom_glink_cancel_rx_work(glink);
1853 spin_lock_irqsave(&glink->tx_lock, flags);
1854 glink->abort_tx = true;
1855 wake_up_all(&glink->tx_avail_notify);
1856 spin_unlock_irqrestore(&glink->tx_lock, flags);
1859 spin_lock_irqsave(&glink->idr_lock, flags);
1860 idr_for_each_entry(&glink->lcids, channel, cid)
1862 spin_unlock_irqrestore(&glink->idr_lock, flags);
1864 ret = device_for_each_child(glink->dev, NULL, qcom_glink_remove_device);
1866 dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret);
1869 idr_for_each_entry(&glink->lcids, channel, cid)
1873 idr_for_each_entry(&glink->rcids, channel, cid)
1876 idr_destroy(&glink->lcids);
1877 idr_destroy(&glink->rcids);