xref: /aosp_15_r20/external/intel-media-driver/media_driver/linux/gen9/ddi/media_sku_wa_g9.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
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