1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2025 Hisilicon Limited.
4  */
5 
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM hns_roce
8 
9 #if !defined(__HNS_ROCE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
10 #define __HNS_ROCE_TRACE_H
11 
12 #include <linux/tracepoint.h>
13 #include <linux/string_choices.h>
14 #include "hns_roce_device.h"
15 #include "hns_roce_hw_v2.h"
16 
17 DECLARE_EVENT_CLASS(flush_head_template,
18 		    TP_PROTO(unsigned long qpn, u32 pi,
19 			     enum hns_roce_trace_type type),
20 		    TP_ARGS(qpn, pi, type),
21 
22 		    TP_STRUCT__entry(__field(unsigned long, qpn)
23 				     __field(u32, pi)
24 				     __field(enum hns_roce_trace_type, type)
25 		    ),
26 
27 		    TP_fast_assign(__entry->qpn = qpn;
28 				   __entry->pi = pi;
29 				   __entry->type = type;
30 		    ),
31 
32 		    TP_printk("%s 0x%lx flush head 0x%x.",
33 			      trace_type_to_str(__entry->type),
34 			      __entry->qpn, __entry->pi)
35 );
36 
37 DEFINE_EVENT(flush_head_template, hns_sq_flush_cqe,
38 	     TP_PROTO(unsigned long qpn, u32 pi,
39 		      enum hns_roce_trace_type type),
40 	     TP_ARGS(qpn, pi, type));
41 DEFINE_EVENT(flush_head_template, hns_rq_flush_cqe,
42 	     TP_PROTO(unsigned long qpn, u32 pi,
43 		      enum hns_roce_trace_type type),
44 	     TP_ARGS(qpn, pi, type));
45 
46 #define MAX_SGE_PER_WQE 64
47 #define MAX_WQE_SIZE (MAX_SGE_PER_WQE * HNS_ROCE_SGE_SIZE)
48 DECLARE_EVENT_CLASS(wqe_template,
49 		    TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len,
50 			     u64 id, enum hns_roce_trace_type type),
51 		    TP_ARGS(qpn, idx, wqe, len, id, type),
52 
53 		    TP_STRUCT__entry(__field(unsigned long, qpn)
54 				     __field(u32, idx)
55 				     __array(u32, wqe,
56 					     MAX_WQE_SIZE / sizeof(__le32))
57 				     __field(u32, len)
58 				     __field(u64, id)
59 				     __field(enum hns_roce_trace_type, type)
60 				     ),
61 
62 		    TP_fast_assign(__entry->qpn = qpn;
63 				   __entry->idx = idx;
64 				   __entry->id = id;
65 				   __entry->len = len / sizeof(__le32);
66 				   __entry->type = type;
67 				   for (int i = 0; i < __entry->len; i++)
68 					__entry->wqe[i] = le32_to_cpu(((__le32 *)wqe)[i]);
69 				   ),
70 
71 		    TP_printk("%s 0x%lx wqe(0x%x/0x%llx): %s",
72 			      trace_type_to_str(__entry->type),
73 			      __entry->qpn, __entry->idx, __entry->id,
74 			      __print_array(__entry->wqe, __entry->len,
75 					    sizeof(__le32)))
76 );
77 
78 DEFINE_EVENT(wqe_template, hns_sq_wqe,
79 	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
80 		      enum hns_roce_trace_type type),
81 	     TP_ARGS(qpn, idx, wqe, len, id, type));
82 DEFINE_EVENT(wqe_template, hns_rq_wqe,
83 	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
84 		      enum hns_roce_trace_type type),
85 	     TP_ARGS(qpn, idx, wqe, len, id, type));
86 DEFINE_EVENT(wqe_template, hns_srq_wqe,
87 	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
88 		      enum hns_roce_trace_type type),
89 	     TP_ARGS(qpn, idx, wqe, len, id, type));
90 
91 TRACE_EVENT(hns_ae_info,
92 	    TP_PROTO(int event_type, void *aeqe, unsigned int len),
93 	    TP_ARGS(event_type, aeqe, len),
94 
95 	    TP_STRUCT__entry(__field(int, event_type)
96 			     __array(u32, aeqe,
97 				     HNS_ROCE_V3_EQE_SIZE / sizeof(__le32))
98 			     __field(u32, len)
99 	    ),
100 
101 	    TP_fast_assign(__entry->event_type = event_type;
102 			   __entry->len = len / sizeof(__le32);
103 			   for (int i = 0; i < __entry->len; i++)
104 				__entry->aeqe[i] = le32_to_cpu(((__le32 *)aeqe)[i]);
105 	    ),
106 
107 	    TP_printk("event %2d aeqe: %s", __entry->event_type,
108 		      __print_array(__entry->aeqe, __entry->len, sizeof(__le32)))
109 );
110 
111 TRACE_EVENT(hns_mr,
112 	    TP_PROTO(struct hns_roce_mr *mr),
113 	    TP_ARGS(mr),
114 
115 	    TP_STRUCT__entry(__field(u64, iova)
116 			     __field(u64, size)
117 			     __field(u32, key)
118 			     __field(u32, pd)
119 			     __field(u32, pbl_hop_num)
120 			     __field(u32, npages)
121 			     __field(int, type)
122 			     __field(int, enabled)
123 	    ),
124 
125 	    TP_fast_assign(__entry->iova = mr->iova;
126 			   __entry->size = mr->size;
127 			   __entry->key = mr->key;
128 			   __entry->pd = mr->pd;
129 			   __entry->pbl_hop_num = mr->pbl_hop_num;
130 			   __entry->npages = mr->npages;
131 			   __entry->type = mr->type;
132 			   __entry->enabled = mr->enabled;
133 	    ),
134 
135 	    TP_printk("iova:0x%llx, size:%llu, key:%u, pd:%u, pbl_hop:%u, npages:%u, type:%d, status:%d",
136 		      __entry->iova, __entry->size, __entry->key,
137 		      __entry->pd, __entry->pbl_hop_num, __entry->npages,
138 		      __entry->type, __entry->enabled)
139 );
140 
141 TRACE_EVENT(hns_buf_attr,
142 	    TP_PROTO(struct hns_roce_buf_attr *attr),
143 	    TP_ARGS(attr),
144 
145 	    TP_STRUCT__entry(__field(unsigned int, region_count)
146 			     __field(unsigned int, region0_size)
147 			     __field(int, region0_hopnum)
148 			     __field(unsigned int, region1_size)
149 			     __field(int, region1_hopnum)
150 			     __field(unsigned int, region2_size)
151 			     __field(int, region2_hopnum)
152 			     __field(unsigned int, page_shift)
153 			     __field(bool, mtt_only)
154 	    ),
155 
156 	    TP_fast_assign(__entry->region_count = attr->region_count;
157 			   __entry->region0_size = attr->region[0].size;
158 			   __entry->region0_hopnum = attr->region[0].hopnum;
159 			   __entry->region1_size = attr->region[1].size;
160 			   __entry->region1_hopnum = attr->region[1].hopnum;
161 			   __entry->region2_size = attr->region[2].size;
162 			   __entry->region2_hopnum = attr->region[2].hopnum;
163 			   __entry->page_shift = attr->page_shift;
164 			   __entry->mtt_only = attr->mtt_only;
165 	    ),
166 
167 	    TP_printk("rg cnt:%u, pg_sft:0x%x, mtt_only:%s, rg 0 (sz:%u, hop:%u), rg 1 (sz:%u, hop:%u), rg 2 (sz:%u, hop:%u)\n",
168 		      __entry->region_count, __entry->page_shift,
169 		      str_yes_no(__entry->mtt_only),
170 		      __entry->region0_size, __entry->region0_hopnum,
171 		      __entry->region1_size, __entry->region1_hopnum,
172 		      __entry->region2_size, __entry->region2_hopnum)
173 );
174 
175 DECLARE_EVENT_CLASS(cmdq,
176 		    TP_PROTO(struct hns_roce_dev *hr_dev,
177 			     struct hns_roce_cmq_desc *desc),
178 		    TP_ARGS(hr_dev, desc),
179 
180 		    TP_STRUCT__entry(__string(dev_name, dev_name(hr_dev->dev))
181 				     __field(u16, opcode)
182 				     __field(u16, flag)
183 				     __field(u16, retval)
184 				     __array(u32, data, 6)
185 		    ),
186 
187 		    TP_fast_assign(__assign_str(dev_name);
188 				   __entry->opcode = le16_to_cpu(desc->opcode);
189 				   __entry->flag = le16_to_cpu(desc->flag);
190 				   __entry->retval = le16_to_cpu(desc->retval);
191 				   for (int i = 0; i < 6; i++)
192 					__entry->data[i] = le32_to_cpu(desc->data[i]);
193 		    ),
194 
195 		    TP_printk("%s cmdq opcode:0x%x, flag:0x%x, retval:0x%x, data:%s\n",
196 			      __get_str(dev_name), __entry->opcode,
197 			      __entry->flag, __entry->retval,
198 			      __print_array(__entry->data, 6, sizeof(__le32)))
199 );
200 
201 DEFINE_EVENT(cmdq, hns_cmdq_req,
202 	     TP_PROTO(struct hns_roce_dev *hr_dev,
203 		      struct hns_roce_cmq_desc *desc),
204 	     TP_ARGS(hr_dev, desc));
205 DEFINE_EVENT(cmdq, hns_cmdq_resp,
206 	     TP_PROTO(struct hns_roce_dev *hr_dev,
207 		      struct hns_roce_cmq_desc *desc),
208 	     TP_ARGS(hr_dev, desc));
209 
210 #endif /* __HNS_ROCE_TRACE_H */
211 
212 #undef TRACE_INCLUDE_FILE
213 #define TRACE_INCLUDE_FILE hns_roce_trace
214 #undef TRACE_INCLUDE_PATH
215 #define TRACE_INCLUDE_PATH .
216 #include <trace/define_trace.h>
217