]> CyberLeo.Net >> Repos - FreeBSD/releng/8.2.git/blob - sys/contrib/octeon-sdk/cvmx-tra.c
MFC: 217169
[FreeBSD/releng/8.2.git] / sys / contrib / octeon-sdk / cvmx-tra.c
1 /***********************license start***************
2  *  Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights
3  *  reserved.
4  *
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are
8  *  met:
9  *
10  *      * Redistributions of source code must retain the above copyright
11  *        notice, this list of conditions and the following disclaimer.
12  *
13  *      * Redistributions in binary form must reproduce the above
14  *        copyright notice, this list of conditions and the following
15  *        disclaimer in the documentation and/or other materials provided
16  *        with the distribution.
17  *
18  *      * Neither the name of Cavium Networks nor the names of
19  *        its contributors may be used to endorse or promote products
20  *        derived from this software without specific prior written
21  *        permission.
22  *
23  *  TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
24  *  AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS
25  *  OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
26  *  RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY
27  *  REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT
28  *  DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES
29  *  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR
30  *  PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET
31  *  POSSESSION OR CORRESPONDENCE TO DESCRIPTION.  THE ENTIRE RISK ARISING OUT
32  *  OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
33  *
34  *
35  *  For any questions regarding licensing please contact marketing@caviumnetworks.com
36  *
37  ***********************license end**************************************/
38
39
40
41
42
43 /**
44  * @file
45  *
46  * Interface to the Trace buffer hardware.
47  *
48  * <hr>$Revision: 30644 $<hr>
49  */
50 #include "cvmx.h"
51 #include "cvmx-tra.h"
52
53 static const char *TYPE_ARRAY[] = {
54     "DWB - Don't write back",
55     "PL2 - Prefetch into L2",
56     "PSL1 - Dcache fill, skip L2",
57     "LDD - Dcache fill",
58     "LDI - Icache/IO fill",
59     "LDT - Icache/IO fill, skip L2",
60     "STF - Store full",
61     "STC - Store conditional",
62     "STP - Store partial",
63     "STT - Store full, skip L2",
64     "IOBLD8 - IOB 8bit load",
65     "IOBLD16 - IOB 16bit load",
66     "IOBLD32 - IOB 32bit load",
67     "IOBLD64 - IOB 64bit load",
68     "IOBST - IOB store",
69     "IOBDMA - Async IOB",
70     "SAA - Store atomic add",
71     "RSVD17",
72     "RSVD18",
73     "RSVD19",
74     "RSVD20",
75     "RSVD21",
76     "RSVD22",
77     "RSVD23",
78     "RSVD24",
79     "RSVD25",
80     "RSVD26",
81     "RSVD27",
82     "RSVD28",
83     "RSVD29",
84     "RSVD30",
85     "RSVD31"
86 };
87
88 static const char *SOURCE_ARRAY[] = {
89     "PP0",
90     "PP1",
91     "PP2",
92     "PP3",
93     "PP4",
94     "PP5",
95     "PP6",
96     "PP7",
97     "PP8",
98     "PP9",
99     "PP10",
100     "PP11",
101     "PP12",
102     "PP13",
103     "PP14",
104     "PP15",
105     "PIP/IPD",
106     "PKO-R",
107     "FPA/TIM/DFA/PCI/ZIP/POW/PKO-W",
108     "DWB",
109     "RSVD20",
110     "RSVD21",
111     "RSVD22",
112     "RSVD23",
113     "RSVD24",
114     "RSVD25",
115     "RSVD26",
116     "RSVD27",
117     "RSVD28",
118     "RSVD29",
119     "RSVD30",
120     "RSVD31"
121 };
122
123 static const char *DEST_ARRAY[] = {
124     "CIU/GPIO",
125     "RSVD1",
126     "RSVD2",
127     "PCI/PCIe",
128     "KEY",
129     "FPA",
130     "DFA",
131     "ZIP",
132     "RNG",
133     "IPD",
134     "PKO",
135     "RSVD11",
136     "POW",
137     "RSVD13",
138     "RSVD14",
139     "RSVD15",
140     "RSVD16",
141     "RSVD17",
142     "RSVD18",
143     "RSVD19",
144     "RSVD20",
145     "RSVD21",
146     "RSVD22",
147     "RSVD23",
148     "RSVD24",
149     "RSVD25",
150     "RSVD26",
151     "RSVD27",
152     "RSVD28",
153     "RSVD29",
154     "RSVD30",
155     "RSVD31"
156 };
157
158 /**
159  * Setup the TRA buffer for use
160  *
161  * @param control TRA control setup
162  * @param filter  Which events to log
163  * @param source_filter
164  *                Source match
165  * @param dest_filter
166  *                Destination match
167  * @param address Address compare
168  * @param address_mask
169  *                Address mask
170  */
171 void cvmx_tra_setup(cvmx_tra_ctl_t control, cvmx_tra_filt_cmd_t filter,
172                     cvmx_tra_filt_sid_t source_filter, cvmx_tra_filt_did_t dest_filter,
173                     uint64_t address, uint64_t address_mask)
174 {
175     cvmx_write_csr(CVMX_TRA_CTL,            control.u64);
176     cvmx_write_csr(CVMX_TRA_FILT_CMD,       filter.u64);
177     cvmx_write_csr(CVMX_TRA_FILT_SID,       source_filter.u64);
178     cvmx_write_csr(CVMX_TRA_FILT_DID,       dest_filter.u64);
179     cvmx_write_csr(CVMX_TRA_FILT_ADR_ADR,   address);
180     cvmx_write_csr(CVMX_TRA_FILT_ADR_MSK,   address_mask);
181 }
182
183
184 /**
185  * Setup a TRA trigger. How the triggers are used should be
186  * setup using cvmx_tra_setup.
187  *
188  * @param trigger Trigger to setup (0 or 1)
189  * @param filter  Which types of events to trigger on
190  * @param source_filter
191  *                Source trigger match
192  * @param dest_filter
193  *                Destination trigger match
194  * @param address Trigger address compare
195  * @param address_mask
196  *                Trigger address mask
197  */
198 void cvmx_tra_trig_setup(uint64_t trigger, cvmx_tra_filt_cmd_t filter,
199                          cvmx_tra_filt_sid_t source_filter, cvmx_tra_trig0_did_t dest_filter,
200                          uint64_t address, uint64_t address_mask)
201 {
202     cvmx_write_csr(CVMX_TRA_TRIG0_CMD + trigger * 64,       filter.u64);
203     cvmx_write_csr(CVMX_TRA_TRIG0_SID + trigger * 64,       source_filter.u64);
204     cvmx_write_csr(CVMX_TRA_TRIG0_DID + trigger * 64,       dest_filter.u64);
205     cvmx_write_csr(CVMX_TRA_TRIG0_ADR_ADR + trigger * 64,   address);
206     cvmx_write_csr(CVMX_TRA_TRIG0_ADR_MSK + trigger * 64,   address_mask);
207 }
208
209
210 /**
211  * Read an entry from the TRA buffer
212  *
213  * @return Value return. High bit will be zero if there wasn't any data
214  */
215 cvmx_tra_data_t cvmx_tra_read(void)
216 {
217     cvmx_tra_data_t result;
218     result.u64 = cvmx_read_csr(CVMX_TRA_READ_DAT);
219     return result;
220 }
221
222
223 /**
224  * Decode a TRA entry into human readable output
225  *
226  * @param tra_ctl Trace control setup
227  * @param data    Data to decode
228  */
229 void cvmx_tra_decode_text(cvmx_tra_ctl_t tra_ctl, cvmx_tra_data_t data)
230 {
231     /* The type is a five bit field for some entries and 4 for other. The four
232         bit entries can be mis-typed if the top is set */
233     int type = data.cmn.type;
234     if (type >= 0x1a)
235         type &= 0xf;
236     switch (type)
237     {
238         case CVMX_TRA_DATA_DWB:
239         case CVMX_TRA_DATA_PL2:
240         case CVMX_TRA_DATA_PSL1:
241         case CVMX_TRA_DATA_LDD:
242         case CVMX_TRA_DATA_LDI:
243         case CVMX_TRA_DATA_LDT:
244             cvmx_dprintf("0x%016llx %c%+10d %s %s 0x%016llx\n",
245                    (unsigned long long)data.u64,
246                    (data.cmn.discontinuity) ? 'D' : ' ',
247                    data.cmn.timestamp << (tra_ctl.s.time_grn*3),
248                    TYPE_ARRAY[type],
249                    SOURCE_ARRAY[data.cmn.source],
250                    (unsigned long long)data.cmn.address);
251             break;
252         case CVMX_TRA_DATA_STC:
253         case CVMX_TRA_DATA_STF:
254         case CVMX_TRA_DATA_STP:
255         case CVMX_TRA_DATA_STT:
256         case CVMX_TRA_DATA_SAA:
257             cvmx_dprintf("0x%016llx %c%+10d %s %s mask=0x%02x 0x%016llx\n",
258                    (unsigned long long)data.u64,
259                    (data.cmn.discontinuity) ? 'D' : ' ',
260                    data.cmn.timestamp << (tra_ctl.s.time_grn*3),
261                    TYPE_ARRAY[type],
262                    SOURCE_ARRAY[data.store.source],
263                    (unsigned int)data.store.mask,
264                    (unsigned long long)data.store.address << 3);
265             break;
266         case CVMX_TRA_DATA_IOBLD8:
267         case CVMX_TRA_DATA_IOBLD16:
268         case CVMX_TRA_DATA_IOBLD32:
269         case CVMX_TRA_DATA_IOBLD64:
270         case CVMX_TRA_DATA_IOBST:
271             cvmx_dprintf("0x%016llx %c%+10d %s %s->%s subdid=0x%x 0x%016llx\n",
272                    (unsigned long long)data.u64,
273                    (data.cmn.discontinuity) ? 'D' : ' ',
274                    data.cmn.timestamp << (tra_ctl.s.time_grn*3),
275                    TYPE_ARRAY[type],
276                    SOURCE_ARRAY[data.iobld.source],
277                    DEST_ARRAY[data.iobld.dest],
278                    (unsigned int)data.iobld.subid,
279                    (unsigned long long)data.iobld.address);
280             break;
281         case CVMX_TRA_DATA_IOBDMA:
282             cvmx_dprintf("0x%016llx %c%+10d %s %s->%s len=0x%x 0x%016llx\n",
283                    (unsigned long long)data.u64,
284                    (data.cmn.discontinuity) ? 'D' : ' ',
285                    data.cmn.timestamp << (tra_ctl.s.time_grn*3),
286                    TYPE_ARRAY[type],
287                    SOURCE_ARRAY[data.iob.source],
288                    DEST_ARRAY[data.iob.dest],
289                    (unsigned int)data.iob.mask,
290                    (unsigned long long)data.iob.address << 3);
291             break;
292         default:
293             cvmx_dprintf("0x%016llx %c%+10d Unknown format\n",
294                    (unsigned long long)data.u64,
295                    (data.cmn.discontinuity) ? 'D' : ' ',
296                    data.cmn.timestamp << (tra_ctl.s.time_grn*3));
297             break;
298     }
299 }
300
301
302 /**
303  * Display the entire trace buffer. It is advised that you
304  * disable the trace buffer before calling this routine
305  * otherwise it could infinitely loop displaying trace data
306  * that it created.
307  */
308 void cvmx_tra_display(void)
309 {
310     cvmx_tra_ctl_t tra_ctl;
311     cvmx_tra_data_t data;
312
313     tra_ctl.u64 = cvmx_read_csr(CVMX_TRA_CTL);
314
315     do
316     {
317         data = cvmx_tra_read();
318         if (data.cmn.valid)
319             cvmx_tra_decode_text(tra_ctl, data);
320     } while (data.cmn.valid);
321 }
322