xref: /aosp_15_r20/external/igt-gpu-tools/tools/intel_reg_checker.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /* Copyright © 2011 Intel Corporation
2*d83cc019SAndroid Build Coastguard Worker  *
3*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
4*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
5*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
6*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
8*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
9*d83cc019SAndroid Build Coastguard Worker  *
10*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
11*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
12*d83cc019SAndroid Build Coastguard Worker  * Software.
13*d83cc019SAndroid Build Coastguard Worker  *
14*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20*d83cc019SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
21*d83cc019SAndroid Build Coastguard Worker  */
22*d83cc019SAndroid Build Coastguard Worker 
23*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
24*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
25*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
26*d83cc019SAndroid Build Coastguard Worker #include <err.h>
27*d83cc019SAndroid Build Coastguard Worker #include <string.h>
28*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
29*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
30*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
31*d83cc019SAndroid Build Coastguard Worker 
32*d83cc019SAndroid Build Coastguard Worker static uint32_t devid;
33*d83cc019SAndroid Build Coastguard Worker static int gen;
34*d83cc019SAndroid Build Coastguard Worker 
35*d83cc019SAndroid Build Coastguard Worker static uint32_t
read_and_print_reg(const char * name,uint32_t reg)36*d83cc019SAndroid Build Coastguard Worker read_and_print_reg(const char *name, uint32_t reg)
37*d83cc019SAndroid Build Coastguard Worker {
38*d83cc019SAndroid Build Coastguard Worker 	uint32_t val = INREG(reg);
39*d83cc019SAndroid Build Coastguard Worker 
40*d83cc019SAndroid Build Coastguard Worker 	printf("%s (0x%x): 0x%08x\n", name, reg, val);
41*d83cc019SAndroid Build Coastguard Worker 
42*d83cc019SAndroid Build Coastguard Worker 	return val;
43*d83cc019SAndroid Build Coastguard Worker }
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker static void
check_chicken_unset(const char * name,uint32_t reg)46*d83cc019SAndroid Build Coastguard Worker check_chicken_unset(const char *name, uint32_t reg)
47*d83cc019SAndroid Build Coastguard Worker {
48*d83cc019SAndroid Build Coastguard Worker 	uint32_t val = read_and_print_reg(name, reg);
49*d83cc019SAndroid Build Coastguard Worker 
50*d83cc019SAndroid Build Coastguard Worker 
51*d83cc019SAndroid Build Coastguard Worker 	if (val != 0) {
52*d83cc019SAndroid Build Coastguard Worker 		fprintf(stderr, "           WARN: chicken bits set\n");
53*d83cc019SAndroid Build Coastguard Worker 	} else {
54*d83cc019SAndroid Build Coastguard Worker 		printf("           OK:   chicken bits unset\n");
55*d83cc019SAndroid Build Coastguard Worker 	}
56*d83cc019SAndroid Build Coastguard Worker }
57*d83cc019SAndroid Build Coastguard Worker 
58*d83cc019SAndroid Build Coastguard Worker static void
check_bit(uint32_t val,int bit,const char * bitname,bool set)59*d83cc019SAndroid Build Coastguard Worker check_bit(uint32_t val, int bit, const char *bitname, bool set)
60*d83cc019SAndroid Build Coastguard Worker {
61*d83cc019SAndroid Build Coastguard Worker 	if (!!(val & (1 << bit)) != set) {
62*d83cc019SAndroid Build Coastguard Worker 		fprintf(stderr, "  (bit %2d) FAIL: %s must be %s\n",
63*d83cc019SAndroid Build Coastguard Worker 			bit, bitname, set ? "set" : "unset");
64*d83cc019SAndroid Build Coastguard Worker 	} else {
65*d83cc019SAndroid Build Coastguard Worker 		printf("  (bit %2d) OK:   %s\n", bit, bitname);
66*d83cc019SAndroid Build Coastguard Worker 	}
67*d83cc019SAndroid Build Coastguard Worker }
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker static void
check_perf_bit(uint32_t val,int bit,const char * bitname,bool set)70*d83cc019SAndroid Build Coastguard Worker check_perf_bit(uint32_t val, int bit, const char *bitname, bool set)
71*d83cc019SAndroid Build Coastguard Worker {
72*d83cc019SAndroid Build Coastguard Worker 	if (!!(val & (1 << bit)) != set) {
73*d83cc019SAndroid Build Coastguard Worker 		printf("  (bit %2d) PERF: %s should be %s\n",
74*d83cc019SAndroid Build Coastguard Worker 			bit, bitname, set ? "set" : "unset");
75*d83cc019SAndroid Build Coastguard Worker 	} else {
76*d83cc019SAndroid Build Coastguard Worker 		printf("  (bit %2d) OK:   %s\n", bit, bitname);
77*d83cc019SAndroid Build Coastguard Worker 	}
78*d83cc019SAndroid Build Coastguard Worker }
79*d83cc019SAndroid Build Coastguard Worker 
80*d83cc019SAndroid Build Coastguard Worker static void
check_mi_mode(void)81*d83cc019SAndroid Build Coastguard Worker check_mi_mode(void)
82*d83cc019SAndroid Build Coastguard Worker {
83*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 14-16 of the IHD_OS_Vol1_Part3.pdf
84*d83cc019SAndroid Build Coastguard Worker 	 * specification.
85*d83cc019SAndroid Build Coastguard Worker 	 */
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker 	uint32_t mi_mode = read_and_print_reg("MI_MODE", 0x209c);
88*d83cc019SAndroid Build Coastguard Worker 
89*d83cc019SAndroid Build Coastguard Worker 	/* From page 14:
90*d83cc019SAndroid Build Coastguard Worker 	 *
91*d83cc019SAndroid Build Coastguard Worker 	 * Async Flip Performance mode
92*d83cc019SAndroid Build Coastguard Worker 	 * Project: All
93*d83cc019SAndroid Build Coastguard Worker 	 * Default Value: 0h
94*d83cc019SAndroid Build Coastguard Worker 	 * Format: U1
95*d83cc019SAndroid Build Coastguard Worker 	 * [DevSNB] This bit must be set to ‘1’
96*d83cc019SAndroid Build Coastguard Worker 	 */
97*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6)
98*d83cc019SAndroid Build Coastguard Worker 		check_bit(mi_mode, 14, "Async Flip Performance mode", true);
99*d83cc019SAndroid Build Coastguard Worker 	else
100*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(mi_mode, 14, "Async Flip Performance mode",
101*d83cc019SAndroid Build Coastguard Worker 			       false);
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(mi_mode, 13, "Flush Performance Mode", false);
104*d83cc019SAndroid Build Coastguard Worker 
105*d83cc019SAndroid Build Coastguard Worker 	/* Our driver relies on MI_FLUSH, unfortunately. */
106*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 6)
107*d83cc019SAndroid Build Coastguard Worker 		check_bit(mi_mode, 12, "MI_FLUSH enable", true);
108*d83cc019SAndroid Build Coastguard Worker 
109*d83cc019SAndroid Build Coastguard Worker 	/* From page 15:
110*d83cc019SAndroid Build Coastguard Worker 	 *
111*d83cc019SAndroid Build Coastguard Worker 	 *     "1h: LRA mode of allocation. Used for validation purposes"
112*d83cc019SAndroid Build Coastguard Worker 	 */
113*d83cc019SAndroid Build Coastguard Worker 	if (gen < 7)
114*d83cc019SAndroid Build Coastguard Worker 		check_bit(mi_mode, 7, "Vertex Shader Cache Mode", false);
115*d83cc019SAndroid Build Coastguard Worker 
116*d83cc019SAndroid Build Coastguard Worker 	/* From page 16:
117*d83cc019SAndroid Build Coastguard Worker 	 *
118*d83cc019SAndroid Build Coastguard Worker 	 *     "To avoid deadlock conditions in hardware this bit
119*d83cc019SAndroid Build Coastguard Worker 	 *      needs to be set for normal operation.
120*d83cc019SAndroid Build Coastguard Worker 	 */
121*d83cc019SAndroid Build Coastguard Worker 	check_bit(mi_mode, 6, "Vertex Shader Timer Dispatch Enable", true);
122*d83cc019SAndroid Build Coastguard Worker }
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker static void
check_gfx_mode(void)125*d83cc019SAndroid Build Coastguard Worker check_gfx_mode(void)
126*d83cc019SAndroid Build Coastguard Worker {
127*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 17-19 of the IHD_OS_Vol1_Part3.pdf
128*d83cc019SAndroid Build Coastguard Worker 	 * specification.
129*d83cc019SAndroid Build Coastguard Worker 	 */
130*d83cc019SAndroid Build Coastguard Worker 	uint32_t gfx_mode;
131*d83cc019SAndroid Build Coastguard Worker 
132*d83cc019SAndroid Build Coastguard Worker 	if (gen < 6)
133*d83cc019SAndroid Build Coastguard Worker 		return;
134*d83cc019SAndroid Build Coastguard Worker 
135*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6)
136*d83cc019SAndroid Build Coastguard Worker 		gfx_mode = read_and_print_reg("GFX_MODE", 0x2520);
137*d83cc019SAndroid Build Coastguard Worker 	else
138*d83cc019SAndroid Build Coastguard Worker 		gfx_mode = read_and_print_reg("GFX_MODE", 0x229c);
139*d83cc019SAndroid Build Coastguard Worker 
140*d83cc019SAndroid Build Coastguard Worker 	/* Our driver only updates page tables at batchbuffer
141*d83cc019SAndroid Build Coastguard Worker 	 * boundaries, so we don't need TLB flushes at other times.
142*d83cc019SAndroid Build Coastguard Worker 	 */
143*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(gfx_mode, 13, "Flush TLB Invalidation Mode", true);
144*d83cc019SAndroid Build Coastguard Worker }
145*d83cc019SAndroid Build Coastguard Worker 
146*d83cc019SAndroid Build Coastguard Worker static void
check_gt_mode(void)147*d83cc019SAndroid Build Coastguard Worker check_gt_mode(void)
148*d83cc019SAndroid Build Coastguard Worker {
149*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 20-22 of the IHD_OS_Vol1_Part3.pdf
150*d83cc019SAndroid Build Coastguard Worker 	 * specification.
151*d83cc019SAndroid Build Coastguard Worker 	 */
152*d83cc019SAndroid Build Coastguard Worker 	uint32_t gt_mode;
153*d83cc019SAndroid Build Coastguard Worker 
154*d83cc019SAndroid Build Coastguard Worker 	if (gen < 6)
155*d83cc019SAndroid Build Coastguard Worker 		return;
156*d83cc019SAndroid Build Coastguard Worker 
157*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6)
158*d83cc019SAndroid Build Coastguard Worker 		gt_mode = read_and_print_reg("GT_MODE", 0x20d0);
159*d83cc019SAndroid Build Coastguard Worker 	else
160*d83cc019SAndroid Build Coastguard Worker 		gt_mode = read_and_print_reg("GT_MODE", 0x7008);
161*d83cc019SAndroid Build Coastguard Worker 
162*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6)
163*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(gt_mode, 8, "Full Rate Sampler Disable", false);
164*d83cc019SAndroid Build Coastguard Worker 
165*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6) {
166*d83cc019SAndroid Build Coastguard Worker 		/* For DevSmallGT, this bit must be set, which means disable
167*d83cc019SAndroid Build Coastguard Worker 		 * hashing.
168*d83cc019SAndroid Build Coastguard Worker 		 */
169*d83cc019SAndroid Build Coastguard Worker 		if (intel_gt(devid) == 0)
170*d83cc019SAndroid Build Coastguard Worker 			check_bit(gt_mode, 6,
171*d83cc019SAndroid Build Coastguard Worker 				  "WIZ Hashing disable", true);
172*d83cc019SAndroid Build Coastguard Worker 		else
173*d83cc019SAndroid Build Coastguard Worker 			check_perf_bit(gt_mode, 6,
174*d83cc019SAndroid Build Coastguard Worker 				       "WIZ Hashing disable", false);
175*d83cc019SAndroid Build Coastguard Worker 
176*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(gt_mode, 5, "TD Four Row Dispatch Disable",
177*d83cc019SAndroid Build Coastguard Worker 			       false);
178*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(gt_mode, 4, "Full Size URB Disable", false);
179*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(gt_mode, 3, "Full Size SF FIFO Disable", false);
180*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(gt_mode, 1, "VS Quad Thread Dispatch Disable",
181*d83cc019SAndroid Build Coastguard Worker 			       false);
182*d83cc019SAndroid Build Coastguard Worker 	}
183*d83cc019SAndroid Build Coastguard Worker }
184*d83cc019SAndroid Build Coastguard Worker 
185*d83cc019SAndroid Build Coastguard Worker static void
check_cache_mode_0(void)186*d83cc019SAndroid Build Coastguard Worker check_cache_mode_0(void)
187*d83cc019SAndroid Build Coastguard Worker {
188*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 23-25 of the IHD_OS_Vol1_Part3.pdf
189*d83cc019SAndroid Build Coastguard Worker 	 * specification.
190*d83cc019SAndroid Build Coastguard Worker 	 */
191*d83cc019SAndroid Build Coastguard Worker 	uint32_t cache_mode_0;
192*d83cc019SAndroid Build Coastguard Worker 
193*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 7)
194*d83cc019SAndroid Build Coastguard Worker 		cache_mode_0 = read_and_print_reg("CACHE_MODE_0", 0x7000);
195*d83cc019SAndroid Build Coastguard Worker 	else
196*d83cc019SAndroid Build Coastguard Worker 		cache_mode_0 = read_and_print_reg("CACHE_MODE_0", 0x2120);
197*d83cc019SAndroid Build Coastguard Worker 
198*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(cache_mode_0, 15, "Sampler L2 Disable", false);
199*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(cache_mode_0, 9, "Sampler L2 TLB Prefetch Enable", true);
200*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(cache_mode_0, 8,
201*d83cc019SAndroid Build Coastguard Worker 		       "Depth Related Cache Pipelined Flush Disable", false);
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 	/* From page 24:
204*d83cc019SAndroid Build Coastguard Worker 	 *
205*d83cc019SAndroid Build Coastguard Worker 	 *     "If this bit is set, RCCunit will have LRA as
206*d83cc019SAndroid Build Coastguard Worker 	 *      replacement policy. The default value i.e. ( when this
207*d83cc019SAndroid Build Coastguard Worker 	 *      bit is reset ) indicates that non-LRA eviction
208*d83cc019SAndroid Build Coastguard Worker 	 *      policy. This bit must be reset. LRA replacement policy
209*d83cc019SAndroid Build Coastguard Worker 	 *      is not supported."
210*d83cc019SAndroid Build Coastguard Worker 	 *
211*d83cc019SAndroid Build Coastguard Worker 	 * And the same for STC Eviction Policy.
212*d83cc019SAndroid Build Coastguard Worker 	 */
213*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_0, 5, "STC LRA Eviction Policy", false);
214*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 6)
215*d83cc019SAndroid Build Coastguard Worker 		check_bit(cache_mode_0, 4, "RCC LRA Eviction Policy", false);
216*d83cc019SAndroid Build Coastguard Worker 
217*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(cache_mode_0, 3, "Hierarchical Z Disable", false);
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6) {
220*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_0, 2,
221*d83cc019SAndroid Build Coastguard Worker 			       "Hierarchical Z RAW Stall Optimization "
222*d83cc019SAndroid Build Coastguard Worker 			       "Disable", false);
223*d83cc019SAndroid Build Coastguard Worker 	}
224*d83cc019SAndroid Build Coastguard Worker 
225*d83cc019SAndroid Build Coastguard Worker 	/* From page 25:
226*d83cc019SAndroid Build Coastguard Worker 	 *
227*d83cc019SAndroid Build Coastguard Worker 	 *     "This bit must be 0. Operational Flushes [DevSNB] are
228*d83cc019SAndroid Build Coastguard Worker 	 *      not supported in [DevSNB].  SW must flush the render
229*d83cc019SAndroid Build Coastguard Worker 	 *      target after front buffer rendering."
230*d83cc019SAndroid Build Coastguard Worker 	 */
231*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_0, 0, "Render Cache Operational Flush", false);
232*d83cc019SAndroid Build Coastguard Worker }
233*d83cc019SAndroid Build Coastguard Worker 
234*d83cc019SAndroid Build Coastguard Worker 
235*d83cc019SAndroid Build Coastguard Worker static void
check_cache_mode_1(void)236*d83cc019SAndroid Build Coastguard Worker check_cache_mode_1(void)
237*d83cc019SAndroid Build Coastguard Worker {
238*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 23-25 of the IHD_OS_Vol1_Part3.pdf
239*d83cc019SAndroid Build Coastguard Worker 	 * specification.
240*d83cc019SAndroid Build Coastguard Worker 	 */
241*d83cc019SAndroid Build Coastguard Worker 	uint32_t cache_mode_1;
242*d83cc019SAndroid Build Coastguard Worker 
243*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 7)
244*d83cc019SAndroid Build Coastguard Worker 		cache_mode_1 = read_and_print_reg("CACHE_MODE_1", 0x7004);
245*d83cc019SAndroid Build Coastguard Worker 	else
246*d83cc019SAndroid Build Coastguard Worker 		cache_mode_1 = read_and_print_reg("CACHE_MODE_1", 0x2124);
247*d83cc019SAndroid Build Coastguard Worker 
248*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 7) {
249*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_1, 13,
250*d83cc019SAndroid Build Coastguard Worker 			       "STC Address Lookup Optimization Disable",
251*d83cc019SAndroid Build Coastguard Worker 			       false);
252*d83cc019SAndroid Build Coastguard Worker 	}
253*d83cc019SAndroid Build Coastguard Worker 
254*d83cc019SAndroid Build Coastguard Worker 	/* From page 24:
255*d83cc019SAndroid Build Coastguard Worker 	 *
256*d83cc019SAndroid Build Coastguard Worker 	 *     "If this bit is set, Hizunit will have LRA as
257*d83cc019SAndroid Build Coastguard Worker 	 *      replacement policy. The default value i.e.  (when this
258*d83cc019SAndroid Build Coastguard Worker 	 *      bit is reset) indicates the non-LRA eviction
259*d83cc019SAndroid Build Coastguard Worker 	 *      policy. For performance reasons, this bit must be
260*d83cc019SAndroid Build Coastguard Worker 	 *      reset."
261*d83cc019SAndroid Build Coastguard Worker 	 */
262*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 12, "HIZ LRA Eviction Policy", false);
263*d83cc019SAndroid Build Coastguard Worker 
264*d83cc019SAndroid Build Coastguard Worker 	/* Page 26 describes these bits as reserved (debug only). */
265*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 11,
266*d83cc019SAndroid Build Coastguard Worker 		  "DAP Instruction and State Cache Invalidate", false);
267*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 10,
268*d83cc019SAndroid Build Coastguard Worker 		  "Instruction L1 Cache and In-Flight Queue Disable",
269*d83cc019SAndroid Build Coastguard Worker 		  false);
270*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 9, "Instruction L2 Cache Fill Buffers Disable",
271*d83cc019SAndroid Build Coastguard Worker 		  false);
272*d83cc019SAndroid Build Coastguard Worker 
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 7) {
275*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_1, 6,
276*d83cc019SAndroid Build Coastguard Worker 			       "Pixel Backend sub-span collection "
277*d83cc019SAndroid Build Coastguard Worker 			       "Optimization Disable",
278*d83cc019SAndroid Build Coastguard Worker 			       false);
279*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_1, 5, "MCS Cache Disable", false);
280*d83cc019SAndroid Build Coastguard Worker 	}
281*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(cache_mode_1, 4, "Data Disable", false);
282*d83cc019SAndroid Build Coastguard Worker 
283*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6) {
284*d83cc019SAndroid Build Coastguard Worker 		/* In a later update of the documentation, it says:
285*d83cc019SAndroid Build Coastguard Worker 		 *
286*d83cc019SAndroid Build Coastguard Worker 		 *     "[DevSNB:A0{WKA1}] [DevSNB]: This bit must be
287*d83cc019SAndroid Build Coastguard Worker 		 *      set for depth buffer format
288*d83cc019SAndroid Build Coastguard Worker 		 *      D24_UNORM_S8_UINT."
289*d83cc019SAndroid Build Coastguard Worker 		 *
290*d83cc019SAndroid Build Coastguard Worker 		 * XXX: Does that mean A0 only, or all DevSNB?
291*d83cc019SAndroid Build Coastguard Worker 		 */
292*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_1, 3,
293*d83cc019SAndroid Build Coastguard Worker 			       "Depth Read Hit Write-Only Optimization "
294*d83cc019SAndroid Build Coastguard Worker 			       "Disable", false);
295*d83cc019SAndroid Build Coastguard Worker 
296*d83cc019SAndroid Build Coastguard Worker 		check_perf_bit(cache_mode_1, 2,
297*d83cc019SAndroid Build Coastguard Worker 			       "Depth Cache LRA Hunt Feature Disable",
298*d83cc019SAndroid Build Coastguard Worker 			       false);
299*d83cc019SAndroid Build Coastguard Worker 	}
300*d83cc019SAndroid Build Coastguard Worker 
301*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 1, "Instruction and State L2 Cache Disable",
302*d83cc019SAndroid Build Coastguard Worker 		  false);
303*d83cc019SAndroid Build Coastguard Worker 	check_bit(cache_mode_1, 0, "Instruction and State L1 Cache Disable",
304*d83cc019SAndroid Build Coastguard Worker 		  false);
305*d83cc019SAndroid Build Coastguard Worker }
306*d83cc019SAndroid Build Coastguard Worker 
307*d83cc019SAndroid Build Coastguard Worker 
308*d83cc019SAndroid Build Coastguard Worker static void
check_3d_chicken4(void)309*d83cc019SAndroid Build Coastguard Worker check_3d_chicken4(void)
310*d83cc019SAndroid Build Coastguard Worker {
311*d83cc019SAndroid Build Coastguard Worker 	/* Described in page 23-25 of the IHD_OS_Vol1_Part3.pdf
312*d83cc019SAndroid Build Coastguard Worker 	 * specification.
313*d83cc019SAndroid Build Coastguard Worker 	 */
314*d83cc019SAndroid Build Coastguard Worker 	uint32_t _3d_chicken4 = read_and_print_reg("3D_CHICKEN4", 0x20d4);
315*d83cc019SAndroid Build Coastguard Worker 
316*d83cc019SAndroid Build Coastguard Worker 	check_perf_bit(_3d_chicken4, 6, "3D Scoreboard Hashing Enable", true);
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker 	if (_3d_chicken4 & 0x0fbf) {
319*d83cc019SAndroid Build Coastguard Worker 		fprintf(stderr,
320*d83cc019SAndroid Build Coastguard Worker 			"         WARN:   other non-thread deps bits set\n");
321*d83cc019SAndroid Build Coastguard Worker 	} else {
322*d83cc019SAndroid Build Coastguard Worker 		printf("           OK:   other non-thread deps bits unset\n");
323*d83cc019SAndroid Build Coastguard Worker 	}
324*d83cc019SAndroid Build Coastguard Worker }
325*d83cc019SAndroid Build Coastguard Worker 
326*d83cc019SAndroid Build Coastguard Worker static void
check_dpfc_control_sa(void)327*d83cc019SAndroid Build Coastguard Worker check_dpfc_control_sa(void)
328*d83cc019SAndroid Build Coastguard Worker {
329*d83cc019SAndroid Build Coastguard Worker 	uint32_t dpfc_control_sa;
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	if (gen != 6)
332*d83cc019SAndroid Build Coastguard Worker 		return;
333*d83cc019SAndroid Build Coastguard Worker 
334*d83cc019SAndroid Build Coastguard Worker 	dpfc_control_sa = read_and_print_reg("DPFC_CONTROL_SA", 0x100100);
335*d83cc019SAndroid Build Coastguard Worker 
336*d83cc019SAndroid Build Coastguard Worker 	/* This is needed for framebuffer compression for us to be
337*d83cc019SAndroid Build Coastguard Worker 	 * able to access the framebuffer by the CPU through the GTT.
338*d83cc019SAndroid Build Coastguard Worker 	 */
339*d83cc019SAndroid Build Coastguard Worker 	check_bit(dpfc_control_sa, 29, "CPU Fence Enable", true);
340*d83cc019SAndroid Build Coastguard Worker }
341*d83cc019SAndroid Build Coastguard Worker 
main(int argc,char ** argv)342*d83cc019SAndroid Build Coastguard Worker int main(int argc, char** argv)
343*d83cc019SAndroid Build Coastguard Worker {
344*d83cc019SAndroid Build Coastguard Worker 	struct pci_device *dev;
345*d83cc019SAndroid Build Coastguard Worker 
346*d83cc019SAndroid Build Coastguard Worker 	dev = intel_get_pci_device();
347*d83cc019SAndroid Build Coastguard Worker 	devid = dev->device_id;
348*d83cc019SAndroid Build Coastguard Worker 	intel_mmio_use_pci_bar(dev);
349*d83cc019SAndroid Build Coastguard Worker 
350*d83cc019SAndroid Build Coastguard Worker 	if (IS_GEN7(devid))
351*d83cc019SAndroid Build Coastguard Worker 		gen = 7;
352*d83cc019SAndroid Build Coastguard Worker 	else if (IS_GEN6(devid))
353*d83cc019SAndroid Build Coastguard Worker 		gen = 6;
354*d83cc019SAndroid Build Coastguard Worker 	else if (IS_GEN5(devid))
355*d83cc019SAndroid Build Coastguard Worker 		gen = 5;
356*d83cc019SAndroid Build Coastguard Worker 	else
357*d83cc019SAndroid Build Coastguard Worker 		gen = 4;
358*d83cc019SAndroid Build Coastguard Worker 
359*d83cc019SAndroid Build Coastguard Worker 	check_mi_mode();
360*d83cc019SAndroid Build Coastguard Worker 	check_gfx_mode();
361*d83cc019SAndroid Build Coastguard Worker 	check_gt_mode();
362*d83cc019SAndroid Build Coastguard Worker 	check_cache_mode_0();
363*d83cc019SAndroid Build Coastguard Worker 	check_cache_mode_1();
364*d83cc019SAndroid Build Coastguard Worker 
365*d83cc019SAndroid Build Coastguard Worker 	if (gen < 7) {
366*d83cc019SAndroid Build Coastguard Worker  		check_chicken_unset("3D_CHICKEN", 0x2084);
367*d83cc019SAndroid Build Coastguard Worker  		check_chicken_unset("3D_CHICKEN2", 0x208c);
368*d83cc019SAndroid Build Coastguard Worker 	} else {
369*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("FF_SLICE_CHICKEN", 0x2088);
370*d83cc019SAndroid Build Coastguard Worker 	}
371*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 6)
372*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("3D_CHICKEN3", 0x2090);
373*d83cc019SAndroid Build Coastguard Worker 	if (gen == 6)
374*d83cc019SAndroid Build Coastguard Worker 		check_3d_chicken4();
375*d83cc019SAndroid Build Coastguard Worker 
376*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 7) {
377*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("FF_SLICE_CS_CHICKEN1", 0x20e0);
378*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("FF_SLICE_CS_CHICKEN2", 0x20e4);
379*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("FF_SLICE_CS_CHICKEN3", 0x20e8);
380*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("COMMON_SLICE_CHICKEN1", 0x7010);
381*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("COMMON_SLICE_CHICKEN2", 0x7014);
382*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("WM_CHICKEN", 0x5580);
383*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("HALF_SLICE_CHICKEN", 0xe100);
384*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("HALF_SLICE_CHICKEN2", 0xe180);
385*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("ROW_CHICKEN", 0xe4f0);
386*d83cc019SAndroid Build Coastguard Worker 		check_chicken_unset("ROW_CHICKEN2", 0xe4f4);
387*d83cc019SAndroid Build Coastguard Worker 	}
388*d83cc019SAndroid Build Coastguard Worker 
389*d83cc019SAndroid Build Coastguard Worker 	check_chicken_unset("ECOSKPD", 0x21d0);
390*d83cc019SAndroid Build Coastguard Worker 
391*d83cc019SAndroid Build Coastguard Worker 	check_dpfc_control_sa();
392*d83cc019SAndroid Build Coastguard Worker 
393*d83cc019SAndroid Build Coastguard Worker 	return 0;
394*d83cc019SAndroid Build Coastguard Worker }
395*d83cc019SAndroid Build Coastguard Worker 
396