Lines Matching defs:glink

134  * @glink:	qcom_glink context handle
158 struct qcom_glink *glink;
209 static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink,
218 /* Setup glink internal glink_channel data */
223 channel->glink = glink;
280 static size_t qcom_glink_rx_avail(struct qcom_glink *glink)
282 return glink->rx_pipe->avail(glink->rx_pipe);
285 static void qcom_glink_rx_peak(struct qcom_glink *glink,
288 glink->rx_pipe->peak(glink->rx_pipe, data, offset, count);
291 static void qcom_glink_rx_advance(struct qcom_glink *glink, size_t count)
293 glink->rx_pipe->advance(glink->rx_pipe, count);
296 static size_t qcom_glink_tx_avail(struct qcom_glink *glink)
298 return glink->tx_pipe->avail(glink->tx_pipe);
301 static void qcom_glink_tx_write(struct qcom_glink *glink,
305 glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen);
308 static int qcom_glink_tx(struct qcom_glink *glink,
317 if (tlen >= glink->tx_pipe->length)
320 spin_lock_irqsave(&glink->tx_lock, flags);
322 while (qcom_glink_tx_avail(glink) < tlen) {
329 spin_unlock_irqrestore(&glink->tx_lock, flags);
333 spin_lock_irqsave(&glink->tx_lock, flags);
336 qcom_glink_tx_write(glink, hdr, hlen, data, dlen);
338 mbox_send_message(glink->mbox_chan, NULL);
339 mbox_client_txdone(glink->mbox_chan, 0);
342 spin_unlock_irqrestore(&glink->tx_lock, flags);
347 static int qcom_glink_send_version(struct qcom_glink *glink)
353 msg.param2 = cpu_to_le32(glink->features);
355 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
358 static void qcom_glink_send_version_ack(struct qcom_glink *glink)
364 msg.param2 = cpu_to_le32(glink->features);
366 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
369 static void qcom_glink_send_open_ack(struct qcom_glink *glink,
378 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
381 static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink,
387 spin_lock_irqsave(&glink->idr_lock, flags);
388 channel = idr_find(&glink->rcids, cid);
389 spin_unlock_irqrestore(&glink->idr_lock, flags);
391 dev_err(glink->dev, "unable to find channel\n");
401 * @glink: Ptr to the glink edge
409 static int qcom_glink_send_open_req(struct qcom_glink *glink,
423 spin_lock_irqsave(&glink->idr_lock, flags);
424 ret = idr_alloc_cyclic(&glink->lcids, channel,
427 spin_unlock_irqrestore(&glink->idr_lock, flags);
438 ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true);
445 spin_lock_irqsave(&glink->idr_lock, flags);
446 idr_remove(&glink->lcids, channel->lcid);
448 spin_unlock_irqrestore(&glink->idr_lock, flags);
453 static void qcom_glink_send_close_req(struct qcom_glink *glink,
462 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
465 static void qcom_glink_send_close_ack(struct qcom_glink *glink,
474 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true);
481 struct qcom_glink *glink = channel->glink;
505 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
515 static void qcom_glink_rx_done(struct qcom_glink *glink,
520 if (glink->intentless) {
544 * @glink: pointer to transport interface
551 static void qcom_glink_receive_version(struct qcom_glink *glink,
559 glink->features &= features;
562 qcom_glink_send_version_ack(glink);
570 * @glink: pointer to transport interface
578 static void qcom_glink_receive_version_ack(struct qcom_glink *glink,
587 if (features == glink->features)
590 glink->features &= features;
593 qcom_glink_send_version(glink);
601 * @glink: The transport to transmit on.
602 * @channel: The glink channel
607 static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink,
617 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
625 * @glink: The transport to transmit on.
631 static int qcom_glink_advertise_intent(struct qcom_glink *glink,
650 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
656 qcom_glink_alloc_intent(struct qcom_glink *glink,
694 static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
702 spin_lock_irqsave(&glink->idr_lock, flags);
703 channel = idr_find(&glink->rcids, cid);
704 spin_unlock_irqrestore(&glink->idr_lock, flags);
706 dev_err(glink->dev, "invalid channel id received\n");
715 dev_err(glink->dev, "invalid intent id received\n");
731 * @glink: Pointer to the transport interface
738 static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
745 spin_lock_irqsave(&glink->idr_lock, flags);
746 channel = idr_find(&glink->rcids, cid);
747 spin_unlock_irqrestore(&glink->idr_lock, flags);
754 intent = qcom_glink_alloc_intent(glink, channel, size, false);
756 qcom_glink_advertise_intent(glink, channel, intent);
758 qcom_glink_send_intent_req_ack(glink, channel, !!intent);
761 static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra)
767 if (qcom_glink_rx_avail(glink) < sizeof(struct glink_msg) + extra) {
768 dev_dbg(glink->dev, "Insufficient data in rx fifo");
778 qcom_glink_rx_peak(glink, &dcmd->msg, 0, sizeof(dcmd->msg) + extra);
780 spin_lock(&glink->rx_lock);
781 list_add_tail(&dcmd->node, &glink->rx_queue);
782 spin_unlock(&glink->rx_lock);
784 schedule_work(&glink->rx_work);
785 qcom_glink_rx_advance(glink, sizeof(dcmd->msg) + extra);
790 static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
807 dev_dbg(glink->dev, "Not enough data in fifo\n");
811 qcom_glink_rx_peak(glink, &hdr, 0, sizeof(hdr));
816 dev_dbg(glink->dev, "Payload not yet in fifo\n");
821 spin_lock_irqsave(&glink->idr_lock, flags);
822 channel = idr_find(&glink->rcids, rcid);
823 spin_unlock_irqrestore(&glink->idr_lock, flags);
825 dev_dbg(glink->dev, "Data on non-existing channel\n");
831 if (glink->intentless) {
861 dev_err(glink->dev,
870 dev_err(glink->dev, "Insufficient space in intent\n");
876 qcom_glink_rx_peak(glink, intent->data + intent->offset,
895 qcom_glink_rx_done(glink, channel, intent);
899 qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8));
904 static void qcom_glink_handle_intent(struct qcom_glink *glink,
927 dev_dbg(glink->dev, "Not enough data in fifo\n");
931 spin_lock_irqsave(&glink->idr_lock, flags);
932 channel = idr_find(&glink->rcids, cid);
933 spin_unlock_irqrestore(&glink->idr_lock, flags);
935 dev_err(glink->dev, "intents for non-existing channel\n");
936 qcom_glink_rx_advance(glink, ALIGN(msglen, 8));
944 qcom_glink_rx_peak(glink, msg, 0, msglen);
960 dev_err(glink->dev, "failed to store remote intent\n");
964 qcom_glink_rx_advance(glink, ALIGN(msglen, 8));
967 static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
971 spin_lock(&glink->idr_lock);
972 channel = idr_find(&glink->lcids, lcid);
973 spin_unlock(&glink->idr_lock);
975 dev_err(glink->dev, "Invalid open ack packet\n");
986 struct qcom_glink *glink = data;
995 avail = qcom_glink_rx_avail(glink);
999 qcom_glink_rx_peak(glink, &msg, 0, sizeof(msg));
1011 ret = qcom_glink_rx_defer(glink, 0);
1014 ret = qcom_glink_rx_open_ack(glink, param1);
1015 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1018 ret = qcom_glink_rx_defer(glink, param2);
1022 ret = qcom_glink_rx_data(glink, avail);
1025 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1027 mbox_send_message(glink->mbox_chan, NULL);
1028 mbox_client_txdone(glink->mbox_chan, 0);
1031 qcom_glink_handle_intent(glink, param1, param2, avail);
1034 qcom_glink_handle_rx_done(glink, param1, param2, false);
1035 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1038 qcom_glink_handle_rx_done(glink, param1, param2, true);
1039 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1042 qcom_glink_handle_intent_req_ack(glink, param1, param2);
1043 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
1046 dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
1059 static struct glink_channel *qcom_glink_create_local(struct qcom_glink *glink,
1066 channel = qcom_glink_alloc_channel(glink, name);
1070 ret = qcom_glink_send_open_req(glink, channel);
1082 qcom_glink_send_open_ack(glink, channel);
1088 spin_lock_irqsave(&glink->idr_lock, flags);
1089 idr_remove(&glink->lcids, channel->lcid);
1090 spin_unlock_irqrestore(&glink->idr_lock, flags);
1102 static int qcom_glink_create_remote(struct qcom_glink *glink,
1107 qcom_glink_send_open_ack(glink, channel);
1109 ret = qcom_glink_send_open_req(glink, channel);
1128 qcom_glink_send_close_req(glink, channel);
1141 struct qcom_glink *glink = parent->glink;
1148 spin_lock_irqsave(&glink->idr_lock, flags);
1149 idr_for_each_entry(&glink->rcids, channel, cid) {
1153 spin_unlock_irqrestore(&glink->idr_lock, flags);
1156 channel = qcom_glink_create_local(glink, name);
1160 ret = qcom_glink_create_remote(glink, channel);
1178 struct qcom_glink *glink = channel->glink;
1187 if (glink->intentless || !completion_done(&channel->open_ack))
1201 intent = qcom_glink_alloc_intent(glink, channel, size,
1206 qcom_glink_advertise_intent(glink, channel, intent);
1215 struct qcom_glink *glink = channel->glink;
1225 qcom_glink_send_close_req(glink, channel);
1228 static int qcom_glink_request_intent(struct qcom_glink *glink,
1248 ret = qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true);
1254 dev_err(glink->dev, "intent request timed out\n");
1268 struct qcom_glink *glink = channel->glink;
1280 if (!glink->intentless) {
1304 ret = qcom_glink_request_intent(glink, channel, len);
1318 ret = qcom_glink_tx(glink, &req, sizeof(req), data, len, wait);
1342 * Finds the device_node for the glink child interested in this channel.
1353 key = "qcom,glink-channels";
1386 static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
1397 spin_lock_irqsave(&glink->idr_lock, flags);
1398 idr_for_each_entry(&glink->lcids, channel, lcid) {
1402 spin_unlock_irqrestore(&glink->idr_lock, flags);
1405 channel = qcom_glink_alloc_channel(glink, name);
1413 spin_lock_irqsave(&glink->idr_lock, flags);
1414 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC);
1416 dev_err(glink->dev, "Unable to insert channel into rcid list\n");
1417 spin_unlock_irqrestore(&glink->idr_lock, flags);
1421 spin_unlock_irqrestore(&glink->idr_lock, flags);
1438 node = qcom_glink_match_channel(glink->dev->of_node, name);
1440 rpdev->dev.parent = glink->dev;
1453 spin_lock_irqsave(&glink->idr_lock, flags);
1454 idr_remove(&glink->rcids, channel->rcid);
1456 spin_unlock_irqrestore(&glink->idr_lock, flags);
1465 static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
1471 spin_lock_irqsave(&glink->idr_lock, flags);
1472 channel = idr_find(&glink->rcids, rcid);
1473 spin_unlock_irqrestore(&glink->idr_lock, flags);
1485 rpmsg_unregister_device(glink->dev, &chinfo);
1488 qcom_glink_send_close_ack(glink, channel->rcid);
1490 spin_lock_irqsave(&glink->idr_lock, flags);
1491 idr_remove(&glink->rcids, channel->rcid);
1493 spin_unlock_irqrestore(&glink->idr_lock, flags);
1498 static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid)
1503 spin_lock_irqsave(&glink->idr_lock, flags);
1504 channel = idr_find(&glink->lcids, lcid);
1506 spin_unlock_irqrestore(&glink->idr_lock, flags);
1510 idr_remove(&glink->lcids, channel->lcid);
1512 spin_unlock_irqrestore(&glink->idr_lock, flags);
1519 struct qcom_glink *glink = container_of(work, struct qcom_glink,
1529 spin_lock_irqsave(&glink->rx_lock, flags);
1530 if (list_empty(&glink->rx_queue)) {
1531 spin_unlock_irqrestore(&glink->rx_lock, flags);
1534 dcmd = list_first_entry(&glink->rx_queue,
1537 spin_unlock_irqrestore(&glink->rx_lock, flags);
1546 qcom_glink_receive_version(glink, param1, param2);
1549 qcom_glink_receive_version_ack(glink, param1, param2);
1552 qcom_glink_rx_open(glink, param1, msg->data);
1555 qcom_glink_rx_close(glink, param1);
1558 qcom_glink_rx_close_ack(glink, param1);
1561 qcom_glink_handle_intent_req(glink, param1, param2);
1572 static void qcom_glink_cancel_rx_work(struct qcom_glink *glink)
1578 cancel_work_sync(&glink->rx_work);
1580 list_for_each_entry_safe(dcmd, tmp, &glink->rx_queue, node)
1615 static int qcom_glink_create_chrdev(struct qcom_glink *glink)
1624 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev");
1633 rpdev->dev.parent = glink->dev;
1647 struct qcom_glink *glink;
1649 glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL);
1650 if (!glink)
1653 glink->dev = dev;
1654 glink->tx_pipe = tx;
1655 glink->rx_pipe = rx;
1657 glink->features = features;
1658 glink->intentless = intentless;
1660 spin_lock_init(&glink->tx_lock);
1661 spin_lock_init(&glink->rx_lock);
1662 INIT_LIST_HEAD(&glink->rx_queue);
1663 INIT_WORK(&glink->rx_work, qcom_glink_work);
1665 spin_lock_init(&glink->idr_lock);
1666 idr_init(&glink->lcids);
1667 idr_init(&glink->rcids);
1669 glink->dev->groups = qcom_glink_groups;
1675 ret = of_property_read_string(dev->of_node, "label", &glink->name);
1677 glink->name = dev->of_node->name;
1679 glink->mbox_client.dev = dev;
1680 glink->mbox_client.knows_txdone = true;
1681 glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0);
1682 if (IS_ERR(glink->mbox_chan)) {
1683 if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER)
1685 return ERR_CAST(glink->mbox_chan);
1692 "glink-native", glink);
1698 glink->irq = irq;
1700 ret = qcom_glink_send_version(glink);
1704 ret = qcom_glink_create_chrdev(glink);
1706 dev_err(glink->dev, "failed to register chrdev\n");
1708 return glink;
1719 void qcom_glink_native_remove(struct qcom_glink *glink)
1725 disable_irq(glink->irq);
1726 qcom_glink_cancel_rx_work(glink);
1728 ret = device_for_each_child(glink->dev, NULL, qcom_glink_remove_device);
1730 dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret);
1733 idr_for_each_entry(&glink->lcids, channel, cid)
1737 idr_for_each_entry(&glink->rcids, channel, cid)
1740 idr_destroy(&glink->lcids);
1741 idr_destroy(&glink->rcids);
1742 mbox_free_channel(glink->mbox_chan);
1746 void qcom_glink_native_unregister(struct qcom_glink *glink)
1748 device_unregister(glink->dev);