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_sku_wa_g9.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
32 //extern template class DeviceInfoFactory<GfxDeviceInfo>;
33 typedef DeviceInfoFactory<LinuxDeviceInit> DeviceInit;
34
35 static struct LinuxCodecInfo sklCodecInfo =
36 {
37 .avcDecoding = 1,
38 .mpeg2Decoding = 1,
39 .vp8Decoding = 1,
40 .vc1Decoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
41 .jpegDecoding = 1,
42 .avcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
43 .mpeg2Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
44 .hevcDecoding = 1,
45 .hevcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
46 .jpegEncoding = 1,
47 .avcVdenc = 1,
48 .vp9Decoding = 0,
49 .hevc10Decoding = 0,
50 .vp9b10Decoding = 0,
51 .hevc10Encoding = 0,
52 .hevc12Encoding = 0,
53 .vp8Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
54 };
55
56 static struct LinuxCodecInfo bxtCodecInfo =
57 {
58 .avcDecoding = 1,
59 .mpeg2Decoding = 1,
60 .vp8Decoding = 1,
61 .vc1Decoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
62 .jpegDecoding = 1,
63 .avcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
64 .mpeg2Encoding = 0,
65 .hevcDecoding = 1,
66 .hevcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
67 .jpegEncoding = 1,
68 .avcVdenc = 1,
69 .vp9Decoding = 1,
70 .hevc10Decoding = 1,
71 .vp9b10Decoding = 0,
72 .hevc10Encoding = 0,
73 .hevc12Encoding = 0,
74 .vp8Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
75 };
76
77 /* This can also be applied to CFL */
78 static struct LinuxCodecInfo kblCodecInfo =
79 {
80 .avcDecoding = 1,
81 .mpeg2Decoding = 1,
82 .vp8Decoding = 1,
83 .vc1Decoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
84 .jpegDecoding = 1,
85 .avcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
86 .mpeg2Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
87 .hevcDecoding = 1,
88 .hevcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
89 .jpegEncoding = 1,
90 .avcVdenc = 1,
91 .vp9Decoding = 1,
92 .hevc10Decoding = 1,
93 .vp9b10Decoding = 1,
94 .hevc10Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
95 .hevc12Encoding = 0,
96 .vp8Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
97 };
98
99 static struct LinuxCodecInfo glkCodecInfo =
100 {
101 .avcDecoding = 1,
102 .mpeg2Decoding = 1,
103 .vp8Decoding = 1,
104 .vc1Decoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
105 .jpegDecoding = 1,
106 .avcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
107 .mpeg2Encoding = 0,
108 .hevcDecoding = 1,
109 .hevcEncoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
110 .jpegEncoding = 1,
111 .avcVdenc = 1,
112 .vp9Decoding = 1,
113 .hevc10Decoding = 1,
114 .vp9b10Decoding = 1,
115 .hevc10Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
116 .hevc12Encoding = 0,
117 .vp8Encoding = SET_STATUS_BY_FULL_OPEN_SOURCE(1, 0),
118 };
119
InitSklMediaSku(struct GfxDeviceInfo * devInfo,MediaFeatureTable * skuTable,struct LinuxDriverInfo * drvInfo,MediaUserSettingSharedPtr userSettingPtr)120 static bool InitSklMediaSku(struct GfxDeviceInfo *devInfo,
121 MediaFeatureTable *skuTable,
122 struct LinuxDriverInfo *drvInfo,
123 MediaUserSettingSharedPtr userSettingPtr)
124 {
125 if ((devInfo == nullptr) || (skuTable == nullptr) || (drvInfo == nullptr))
126 {
127 DEVINFO_ERROR("null ptr is passed\n");
128 return false;
129 }
130
131 if (drvInfo->hasBsd)
132 {
133 LinuxCodecInfo *codecInfo = &sklCodecInfo;
134
135 MEDIA_WR_SKU(skuTable, FtrAVCVLDLongDecoding, codecInfo->avcDecoding);
136 MEDIA_WR_SKU(skuTable, FtrMPEG2VLDDecoding, codecInfo->mpeg2Decoding);
137 MEDIA_WR_SKU(skuTable, FtrIntelVP8VLDDecoding, codecInfo->vp8Decoding);
138 MEDIA_WR_SKU(skuTable, FtrVC1VLDDecoding, codecInfo->vc1Decoding);
139 MEDIA_WR_SKU(skuTable, FtrIntelJPEGDecoding, codecInfo->jpegDecoding);
140 MEDIA_WR_SKU(skuTable, FtrEncodeAVC, codecInfo->avcEncoding);
141 MEDIA_WR_SKU(skuTable, FtrEncodeMPEG2, codecInfo->mpeg2Encoding);
142 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMainDecoding, codecInfo->hevcDecoding);
143
144 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC, codecInfo->hevcEncoding);
145 MEDIA_WR_SKU(skuTable, FtrEncodeJPEG, codecInfo->jpegEncoding);
146 MEDIA_WR_SKU(skuTable, FtrEncodeAVCVdenc, codecInfo->avcVdenc);
147
148 /* VP8 enc */
149 MEDIA_WR_SKU(skuTable, FtrEncodeVP8, codecInfo->vp8Encoding);
150 }
151
152 MEDIA_WR_SKU(skuTable, FtrEnableMediaKernels, drvInfo->hasHuc);
153
154 if (devInfo->eGTType == GTTYPE_GT1)
155 {
156 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
157 }
158 else if (devInfo->eGTType == GTTYPE_GT1_5)
159 {
160 MEDIA_WR_SKU(skuTable, FtrGT1_5, 1);
161 }
162 else if (devInfo->eGTType == GTTYPE_GT2)
163 {
164 MEDIA_WR_SKU(skuTable, FtrGT2, 1);
165 }
166 else if (devInfo->eGTType == GTTYPE_GT3)
167 {
168 MEDIA_WR_SKU(skuTable, FtrGT3, 1);
169 }
170 else if (devInfo->eGTType == GTTYPE_GT4)
171 {
172 MEDIA_WR_SKU(skuTable, FtrGT4, 1);
173 }
174 else
175 {
176 /* GT1 is by default */
177 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
178 }
179
180 MEDIA_WR_SKU(skuTable, FtrVcs2, drvInfo->hasBsd2);
181 MEDIA_WR_SKU(skuTable, FtrPPGTT, drvInfo->hasPpgtt);
182 MEDIA_WR_SKU(skuTable, FtrVERing, drvInfo->hasVebox);
183 MEDIA_WR_SKU(skuTable, FtrEDram, devInfo->hasERAM);
184
185 MEDIA_WR_SKU(skuTable, FtrSliceShutdown, 0);
186 MEDIA_WR_SKU(skuTable, FtrSliceShutdownOverride, 1);
187 if ((devInfo->eGTType == GTTYPE_GT3) ||
188 (devInfo->eGTType == GTTYPE_GT4))
189 {
190 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 0);
191 }
192 else
193 {
194 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 1);
195 }
196 //SFC enabled/disabled
197 MEDIA_WR_SKU(skuTable, FtrSFCPipe, 1);
198
199 MEDIA_WR_SKU(skuTable, FtrSSEUPowerGating, 1);
200 MEDIA_WR_SKU(skuTable, FtrMemoryCompression, 0);
201 MEDIA_WR_SKU(skuTable, FtrHcpDecMemoryCompression, 0);
202
203 MEDIA_WR_SKU(skuTable, FtrVpP010Output, 1);
204
205 MEDIA_WR_SKU(skuTable, FtrPerCtxtPreemptionGranularityControl, 1);
206
207 MEDIA_WR_SKU(skuTable, FtrTileY, 1);
208
209 MEDIA_WR_SKU(skuTable, FtrUseSwSwizzling, 1);
210
211 return true;
212 }
213
InitSklMediaWa(struct GfxDeviceInfo * devInfo,MediaWaTable * waTable,struct LinuxDriverInfo * drvInfo)214 static bool InitSklMediaWa(struct GfxDeviceInfo *devInfo,
215 MediaWaTable *waTable,
216 struct LinuxDriverInfo *drvInfo)
217 {
218 if ((devInfo == nullptr) || (waTable == nullptr) || (drvInfo == nullptr))
219 {
220 DEVINFO_ERROR("null ptr is passed\n");
221 return false;
222 }
223
224 MEDIA_WR_WA(waTable, WaForceGlobalGTT, !drvInfo->hasPpgtt);
225 MEDIA_WR_WA(waTable, WaAddMediaStateFlushCmd, 1);
226 MEDIA_WR_WA(waTable, WaMidBatchPreemption, 1);
227 MEDIA_WR_WA(waTable, WaSendDummyVFEafterPipelineSelect, 1);
228 MEDIA_WR_WA(waTable, WaHucStreamoutEnable, 1);
229 MEDIA_WR_WA(waTable, WaEnableDscale, 1);
230 MEDIA_WR_WA(waTable, WaDisableSFCSrcCrop, 1);
231
232 MEDIA_WR_WA(waTable, WaSFC270DegreeRotation, 1);
233 MEDIA_WR_WA(waTable, WaEnableYV12BugFixInHalfSliceChicken7, 1);
234
235 MEDIA_WR_WA(waTable, WaHucStreamoutOnlyDisable, 1);
236
237 MEDIA_WR_WA(waTable, Wa16KInputHeightNV12Planar420, 1);
238 MEDIA_WR_WA(waTable, WaDisableCodecMmc, 1);
239 MEDIA_WR_WA(waTable, WaDisableSetObjectCapture, 0);
240
241 MEDIA_WR_WA(waTable, WaDisableGmmLibOffsetInDeriveImage, 1);
242 return true;
243 }
244
InitBxtMediaSku(struct GfxDeviceInfo * devInfo,MediaFeatureTable * skuTable,struct LinuxDriverInfo * drvInfo,MediaUserSettingSharedPtr userSettingPtr)245 static bool InitBxtMediaSku(struct GfxDeviceInfo *devInfo,
246 MediaFeatureTable *skuTable,
247 struct LinuxDriverInfo *drvInfo,
248 MediaUserSettingSharedPtr userSettingPtr)
249 {
250 if ((devInfo == nullptr) || (skuTable == nullptr) || (drvInfo == nullptr))
251 {
252 DEVINFO_ERROR("null ptr is passed\n");
253 return false;
254 }
255
256 if (drvInfo->hasBsd)
257 {
258 LinuxCodecInfo *codecInfo = &bxtCodecInfo;
259
260 MEDIA_WR_SKU(skuTable, FtrAVCVLDLongDecoding, codecInfo->avcDecoding);
261 MEDIA_WR_SKU(skuTable, FtrMPEG2VLDDecoding, codecInfo->mpeg2Decoding);
262 MEDIA_WR_SKU(skuTable, FtrIntelVP8VLDDecoding, codecInfo->vp8Decoding);
263 MEDIA_WR_SKU(skuTable, FtrVC1VLDDecoding, codecInfo->vc1Decoding);
264 MEDIA_WR_SKU(skuTable, FtrIntelJPEGDecoding, codecInfo->jpegDecoding);
265 MEDIA_WR_SKU(skuTable, FtrEncodeAVC, codecInfo->avcEncoding);
266 MEDIA_WR_SKU(skuTable, FtrEncodeMPEG2, codecInfo->mpeg2Encoding);
267 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMainDecoding, codecInfo->hevcDecoding);
268 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMain10Decoding, codecInfo->hevc10Decoding);
269
270 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC, codecInfo->hevcEncoding);
271 MEDIA_WR_SKU(skuTable, FtrEncodeJPEG, codecInfo->jpegEncoding);
272 MEDIA_WR_SKU(skuTable, FtrEncodeAVCVdenc, codecInfo->avcVdenc);
273 MEDIA_WR_SKU(skuTable, FtrVP9VLDDecoding, codecInfo->vp9Decoding);
274 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile0Decoding8bit420, codecInfo->vp9Decoding);
275 MEDIA_WR_SKU(skuTable, FtrEncodeVP8, codecInfo->vp8Encoding);
276 }
277
278 MEDIA_WR_SKU(skuTable, FtrEnableMediaKernels, drvInfo->hasHuc);
279
280 if (devInfo->eGTType == GTTYPE_GT1)
281 {
282 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
283 }
284 else if (devInfo->eGTType == GTTYPE_GT1_5)
285 {
286 MEDIA_WR_SKU(skuTable, FtrGT1_5, 1);
287 }
288 else
289 {
290 /* GT1 is by default */
291 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
292 }
293
294 MEDIA_WR_SKU(skuTable, FtrLCIA, 1);
295 MEDIA_WR_SKU(skuTable, FtrVERing, drvInfo->hasVebox);
296 MEDIA_WR_SKU(skuTable, FtrEDram, devInfo->hasERAM);
297 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 1);
298 MEDIA_WR_SKU(skuTable, FtrSFCPipe, 1);
299 MEDIA_WR_SKU(skuTable, FtrSSEUPowerGating, 1);
300 MEDIA_WR_SKU(skuTable, FtrMemoryCompression, 0);
301 MEDIA_WR_SKU(skuTable, FtrHcpDecMemoryCompression, 0);
302 MEDIA_WR_SKU(skuTable, FtrPPGTT, drvInfo->hasPpgtt);
303
304 MEDIA_WR_SKU(skuTable, FtrPerCtxtPreemptionGranularityControl, 1);
305
306 MEDIA_WR_SKU(skuTable, FtrVpP010Output, 1);
307
308 MEDIA_WR_SKU(skuTable, FtrUseSwSwizzling, 1);
309
310 return true;
311 }
312
InitBxtMediaWa(struct GfxDeviceInfo * devInfo,MediaWaTable * waTable,struct LinuxDriverInfo * drvInfo)313 static bool InitBxtMediaWa(struct GfxDeviceInfo *devInfo,
314 MediaWaTable *waTable,
315 struct LinuxDriverInfo *drvInfo)
316 {
317 if ((devInfo == nullptr) || (waTable == nullptr) || (drvInfo == nullptr))
318 {
319 DEVINFO_ERROR("null ptr is passed\n");
320 return false;
321 }
322
323 MEDIA_WR_WA(waTable, WaForceGlobalGTT, !drvInfo->hasPpgtt);
324 MEDIA_WR_WA(waTable, WaLLCCachingUnsupported, 1);
325 MEDIA_WR_WA(waTable, WaAddMediaStateFlushCmd, 1);
326 MEDIA_WR_WA(waTable, WaMidBatchPreemption, 1);
327 MEDIA_WR_WA(waTable, WaDisableLockForTranscodePerf, 1);
328 MEDIA_WR_WA(waTable, WaSendDummyVFEafterPipelineSelect, 1);
329 MEDIA_WR_WA(waTable, WaHucStreamoutEnable, 1);
330 MEDIA_WR_WA(waTable, WaTlbAllocationForAvcVdenc, 1);
331
332 MEDIA_WR_WA(waTable, Wa8BitFrameIn10BitHevc, 1);
333
334 MEDIA_WR_WA(waTable, WaEnableDscale, 1);
335 MEDIA_WR_WA(waTable, WaDisableSFCSrcCrop, 1);
336
337 MEDIA_WR_WA(waTable, WaSFC270DegreeRotation, 1);
338 MEDIA_WR_WA(waTable, WaEnableYV12BugFixInHalfSliceChicken7, 1);
339
340 MEDIA_WR_WA(waTable, WaHucStreamoutOnlyDisable, 1);
341
342 MEDIA_WR_WA(waTable, Wa16KInputHeightNV12Planar420, 1);
343 MEDIA_WR_WA(waTable, WaDisableCodecMmc, 1);
344
345 return true;
346 }
347
InitKblMediaSku(struct GfxDeviceInfo * devInfo,MediaFeatureTable * skuTable,struct LinuxDriverInfo * drvInfo,MediaUserSettingSharedPtr userSettingPtr)348 static bool InitKblMediaSku(struct GfxDeviceInfo *devInfo,
349 MediaFeatureTable *skuTable,
350 struct LinuxDriverInfo *drvInfo,
351 MediaUserSettingSharedPtr userSettingPtr)
352 {
353 if ((devInfo == nullptr) || (skuTable == nullptr) || (drvInfo == nullptr))
354 {
355 DEVINFO_ERROR("null ptr is passed\n");
356 return false;
357 }
358
359 if (drvInfo->hasBsd)
360 {
361 LinuxCodecInfo *codecInfo = &kblCodecInfo;
362
363 MEDIA_WR_SKU(skuTable, FtrAVCVLDLongDecoding, codecInfo->avcDecoding);
364 MEDIA_WR_SKU(skuTable, FtrMPEG2VLDDecoding, codecInfo->mpeg2Decoding);
365 MEDIA_WR_SKU(skuTable, FtrIntelVP8VLDDecoding, codecInfo->vp8Decoding);
366 MEDIA_WR_SKU(skuTable, FtrVC1VLDDecoding, codecInfo->vc1Decoding);
367 MEDIA_WR_SKU(skuTable, FtrIntelJPEGDecoding, codecInfo->jpegDecoding);
368 MEDIA_WR_SKU(skuTable, FtrEncodeAVC, codecInfo->avcEncoding);
369 MEDIA_WR_SKU(skuTable, FtrEncodeMPEG2, codecInfo->mpeg2Encoding);
370 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMainDecoding, codecInfo->hevcDecoding);
371 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMain10Decoding, codecInfo->hevc10Decoding);
372
373 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC, codecInfo->hevcEncoding);
374 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC10bit, codecInfo->hevc10Encoding);
375 MEDIA_WR_SKU(skuTable, FtrEncodeJPEG, codecInfo->jpegEncoding);
376 MEDIA_WR_SKU(skuTable, FtrEncodeAVCVdenc, codecInfo->avcVdenc);
377 MEDIA_WR_SKU(skuTable, FtrVP9VLDDecoding, codecInfo->vp9Decoding);
378 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile0Decoding8bit420, codecInfo->vp9Decoding);
379 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile2Decoding10bit420, codecInfo->vp9b10Decoding);
380 MEDIA_WR_SKU(skuTable, FtrVP9VLD10bProfile2Decoding, codecInfo->vp9b10Decoding);
381 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile2Decoding, codecInfo->vp9b10Decoding);
382
383 /* VP8 enc */
384 MEDIA_WR_SKU(skuTable, FtrEncodeVP8, codecInfo->vp8Encoding);
385
386 }
387
388 MEDIA_WR_SKU(skuTable, FtrEnableMediaKernels, drvInfo->hasHuc);
389
390 if (devInfo->eGTType == GTTYPE_GT1)
391 {
392 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
393 }
394 else if (devInfo->eGTType == GTTYPE_GT1_5)
395 {
396 MEDIA_WR_SKU(skuTable, FtrGT1_5, 1);
397 }
398 else if (devInfo->eGTType == GTTYPE_GT2)
399 {
400 MEDIA_WR_SKU(skuTable, FtrGT2, 1);
401 MEDIA_WR_SKU(skuTable, FtrHDR, 1);
402 }
403 else if (devInfo->eGTType == GTTYPE_GT3)
404 {
405 MEDIA_WR_SKU(skuTable, FtrGT3, 1);
406 MEDIA_WR_SKU(skuTable, FtrHDR, 1);
407 }
408 else if (devInfo->eGTType == GTTYPE_GT4)
409 {
410 MEDIA_WR_SKU(skuTable, FtrGT4, 1);
411 MEDIA_WR_SKU(skuTable, FtrHDR, 1);
412 }
413 else
414 {
415 /* GT1 is by default */
416 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
417 }
418
419 MEDIA_WR_SKU(skuTable, FtrVcs2, drvInfo->hasBsd2);
420 MEDIA_WR_SKU(skuTable, FtrPPGTT, drvInfo->hasPpgtt);
421 MEDIA_WR_SKU(skuTable, FtrVERing, drvInfo->hasVebox);
422 MEDIA_WR_SKU(skuTable, FtrEDram, devInfo->hasERAM);
423 MEDIA_WR_SKU(skuTable, FtrSliceShutdown, 0);
424 MEDIA_WR_SKU(skuTable, FtrSliceShutdownOverride, 1);
425 if ((devInfo->eGTType == GTTYPE_GT3) ||
426 (devInfo->eGTType == GTTYPE_GT4))
427 {
428 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 0);
429 }
430 else
431 {
432 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 1);
433 }
434 MEDIA_WR_SKU(skuTable, FtrSFCPipe, 1);
435 MEDIA_WR_SKU(skuTable, FtrSSEUPowerGating, 1);
436 MEDIA_WR_SKU(skuTable, FtrMemoryCompression, 0);
437 MEDIA_WR_SKU(skuTable, trHcpDecMemoryCompression, 0);
438
439 MEDIA_WR_SKU(skuTable, FtrVpP010Output, 1);
440
441 MEDIA_WR_SKU(skuTable, FtrPerCtxtPreemptionGranularityControl, 1);
442
443 MEDIA_WR_SKU(skuTable, FtrUseSwSwizzling, 1);
444
445 return true;
446 }
447
InitKblMediaWa(struct GfxDeviceInfo * devInfo,MediaWaTable * waTable,struct LinuxDriverInfo * drvInfo)448 static bool InitKblMediaWa(struct GfxDeviceInfo *devInfo,
449 MediaWaTable *waTable,
450 struct LinuxDriverInfo *drvInfo)
451 {
452 if ((devInfo == nullptr) || (waTable == nullptr) || (drvInfo == nullptr))
453 {
454 DEVINFO_ERROR("null ptr is passed\n");
455 return false;
456 }
457
458 MEDIA_WR_WA(waTable, WaForceGlobalGTT, !drvInfo->hasPpgtt);
459 MEDIA_WR_WA(waTable, WaMSFWithNoWatermarkTSGHang, 1);
460 MEDIA_WR_WA(waTable, WaAddMediaStateFlushCmd, 1);
461 MEDIA_WR_WA(waTable, WaMidBatchPreemption, 1);
462 MEDIA_WR_WA(waTable, WaSendDummyVFEafterPipelineSelect, 1);
463 MEDIA_WR_WA(waTable, WaHucStreamoutEnable, 1);
464 MEDIA_WR_WA(waTable, WaSuperSliceHeaderPacking, 1);
465
466 MEDIA_WR_WA(waTable, Wa8BitFrameIn10BitHevc, 1);
467
468 MEDIA_WR_WA(waTable, WaEnableDscale, 1);
469 MEDIA_WR_WA(waTable, WaDisableSFCSrcCrop, 1);
470
471 MEDIA_WR_WA(waTable, WaSFC270DegreeRotation, 1);
472
473 MEDIA_WR_WA(waTable, WaEnableYV12BugFixInHalfSliceChicken7, 1);
474
475 MEDIA_WR_WA(waTable, WaHucStreamoutOnlyDisable, 1);
476
477 MEDIA_WR_WA(waTable, Wa16KInputHeightNV12Planar420, 1);
478 MEDIA_WR_WA(waTable, WaDisableCodecMmc, 1);
479
480 MEDIA_WR_WA(waTable, WaDisableGmmLibOffsetInDeriveImage, 1);
481 return true;
482 }
483
InitGlkMediaSku(struct GfxDeviceInfo * devInfo,MediaFeatureTable * skuTable,struct LinuxDriverInfo * drvInfo,MediaUserSettingSharedPtr userSettingPtr)484 static bool InitGlkMediaSku(struct GfxDeviceInfo *devInfo,
485 MediaFeatureTable *skuTable,
486 struct LinuxDriverInfo *drvInfo,
487 MediaUserSettingSharedPtr userSettingPtr)
488 {
489 if ((devInfo == nullptr) || (skuTable == nullptr) || (drvInfo == nullptr))
490 {
491 DEVINFO_ERROR("null ptr is passed\n");
492 return false;
493 }
494
495 if (drvInfo->hasBsd)
496 {
497 LinuxCodecInfo *codecInfo = &glkCodecInfo;
498
499 MEDIA_WR_SKU(skuTable, FtrAVCVLDLongDecoding, codecInfo->avcDecoding);
500 MEDIA_WR_SKU(skuTable, FtrMPEG2VLDDecoding, codecInfo->mpeg2Decoding);
501 MEDIA_WR_SKU(skuTable, FtrIntelVP8VLDDecoding, codecInfo->vp8Decoding);
502 MEDIA_WR_SKU(skuTable, FtrVC1VLDDecoding, codecInfo->vc1Decoding);
503 MEDIA_WR_SKU(skuTable, FtrIntelJPEGDecoding, codecInfo->jpegDecoding);
504 MEDIA_WR_SKU(skuTable, FtrEncodeAVC, codecInfo->avcEncoding);
505 MEDIA_WR_SKU(skuTable, FtrEncodeMPEG2, codecInfo->mpeg2Encoding);
506 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMainDecoding, codecInfo->hevcDecoding);
507 MEDIA_WR_SKU(skuTable, FtrIntelHEVCVLDMain10Decoding, codecInfo->hevc10Decoding);
508
509 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC, codecInfo->hevcEncoding);
510 MEDIA_WR_SKU(skuTable, FtrEncodeHEVC10bit, codecInfo->hevc10Encoding);
511 MEDIA_WR_SKU(skuTable, FtrEncodeJPEG, codecInfo->jpegEncoding);
512 MEDIA_WR_SKU(skuTable, FtrEncodeAVCVdenc, codecInfo->avcVdenc);
513 MEDIA_WR_SKU(skuTable, FtrVP9VLDDecoding, codecInfo->vp9Decoding);
514 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile0Decoding8bit420, codecInfo->vp9Decoding);
515 MEDIA_WR_SKU(skuTable, FtrVP9VLD10bProfile2Decoding, codecInfo->vp9b10Decoding);
516 MEDIA_WR_SKU(skuTable, FtrIntelVP9VLDProfile2Decoding10bit420, codecInfo->vp9b10Decoding);
517
518 /* VP8 enc */
519 MEDIA_WR_SKU(skuTable, FtrEncodeVP8, codecInfo->vp8Encoding);
520 }
521
522 MEDIA_WR_SKU(skuTable, FtrEnableMediaKernels, drvInfo->hasHuc);
523
524 if (devInfo->eGTType == GTTYPE_GT1)
525 {
526 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
527 }
528 else if (devInfo->eGTType == GTTYPE_GT1_5)
529 {
530 MEDIA_WR_SKU(skuTable, FtrGT1_5, 1);
531 }
532 else
533 {
534 /* GT1 is by default */
535 MEDIA_WR_SKU(skuTable, FtrGT1, 1);
536 }
537
538 MEDIA_WR_SKU(skuTable, FtrLCIA, 1);
539 MEDIA_WR_SKU(skuTable, FtrVERing, drvInfo->hasVebox);
540 MEDIA_WR_SKU(skuTable, FtrPPGTT, drvInfo->hasPpgtt);
541 MEDIA_WR_SKU(skuTable, FtrEDram, devInfo->hasERAM);
542 MEDIA_WR_SKU(skuTable, FtrSingleVeboxSlice, 1);
543 MEDIA_WR_SKU(skuTable, FtrSFCPipe, 1);
544 MEDIA_WR_SKU(skuTable, FtrSSEUPowerGating, 1);
545 MEDIA_WR_SKU(skuTable, FtrMemoryCompression, 0);
546 MEDIA_WR_SKU(skuTable, FtrHcpDecMemoryCompression, 0);
547
548 MEDIA_WR_SKU(skuTable, FtrVpP010Output, 1);
549
550 MEDIA_WR_SKU(skuTable, FtrPerCtxtPreemptionGranularityControl, 1);
551
552 MEDIA_WR_SKU(skuTable, FtrHDR, 1);
553
554 return true;
555 }
556
InitGlkMediaWa(struct GfxDeviceInfo * devInfo,MediaWaTable * waTable,struct LinuxDriverInfo * drvInfo)557 static bool InitGlkMediaWa(struct GfxDeviceInfo *devInfo,
558 MediaWaTable *waTable,
559 struct LinuxDriverInfo *drvInfo)
560 {
561 if ((devInfo == nullptr) || (waTable == nullptr) || (drvInfo == nullptr))
562 {
563 DEVINFO_ERROR("null ptr is passed\n");
564 return false;
565 }
566
567 MEDIA_WR_WA(waTable, WaForceGlobalGTT, !drvInfo->hasPpgtt);
568 MEDIA_WR_WA(waTable, WaLLCCachingUnsupported, 1);
569 MEDIA_WR_WA(waTable, WaAddMediaStateFlushCmd, 1);
570 MEDIA_WR_WA(waTable, WaMidBatchPreemption, 1);
571 MEDIA_WR_WA(waTable, WaDisableLockForTranscodePerf, 1);
572 MEDIA_WR_WA(waTable, WaSendDummyVFEafterPipelineSelect, 1);
573 MEDIA_WR_WA(waTable, WaHucStreamoutEnable, 1);
574 MEDIA_WR_WA(waTable, WaSuperSliceHeaderPacking, 1);
575
576 MEDIA_WR_WA(waTable, Wa8BitFrameIn10BitHevc, 1);
577
578 MEDIA_WR_WA(waTable, WaEnableDscale, 1);
579 MEDIA_WR_WA(waTable, WaDisableSFCSrcCrop, 1);
580
581 MEDIA_WR_WA(waTable, WaSFC270DegreeRotation, 1);
582 MEDIA_WR_WA(waTable, WaEnableYV12BugFixInHalfSliceChicken7, 1);
583
584 MEDIA_WR_WA(waTable, WaHucStreamoutOnlyDisable, 1);
585
586 MEDIA_WR_WA(waTable, Wa16KInputHeightNV12Planar420, 1);
587 MEDIA_WR_WA(waTable, WaDisableCodecMmc, 1);
588
589 return true;
590 }
591
592 static struct LinuxDeviceInit sklDeviceInit =
593 {
594 .productFamily = IGFX_SKYLAKE,
595 .InitMediaFeature = InitSklMediaSku,
596 .InitMediaWa = InitSklMediaWa,
597 };
598
599 static struct LinuxDeviceInit bxtDeviceInit =
600 {
601 .productFamily = IGFX_BROXTON,
602 .InitMediaFeature = InitBxtMediaSku,
603 .InitMediaWa = InitBxtMediaWa,
604 };
605
606 static struct LinuxDeviceInit kblDeviceInit =
607 {
608 .productFamily = IGFX_KABYLAKE,
609 .InitMediaFeature = InitKblMediaSku,
610 .InitMediaWa = InitKblMediaWa,
611 };
612
613 /* CFL sses the same call back with KBL */
614 static struct LinuxDeviceInit cflDeviceInit =
615 {
616 .productFamily = IGFX_COFFEELAKE,
617 .InitMediaFeature = InitKblMediaSku,
618 .InitMediaWa = InitKblMediaWa,
619 };
620
621 static struct LinuxDeviceInit glkDeviceInit =
622 {
623 .productFamily = IGFX_GEMINILAKE,
624 .InitMediaFeature = InitGlkMediaSku,
625 .InitMediaWa = InitGlkMediaWa,
626 };
627
628 static bool sklDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
629 RegisterDevice(IGFX_SKYLAKE, &sklDeviceInit);
630
631 static bool chvDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
632 RegisterDevice(IGFX_BROXTON, &bxtDeviceInit);
633
634 static bool kblDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
635 RegisterDevice(IGFX_KABYLAKE, &kblDeviceInit);
636
637 static bool glkDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
638 RegisterDevice(IGFX_GEMINILAKE, &glkDeviceInit);
639
640 static bool cflDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
641 RegisterDevice(IGFX_COFFEELAKE, &cflDeviceInit);
642