1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file media_sysinfo_g8.cpp
24 //!
25
26 #include "igfxfmid.h"
27 #include "linux_system_info.h"
28 #include "skuwa_factory.h"
29 #include "linux_skuwa_debug.h"
30 #include "linux_media_skuwa.h"
31 #include "linux_shadow_skuwa.h"
32
33 #define GEN8_THREADS_PER_EU 7
34
InitBdwMediaSysInfo(struct GfxDeviceInfo * devInfo,MEDIA_GT_SYSTEM_INFO * sysInfo)35 static bool InitBdwMediaSysInfo(struct GfxDeviceInfo *devInfo, MEDIA_GT_SYSTEM_INFO *sysInfo)
36 {
37 if ((devInfo == nullptr) || (sysInfo == nullptr))
38 {
39 DEVINFO_ERROR("null ptr is passed\n");
40 return false;
41 }
42
43 if (!sysInfo->SliceCount)
44 {
45 sysInfo->SliceCount = devInfo->SliceCount;
46 }
47
48 if (!sysInfo->SubSliceCount)
49 {
50 sysInfo->SubSliceCount = devInfo->SubSliceCount;
51 }
52
53 if (!sysInfo->EUCount)
54 {
55 sysInfo->EUCount = devInfo->EUCount;
56 }
57
58 sysInfo->L3CacheSizeInKb = devInfo->L3CacheSizeInKb;
59 sysInfo->L3BankCount = devInfo->L3BankCount;
60 sysInfo->VDBoxInfo.Instances.Bits.VDBox0Enabled = 1;
61 sysInfo->VEBoxInfo.Instances.Bits.VEBox0Enabled = 1;
62 sysInfo->MaxEuPerSubSlice = devInfo->MaxEuPerSubSlice;
63 sysInfo->MaxSlicesSupported = sysInfo->SliceCount;
64 sysInfo->MaxSubSlicesSupported = sysInfo->SubSliceCount;
65
66 sysInfo->VEBoxInfo.NumberOfVEBoxEnabled = 1;
67 sysInfo->VDBoxInfo.NumberOfVDBoxEnabled = 1;
68 if (devInfo->eGTType == GTTYPE_GT3)
69 {
70 sysInfo->VDBoxInfo.Instances.Bits.VDBox1Enabled = 1;
71 sysInfo->VEBoxInfo.Instances.Bits.VEBox1Enabled = 1;
72 sysInfo->VEBoxInfo.NumberOfVEBoxEnabled++;
73 sysInfo->VDBoxInfo.NumberOfVDBoxEnabled++;
74 }
75
76 sysInfo->ThreadCount = sysInfo->EUCount * GEN8_THREADS_PER_EU;
77
78 sysInfo->VEBoxInfo.IsValid = true;
79 sysInfo->VDBoxInfo.IsValid = true;
80
81 /* the GMM doesn't care the real size of ERAM/LLC. Instead it is used to
82 * indicate whether the LLC/ERAM exists
83 */
84 if (devInfo->hasERAM)
85 {
86 // 64M
87 sysInfo->EdramSizeInKb = 64 * 1024;
88 }
89 if (devInfo->hasLLC)
90 {
91 // 2M
92 sysInfo->LLCCacheSizeInKb = 2 * 1024;
93 }
94
95 return true;
96 }
97
InitBdwShadowSku(struct GfxDeviceInfo * devInfo,SHADOW_MEDIA_FEATURE_TABLE * skuTable,struct LinuxDriverInfo * drvInfo)98 static bool InitBdwShadowSku(struct GfxDeviceInfo *devInfo,
99 SHADOW_MEDIA_FEATURE_TABLE *skuTable,
100 struct LinuxDriverInfo *drvInfo)
101 {
102 if ((devInfo == nullptr) || (skuTable == nullptr) || (drvInfo == nullptr))
103 {
104 DEVINFO_ERROR("null ptr is passed\n");
105 return false;
106 }
107
108 skuTable->FtrVERing = 0;
109 if (drvInfo->hasVebox)
110 {
111 skuTable->FtrVERing = 1;
112 }
113
114 skuTable->FtrVcs2 = 0;
115 if ((devInfo->eGTType == GTTYPE_GT3) &&
116 drvInfo->hasBsd2)
117 {
118 skuTable->FtrVcs2 = 1;
119 }
120
121 skuTable->FtrULT = 0;
122
123 skuTable->FtrPPGTT = 1;
124 skuTable->FtrIA32eGfxPTEs = 1;
125
126 skuTable->FtrEDram = devInfo->hasERAM;
127
128 skuTable->FtrTileY = 1;
129
130 return true;
131 }
132
InitBdwShadowWa(struct GfxDeviceInfo * devInfo,SHADOW_MEDIA_WA_TABLE * waTable,struct LinuxDriverInfo * drvInfo)133 static bool InitBdwShadowWa(struct GfxDeviceInfo *devInfo,
134 SHADOW_MEDIA_WA_TABLE *waTable,
135 struct LinuxDriverInfo *drvInfo)
136 {
137 if ((devInfo == nullptr) || (waTable == nullptr) || (drvInfo == nullptr))
138 {
139 DEVINFO_ERROR("null ptr is passed\n");
140 return false;
141 }
142
143 /* by default PPGTT is enabled */
144 waTable->WaForceGlobalGTT = 0;
145 if (drvInfo->hasPpgtt == 0)
146 {
147 waTable->WaForceGlobalGTT = 1;
148 }
149
150 waTable->WaUseVAlign16OnTileXYBpp816 = 1;
151 waTable->WaDisregardPlatformChecks = 1;
152
153 return true;
154 }
155
156 static struct GfxDeviceInfo bdwGt1Info = {
157 .platformType = PLATFORM_MOBILE,
158 .productFamily = IGFX_BROADWELL,
159 .displayFamily = IGFX_GEN8_CORE,
160 .renderFamily = IGFX_GEN8_CORE,
161 .eGTType = GTTYPE_GT1,
162 .L3CacheSizeInKb = 384,
163 .L3BankCount = 2,
164 .EUCount = 12,
165 .SliceCount = 1,
166 .SubSliceCount = 2,
167 .MaxEuPerSubSlice = 6,
168 .isLCIA = 0,
169 .hasLLC = 1,
170 .hasERAM = 0,
171 .InitMediaSysInfo = InitBdwMediaSysInfo,
172 .InitShadowSku = InitBdwShadowSku,
173 .InitShadowWa = InitBdwShadowWa,
174 };
175
176 static struct GfxDeviceInfo bdwGt2Info = {
177 .platformType = PLATFORM_MOBILE,
178 .productFamily = IGFX_BROADWELL,
179 .displayFamily = IGFX_GEN8_CORE,
180 .renderFamily = IGFX_GEN8_CORE,
181 .eGTType = GTTYPE_GT2,
182 .L3CacheSizeInKb = 768,
183 .L3BankCount = 4,
184 .EUCount = 23,
185 .SliceCount = 1,
186 .SubSliceCount = 3,
187 .MaxEuPerSubSlice = 8,
188 .isLCIA = 0,
189 .hasLLC = 1,
190 .hasERAM = 0,
191 .InitMediaSysInfo = InitBdwMediaSysInfo,
192 .InitShadowSku = InitBdwShadowSku,
193 .InitShadowWa = InitBdwShadowWa,
194 };
195
196 static struct GfxDeviceInfo bdwGt3Info = {
197 .platformType = PLATFORM_MOBILE,
198 .productFamily = IGFX_BROADWELL,
199 .displayFamily = IGFX_GEN8_CORE,
200 .renderFamily = IGFX_GEN8_CORE,
201 .eGTType = GTTYPE_GT3,
202 .L3CacheSizeInKb = 1536,
203 .L3BankCount = 8,
204 .EUCount = 48,
205 .SliceCount = 2,
206 .SubSliceCount = 6,
207 .MaxEuPerSubSlice = 8,
208 .isLCIA = 0,
209 .hasLLC = 1,
210 .hasERAM = 0,
211 .InitMediaSysInfo = InitBdwMediaSysInfo,
212 .InitShadowSku = InitBdwShadowSku,
213 .InitShadowWa = InitBdwShadowWa,
214 };
215
216 static struct GfxDeviceInfo bdwGt3eInfo = {
217 .platformType = PLATFORM_MOBILE,
218 .productFamily = IGFX_BROADWELL,
219 .displayFamily = IGFX_GEN8_CORE,
220 .renderFamily = IGFX_GEN8_CORE,
221 .eGTType = GTTYPE_GT3,
222 .L3CacheSizeInKb = 1536,
223 .L3BankCount = 8,
224 .EUCount = 48,
225 .SliceCount = 2,
226 .SubSliceCount = 6,
227 .MaxEuPerSubSlice = 8,
228 .isLCIA = 0,
229 .hasLLC = 1,
230 .hasERAM = 1,
231 .InitMediaSysInfo = InitBdwMediaSysInfo,
232 .InitShadowSku = InitBdwShadowSku,
233 .InitShadowWa = InitBdwShadowWa,
234 };
235
236 //extern template class DeviceInfoFactory<GfxDeviceInfo>;
237 typedef DeviceInfoFactory<GfxDeviceInfo> base_fact;
238
239 static bool bdwDevice1602 = DeviceInfoFactory<GfxDeviceInfo>::
240 RegisterDevice(0x1602, &bdwGt1Info);
241
242 static bool bdwDevice1606 = DeviceInfoFactory<GfxDeviceInfo>::
243 RegisterDevice(0x1606, &bdwGt1Info);
244
245 static bool bdwDevice160a = DeviceInfoFactory<GfxDeviceInfo>::
246 RegisterDevice(0x160a, &bdwGt1Info);
247
248 static bool bdwDevice160d = DeviceInfoFactory<GfxDeviceInfo>::
249 RegisterDevice(0x160d, &bdwGt1Info);
250
251 static bool bdwDevice160e = DeviceInfoFactory<GfxDeviceInfo>::
252 RegisterDevice(0x160e, &bdwGt1Info);
253
254 static bool bdwDevice160b = DeviceInfoFactory<GfxDeviceInfo>::
255 RegisterDevice(0x160b, &bdwGt1Info);
256
257 static bool bdwDevice1612 = DeviceInfoFactory<GfxDeviceInfo>::
258 RegisterDevice(0x1612, &bdwGt2Info);
259
260 static bool bdwDevice1616 = DeviceInfoFactory<GfxDeviceInfo>::
261 RegisterDevice(0x1616, &bdwGt2Info);
262
263 static bool bdwDevice161a = DeviceInfoFactory<GfxDeviceInfo>::
264 RegisterDevice(0x161a, &bdwGt2Info);
265
266 static bool bdwDevice161d = DeviceInfoFactory<GfxDeviceInfo>::
267 RegisterDevice(0x161d, &bdwGt2Info);
268
269 static bool bdwDevice161e = DeviceInfoFactory<GfxDeviceInfo>::
270 RegisterDevice(0x161e, &bdwGt2Info);
271
272 static bool bdwDevice161b = DeviceInfoFactory<GfxDeviceInfo>::
273 RegisterDevice(0x161b, &bdwGt2Info);
274
275 static bool bdwDevice1622 = DeviceInfoFactory<GfxDeviceInfo>::
276 RegisterDevice(0x1622, &bdwGt3eInfo);
277
278 static bool bdwDevice1626 = DeviceInfoFactory<GfxDeviceInfo>::
279 RegisterDevice(0x1626, &bdwGt3Info);
280
281 static bool bdwDevice162b = DeviceInfoFactory<GfxDeviceInfo>::
282 RegisterDevice(0x162b, &bdwGt3Info);
283
284 static bool bdwDevice162a = DeviceInfoFactory<GfxDeviceInfo>::
285 RegisterDevice(0x162a, &bdwGt3eInfo);
286
287 static bool bdwDevice162d = DeviceInfoFactory<GfxDeviceInfo>::
288 RegisterDevice(0x162d, &bdwGt3Info);
289
290 static bool bdwDevice162e = DeviceInfoFactory<GfxDeviceInfo>::
291 RegisterDevice(0x162e, &bdwGt3Info);
292
293 /* Whether GT4 is needed? */
294 static bool bdwDevice163b = DeviceInfoFactory<GfxDeviceInfo>::
295 RegisterDevice(0x163b, &bdwGt3eInfo);
296