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