xref: /aosp_15_r20/external/igt-gpu-tools/tools/intel_perf_counters.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
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