qsv: Update SDK version to v2022.2.4
[platform/upstream/gstreamer.git] / subprojects / gst-plugins-bad / sys / qsv / libmfx / dispatcher / linux / device_ids.h
1 /*############################################################################
2   # Copyright (C) Intel Corporation
3   #
4   # SPDX-License-Identifier: MIT
5   ############################################################################*/
6
7 #ifndef DISPATCHER_LINUX_DEVICE_IDS_H_
8 #define DISPATCHER_LINUX_DEVICE_IDS_H_
9
10 // Tables from:
11 //   https://github.com/Intel-Media-SDK/MediaSDK/blob/master/_studio/shared/src/libmfx_core_vaapi.cpp
12 //   https://github.com/Intel-Media-SDK/MediaSDK/blob/master/_studio/shared/include/mfxstructures-int.h
13
14 #include <algorithm>
15 #include <string>
16 #include <vector>
17
18 enum eMFXHWType {
19     MFX_HW_UNKNOWN = 0,
20     MFX_HW_SNB     = 0x300000,
21
22     MFX_HW_IVB = 0x400000,
23
24     MFX_HW_HSW     = 0x500000,
25     MFX_HW_HSW_ULT = 0x500001,
26
27     MFX_HW_VLV = 0x600000,
28
29     MFX_HW_BDW = 0x700000,
30
31     MFX_HW_CHT = 0x800000,
32
33     MFX_HW_SCL = 0x900000,
34
35     MFX_HW_APL = 0x1000000,
36
37     MFX_HW_KBL = 0x1100000,
38     MFX_HW_GLK = MFX_HW_KBL + 1,
39     MFX_HW_CFL = MFX_HW_KBL + 2,
40
41     MFX_HW_CNL    = 0x1200000,
42     MFX_HW_ICL    = 0x1400000,
43     MFX_HW_ICL_LP = MFX_HW_ICL + 1,
44
45     MFX_HW_JSL = 0x1500001,
46     MFX_HW_EHL = 0x1500002,
47 };
48
49 enum eMFXGTConfig { MFX_GT_UNKNOWN = 0, MFX_GT1 = 1, MFX_GT2 = 2, MFX_GT3 = 3, MFX_GT4 = 4 };
50
51 typedef struct {
52     unsigned int device_id;
53     eMFXHWType platform;
54     eMFXGTConfig config;
55 } mfx_device_item;
56
57 // list of legal dev ID for Intel's graphics
58 static const mfx_device_item listLegalDevIDs[] = {
59     /*IVB*/
60     { 0x0156, MFX_HW_IVB, MFX_GT1 }, /* GT1 mobile */
61     { 0x0166, MFX_HW_IVB, MFX_GT2 }, /* GT2 mobile */
62     { 0x0152, MFX_HW_IVB, MFX_GT1 }, /* GT1 desktop */
63     { 0x0162, MFX_HW_IVB, MFX_GT2 }, /* GT2 desktop */
64     { 0x015a, MFX_HW_IVB, MFX_GT1 }, /* GT1 server */
65     { 0x016a, MFX_HW_IVB, MFX_GT2 }, /* GT2 server */
66     /*HSW*/
67     { 0x0402, MFX_HW_HSW, MFX_GT1 }, /* GT1 desktop */
68     { 0x0412, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */
69     { 0x0422, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */
70     { 0x041e, MFX_HW_HSW, MFX_GT2 }, /* Core i3-4130 */
71     { 0x040a, MFX_HW_HSW, MFX_GT1 }, /* GT1 server */
72     { 0x041a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */
73     { 0x042a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */
74     { 0x0406, MFX_HW_HSW, MFX_GT1 }, /* GT1 mobile */
75     { 0x0416, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */
76     { 0x0426, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */
77     { 0x0C02, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 desktop */
78     { 0x0C12, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */
79     { 0x0C22, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */
80     { 0x0C0A, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 server */
81     { 0x0C1A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */
82     { 0x0C2A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */
83     { 0x0C06, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 mobile */
84     { 0x0C16, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */
85     { 0x0C26, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */
86     { 0x0A02, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 desktop */
87     { 0x0A12, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */
88     { 0x0A22, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */
89     { 0x0A0A, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 server */
90     { 0x0A1A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */
91     { 0x0A2A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */
92     { 0x0A06, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 mobile */
93     { 0x0A16, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */
94     { 0x0A26, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */
95     { 0x0D02, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 desktop */
96     { 0x0D12, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */
97     { 0x0D22, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */
98     { 0x0D0A, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 server */
99     { 0x0D1A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */
100     { 0x0D2A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */
101     { 0x0D06, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 mobile */
102     { 0x0D16, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */
103     { 0x0D26, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */
104     /* this dev IDs added per HSD 5264859 request  */
105     { 0x040B, MFX_HW_HSW, MFX_GT1 },
106     /*HASWELL_B_GT1 */ /* Reserved */
107     { 0x041B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_B_GT2*/
108     { 0x042B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_B_GT3*/
109     { 0x040E, MFX_HW_HSW, MFX_GT1 },
110     /*HASWELL_E_GT1*/ /* Reserved */
111     { 0x041E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_E_GT2*/
112     { 0x042E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_E_GT3*/
113
114     { 0x0C0B, MFX_HW_HSW, MFX_GT1 },
115     /*HASWELL_SDV_B_GT1*/ /* Reserved */
116     { 0x0C1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/
117     { 0x0C2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/
118     { 0x0C0E, MFX_HW_HSW, MFX_GT1 },
119     /*HASWELL_SDV_B_GT1*/ /* Reserved */
120     { 0x0C1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/
121     { 0x0C2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/
122
123     { 0x0A0B, MFX_HW_HSW, MFX_GT1 },
124     /*HASWELL_ULT_B_GT1*/ /* Reserved */
125     { 0x0A1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_B_GT2*/
126     { 0x0A2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_B_GT3*/
127     { 0x0A0E, MFX_HW_HSW, MFX_GT1 },
128     /*HASWELL_ULT_E_GT1*/ /* Reserved */
129     { 0x0A1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_E_GT2*/
130     { 0x0A2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_E_GT3*/
131
132     { 0x0D0B, MFX_HW_HSW, MFX_GT1 },
133     /*HASWELL_CRW_B_GT1*/ /* Reserved */
134     { 0x0D1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_B_GT2*/
135     { 0x0D2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_B_GT3*/
136     { 0x0D0E, MFX_HW_HSW, MFX_GT1 },
137     /*HASWELL_CRW_E_GT1*/ /* Reserved */
138     { 0x0D1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_E_GT2*/
139     { 0x0D2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_E_GT3*/
140
141     /* VLV */
142     { 0x0f30, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */
143     { 0x0f31, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */
144     { 0x0f32, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */
145     { 0x0f33, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */
146     { 0x0157, MFX_HW_VLV, MFX_GT1 },
147     { 0x0155, MFX_HW_VLV, MFX_GT1 },
148
149     /* BDW */
150     /*GT3: */
151     { 0x162D, MFX_HW_BDW, MFX_GT3 },
152     { 0x162A, MFX_HW_BDW, MFX_GT3 },
153     /*GT2: */
154     { 0x161D, MFX_HW_BDW, MFX_GT2 },
155     { 0x161A, MFX_HW_BDW, MFX_GT2 },
156     /* GT1: */
157     { 0x160D, MFX_HW_BDW, MFX_GT1 },
158     { 0x160A, MFX_HW_BDW, MFX_GT1 },
159     /* BDW-ULT */
160     /* (16x2 - ULT, 16x6 - ULT, 16xB - Iris, 16xE - ULX) */
161     /*GT3: */
162     { 0x162E, MFX_HW_BDW, MFX_GT3 },
163     { 0x162B, MFX_HW_BDW, MFX_GT3 },
164     { 0x1626, MFX_HW_BDW, MFX_GT3 },
165     { 0x1622, MFX_HW_BDW, MFX_GT3 },
166     { 0x1636, MFX_HW_BDW, MFX_GT3 }, /* ULT */
167     { 0x163B, MFX_HW_BDW, MFX_GT3 }, /* Iris */
168     { 0x163E, MFX_HW_BDW, MFX_GT3 }, /* ULX */
169     { 0x1632, MFX_HW_BDW, MFX_GT3 }, /* ULT */
170     { 0x163A, MFX_HW_BDW, MFX_GT3 }, /* Server */
171     { 0x163D, MFX_HW_BDW, MFX_GT3 }, /* Workstation */
172
173     /* GT2: */
174     { 0x161E, MFX_HW_BDW, MFX_GT2 },
175     { 0x161B, MFX_HW_BDW, MFX_GT2 },
176     { 0x1616, MFX_HW_BDW, MFX_GT2 },
177     { 0x1612, MFX_HW_BDW, MFX_GT2 },
178     /* GT1: */
179     { 0x160E, MFX_HW_BDW, MFX_GT1 },
180     { 0x160B, MFX_HW_BDW, MFX_GT1 },
181     { 0x1606, MFX_HW_BDW, MFX_GT1 },
182     { 0x1602, MFX_HW_BDW, MFX_GT1 },
183
184     /* CHT */
185     { 0x22b0, MFX_HW_CHT, MFX_GT1 },
186     { 0x22b1, MFX_HW_CHT, MFX_GT1 },
187     { 0x22b2, MFX_HW_CHT, MFX_GT1 },
188     { 0x22b3, MFX_HW_CHT, MFX_GT1 },
189
190     /* SCL */
191     /* GT1F */
192     { 0x1902, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1F, 510
193     { 0x1906, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1F, 510
194     { 0x190A, MFX_HW_SCL, MFX_GT1 }, // Server, 4x1F
195     { 0x190B, MFX_HW_SCL, MFX_GT1 },
196     { 0x190E, MFX_HW_SCL, MFX_GT1 }, // Y-ULX 2x1F
197     /*GT1.5*/
198     { 0x1913, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1.5
199     { 0x1915, MFX_HW_SCL, MFX_GT1 }, // Y-ULX, 2x1.5
200     { 0x1917, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1.5
201     /* GT2 */
202     { 0x1912, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530
203     { 0x1916, MFX_HW_SCL, MFX_GT2 }, // U-ULD 2x2, 520
204     { 0x191A, MFX_HW_SCL, MFX_GT2 }, // 2x2,4x2, Server
205     { 0x191B, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530
206     { 0x191D, MFX_HW_SCL, MFX_GT2 }, // 4x2, WKS, P530
207     { 0x191E, MFX_HW_SCL, MFX_GT2 }, // Y-ULX, 2x2, P510,515
208     { 0x1921, MFX_HW_SCL, MFX_GT2 }, // U-ULT, 2x2F, 540
209     /* GT3 */
210     { 0x1923, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 535
211     { 0x1926, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 540 (15W)
212     { 0x1927, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3e, 550 (28W)
213     { 0x192A, MFX_HW_SCL, MFX_GT3 }, // Server, 2x3
214     { 0x192B, MFX_HW_SCL, MFX_GT3 }, // Halo 3e
215     { 0x192D, MFX_HW_SCL, MFX_GT3 },
216     /* GT4e*/
217     { 0x1932, MFX_HW_SCL, MFX_GT4 }, // DT
218     { 0x193A, MFX_HW_SCL, MFX_GT4 }, // SRV
219     { 0x193B, MFX_HW_SCL, MFX_GT4 }, // Halo
220     { 0x193D, MFX_HW_SCL, MFX_GT4 }, // WKS
221
222     /* APL */
223     { 0x0A84, MFX_HW_APL, MFX_GT1 },
224     { 0x0A85, MFX_HW_APL, MFX_GT1 },
225     { 0x0A86, MFX_HW_APL, MFX_GT1 },
226     { 0x0A87, MFX_HW_APL, MFX_GT1 },
227     { 0x1A84, MFX_HW_APL, MFX_GT1 },
228     { 0x1A85, MFX_HW_APL, MFX_GT1 },
229     { 0x5A84, MFX_HW_APL, MFX_GT1 },
230     { 0x5A85, MFX_HW_APL, MFX_GT1 },
231
232     /* KBL */
233     { 0x5902, MFX_HW_KBL, MFX_GT1 }, // DT GT1
234     { 0x5906, MFX_HW_KBL, MFX_GT1 }, // ULT GT1
235     { 0x5908, MFX_HW_KBL, MFX_GT1 }, // HALO GT1F
236     { 0x590A, MFX_HW_KBL, MFX_GT1 }, // SERV GT1
237     { 0x590B, MFX_HW_KBL, MFX_GT1 }, // HALO GT1
238     { 0x590E, MFX_HW_KBL, MFX_GT1 }, // ULX GT1
239     { 0x5912, MFX_HW_KBL, MFX_GT2 }, // DT GT2
240     { 0x5913, MFX_HW_KBL, MFX_GT1 }, // ULT GT1 5
241     { 0x5915, MFX_HW_KBL, MFX_GT1 }, // ULX GT1 5
242     { 0x5916, MFX_HW_KBL, MFX_GT2 }, // ULT GT2
243     { 0x5917, MFX_HW_KBL, MFX_GT2 }, // ULT GT2 R
244     { 0x591A, MFX_HW_KBL, MFX_GT2 }, // SERV GT2
245     { 0x591B, MFX_HW_KBL, MFX_GT2 }, // HALO GT2
246     { 0x591C, MFX_HW_KBL, MFX_GT2 }, // ULX GT2
247     { 0x591D, MFX_HW_KBL, MFX_GT2 }, // WRK GT2
248     { 0x591E, MFX_HW_KBL, MFX_GT2 }, // ULX GT2
249     { 0x5921, MFX_HW_KBL, MFX_GT2 }, // ULT GT2F
250     { 0x5923, MFX_HW_KBL, MFX_GT3 }, // ULT GT3
251     { 0x5926, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 15W
252     { 0x5927, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 28W
253     { 0x592A, MFX_HW_KBL, MFX_GT3 }, // SERV GT3
254     { 0x592B, MFX_HW_KBL, MFX_GT3 }, // HALO GT3
255     { 0x5932, MFX_HW_KBL, MFX_GT4 }, // DT GT4
256     { 0x593A, MFX_HW_KBL, MFX_GT4 }, // SERV GT4
257     { 0x593B, MFX_HW_KBL, MFX_GT4 }, // HALO GT4
258     { 0x593D, MFX_HW_KBL, MFX_GT4 }, // WRK GT4
259     { 0x87C0, MFX_HW_KBL, MFX_GT2 }, // ULX GT2
260
261     /* GLK */
262     { 0x3184, MFX_HW_GLK, MFX_GT1 },
263     { 0x3185, MFX_HW_GLK, MFX_GT1 },
264
265     /* CFL */
266     { 0x3E90, MFX_HW_CFL, MFX_GT1 },
267     { 0x3E91, MFX_HW_CFL, MFX_GT2 },
268     { 0x3E92, MFX_HW_CFL, MFX_GT2 },
269     { 0x3E93, MFX_HW_CFL, MFX_GT1 },
270     { 0x3E94, MFX_HW_CFL, MFX_GT2 },
271     { 0x3E96, MFX_HW_CFL, MFX_GT2 },
272     { 0x3E98, MFX_HW_CFL, MFX_GT2 },
273     { 0x3E99, MFX_HW_CFL, MFX_GT1 },
274     { 0x3E9A, MFX_HW_CFL, MFX_GT2 },
275     { 0x3E9C, MFX_HW_CFL, MFX_GT1 },
276     { 0x3E9B, MFX_HW_CFL, MFX_GT2 },
277     { 0x3EA5, MFX_HW_CFL, MFX_GT3 },
278     { 0x3EA6, MFX_HW_CFL, MFX_GT3 },
279     { 0x3EA7, MFX_HW_CFL, MFX_GT3 },
280     { 0x3EA8, MFX_HW_CFL, MFX_GT3 },
281     { 0x3EA9, MFX_HW_CFL, MFX_GT2 },
282     { 0x87CA, MFX_HW_CFL, MFX_GT2 },
283
284     /* WHL */
285     { 0x3EA0, MFX_HW_CFL, MFX_GT2 },
286     { 0x3EA1, MFX_HW_CFL, MFX_GT1 },
287     { 0x3EA2, MFX_HW_CFL, MFX_GT3 },
288     { 0x3EA3, MFX_HW_CFL, MFX_GT2 },
289     { 0x3EA4, MFX_HW_CFL, MFX_GT1 },
290
291     /* CML GT1 */
292     { 0x9b21, MFX_HW_CFL, MFX_GT1 },
293     { 0x9baa, MFX_HW_CFL, MFX_GT1 },
294     { 0x9bab, MFX_HW_CFL, MFX_GT1 },
295     { 0x9bac, MFX_HW_CFL, MFX_GT1 },
296     { 0x9ba0, MFX_HW_CFL, MFX_GT1 },
297     { 0x9ba5, MFX_HW_CFL, MFX_GT1 },
298     { 0x9ba8, MFX_HW_CFL, MFX_GT1 },
299     { 0x9ba4, MFX_HW_CFL, MFX_GT1 },
300     { 0x9ba2, MFX_HW_CFL, MFX_GT1 },
301
302     /* CML GT2 */
303     { 0x9b41, MFX_HW_CFL, MFX_GT2 },
304     { 0x9bca, MFX_HW_CFL, MFX_GT2 },
305     { 0x9bcb, MFX_HW_CFL, MFX_GT2 },
306     { 0x9bcc, MFX_HW_CFL, MFX_GT2 },
307     { 0x9bc0, MFX_HW_CFL, MFX_GT2 },
308     { 0x9bc5, MFX_HW_CFL, MFX_GT2 },
309     { 0x9bc8, MFX_HW_CFL, MFX_GT2 },
310     { 0x9bc4, MFX_HW_CFL, MFX_GT2 },
311     { 0x9bc2, MFX_HW_CFL, MFX_GT2 },
312     { 0x9bc6, MFX_HW_CFL, MFX_GT2 },
313     { 0x9be6, MFX_HW_CFL, MFX_GT2 },
314     { 0x9bf6, MFX_HW_CFL, MFX_GT2 },
315
316     /* CNL */
317     { 0x5A51, MFX_HW_CNL, MFX_GT2 },
318     { 0x5A52, MFX_HW_CNL, MFX_GT2 },
319     { 0x5A5A, MFX_HW_CNL, MFX_GT2 },
320     { 0x5A40, MFX_HW_CNL, MFX_GT2 },
321     { 0x5A42, MFX_HW_CNL, MFX_GT2 },
322     { 0x5A4A, MFX_HW_CNL, MFX_GT2 },
323     { 0x5A4C, MFX_HW_CNL, MFX_GT1 },
324     { 0x5A50, MFX_HW_CNL, MFX_GT2 },
325     { 0x5A54, MFX_HW_CNL, MFX_GT1 },
326     { 0x5A59, MFX_HW_CNL, MFX_GT2 },
327     { 0x5A5C, MFX_HW_CNL, MFX_GT1 },
328     { 0x5A41, MFX_HW_CNL, MFX_GT2 },
329     { 0x5A44, MFX_HW_CNL, MFX_GT1 },
330     { 0x5A49, MFX_HW_CNL, MFX_GT2 },
331
332     /* ICL LP */
333     { 0xFF05, MFX_HW_ICL_LP, MFX_GT1 },
334     { 0x8A50, MFX_HW_ICL_LP, MFX_GT2 },
335     { 0x8A51, MFX_HW_ICL_LP, MFX_GT2 },
336     { 0x8A52, MFX_HW_ICL_LP, MFX_GT2 },
337     { 0x8A53, MFX_HW_ICL_LP, MFX_GT2 },
338     { 0x8A54, MFX_HW_ICL_LP, MFX_GT1 },
339     { 0x8A56, MFX_HW_ICL_LP, MFX_GT1 },
340     { 0x8A57, MFX_HW_ICL_LP, MFX_GT1 },
341     { 0x8A58, MFX_HW_ICL_LP, MFX_GT1 },
342     { 0x8A59, MFX_HW_ICL_LP, MFX_GT1 },
343     { 0x8A5A, MFX_HW_ICL_LP, MFX_GT1 },
344     { 0x8A5B, MFX_HW_ICL_LP, MFX_GT1 },
345     { 0x8A5C, MFX_HW_ICL_LP, MFX_GT1 },
346     { 0x8A5D, MFX_HW_ICL_LP, MFX_GT1 },
347     { 0x8A70, MFX_HW_ICL_LP, MFX_GT1 },
348     { 0x8A71, MFX_HW_ICL_LP, MFX_GT1 }, // GT05, but 1 ok in this context
349
350     /* JSL */
351     { 0x4E51, MFX_HW_JSL, MFX_GT2 },
352     { 0x4E55, MFX_HW_JSL, MFX_GT2 },
353     { 0x4E61, MFX_HW_JSL, MFX_GT2 },
354     { 0x4E71, MFX_HW_JSL, MFX_GT2 },
355
356     /* EHL */
357     { 0x4500, MFX_HW_EHL, MFX_GT2 },
358     { 0x4541, MFX_HW_EHL, MFX_GT2 },
359     { 0x4551, MFX_HW_EHL, MFX_GT2 },
360     { 0x4555, MFX_HW_EHL, MFX_GT2 },
361     { 0x4569, MFX_HW_EHL, MFX_GT2 },
362     { 0x4571, MFX_HW_EHL, MFX_GT2 },
363 };
364
365 typedef struct {
366     unsigned int vendor_id;
367     unsigned int device_id;
368     eMFXHWType platform;
369 } Device;
370
371 static inline eMFXHWType get_platform(unsigned int device_id) {
372     for (unsigned i = 0; i < sizeof(listLegalDevIDs) / sizeof(listLegalDevIDs[0]); ++i) {
373         if (listLegalDevIDs[i].device_id == device_id) {
374             return listLegalDevIDs[i].platform;
375         }
376     }
377     return MFX_HW_UNKNOWN;
378 }
379
380 static mfxStatus get_devices(std::vector<Device> &allDevices) {
381     const char *dir            = "/sys/class/drm";
382     const char *device_id_file = "/device/device";
383     const char *vendor_id_file = "/device/vendor";
384
385     int i = 0;
386     for (; i < 64; ++i) {
387         int ret;
388         Device device;
389         std::string path = std::string(dir) + "/renderD" + std::to_string(128 + i) + vendor_id_file;
390
391         FILE *file = fopen(path.c_str(), "r");
392         if (!file)
393             continue;
394         ret = fscanf(file, "%x", &device.vendor_id);
395         fclose(file);
396         if (ret != 1)
397             continue;
398
399         // Filter out non-Intel devices
400         if (device.vendor_id != 0x8086)
401             continue;
402
403         path = std::string(dir) + "/renderD" + std::to_string(128 + i) + device_id_file;
404         file = fopen(path.c_str(), "r");
405         if (!file)
406             continue;
407         ret = fscanf(file, "%x", &device.device_id);
408         fclose(file);
409         if (ret != 1)
410             continue;
411
412         device.platform = get_platform(device.device_id);
413
414         allDevices.emplace_back(device);
415     }
416
417     // sort by platform, unknown will appear at beginning
418     std::sort(allDevices.begin(), allDevices.end(), [](const Device &a, const Device &b) {
419         return a.platform < b.platform;
420     });
421
422     if (allDevices.size() == 0)
423         return MFX_ERR_NOT_FOUND;
424
425     return MFX_ERR_NONE;
426 }
427
428 #endif // DISPATCHER_LINUX_DEVICE_IDS_H_