summaryrefslogtreecommitdiffstats
path: root/include/trace_types.h
blob: d1d369090953a7d94ebe1dfd522ce671cc321244 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* Copyright 2013-2014 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* API for kernel to read trace buffer. */
#ifndef __TRACE_TYPES_H
#define __TRACE_TYPES_H

#define TRACE_REPEAT	1
#define TRACE_OVERFLOW	2
#define TRACE_OPAL	3	/* OPAL call */
#define TRACE_FSP_MSG	4	/* FSP message sent/received */
#define TRACE_FSP_EVENT	5	/* FSP driver event */
#define TRACE_UART	6	/* UART driver traces */

/* One per cpu, plus one for NMIs */
struct tracebuf {
	/* Mask to apply to get buffer offset. */
	u64 mask;
	/* This where the buffer starts. */
	u64 start;
	/* This is where writer has written to. */
	u64 end;
	/* This is where the writer wrote to previously. */
	u64 last;
	/* This is where the reader is up to. */
	u64 rpos;
	/* If the last one we read was a repeat, this shows how many. */
	u32 last_repeat;
	/* Maximum possible size of a record. */
	u32 max_size;

	char buf[/* TBUF_SZ + max_size */];
};

/* Common header for all trace entries. */
struct trace_hdr {
	u64 timestamp;
	u8 type;
	u8 len_div_8;
	u16 cpu;
	u8 unused[4];
};

/* Note: all other entries must be at least as large as this! */
struct trace_repeat {
	u64 timestamp; /* Last repeat happened at this timestamp */
	u8 type; /* == TRACE_REPEAT */
	u8 len_div_8;
	u16 cpu;
	u16 prev_len;
	u16 num; /* Starts at 1, ie. 1 repeat, or two traces. */
	/* Note that the count can be one short, if read races a repeat. */
};

/* Overflow is special */
struct trace_overflow {
	u64 unused64; /* Timestamp is unused */
	u8 type; /* == TRACE_OVERFLOW */
	u8 len_div_8;
	u8 unused[6]; /* ie. hdr.cpu is indeterminate */
	u64 bytes_missed;
};

/* All other trace types have a full header */
struct trace_opal {
	struct trace_hdr hdr;
	u64 token, lr, sp, r3_to_11[9];
};

#define TRACE_FSP_MSG_IN	0
#define TRACE_FSP_MSG_OUT	1

struct trace_fsp_msg {
	struct trace_hdr hdr;
	u32 word0;
	u32 word1;
	u8 dlen;
	u8 dir; /* TRACE_FSP_MSG_IN or TRACE_FSP_MSG_OUT */
	u8 data[56]; /* See dlen, but max is 56 bytes. */
};

#define TRACE_FSP_EVT_LINK_DOWN		0
#define TRACE_FSP_EVT_DISR_CHG		1 /* 0:disr */
#define TRACE_FSP_EVT_SOFT_RR		2 /* 0:disr */
#define TRACE_FSP_EVT_RR_COMPL		3
#define TRACE_FSP_EVT_HDES_CHG		4 /* 0:hdes */
#define TRACE_FSP_EVT_POLL_IRQ		5 /* 0:irq? 1:hdir 2:ctl 3:psi_irq */

struct trace_fsp_event {
	struct trace_hdr hdr;
	u16 event;
	u16 fsp_state;
	u32 data[4]; /* event type specific */
};

#define TRACE_UART_CTX_IRQ		0
#define TRACE_UART_CTX_POLL		1
#define TRACE_UART_CTX_READ		2

struct trace_uart {
	struct trace_hdr hdr;
	u8 ctx;
	u8 cnt;
	u8 irq_state;
	u8 unused;
	u16 in_count;
};

union trace {
	struct trace_hdr hdr;
	/* Trace types go here... */
	struct trace_repeat repeat;
	struct trace_overflow overflow;
	struct trace_opal opal;
	struct trace_fsp_msg fsp_msg;
	struct trace_fsp_event fsp_evt;
	struct trace_uart uart;
};

#endif /* __TRACE_TYPES_H */
OpenPOWER on IntegriCloud