23
23
#include "rpmsg_internal.h"
24
24
#include "qcom_glink_native.h"
25
25
26
+ #define CREATE_TRACE_POINTS
27
+ #include "qcom_glink_trace.h"
28
+
26
29
#define GLINK_NAME_SIZE 32
27
30
#define GLINK_VERSION_1 1
28
31
@@ -78,6 +81,7 @@ struct glink_core_rx_intent {
78
81
/**
79
82
* struct qcom_glink - driver context, relates to one remote subsystem
80
83
* @dev: reference to the associated struct device
84
+ * @label: identifier of the glink edge
81
85
* @rx_pipe: pipe object for receive FIFO
82
86
* @tx_pipe: pipe object for transmit FIFO
83
87
* @rx_work: worker for handling received control messages
@@ -96,6 +100,8 @@ struct glink_core_rx_intent {
96
100
struct qcom_glink {
97
101
struct device * dev ;
98
102
103
+ const char * label ;
104
+
99
105
struct qcom_glink_pipe * rx_pipe ;
100
106
struct qcom_glink_pipe * tx_pipe ;
101
107
@@ -392,6 +398,8 @@ static int qcom_glink_send_version(struct qcom_glink *glink)
392
398
msg .param1 = cpu_to_le16 (GLINK_VERSION_1 );
393
399
msg .param2 = cpu_to_le32 (glink -> features );
394
400
401
+ trace_qcom_glink_cmd_version_tx (glink -> label , GLINK_VERSION_1 , glink -> features );
402
+
395
403
return qcom_glink_tx (glink , & msg , sizeof (msg ), NULL , 0 , true);
396
404
}
397
405
@@ -403,6 +411,8 @@ static void qcom_glink_send_version_ack(struct qcom_glink *glink)
403
411
msg .param1 = cpu_to_le16 (GLINK_VERSION_1 );
404
412
msg .param2 = cpu_to_le32 (glink -> features );
405
413
414
+ trace_qcom_glink_cmd_version_ack_tx (glink -> label , msg .param1 , msg .param2 );
415
+
406
416
qcom_glink_tx (glink , & msg , sizeof (msg ), NULL , 0 , true);
407
417
}
408
418
@@ -415,6 +425,9 @@ static void qcom_glink_send_open_ack(struct qcom_glink *glink,
415
425
msg .param1 = cpu_to_le16 (channel -> rcid );
416
426
msg .param2 = cpu_to_le32 (0 );
417
427
428
+ trace_qcom_glink_cmd_open_ack_tx (glink -> label , channel -> name ,
429
+ channel -> lcid , channel -> rcid );
430
+
418
431
qcom_glink_tx (glink , & msg , sizeof (msg ), NULL , 0 , true);
419
432
}
420
433
@@ -429,6 +442,11 @@ static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink,
429
442
spin_lock_irqsave (& glink -> idr_lock , flags );
430
443
channel = idr_find (& glink -> rcids , cid );
431
444
spin_unlock_irqrestore (& glink -> idr_lock , flags );
445
+
446
+ trace_qcom_glink_cmd_rx_intent_req_ack_rx (glink -> label ,
447
+ channel ? channel -> name : NULL ,
448
+ channel ? channel -> lcid : 0 ,
449
+ cid , granted );
432
450
if (!channel ) {
433
451
dev_err (glink -> dev , "unable to find channel\n" );
434
452
return ;
@@ -483,6 +501,9 @@ static int qcom_glink_send_open_req(struct qcom_glink *glink,
483
501
req .msg .param2 = cpu_to_le32 (name_len );
484
502
strcpy (req .name , channel -> name );
485
503
504
+ trace_qcom_glink_cmd_open_tx (glink -> label , channel -> name ,
505
+ channel -> lcid , channel -> rcid );
506
+
486
507
ret = qcom_glink_tx (glink , & req , req_len , NULL , 0 , true);
487
508
if (ret )
488
509
goto remove_idr ;
@@ -507,6 +528,9 @@ static void qcom_glink_send_close_req(struct qcom_glink *glink,
507
528
req .param1 = cpu_to_le16 (channel -> lcid );
508
529
req .param2 = 0 ;
509
530
531
+ trace_qcom_glink_cmd_close_tx (glink -> label , channel -> name ,
532
+ channel -> lcid , channel -> rcid );
533
+
510
534
qcom_glink_tx (glink , & req , sizeof (req ), NULL , 0 , true);
511
535
}
512
536
@@ -519,6 +543,9 @@ static void qcom_glink_send_close_ack(struct qcom_glink *glink,
519
543
req .param1 = cpu_to_le16 (channel -> rcid );
520
544
req .param2 = 0 ;
521
545
546
+ trace_qcom_glink_cmd_close_ack_tx (glink -> label , channel -> name ,
547
+ channel -> lcid , channel -> rcid );
548
+
522
549
qcom_glink_tx (glink , & req , sizeof (req ), NULL , 0 , true);
523
550
}
524
551
@@ -550,6 +577,9 @@ static void qcom_glink_rx_done_work(struct work_struct *work)
550
577
cmd .lcid = cid ;
551
578
cmd .liid = iid ;
552
579
580
+ trace_qcom_glink_cmd_rx_done_tx (glink -> label , channel -> name ,
581
+ channel -> lcid , channel -> rcid , cmd .liid , reuse );
582
+
553
583
qcom_glink_tx (glink , & cmd , sizeof (cmd ), NULL , 0 , true);
554
584
if (!reuse ) {
555
585
kfree (intent -> data );
@@ -600,6 +630,8 @@ static void qcom_glink_receive_version(struct qcom_glink *glink,
600
630
u32 version ,
601
631
u32 features )
602
632
{
633
+ trace_qcom_glink_cmd_version_rx (glink -> label , version , features );
634
+
603
635
switch (version ) {
604
636
case 0 :
605
637
break ;
@@ -627,6 +659,8 @@ static void qcom_glink_receive_version_ack(struct qcom_glink *glink,
627
659
u32 version ,
628
660
u32 features )
629
661
{
662
+ trace_qcom_glink_cmd_version_ack_rx (glink -> label , version , features );
663
+
630
664
switch (version ) {
631
665
case 0 :
632
666
/* Version negotiation failed */
@@ -658,6 +692,10 @@ static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink,
658
692
{
659
693
struct glink_msg msg ;
660
694
695
+ trace_qcom_glink_cmd_rx_intent_req_ack_tx (glink -> label , channel -> name ,
696
+ channel -> lcid , channel -> rcid ,
697
+ granted );
698
+
661
699
msg .cmd = cpu_to_le16 (GLINK_CMD_RX_INTENT_REQ_ACK );
662
700
msg .param1 = cpu_to_le16 (channel -> lcid );
663
701
msg .param2 = cpu_to_le32 (granted );
@@ -695,6 +733,10 @@ static int qcom_glink_advertise_intent(struct qcom_glink *glink,
695
733
cmd .size = cpu_to_le32 (intent -> size );
696
734
cmd .liid = cpu_to_le32 (intent -> id );
697
735
736
+ trace_qcom_glink_cmd_intent_tx (glink -> label , channel -> name ,
737
+ channel -> lcid , channel -> rcid ,
738
+ cmd .count , cmd .size , cmd .liid );
739
+
698
740
qcom_glink_tx (glink , & cmd , sizeof (cmd ), NULL , 0 , true);
699
741
700
742
return 0 ;
@@ -752,6 +794,9 @@ static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
752
794
spin_lock_irqsave (& glink -> idr_lock , flags );
753
795
channel = idr_find (& glink -> rcids , cid );
754
796
spin_unlock_irqrestore (& glink -> idr_lock , flags );
797
+
798
+ trace_qcom_glink_cmd_rx_done_rx (glink -> label , channel ? channel -> name : NULL ,
799
+ channel ? channel -> lcid : 0 , cid , iid , reuse );
755
800
if (!channel ) {
756
801
dev_err (glink -> dev , "invalid channel id received\n" );
757
802
return ;
@@ -801,6 +846,10 @@ static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
801
846
channel = idr_find (& glink -> rcids , cid );
802
847
spin_unlock_irqrestore (& glink -> idr_lock , flags );
803
848
849
+ trace_qcom_glink_cmd_rx_intent_req_rx (glink -> label ,
850
+ channel ? channel -> name : NULL ,
851
+ channel ? channel -> lcid : 0 ,
852
+ cid , size );
804
853
if (!channel ) {
805
854
pr_err ("%s channel not found for cid %d\n" , __func__ , cid );
806
855
return ;
@@ -873,9 +922,15 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
873
922
}
874
923
875
924
rcid = le16_to_cpu (hdr .msg .param1 );
925
+ liid = le32_to_cpu (hdr .msg .param2 );
876
926
spin_lock_irqsave (& glink -> idr_lock , flags );
877
927
channel = idr_find (& glink -> rcids , rcid );
878
928
spin_unlock_irqrestore (& glink -> idr_lock , flags );
929
+
930
+ trace_qcom_glink_cmd_tx_data_rx (glink -> label , channel ? channel -> name : NULL ,
931
+ channel ? channel -> lcid : 0 , rcid ,
932
+ liid , chunk_size , left_size ,
933
+ hdr .msg .cmd == GLINK_CMD_TX_DATA_CONT );
879
934
if (!channel ) {
880
935
dev_dbg (glink -> dev , "Data on non-existing channel\n" );
881
936
@@ -906,8 +961,6 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
906
961
intent = channel -> buf ;
907
962
}
908
963
} else {
909
- liid = le32_to_cpu (hdr .msg .param2 );
910
-
911
964
spin_lock_irqsave (& channel -> intent_lock , flags );
912
965
intent = idr_find (& channel -> liids , liid );
913
966
spin_unlock_irqrestore (& channel -> intent_lock , flags );
@@ -958,6 +1011,8 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
958
1011
959
1012
static void qcom_glink_rx_read_notif (struct qcom_glink * glink )
960
1013
{
1014
+ trace_qcom_glink_cmd_read_notif_rx (glink -> label );
1015
+
961
1016
qcom_glink_rx_advance (glink , ALIGN (sizeof (struct glink_msg ), 8 ));
962
1017
qcom_glink_tx_kick (glink );
963
1018
}
@@ -993,6 +1048,7 @@ static void qcom_glink_handle_intent(struct qcom_glink *glink,
993
1048
channel = idr_find (& glink -> rcids , cid );
994
1049
spin_unlock_irqrestore (& glink -> idr_lock , flags );
995
1050
if (!channel ) {
1051
+ trace_qcom_glink_cmd_intent_rx (glink -> label , NULL , 0 , cid , count , 0 , 0 );
996
1052
dev_err (glink -> dev , "intents for non-existing channel\n" );
997
1053
qcom_glink_rx_advance (glink , ALIGN (msglen , 8 ));
998
1054
return ;
@@ -1004,6 +1060,11 @@ static void qcom_glink_handle_intent(struct qcom_glink *glink,
1004
1060
1005
1061
qcom_glink_rx_peek (glink , msg , 0 , msglen );
1006
1062
1063
+ trace_qcom_glink_cmd_intent_rx (glink -> label , channel -> name ,
1064
+ channel -> lcid , cid , count ,
1065
+ count > 0 ? msg -> intents [0 ].size : 0 ,
1066
+ count > 0 ? msg -> intents [0 ].iid : 0 );
1067
+
1007
1068
for (i = 0 ; i < count ; ++ i ) {
1008
1069
intent = kzalloc (sizeof (* intent ), GFP_ATOMIC );
1009
1070
if (!intent )
@@ -1037,6 +1098,9 @@ static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
1037
1098
spin_lock (& glink -> idr_lock );
1038
1099
channel = idr_find (& glink -> lcids , lcid );
1039
1100
spin_unlock (& glink -> idr_lock );
1101
+
1102
+ trace_qcom_glink_cmd_open_ack_rx (glink -> label , channel ? channel -> name : NULL ,
1103
+ lcid , channel ? channel -> rcid : 0 );
1040
1104
if (!channel ) {
1041
1105
dev_err (glink -> dev , "Invalid open ack packet\n" );
1042
1106
return - EINVAL ;
@@ -1069,6 +1133,9 @@ static int qcom_glink_set_flow_control(struct rpmsg_endpoint *ept, bool pause, u
1069
1133
msg .param1 = cpu_to_le16 (channel -> lcid );
1070
1134
msg .param2 = cpu_to_le32 (sigs );
1071
1135
1136
+ trace_qcom_glink_cmd_signal_tx (glink -> label , channel -> name ,
1137
+ channel -> lcid , channel -> rcid , sigs );
1138
+
1072
1139
return qcom_glink_tx (glink , & msg , sizeof (msg ), NULL , 0 , true);
1073
1140
}
1074
1141
@@ -1084,6 +1151,9 @@ static void qcom_glink_handle_signals(struct qcom_glink *glink,
1084
1151
spin_lock_irqsave (& glink -> idr_lock , flags );
1085
1152
channel = idr_find (& glink -> rcids , rcid );
1086
1153
spin_unlock_irqrestore (& glink -> idr_lock , flags );
1154
+
1155
+ trace_qcom_glink_cmd_signal_rx (glink -> label , channel ? channel -> name : NULL ,
1156
+ channel ? channel -> lcid : 0 , rcid , sigs );
1087
1157
if (!channel ) {
1088
1158
dev_err (glink -> dev , "signal for non-existing channel\n" );
1089
1159
return ;
@@ -1357,6 +1427,10 @@ static int qcom_glink_request_intent(struct qcom_glink *glink,
1357
1427
cmd .cid = channel -> lcid ;
1358
1428
cmd .size = size ;
1359
1429
1430
+ trace_qcom_glink_cmd_rx_intent_req_tx (glink -> label , channel -> name ,
1431
+ channel -> lcid , channel -> rcid ,
1432
+ cmd .size );
1433
+
1360
1434
ret = qcom_glink_tx (glink , & cmd , sizeof (cmd ), NULL , 0 , true);
1361
1435
if (ret )
1362
1436
goto unlock ;
@@ -1437,6 +1511,12 @@ static int __qcom_glink_send(struct glink_channel *channel,
1437
1511
req .chunk_size = cpu_to_le32 (chunk_size );
1438
1512
req .left_size = cpu_to_le32 (len - offset - chunk_size );
1439
1513
1514
+ trace_qcom_glink_cmd_tx_data_tx (glink -> label , channel -> name ,
1515
+ channel -> lcid , channel -> rcid ,
1516
+ iid , chunk_size ,
1517
+ len - offset - chunk_size ,
1518
+ offset > 0 );
1519
+
1440
1520
ret = qcom_glink_tx (glink , & req , sizeof (req ), data + offset , chunk_size , wait );
1441
1521
if (ret ) {
1442
1522
/* Mark intent available if we failed */
@@ -1552,6 +1632,8 @@ static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,
1552
1632
create_device = true;
1553
1633
}
1554
1634
1635
+ trace_qcom_glink_cmd_open_rx (glink -> label , name , channel -> lcid , rcid );
1636
+
1555
1637
spin_lock_irqsave (& glink -> idr_lock , flags );
1556
1638
ret = idr_alloc (& glink -> rcids , channel , rcid , rcid + 1 , GFP_ATOMIC );
1557
1639
if (ret < 0 ) {
@@ -1613,6 +1695,9 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
1613
1695
spin_lock_irqsave (& glink -> idr_lock , flags );
1614
1696
channel = idr_find (& glink -> rcids , rcid );
1615
1697
spin_unlock_irqrestore (& glink -> idr_lock , flags );
1698
+
1699
+ trace_qcom_glink_cmd_close_rx (glink -> label , channel ? channel -> name : NULL ,
1700
+ channel ? channel -> lcid : 0 , rcid );
1616
1701
if (WARN (!channel , "close request on unknown channel\n" ))
1617
1702
return ;
1618
1703
@@ -1649,6 +1734,9 @@ static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid)
1649
1734
1650
1735
spin_lock_irqsave (& glink -> idr_lock , flags );
1651
1736
channel = idr_find (& glink -> lcids , lcid );
1737
+
1738
+ trace_qcom_glink_cmd_close_ack_rx (glink -> label , channel ? channel -> name : NULL ,
1739
+ lcid , channel ? channel -> rcid : 0 );
1652
1740
if (WARN (!channel , "close ack on unknown channel\n" )) {
1653
1741
spin_unlock_irqrestore (& glink -> idr_lock , flags );
1654
1742
return ;
@@ -1823,6 +1911,10 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev,
1823
1911
idr_init (& glink -> lcids );
1824
1912
idr_init (& glink -> rcids );
1825
1913
1914
+ ret = of_property_read_string (dev -> of_node , "label" , & glink -> label );
1915
+ if (ret < 0 )
1916
+ glink -> label = dev -> of_node -> name ;
1917
+
1826
1918
glink -> dev -> groups = qcom_glink_groups ;
1827
1919
1828
1920
ret = device_add_groups (dev , qcom_glink_groups );
0 commit comments