summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra2_mc.h
blob: 211213c5f585978c1bb106466fca66741429ea3d (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/*
 * arch/arm/mach-tegra/tegra2_mc.c
 *
 * Memory controller bandwidth profiling interface
 *
 * Copyright (c) 2009-2011, NVIDIA Corporation.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef _INCLUDE_TEGRA2_MC_H_
#define _INCLUDE_TEGRA2_MC_H_

#define SAMPLE_ENABLE_DEFAULT		0
#define SAMPLE_LOG_SIZE			1024 /* need to be DWORD aligned */
#define SAMPLE_QUANTUM_DEFAULT		1 /* in milliseconds */
#define CLIENT_ENABLED_DEFAULT		false
#define CLIENT_ON_SCHEDULE_LENGTH	256
#define SHIFT_4K			12

typedef enum {
	FILTER_NONE,
	FILTER_ADDR,
	FILTER_CLIENT,
} FILTER_MODE;

#define MC_COUNTER_CLIENT_SIZE					256

#define MC_STAT_CONTROL_0					0x90
#define MC_STAT_CONTROL_0_EMC_GATHER_SHIFT			8
#define MC_STAT_CONTROL_0_EMC_GATHER_CLEAR			1
#define MC_STAT_CONTROL_0_EMC_GATHER_DISABLE			2
#define MC_STAT_CONTROL_0_EMC_GATHER_ENABLE			3

#define MC_STAT_EMC_ADDR_LOW_0					0x98
#define MC_STAT_EMC_ADDR_HIGH_0					0x9c
#define MC_STAT_EMC_CLOCK_LIMIT_0				0xa0
#define MC_STAT_EMC_CLOCKS_0					0xa4
#define MC_STAT_EMC_CONTROL_0_0					0xa8
#define MC_STAT_EMC_COUNT_0_0					0xb8
#define MC_STAT_EMC_COUNT_1_0					0xbc

#define ARMC_STAT_CONTROL_FILTER_ADDR_SHIFT			27
#define ARMC_STAT_CONTROL_FILTER_ADDR_DISABLE			0
#define ARMC_STAT_CONTROL_FILTER_ADDR_ENABLE			1
#define ARMC_STAT_CONTROL_FILTER_CLIENT_SHIFT			26
#define ARMC_STAT_CONTROL_FILTER_CLIENT_DISABLE			0
#define ARMC_STAT_CONTROL_FILTER_CLIENT_ENABLE			1
#define ARMC_STAT_CONTROL_FILTER_PRI_SHIFT			28
#define ARMC_STAT_CONTROL_FILTER_PRI_DISABLE			0
#define ARMC_STAT_CONTROL_FILTER_COALESCED_SHIFT		30
#define ARMC_STAT_CONTROL_FILTER_COALESCED_DISABLE		0
#define ARMC_STAT_CONTROL_CLIENT_ID_SHIFT			8
#define ARMC_STAT_CONTROL_MODE_SHIFT				0
#define ARMC_STAT_CONTROL_MODE_BANDWIDTH			0
#define ARMC_STAT_CONTROL_EVENT_SHIFT				16
#define ARMC_STAT_CONTROL_EVENT_QUALIFIED			0

#define EMC_STAT_CONTROL_0					0x160
#define EMC_STAT_CONTROL_0_LLMC_GATHER_SHIFT			0
#define EMC_STAT_CONTROL_0_LLMC_GATHER_CLEAR			1
#define EMC_STAT_CONTROL_0_LLMC_GATHER_DISABLE			2
#define EMC_STAT_CONTROL_0_LLMC_GATHER_ENABLE			3
#define EMC_STAT_CONTROL_0_DRAM_GATHER_SHIFT			16
#define EMC_STAT_CONTROL_0_DRAM_GATHER_CLEAR			1
#define EMC_STAT_CONTROL_0_DRAM_GATHER_DISABLE			2
#define EMC_STAT_CONTROL_0_DRAM_GATHER_ENABLE			3

#define AREMC_STAT_CONTROL_MODE_SHIFT				0
#define AREMC_STAT_CONTROL_MODE_BANDWIDTH			0
#define AREMC_STAT_CONTROL_FILTER_ADDR_SHIFT			27
#define AREMC_STAT_CONTROL_FILTER_ADDR_ENABLE			1
#define AREMC_STAT_CONTROL_CLIENT_TYPE_SHIFT			8
#define AREMC_STAT_CONTROL_CLIENT_TYPE_MPCORER			0
#define AREMC_STAT_CONTROL_FILTER_CLIENT_SHIFT			26
#define AREMC_STAT_CONTROL_FILTER_CLIENT_DISABLE		0
#define AREMC_STAT_CONTROL_FILTER_ADDR_DISABLE			0
#define AREMC_STAT_CONTROL_EVENT_SHIFT				16
#define AREMC_STAT_CONTROL_EVENT_QUALIFIED			0

#define EMC_STAT_LLMC_ADDR_LOW_0				0x168
#define EMC_STAT_LLMC_ADDR_HIGH_0				0x16c
#define EMC_STAT_LLMC_CLOCK_LIMIT_0				0x170
#define EMC_STAT_LLMC_CONTROL_0_0				0x178
#define EMC_STAT_LLMC_COUNT_0_0					0x188

#define EMC_STAT_DRAM_CLOCK_LIMIT_LO_0				0x1a4
#define EMC_STAT_DRAM_CLOCK_LIMIT_HI_0				0x1a8
#define EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_LO_0			0x1b4
#define EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_HI_0			0x1b8
#define EMC_STAT_DRAM_DEV0_READ_CNT_LO_0			0x1bc
#define EMC_STAT_DRAM_DEV0_READ_CNT_HI_0			0x1c0
#define EMC_STAT_DRAM_DEV0_WRITE_CNT_LO_0			0x1c4
#define EMC_STAT_DRAM_DEV0_WRITE_CNT_HI_0			0x1c8
#define EMC_STAT_DRAM_DEV0_REF_CNT_LO_0				0x1cc
#define EMC_STAT_DRAM_DEV0_REF_CNT_HI_0				0x1d0
#define EMC_STAT_DRAM_DEV0_CUMM_BANKS_ACTIVE_CKE_EQ1_LO_0	0x1d4
#define EMC_STAT_DRAM_DEV0_CUMM_BANKS_ACTIVE_CKE_EQ1_HI_0	0x1d8
#define EMC_STAT_DRAM_DEV0_CUMM_BANKS_ACTIVE_CKE_EQ0_LO_0	0x1dc
#define EMC_STAT_DRAM_DEV0_CUMM_BANKS_ACTIVE_CKE_EQ0_HI_0	0x1e0
#define EMC_STAT_DRAM_DEV0_CKE_EQ1_CLKS_LO_0			0x1e4
#define EMC_STAT_DRAM_DEV0_CKE_EQ1_CLKS_HI_0			0x1e8
#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_LO_0			0x1ec
#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_HI_0			0x1f0
#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_LO_0			0x1f4
#define EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_HI_0			0x1f8
#define EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_LO_0			0x1fc
#define EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_HI_0			0x200
#define EMC_STAT_DRAM_DEV1_READ_CNT_LO_0			0x204
#define EMC_STAT_DRAM_DEV1_READ_CNT_HI_0			0x208
#define EMC_STAT_DRAM_DEV1_WRITE_CNT_LO_0			0x20c
#define EMC_STAT_DRAM_DEV1_WRITE_CNT_HI_0			0x210
#define EMC_STAT_DRAM_DEV1_REF_CNT_LO_0				0x214
#define EMC_STAT_DRAM_DEV1_REF_CNT_HI_0				0x218
#define EMC_STAT_DRAM_DEV1_CUMM_BANKS_ACTIVE_CKE_EQ1_LO_0	0x21c
#define EMC_STAT_DRAM_DEV1_CUMM_BANKS_ACTIVE_CKE_EQ1_HI_0	0x220
#define EMC_STAT_DRAM_DEV1_CUMM_BANKS_ACTIVE_CKE_EQ0_LO_0	0x224
#define EMC_STAT_DRAM_DEV1_CUMM_BANKS_ACTIVE_CKE_EQ0_HI_0	0x228
#define EMC_STAT_DRAM_DEV1_CKE_EQ1_CLKS_LO_0			0x22c
#define EMC_STAT_DRAM_DEV1_CKE_EQ1_CLKS_HI_0			0x230
#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_LO_0			0x234
#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_HI_0			0x238
#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_LO_0			0x23c
#define EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_HI_0			0x240
#define EMC_STAT_DRAM_DEV0_NO_BANKS_ACTIVE_CKE_EQ1_LO_0		0x244
#define EMC_STAT_DRAM_DEV0_NO_BANKS_ACTIVE_CKE_EQ1_HI_0		0x248
#define EMC_STAT_DRAM_DEV0_NO_BANKS_ACTIVE_CKE_EQ0_LO_0		0x24c
#define EMC_STAT_DRAM_DEV0_NO_BANKS_ACTIVE_CKE_EQ0_HI_0		0x250
#define EMC_STAT_DRAM_DEV1_NO_BANKS_ACTIVE_CKE_EQ1_LO_0		0x254
#define EMC_STAT_DRAM_DEV1_NO_BANKS_ACTIVE_CKE_EQ1_HI_0		0x258
#define EMC_STAT_DRAM_DEV1_NO_BANKS_ACTIVE_CKE_EQ0_LO_0		0x25c
#define EMC_STAT_DRAM_DEV1_NO_BANKS_ACTIVE_CKE_EQ0_HI_0		0x260

#pragma pack(push)
#pragma pack(1)

typedef struct {
	u32	signature;
	u32	client_number;
	u32	client_counts;
	u32	total_counts;
	u32	emc_clock_rate;
} sample_data_t;

#pragma pack(pop)

typedef struct tegra_mc_counter {
	bool		enabled;
	u32		period;
	FILTER_MODE	mode;
	u32		address_low;
	u32		address_length;
	u32		current_client_index;
	u32		total_clients;
	u8		clients[MC_COUNTER_CLIENT_SIZE];
	sample_data_t	sample_data;
} tegra_mc_counter_t;

typedef struct tegra_emc_dram_counter {
	bool	enabled;
	u8	device_mask;

	sample_data_t	sample_data;
} tegra_emc_dram_counter_t;

/* client ids of mc/emc */
typedef enum {
	MC_STAT_BEGIN = 0,
	CBR_DISPLAY0A = 0,
	CBR_DISPLAY0AB,
	CBR_DISPLAY0B,
	CBR_DISPLAY0BB,
	CBR_DISPLAY0C,
	CBR_DISPLAY0CB,
	CBR_DISPLAY1B,
	CBR_DISPLAY1BB,
	CBR_EPPUP,
	CBR_G2PR,
	CBR_G2SR,
	CBR_MPEUNIFBR,
	CBR_VIRUV,
	CSR_AVPCARM7R,
	CSR_DISPLAYHC,
	CSR_DISPLAYHCB,
	CSR_FDCDRD,
	CSR_G2DR,
	CSR_HOST1XDMAR,
	CSR_HOST1XR,
	CSR_IDXSRD,
	CSR_MPCORER,
	CSR_MPE_IPRED,
	CSR_MPEAMEMRD,
	CSR_MPECSRD,
	CSR_PPCSAHBDMAR,
	CSR_PPCSAHBSLVR,
	CSR_TEXSRD,
	CSR_VDEBSEVR,
	CSR_VDEMBER,
	CSR_VDEMCER,
	CSR_VDETPER,
	CBW_EPPU,
	CBW_EPPV,
	CBW_EPPY,
	CBW_MPEUNIFBW,
	CBW_VIWSB,
	CBW_VIWU,
	CBW_VIWV,
	CBW_VIWY,
	CCW_G2DW,
	CSW_AVPCARM7W,
	CSW_FDCDWR,
	CSW_HOST1XW,
	CSW_ISPW,
	CSW_MPCOREW,
	CSW_MPECSWR,
	CSW_PPCSAHBDMAW,
	CSW_PPCSAHBSLVW,
	CSW_VDEBSEVW,
	CSW_VDEMBEW,
	CSW_VDETPMW,
	MC_STAT_END,
	EMC_DRAM_STAT_BEGIN = 128,
	ACTIVATE_CNT = 128,
	READ_CNT,
	WRITE_CNT,
	REF_CNT,
	CUMM_BANKS_ACTIVE_CKE_EQ1,
	CUMM_BANKS_ACTIVE_CKE_EQ0,
	CKE_EQ1_CLKS,
	EXTCLKS_CKE_EQ1,
	EXTCLKS_CKE_EQ0,
	NO_BANKS_ACTIVE_CKE_EQ1,
	NO_BANKS_ACTIVE_CKE_EQ0,
	EMC_DRAM_STAT_END,
	MC_STAT_AGGREGATE = 255,
} device_id;

#endif