1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2010, 2013 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*d83cc019SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker * Kenneth Graunke <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker *
27*d83cc019SAndroid Build Coastguard Worker * While documentation for performance counters is suspiciously missing from the
28*d83cc019SAndroid Build Coastguard Worker * Sandybridge PRM, they were documented in Volume 1 Part 3 of the Ironlake PRM.
29*d83cc019SAndroid Build Coastguard Worker *
30*d83cc019SAndroid Build Coastguard Worker * A lot of the Ironlake PRM actually unintentionally documents Sandybridge
31*d83cc019SAndroid Build Coastguard Worker * due to mistakes made when updating the documentation for Gen6+. Many of
32*d83cc019SAndroid Build Coastguard Worker * these mislabeled sections carried forward to the public documentation.
33*d83cc019SAndroid Build Coastguard Worker *
34*d83cc019SAndroid Build Coastguard Worker * The Ironlake PRMs have been publicly available since 2010 and are online at:
35*d83cc019SAndroid Build Coastguard Worker * https://01.org/linuxgraphics/documentation/2010-intel-core-processor-family
36*d83cc019SAndroid Build Coastguard Worker */
37*d83cc019SAndroid Build Coastguard Worker
38*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
39*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
40*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
41*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
42*d83cc019SAndroid Build Coastguard Worker #include <err.h>
43*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
44*d83cc019SAndroid Build Coastguard Worker
45*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
46*d83cc019SAndroid Build Coastguard Worker #include "i915_drm.h"
47*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
48*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
49*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
50*d83cc019SAndroid Build Coastguard Worker #include "intel_batchbuffer.h"
51*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
52*d83cc019SAndroid Build Coastguard Worker
53*d83cc019SAndroid Build Coastguard Worker #define GEN5_COUNTER_COUNT 29
54*d83cc019SAndroid Build Coastguard Worker
55*d83cc019SAndroid Build Coastguard Worker const char *gen5_counter_names[GEN5_COUNTER_COUNT] = {
56*d83cc019SAndroid Build Coastguard Worker "cycles the CS unit is starved",
57*d83cc019SAndroid Build Coastguard Worker "cycles the CS unit is stalled",
58*d83cc019SAndroid Build Coastguard Worker "cycles the VF unit is starved",
59*d83cc019SAndroid Build Coastguard Worker "cycles the VF unit is stalled",
60*d83cc019SAndroid Build Coastguard Worker "cycles the VS unit is starved",
61*d83cc019SAndroid Build Coastguard Worker "cycles the VS unit is stalled",
62*d83cc019SAndroid Build Coastguard Worker "cycles the GS unit is starved",
63*d83cc019SAndroid Build Coastguard Worker "cycles the GS unit is stalled",
64*d83cc019SAndroid Build Coastguard Worker "cycles the CL unit is starved",
65*d83cc019SAndroid Build Coastguard Worker "cycles the CL unit is stalled",
66*d83cc019SAndroid Build Coastguard Worker "cycles the SF unit is starved",
67*d83cc019SAndroid Build Coastguard Worker "cycles the SF unit is stalled",
68*d83cc019SAndroid Build Coastguard Worker "cycles the WZ unit is starved",
69*d83cc019SAndroid Build Coastguard Worker "cycles the WZ unit is stalled",
70*d83cc019SAndroid Build Coastguard Worker "Z buffer read/write ",
71*d83cc019SAndroid Build Coastguard Worker "cycles each EU was active ",
72*d83cc019SAndroid Build Coastguard Worker "cycles each EU was suspended ",
73*d83cc019SAndroid Build Coastguard Worker "cycles threads loaded all EUs",
74*d83cc019SAndroid Build Coastguard Worker "cycles filtering active ",
75*d83cc019SAndroid Build Coastguard Worker "cycles PS threads executed ",
76*d83cc019SAndroid Build Coastguard Worker "subspans written to RC ",
77*d83cc019SAndroid Build Coastguard Worker "bytes read for texture reads ",
78*d83cc019SAndroid Build Coastguard Worker "texels returned from sampler ",
79*d83cc019SAndroid Build Coastguard Worker "polygons not culled ",
80*d83cc019SAndroid Build Coastguard Worker "clocks MASF has valid message",
81*d83cc019SAndroid Build Coastguard Worker "64b writes/reads from RC ",
82*d83cc019SAndroid Build Coastguard Worker "reads on dataport ",
83*d83cc019SAndroid Build Coastguard Worker "clocks MASF has valid msg not consumed by sampler",
84*d83cc019SAndroid Build Coastguard Worker "cycles any EU is stalled for math",
85*d83cc019SAndroid Build Coastguard Worker };
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker #define GEN6_COUNTER_COUNT 29
88*d83cc019SAndroid Build Coastguard Worker
89*d83cc019SAndroid Build Coastguard Worker /**
90*d83cc019SAndroid Build Coastguard Worker * Sandybridge: Counter Select = 001
91*d83cc019SAndroid Build Coastguard Worker * A0 A1 A2 A3 A4 TIMESTAMP RPT_ID
92*d83cc019SAndroid Build Coastguard Worker * A5 A6 A7 A8 A9 A10 A11 A12
93*d83cc019SAndroid Build Coastguard Worker * A13 A14 A15 A16 A17 A18 A19 A20
94*d83cc019SAndroid Build Coastguard Worker * A21 A22 A23 A24 A25 A26 A27 A28
95*d83cc019SAndroid Build Coastguard Worker */
96*d83cc019SAndroid Build Coastguard Worker const int gen6_counter_format = 1;
97*d83cc019SAndroid Build Coastguard Worker
98*d83cc019SAndroid Build Coastguard Worker /**
99*d83cc019SAndroid Build Coastguard Worker * Names for aggregating counters A0-A28.
100*d83cc019SAndroid Build Coastguard Worker *
101*d83cc019SAndroid Build Coastguard Worker * While the Ironlake PRM clearly documents that there are 29 counters (A0-A28),
102*d83cc019SAndroid Build Coastguard Worker * it only lists the names for 28 of them; one is missing. However, careful
103*d83cc019SAndroid Build Coastguard Worker * examination reveals a pattern: there are five GS counters (Active, Stall,
104*d83cc019SAndroid Build Coastguard Worker * Core Stall, # threads loaded, and ready but not running time). There are
105*d83cc019SAndroid Build Coastguard Worker * also five PS counters, in the same order. But there are only four VS
106*d83cc019SAndroid Build Coastguard Worker * counters listed - the number of VS threads loaded is missing. Presumably,
107*d83cc019SAndroid Build Coastguard Worker * it exists and is counter 5, and the rest are shifted over one place.
108*d83cc019SAndroid Build Coastguard Worker */
109*d83cc019SAndroid Build Coastguard Worker const char *gen6_counter_names[GEN6_COUNTER_COUNT] = {
110*d83cc019SAndroid Build Coastguard Worker [0] = "Aggregated Core Array Active",
111*d83cc019SAndroid Build Coastguard Worker [1] = "Aggregated Core Array Stalled",
112*d83cc019SAndroid Build Coastguard Worker [2] = "Vertex Shader Active Time",
113*d83cc019SAndroid Build Coastguard Worker [3] = "Vertex Shader Stall Time",
114*d83cc019SAndroid Build Coastguard Worker [4] = "Vertex Shader Stall Time - Core Stall",
115*d83cc019SAndroid Build Coastguard Worker [5] = "# VS threads loaded",
116*d83cc019SAndroid Build Coastguard Worker [6] = "Vertex Shader Ready but not running time",
117*d83cc019SAndroid Build Coastguard Worker [7] = "Geometry Shader Active Time",
118*d83cc019SAndroid Build Coastguard Worker [8] = "Geometry Shader Stall Time",
119*d83cc019SAndroid Build Coastguard Worker [9] = "Geometry Shader Stall Time - Core Stall",
120*d83cc019SAndroid Build Coastguard Worker [10] = "# GS threads loaded",
121*d83cc019SAndroid Build Coastguard Worker [11] = "Geometry Shader ready but not running Time",
122*d83cc019SAndroid Build Coastguard Worker [12] = "Pixel Shader Active Time",
123*d83cc019SAndroid Build Coastguard Worker [13] = "Pixel Shader Stall Time",
124*d83cc019SAndroid Build Coastguard Worker [14] = "Pixel Shader Stall Time - Core Stall",
125*d83cc019SAndroid Build Coastguard Worker [15] = "# PS threads loaded",
126*d83cc019SAndroid Build Coastguard Worker [16] = "Pixel Shader ready but not running Time",
127*d83cc019SAndroid Build Coastguard Worker [17] = "Early Z Test Pixels Passing",
128*d83cc019SAndroid Build Coastguard Worker [18] = "Early Z Test Pixels Failing",
129*d83cc019SAndroid Build Coastguard Worker [19] = "Early Stencil Test Pixels Passing",
130*d83cc019SAndroid Build Coastguard Worker [20] = "Early Stencil Test Pixels Failing",
131*d83cc019SAndroid Build Coastguard Worker [21] = "Pixel Kill Count",
132*d83cc019SAndroid Build Coastguard Worker [22] = "Alpha Test Pixels Failed",
133*d83cc019SAndroid Build Coastguard Worker [23] = "Post PS Stencil Pixels Failed",
134*d83cc019SAndroid Build Coastguard Worker [24] = "Post PS Z buffer Pixels Failed",
135*d83cc019SAndroid Build Coastguard Worker [25] = "Pixels/samples Written in the frame buffer",
136*d83cc019SAndroid Build Coastguard Worker [26] = "GPU Busy",
137*d83cc019SAndroid Build Coastguard Worker [27] = "CL active and not stalled",
138*d83cc019SAndroid Build Coastguard Worker [28] = "SF active and stalled",
139*d83cc019SAndroid Build Coastguard Worker };
140*d83cc019SAndroid Build Coastguard Worker
141*d83cc019SAndroid Build Coastguard Worker #define GEN7_COUNTER_COUNT 44
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker /**
144*d83cc019SAndroid Build Coastguard Worker * Names for aggregating counters A0-A44. Uninitialized fields are "Reserved."
145*d83cc019SAndroid Build Coastguard Worker */
146*d83cc019SAndroid Build Coastguard Worker const char *gen7_counter_names[GEN7_COUNTER_COUNT] = {
147*d83cc019SAndroid Build Coastguard Worker /* A0:
148*d83cc019SAndroid Build Coastguard Worker * The sum of all cycles on all cores actively executing instructions
149*d83cc019SAndroid Build Coastguard Worker * This does not count the time taken to service Send instructions.
150*d83cc019SAndroid Build Coastguard Worker * This time is considered by shader active counters to give the result.
151*d83cc019SAndroid Build Coastguard Worker */
152*d83cc019SAndroid Build Coastguard Worker [0] = "Aggregated Core Array Active",
153*d83cc019SAndroid Build Coastguard Worker /* A1:
154*d83cc019SAndroid Build Coastguard Worker * The sum of all cycles on all cores where the EU is not idle and is
155*d83cc019SAndroid Build Coastguard Worker * not actively executing ISA instructions. Generally this means that
156*d83cc019SAndroid Build Coastguard Worker * all loaded threads on the EU are stalled on some data dependency,
157*d83cc019SAndroid Build Coastguard Worker * but this also includes the time during which the TS is loading the
158*d83cc019SAndroid Build Coastguard Worker * thread dispatch header into the EU prior to thread execution and no
159*d83cc019SAndroid Build Coastguard Worker * other thread is fully loaded.
160*d83cc019SAndroid Build Coastguard Worker */
161*d83cc019SAndroid Build Coastguard Worker [1] = "Aggregated Core Array Stalled",
162*d83cc019SAndroid Build Coastguard Worker /* A2:
163*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the vertex shader spent active on all cores.
164*d83cc019SAndroid Build Coastguard Worker */
165*d83cc019SAndroid Build Coastguard Worker [2] = "Vertex Shader Active Time",
166*d83cc019SAndroid Build Coastguard Worker /* A4:
167*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the vertex shader spent stalled on all cores -
168*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
169*d83cc019SAndroid Build Coastguard Worker */
170*d83cc019SAndroid Build Coastguard Worker [4] = "Vertex Shader Stall Time - Core Stall",
171*d83cc019SAndroid Build Coastguard Worker /* A5: Number of VS threads loaded at any given time in the EUs. */
172*d83cc019SAndroid Build Coastguard Worker [5] = "# VS threads loaded",
173*d83cc019SAndroid Build Coastguard Worker /* A7:
174*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the Hull shader spent active on all cores.
175*d83cc019SAndroid Build Coastguard Worker */
176*d83cc019SAndroid Build Coastguard Worker [7] = "Hull Shader Active Time",
177*d83cc019SAndroid Build Coastguard Worker /* A9:
178*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the Hull shader spent stalled on all cores -
179*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
180*d83cc019SAndroid Build Coastguard Worker */
181*d83cc019SAndroid Build Coastguard Worker [9] = "Hull Shader Stall Time - Core Stall",
182*d83cc019SAndroid Build Coastguard Worker /* A10: Number of HS threads loaded at any given time in the EUs. */
183*d83cc019SAndroid Build Coastguard Worker [10] = "# HS threads loaded",
184*d83cc019SAndroid Build Coastguard Worker /* A12:
185*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the Domain shader spent active on all cores.
186*d83cc019SAndroid Build Coastguard Worker */
187*d83cc019SAndroid Build Coastguard Worker [12] = "Domain Shader Active Time",
188*d83cc019SAndroid Build Coastguard Worker /* A14:
189*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the domain shader spent stalled on all cores -
190*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
191*d83cc019SAndroid Build Coastguard Worker */
192*d83cc019SAndroid Build Coastguard Worker [14] = "Domain Shader Stall Time - Core Stall",
193*d83cc019SAndroid Build Coastguard Worker /* A15: Number of DS threads loaded at any given time in the EUs. */
194*d83cc019SAndroid Build Coastguard Worker [15] = "# DS threads loaded",
195*d83cc019SAndroid Build Coastguard Worker /* A17:
196*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the compute shader spent active on all cores.
197*d83cc019SAndroid Build Coastguard Worker */
198*d83cc019SAndroid Build Coastguard Worker [17] = "Compute Shader Active Time",
199*d83cc019SAndroid Build Coastguard Worker /* A19:
200*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the compute shader spent stalled on all cores -
201*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
202*d83cc019SAndroid Build Coastguard Worker */
203*d83cc019SAndroid Build Coastguard Worker [19] = "Compute Shader Stall Time - Core Stall",
204*d83cc019SAndroid Build Coastguard Worker /* A20: Number of CS threads loaded at any given time in the EUs. */
205*d83cc019SAndroid Build Coastguard Worker [20] = "# CS threads loaded",
206*d83cc019SAndroid Build Coastguard Worker /* A22:
207*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the geometry shader spent active on all cores.
208*d83cc019SAndroid Build Coastguard Worker */
209*d83cc019SAndroid Build Coastguard Worker [22] = "Geometry Shader Active Time",
210*d83cc019SAndroid Build Coastguard Worker /* A24:
211*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the geometry shader spent stalled on all cores -
212*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
213*d83cc019SAndroid Build Coastguard Worker */
214*d83cc019SAndroid Build Coastguard Worker [24] = "Geometry Shader Stall Time - Core Stall",
215*d83cc019SAndroid Build Coastguard Worker /* A25: Number of GS threads loaded at any time in the EUs. */
216*d83cc019SAndroid Build Coastguard Worker [25] = "# GS threads loaded",
217*d83cc019SAndroid Build Coastguard Worker /* A27:
218*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the pixel shader spent active on all cores.
219*d83cc019SAndroid Build Coastguard Worker */
220*d83cc019SAndroid Build Coastguard Worker [27] = "Pixel Shader Active Time",
221*d83cc019SAndroid Build Coastguard Worker /* A29:
222*d83cc019SAndroid Build Coastguard Worker * Total time in clocks the pixel shader spent stalled on all cores -
223*d83cc019SAndroid Build Coastguard Worker * and the entire core was stalled as well.
224*d83cc019SAndroid Build Coastguard Worker */
225*d83cc019SAndroid Build Coastguard Worker [29] = "Pixel Shader Stall Time - Core Stall",
226*d83cc019SAndroid Build Coastguard Worker /* A30: Number of PS threads loaded at any given time in the EUs. */
227*d83cc019SAndroid Build Coastguard Worker [30] = "# PS threads loaded",
228*d83cc019SAndroid Build Coastguard Worker /* A32: Count of pixels that pass the fast check (8x8). */
229*d83cc019SAndroid Build Coastguard Worker [32] = "HiZ Fast Z Test Pixels Passing",
230*d83cc019SAndroid Build Coastguard Worker /* A33: Count of pixels that fail the fast check (8x8). */
231*d83cc019SAndroid Build Coastguard Worker [33] = "HiZ Fast Z Test Pixels Failing",
232*d83cc019SAndroid Build Coastguard Worker /* A34: Count of pixels passing the slow check (2x2). */
233*d83cc019SAndroid Build Coastguard Worker [34] = "Slow Z Test Pixels Passing",
234*d83cc019SAndroid Build Coastguard Worker /* A35: Count of pixels that fail the slow check (2x2). */
235*d83cc019SAndroid Build Coastguard Worker [35] = "Slow Z Test Pixels Failing",
236*d83cc019SAndroid Build Coastguard Worker /* A36: Number of pixels/samples killed in the pixel shader.
237*d83cc019SAndroid Build Coastguard Worker * Ivybridge/Baytrail Erratum: Count reported is 2X the actual count for
238*d83cc019SAndroid Build Coastguard Worker * dual source render target messages i.e. when PS has two output colors.
239*d83cc019SAndroid Build Coastguard Worker */
240*d83cc019SAndroid Build Coastguard Worker [36] = "Pixel Kill Count",
241*d83cc019SAndroid Build Coastguard Worker /* A37:
242*d83cc019SAndroid Build Coastguard Worker * Number of pixels/samples that fail alpha-test. Alpha to coverage
243*d83cc019SAndroid Build Coastguard Worker * may have some challenges in per-pixel invocation.
244*d83cc019SAndroid Build Coastguard Worker */
245*d83cc019SAndroid Build Coastguard Worker [37] = "Alpha Test Pixels Failed",
246*d83cc019SAndroid Build Coastguard Worker /* A38:
247*d83cc019SAndroid Build Coastguard Worker * Number of pixels/samples failing stencil test after the pixel shader
248*d83cc019SAndroid Build Coastguard Worker * has executed.
249*d83cc019SAndroid Build Coastguard Worker */
250*d83cc019SAndroid Build Coastguard Worker [38] = "Post PS Stencil Pixels Failed",
251*d83cc019SAndroid Build Coastguard Worker /* A39:
252*d83cc019SAndroid Build Coastguard Worker * Number of pixels/samples fail Z test after the pixel shader has
253*d83cc019SAndroid Build Coastguard Worker * executed.
254*d83cc019SAndroid Build Coastguard Worker */
255*d83cc019SAndroid Build Coastguard Worker [39] = "Post PS Z buffer Pixels Failed",
256*d83cc019SAndroid Build Coastguard Worker /* A40:
257*d83cc019SAndroid Build Coastguard Worker * Number of render target writes. MRT scenarios will cause this
258*d83cc019SAndroid Build Coastguard Worker * counter to increment multiple times.
259*d83cc019SAndroid Build Coastguard Worker */
260*d83cc019SAndroid Build Coastguard Worker [40] = "3D/GPGPU Render Target Writes",
261*d83cc019SAndroid Build Coastguard Worker /* A41: Render engine is not idle.
262*d83cc019SAndroid Build Coastguard Worker *
263*d83cc019SAndroid Build Coastguard Worker * GPU Busy aggregate counter doesn't increment under the following
264*d83cc019SAndroid Build Coastguard Worker * conditions:
265*d83cc019SAndroid Build Coastguard Worker *
266*d83cc019SAndroid Build Coastguard Worker * 1. Context Switch in Progress.
267*d83cc019SAndroid Build Coastguard Worker * 2. GPU stalled on executing MI_WAIT_FOR_EVENT.
268*d83cc019SAndroid Build Coastguard Worker * 3. GPU stalled on execution MI_SEMAPHORE_MBOX.
269*d83cc019SAndroid Build Coastguard Worker * 4. RCS idle but other parts of GPU active (e.g. only media engines
270*d83cc019SAndroid Build Coastguard Worker * active)
271*d83cc019SAndroid Build Coastguard Worker */
272*d83cc019SAndroid Build Coastguard Worker [41] = "Render Engine Busy",
273*d83cc019SAndroid Build Coastguard Worker /* A42:
274*d83cc019SAndroid Build Coastguard Worker * VSunit is stalling VF (upstream unit) and starving HS (downstream
275*d83cc019SAndroid Build Coastguard Worker * unit).
276*d83cc019SAndroid Build Coastguard Worker */
277*d83cc019SAndroid Build Coastguard Worker [42] = "VS bottleneck",
278*d83cc019SAndroid Build Coastguard Worker /* A43:
279*d83cc019SAndroid Build Coastguard Worker * GSunit is stalling DS (upstream unit) and starving SOL (downstream
280*d83cc019SAndroid Build Coastguard Worker * unit).
281*d83cc019SAndroid Build Coastguard Worker */
282*d83cc019SAndroid Build Coastguard Worker [43] = "GS bottleneck",
283*d83cc019SAndroid Build Coastguard Worker };
284*d83cc019SAndroid Build Coastguard Worker
285*d83cc019SAndroid Build Coastguard Worker /**
286*d83cc019SAndroid Build Coastguard Worker * Ivybridge - Counter Select = 101
287*d83cc019SAndroid Build Coastguard Worker * A4 A3 A2 A1 A0 TIMESTAMP ReportID
288*d83cc019SAndroid Build Coastguard Worker * A12 A11 A10 A9 A8 A7 A6 A5
289*d83cc019SAndroid Build Coastguard Worker * A20 A19 A18 A17 A16 A15 A14 A13
290*d83cc019SAndroid Build Coastguard Worker * A28 A27 A26 A25 A24 A23 A22 A21
291*d83cc019SAndroid Build Coastguard Worker * A36 A35 A34 A33 A32 A31 A30 A29
292*d83cc019SAndroid Build Coastguard Worker * A44 A43 A42 A41 A40 A39 A38 A37
293*d83cc019SAndroid Build Coastguard Worker * C3 C2 C1 C0 B3 B2 B1 B0
294*d83cc019SAndroid Build Coastguard Worker * C11 C10 C9 C8 C7 C6 C5 C4
295*d83cc019SAndroid Build Coastguard Worker */
296*d83cc019SAndroid Build Coastguard Worker const int gen7_counter_format = 5; /* 0b101 */
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker int have_totals = 0;
299*d83cc019SAndroid Build Coastguard Worker uint32_t *totals;
300*d83cc019SAndroid Build Coastguard Worker uint32_t *last_counter;
301*d83cc019SAndroid Build Coastguard Worker static drm_intel_bufmgr *bufmgr;
302*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *batch;
303*d83cc019SAndroid Build Coastguard Worker
304*d83cc019SAndroid Build Coastguard Worker /* DW0 */
305*d83cc019SAndroid Build Coastguard Worker #define GEN5_MI_REPORT_PERF_COUNT ((0x26 << 23) | (3 - 2))
306*d83cc019SAndroid Build Coastguard Worker #define MI_COUNTER_SET_0 (0 << 6)
307*d83cc019SAndroid Build Coastguard Worker #define MI_COUNTER_SET_1 (1 << 6)
308*d83cc019SAndroid Build Coastguard Worker /* DW1 */
309*d83cc019SAndroid Build Coastguard Worker #define MI_COUNTER_ADDRESS_GTT (1 << 0)
310*d83cc019SAndroid Build Coastguard Worker /* DW2: report ID */
311*d83cc019SAndroid Build Coastguard Worker
312*d83cc019SAndroid Build Coastguard Worker /**
313*d83cc019SAndroid Build Coastguard Worker * According to the Sandybridge PRM, Volume 1, Part 1, page 48,
314*d83cc019SAndroid Build Coastguard Worker * MI_REPORT_PERF_COUNT is now opcode 0x28. The Ironlake PRM, Volume 1,
315*d83cc019SAndroid Build Coastguard Worker * Part 3 details how it works.
316*d83cc019SAndroid Build Coastguard Worker */
317*d83cc019SAndroid Build Coastguard Worker /* DW0 */
318*d83cc019SAndroid Build Coastguard Worker #define GEN6_MI_REPORT_PERF_COUNT (0x28 << 23)
319*d83cc019SAndroid Build Coastguard Worker /* DW1 and 2 are the same as above */
320*d83cc019SAndroid Build Coastguard Worker
321*d83cc019SAndroid Build Coastguard Worker /* OACONTROL exists on Gen6+ but is documented in the Ironlake PRM */
322*d83cc019SAndroid Build Coastguard Worker #define OACONTROL 0x2360
323*d83cc019SAndroid Build Coastguard Worker # define OACONTROL_COUNTER_SELECT_SHIFT 2
324*d83cc019SAndroid Build Coastguard Worker # define PERFORMANCE_COUNTER_ENABLE (1 << 0)
325*d83cc019SAndroid Build Coastguard Worker
326*d83cc019SAndroid Build Coastguard Worker static void
gen5_get_counters(void)327*d83cc019SAndroid Build Coastguard Worker gen5_get_counters(void)
328*d83cc019SAndroid Build Coastguard Worker {
329*d83cc019SAndroid Build Coastguard Worker int i;
330*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *stats_bo;
331*d83cc019SAndroid Build Coastguard Worker uint32_t *stats_result;
332*d83cc019SAndroid Build Coastguard Worker
333*d83cc019SAndroid Build Coastguard Worker stats_bo = drm_intel_bo_alloc(bufmgr, "stats", 4096, 4096);
334*d83cc019SAndroid Build Coastguard Worker
335*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(6, 2);
336*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN5_MI_REPORT_PERF_COUNT | MI_COUNTER_SET_0);
337*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(stats_bo,
338*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
339*d83cc019SAndroid Build Coastguard Worker 0);
340*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
341*d83cc019SAndroid Build Coastguard Worker
342*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN5_MI_REPORT_PERF_COUNT | MI_COUNTER_SET_1);
343*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(stats_bo,
344*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
345*d83cc019SAndroid Build Coastguard Worker 64);
346*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
347*d83cc019SAndroid Build Coastguard Worker
348*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
349*d83cc019SAndroid Build Coastguard Worker
350*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
351*d83cc019SAndroid Build Coastguard Worker
352*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_map(stats_bo, 0);
353*d83cc019SAndroid Build Coastguard Worker stats_result = stats_bo->virtual;
354*d83cc019SAndroid Build Coastguard Worker /* skip REPORT_ID, TIMESTAMP */
355*d83cc019SAndroid Build Coastguard Worker stats_result += 3;
356*d83cc019SAndroid Build Coastguard Worker for (i = 0 ; i < GEN5_COUNTER_COUNT; i++) {
357*d83cc019SAndroid Build Coastguard Worker totals[i] += stats_result[i] - last_counter[i];
358*d83cc019SAndroid Build Coastguard Worker last_counter[i] = stats_result[i];
359*d83cc019SAndroid Build Coastguard Worker }
360*d83cc019SAndroid Build Coastguard Worker
361*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unmap(stats_bo);
362*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unreference(stats_bo);
363*d83cc019SAndroid Build Coastguard Worker }
364*d83cc019SAndroid Build Coastguard Worker
365*d83cc019SAndroid Build Coastguard Worker static void
gen6_get_counters(void)366*d83cc019SAndroid Build Coastguard Worker gen6_get_counters(void)
367*d83cc019SAndroid Build Coastguard Worker {
368*d83cc019SAndroid Build Coastguard Worker int i;
369*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *stats_bo;
370*d83cc019SAndroid Build Coastguard Worker uint32_t *stats_result;
371*d83cc019SAndroid Build Coastguard Worker
372*d83cc019SAndroid Build Coastguard Worker /* Map from counter names to their index in the buffer object */
373*d83cc019SAndroid Build Coastguard Worker static const int buffer_index[GEN6_COUNTER_COUNT] =
374*d83cc019SAndroid Build Coastguard Worker {
375*d83cc019SAndroid Build Coastguard Worker 7, 6, 5, 4, 3,
376*d83cc019SAndroid Build Coastguard Worker 15, 14, 13, 12, 11, 10, 9, 8,
377*d83cc019SAndroid Build Coastguard Worker 23, 22, 21, 20, 19, 18, 17, 16,
378*d83cc019SAndroid Build Coastguard Worker 31, 30, 29, 28, 27, 26, 25, 24,
379*d83cc019SAndroid Build Coastguard Worker };
380*d83cc019SAndroid Build Coastguard Worker
381*d83cc019SAndroid Build Coastguard Worker stats_bo = drm_intel_bo_alloc(bufmgr, "stats", 4096, 4096);
382*d83cc019SAndroid Build Coastguard Worker
383*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(3, 1);
384*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_MI_REPORT_PERF_COUNT | (3 - 2));
385*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(stats_bo,
386*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
387*d83cc019SAndroid Build Coastguard Worker MI_COUNTER_ADDRESS_GTT);
388*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
389*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
390*d83cc019SAndroid Build Coastguard Worker
391*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_on_ring(batch, I915_EXEC_RENDER);
392*d83cc019SAndroid Build Coastguard Worker
393*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_map(stats_bo, 0);
394*d83cc019SAndroid Build Coastguard Worker stats_result = stats_bo->virtual;
395*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < GEN6_COUNTER_COUNT; i++) {
396*d83cc019SAndroid Build Coastguard Worker totals[i] += stats_result[buffer_index[i]] - last_counter[i];
397*d83cc019SAndroid Build Coastguard Worker last_counter[i] = stats_result[buffer_index[i]];
398*d83cc019SAndroid Build Coastguard Worker }
399*d83cc019SAndroid Build Coastguard Worker
400*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unmap(stats_bo);
401*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unreference(stats_bo);
402*d83cc019SAndroid Build Coastguard Worker }
403*d83cc019SAndroid Build Coastguard Worker
404*d83cc019SAndroid Build Coastguard Worker static void
gen7_get_counters(void)405*d83cc019SAndroid Build Coastguard Worker gen7_get_counters(void)
406*d83cc019SAndroid Build Coastguard Worker {
407*d83cc019SAndroid Build Coastguard Worker int i;
408*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *stats_bo;
409*d83cc019SAndroid Build Coastguard Worker uint32_t *stats_result;
410*d83cc019SAndroid Build Coastguard Worker
411*d83cc019SAndroid Build Coastguard Worker stats_bo = drm_intel_bo_alloc(bufmgr, "stats", 4096, 4096);
412*d83cc019SAndroid Build Coastguard Worker
413*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(3, 1);
414*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_MI_REPORT_PERF_COUNT | (3 - 2));
415*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(stats_bo,
416*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0);
417*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
418*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
419*d83cc019SAndroid Build Coastguard Worker
420*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_on_ring(batch, I915_EXEC_RENDER);
421*d83cc019SAndroid Build Coastguard Worker
422*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_map(stats_bo, 0);
423*d83cc019SAndroid Build Coastguard Worker stats_result = stats_bo->virtual;
424*d83cc019SAndroid Build Coastguard Worker /* skip REPORT_ID, TIMESTAMP */
425*d83cc019SAndroid Build Coastguard Worker stats_result += 3;
426*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < GEN7_COUNTER_COUNT; i++) {
427*d83cc019SAndroid Build Coastguard Worker /* Ignore "Reserved" counters */
428*d83cc019SAndroid Build Coastguard Worker if (!gen7_counter_names[i])
429*d83cc019SAndroid Build Coastguard Worker continue;
430*d83cc019SAndroid Build Coastguard Worker totals[i] += stats_result[i] - last_counter[i];
431*d83cc019SAndroid Build Coastguard Worker last_counter[i] = stats_result[i];
432*d83cc019SAndroid Build Coastguard Worker }
433*d83cc019SAndroid Build Coastguard Worker
434*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unmap(stats_bo);
435*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unreference(stats_bo);
436*d83cc019SAndroid Build Coastguard Worker }
437*d83cc019SAndroid Build Coastguard Worker
438*d83cc019SAndroid Build Coastguard Worker #define STATS_CHECK_FREQUENCY 100
439*d83cc019SAndroid Build Coastguard Worker #define STATS_REPORT_FREQUENCY 2
440*d83cc019SAndroid Build Coastguard Worker
441*d83cc019SAndroid Build Coastguard Worker int
main(int argc,char ** argv)442*d83cc019SAndroid Build Coastguard Worker main(int argc, char **argv)
443*d83cc019SAndroid Build Coastguard Worker {
444*d83cc019SAndroid Build Coastguard Worker uint32_t devid;
445*d83cc019SAndroid Build Coastguard Worker int counter_format;
446*d83cc019SAndroid Build Coastguard Worker int counter_count;
447*d83cc019SAndroid Build Coastguard Worker const char **counter_name;
448*d83cc019SAndroid Build Coastguard Worker void (*get_counters)(void);
449*d83cc019SAndroid Build Coastguard Worker int i;
450*d83cc019SAndroid Build Coastguard Worker char clear_screen[] = {0x1b, '[', 'H',
451*d83cc019SAndroid Build Coastguard Worker 0x1b, '[', 'J',
452*d83cc019SAndroid Build Coastguard Worker 0x0};
453*d83cc019SAndroid Build Coastguard Worker bool oacontrol = true;
454*d83cc019SAndroid Build Coastguard Worker int fd;
455*d83cc019SAndroid Build Coastguard Worker int l;
456*d83cc019SAndroid Build Coastguard Worker
457*d83cc019SAndroid Build Coastguard Worker fd = drm_open_driver(DRIVER_INTEL);
458*d83cc019SAndroid Build Coastguard Worker devid = intel_get_drm_devid(fd);
459*d83cc019SAndroid Build Coastguard Worker
460*d83cc019SAndroid Build Coastguard Worker bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
461*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_gem_enable_reuse(bufmgr);
462*d83cc019SAndroid Build Coastguard Worker batch = intel_batchbuffer_alloc(bufmgr, devid);
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker if (IS_GEN5(devid)) {
465*d83cc019SAndroid Build Coastguard Worker counter_name = gen5_counter_names;
466*d83cc019SAndroid Build Coastguard Worker counter_count = GEN5_COUNTER_COUNT;
467*d83cc019SAndroid Build Coastguard Worker get_counters = gen5_get_counters;
468*d83cc019SAndroid Build Coastguard Worker oacontrol = false;
469*d83cc019SAndroid Build Coastguard Worker } else if (IS_GEN6(devid)) {
470*d83cc019SAndroid Build Coastguard Worker counter_name = gen6_counter_names;
471*d83cc019SAndroid Build Coastguard Worker counter_count = GEN6_COUNTER_COUNT;
472*d83cc019SAndroid Build Coastguard Worker counter_format = gen6_counter_format;
473*d83cc019SAndroid Build Coastguard Worker get_counters = gen6_get_counters;
474*d83cc019SAndroid Build Coastguard Worker } else if (IS_GEN7(devid)) {
475*d83cc019SAndroid Build Coastguard Worker counter_name = gen7_counter_names;
476*d83cc019SAndroid Build Coastguard Worker counter_count = GEN7_COUNTER_COUNT;
477*d83cc019SAndroid Build Coastguard Worker counter_format = gen7_counter_format;
478*d83cc019SAndroid Build Coastguard Worker get_counters = gen7_get_counters;
479*d83cc019SAndroid Build Coastguard Worker } else {
480*d83cc019SAndroid Build Coastguard Worker printf("This tool is not yet supported on your platform.\n");
481*d83cc019SAndroid Build Coastguard Worker abort();
482*d83cc019SAndroid Build Coastguard Worker }
483*d83cc019SAndroid Build Coastguard Worker
484*d83cc019SAndroid Build Coastguard Worker if (oacontrol) {
485*d83cc019SAndroid Build Coastguard Worker /* Forcewake */
486*d83cc019SAndroid Build Coastguard Worker intel_register_access_init(intel_get_pci_device(), 0, fd);
487*d83cc019SAndroid Build Coastguard Worker
488*d83cc019SAndroid Build Coastguard Worker /* Enable performance counters */
489*d83cc019SAndroid Build Coastguard Worker intel_register_write(OACONTROL,
490*d83cc019SAndroid Build Coastguard Worker counter_format << OACONTROL_COUNTER_SELECT_SHIFT |
491*d83cc019SAndroid Build Coastguard Worker PERFORMANCE_COUNTER_ENABLE);
492*d83cc019SAndroid Build Coastguard Worker }
493*d83cc019SAndroid Build Coastguard Worker
494*d83cc019SAndroid Build Coastguard Worker totals = calloc(counter_count, sizeof(uint32_t));
495*d83cc019SAndroid Build Coastguard Worker last_counter = calloc(counter_count, sizeof(uint32_t));
496*d83cc019SAndroid Build Coastguard Worker
497*d83cc019SAndroid Build Coastguard Worker for (;;) {
498*d83cc019SAndroid Build Coastguard Worker for (l = 0; l < STATS_CHECK_FREQUENCY; l++) {
499*d83cc019SAndroid Build Coastguard Worker printf("%s", clear_screen);
500*d83cc019SAndroid Build Coastguard Worker
501*d83cc019SAndroid Build Coastguard Worker if (l % (STATS_CHECK_FREQUENCY / STATS_REPORT_FREQUENCY) == 0) {
502*d83cc019SAndroid Build Coastguard Worker if (have_totals) {
503*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < counter_count; i++) {
504*d83cc019SAndroid Build Coastguard Worker /* Ignore "Reserved" counters */
505*d83cc019SAndroid Build Coastguard Worker if (!counter_name[i])
506*d83cc019SAndroid Build Coastguard Worker continue;
507*d83cc019SAndroid Build Coastguard Worker printf("%s: %u\n", counter_name[i],
508*d83cc019SAndroid Build Coastguard Worker totals[i]);
509*d83cc019SAndroid Build Coastguard Worker totals[i] = 0;
510*d83cc019SAndroid Build Coastguard Worker }
511*d83cc019SAndroid Build Coastguard Worker }
512*d83cc019SAndroid Build Coastguard Worker }
513*d83cc019SAndroid Build Coastguard Worker
514*d83cc019SAndroid Build Coastguard Worker get_counters();
515*d83cc019SAndroid Build Coastguard Worker have_totals = 1;
516*d83cc019SAndroid Build Coastguard Worker
517*d83cc019SAndroid Build Coastguard Worker usleep(1000000 / STATS_CHECK_FREQUENCY);
518*d83cc019SAndroid Build Coastguard Worker }
519*d83cc019SAndroid Build Coastguard Worker }
520*d83cc019SAndroid Build Coastguard Worker
521*d83cc019SAndroid Build Coastguard Worker if (oacontrol) {
522*d83cc019SAndroid Build Coastguard Worker /* Disable performance counters */
523*d83cc019SAndroid Build Coastguard Worker intel_register_write(OACONTROL, 0);
524*d83cc019SAndroid Build Coastguard Worker
525*d83cc019SAndroid Build Coastguard Worker /* Forcewake */
526*d83cc019SAndroid Build Coastguard Worker intel_register_access_fini();
527*d83cc019SAndroid Build Coastguard Worker }
528*d83cc019SAndroid Build Coastguard Worker
529*d83cc019SAndroid Build Coastguard Worker free(totals);
530*d83cc019SAndroid Build Coastguard Worker free(last_counter);
531*d83cc019SAndroid Build Coastguard Worker
532*d83cc019SAndroid Build Coastguard Worker return 0;
533*d83cc019SAndroid Build Coastguard Worker }
534