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