1*1cddb830SAndroid Build Coastguard Worker /*
2*1cddb830SAndroid Build Coastguard Worker * Copyright (c) 2017-2022 The Khronos Group Inc.
3*1cddb830SAndroid Build Coastguard Worker *
4*1cddb830SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*1cddb830SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*1cddb830SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*1cddb830SAndroid Build Coastguard Worker *
8*1cddb830SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*1cddb830SAndroid Build Coastguard Worker *
10*1cddb830SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*1cddb830SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*1cddb830SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1cddb830SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*1cddb830SAndroid Build Coastguard Worker * limitations under the License.
15*1cddb830SAndroid Build Coastguard Worker *
16*1cddb830SAndroid Build Coastguard Worker * OpenCL is a trademark of Apple Inc. used under license by Khronos.
17*1cddb830SAndroid Build Coastguard Worker */
18*1cddb830SAndroid Build Coastguard Worker
19*1cddb830SAndroid Build Coastguard Worker #include "icd.h"
20*1cddb830SAndroid Build Coastguard Worker #include "icd_windows_hkr.h"
21*1cddb830SAndroid Build Coastguard Worker #include <windows.h>
22*1cddb830SAndroid Build Coastguard Worker #include "icd_windows_dxgk.h"
23*1cddb830SAndroid Build Coastguard Worker #include <cfgmgr32.h>
24*1cddb830SAndroid Build Coastguard Worker #include <assert.h>
25*1cddb830SAndroid Build Coastguard Worker #include <stdbool.h>
26*1cddb830SAndroid Build Coastguard Worker #include <initguid.h>
27*1cddb830SAndroid Build Coastguard Worker #include <devpkey.h>
28*1cddb830SAndroid Build Coastguard Worker #include <devguid.h>
29*1cddb830SAndroid Build Coastguard Worker
30*1cddb830SAndroid Build Coastguard Worker // This GUID was only added to devguid.h on Windows SDK v10.0.16232 which
31*1cddb830SAndroid Build Coastguard Worker // corresponds to Windows 10 Redstone 3 (Windows 10 Fall Creators Update).
32*1cddb830SAndroid Build Coastguard Worker DEFINE_GUID(OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, 0x5c4c3332, 0x344d, 0x483c, 0x87, 0x39, 0x25, 0x9e, 0x93, 0x4c, 0x9c, 0xc8);
33*1cddb830SAndroid Build Coastguard Worker
34*1cddb830SAndroid Build Coastguard Worker typedef enum
35*1cddb830SAndroid Build Coastguard Worker {
36*1cddb830SAndroid Build Coastguard Worker ProbeFailure,
37*1cddb830SAndroid Build Coastguard Worker PendingReboot,
38*1cddb830SAndroid Build Coastguard Worker Valid
39*1cddb830SAndroid Build Coastguard Worker } DeviceProbeResult;
40*1cddb830SAndroid Build Coastguard Worker
41*1cddb830SAndroid Build Coastguard Worker #define KHR_SAFE_RELEASE(mem) \
42*1cddb830SAndroid Build Coastguard Worker do \
43*1cddb830SAndroid Build Coastguard Worker { \
44*1cddb830SAndroid Build Coastguard Worker free(mem); \
45*1cddb830SAndroid Build Coastguard Worker mem = NULL; \
46*1cddb830SAndroid Build Coastguard Worker } while (0)
47*1cddb830SAndroid Build Coastguard Worker
48*1cddb830SAndroid Build Coastguard Worker static const char OPENCL_REG_SUB_KEY[] = "OpenCLDriverName";
49*1cddb830SAndroid Build Coastguard Worker
50*1cddb830SAndroid Build Coastguard Worker #ifndef _WIN64
51*1cddb830SAndroid Build Coastguard Worker static const char OPENCL_REG_SUB_KEY_WOW[] = "OpenCLDriverNameWow";
52*1cddb830SAndroid Build Coastguard Worker #endif
53*1cddb830SAndroid Build Coastguard Worker
54*1cddb830SAndroid Build Coastguard Worker // Do not free the memory returned by this function.
getOpenCLRegKeyName(void)55*1cddb830SAndroid Build Coastguard Worker const char* getOpenCLRegKeyName(void)
56*1cddb830SAndroid Build Coastguard Worker {
57*1cddb830SAndroid Build Coastguard Worker #ifdef _WIN64
58*1cddb830SAndroid Build Coastguard Worker return OPENCL_REG_SUB_KEY;
59*1cddb830SAndroid Build Coastguard Worker #else
60*1cddb830SAndroid Build Coastguard Worker // The suffix/substring "WoW" is meaningful only when a 32-bit
61*1cddb830SAndroid Build Coastguard Worker // application is running on a 64-bit Windows OS. A 32-bit application
62*1cddb830SAndroid Build Coastguard Worker // running on a 32-bit OS uses non-WoW names.
63*1cddb830SAndroid Build Coastguard Worker BOOL is_wow64;
64*1cddb830SAndroid Build Coastguard Worker if (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)
65*1cddb830SAndroid Build Coastguard Worker {
66*1cddb830SAndroid Build Coastguard Worker return OPENCL_REG_SUB_KEY_WOW;
67*1cddb830SAndroid Build Coastguard Worker }
68*1cddb830SAndroid Build Coastguard Worker
69*1cddb830SAndroid Build Coastguard Worker return OPENCL_REG_SUB_KEY;
70*1cddb830SAndroid Build Coastguard Worker #endif
71*1cddb830SAndroid Build Coastguard Worker }
72*1cddb830SAndroid Build Coastguard Worker
ReadOpenCLKey(DEVINST dnDevNode)73*1cddb830SAndroid Build Coastguard Worker static bool ReadOpenCLKey(DEVINST dnDevNode)
74*1cddb830SAndroid Build Coastguard Worker {
75*1cddb830SAndroid Build Coastguard Worker HKEY hkey = 0;
76*1cddb830SAndroid Build Coastguard Worker CONFIGRET ret;
77*1cddb830SAndroid Build Coastguard Worker bool bRet = false;
78*1cddb830SAndroid Build Coastguard Worker DWORD dwLibraryNameType = 0;
79*1cddb830SAndroid Build Coastguard Worker char *cszOclPath = NULL;
80*1cddb830SAndroid Build Coastguard Worker DWORD dwOclPathSize = 0;
81*1cddb830SAndroid Build Coastguard Worker LSTATUS result;
82*1cddb830SAndroid Build Coastguard Worker
83*1cddb830SAndroid Build Coastguard Worker ret = CM_Open_DevNode_Key(
84*1cddb830SAndroid Build Coastguard Worker dnDevNode,
85*1cddb830SAndroid Build Coastguard Worker KEY_QUERY_VALUE,
86*1cddb830SAndroid Build Coastguard Worker 0,
87*1cddb830SAndroid Build Coastguard Worker RegDisposition_OpenExisting,
88*1cddb830SAndroid Build Coastguard Worker &hkey,
89*1cddb830SAndroid Build Coastguard Worker CM_REGISTRY_SOFTWARE);
90*1cddb830SAndroid Build Coastguard Worker
91*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
92*1cddb830SAndroid Build Coastguard Worker {
93*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed with ret 0x%"PRIxDW"\n", ret);
94*1cddb830SAndroid Build Coastguard Worker goto out;
95*1cddb830SAndroid Build Coastguard Worker }
96*1cddb830SAndroid Build Coastguard Worker else
97*1cddb830SAndroid Build Coastguard Worker {
98*1cddb830SAndroid Build Coastguard Worker result = RegQueryValueExA(
99*1cddb830SAndroid Build Coastguard Worker hkey,
100*1cddb830SAndroid Build Coastguard Worker getOpenCLRegKeyName(),
101*1cddb830SAndroid Build Coastguard Worker NULL,
102*1cddb830SAndroid Build Coastguard Worker &dwLibraryNameType,
103*1cddb830SAndroid Build Coastguard Worker NULL,
104*1cddb830SAndroid Build Coastguard Worker &dwOclPathSize);
105*1cddb830SAndroid Build Coastguard Worker
106*1cddb830SAndroid Build Coastguard Worker if (ERROR_SUCCESS != result)
107*1cddb830SAndroid Build Coastguard Worker {
108*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to open sub key 0x%"PRIxDW"\n", result);
109*1cddb830SAndroid Build Coastguard Worker goto out;
110*1cddb830SAndroid Build Coastguard Worker }
111*1cddb830SAndroid Build Coastguard Worker
112*1cddb830SAndroid Build Coastguard Worker cszOclPath = malloc(dwOclPathSize);
113*1cddb830SAndroid Build Coastguard Worker if (NULL == cszOclPath)
114*1cddb830SAndroid Build Coastguard Worker {
115*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to allocate %"PRIuDW" bytes for registry value\n", dwOclPathSize);
116*1cddb830SAndroid Build Coastguard Worker goto out;
117*1cddb830SAndroid Build Coastguard Worker }
118*1cddb830SAndroid Build Coastguard Worker
119*1cddb830SAndroid Build Coastguard Worker result = RegQueryValueExA(
120*1cddb830SAndroid Build Coastguard Worker hkey,
121*1cddb830SAndroid Build Coastguard Worker getOpenCLRegKeyName(),
122*1cddb830SAndroid Build Coastguard Worker NULL,
123*1cddb830SAndroid Build Coastguard Worker &dwLibraryNameType,
124*1cddb830SAndroid Build Coastguard Worker (LPBYTE)cszOclPath,
125*1cddb830SAndroid Build Coastguard Worker &dwOclPathSize);
126*1cddb830SAndroid Build Coastguard Worker if (ERROR_SUCCESS != result)
127*1cddb830SAndroid Build Coastguard Worker {
128*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to open sub key 0x%"PRIxDW"\n", result);
129*1cddb830SAndroid Build Coastguard Worker goto out;
130*1cddb830SAndroid Build Coastguard Worker }
131*1cddb830SAndroid Build Coastguard Worker
132*1cddb830SAndroid Build Coastguard Worker if (REG_SZ != dwLibraryNameType)
133*1cddb830SAndroid Build Coastguard Worker {
134*1cddb830SAndroid Build Coastguard Worker if (REG_MULTI_SZ == dwLibraryNameType)
135*1cddb830SAndroid Build Coastguard Worker {
136*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Accepting multi-string registry key type\n");
137*1cddb830SAndroid Build Coastguard Worker }
138*1cddb830SAndroid Build Coastguard Worker else
139*1cddb830SAndroid Build Coastguard Worker {
140*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Unexpected registry entry 0x%"PRIxDW"! continuing\n", dwLibraryNameType);
141*1cddb830SAndroid Build Coastguard Worker goto out;
142*1cddb830SAndroid Build Coastguard Worker }
143*1cddb830SAndroid Build Coastguard Worker }
144*1cddb830SAndroid Build Coastguard Worker
145*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" Path: %s\n", cszOclPath);
146*1cddb830SAndroid Build Coastguard Worker
147*1cddb830SAndroid Build Coastguard Worker bRet |= adapterAdd(cszOclPath, ZeroLuid);
148*1cddb830SAndroid Build Coastguard Worker }
149*1cddb830SAndroid Build Coastguard Worker
150*1cddb830SAndroid Build Coastguard Worker out:
151*1cddb830SAndroid Build Coastguard Worker free(cszOclPath);
152*1cddb830SAndroid Build Coastguard Worker
153*1cddb830SAndroid Build Coastguard Worker if (hkey)
154*1cddb830SAndroid Build Coastguard Worker {
155*1cddb830SAndroid Build Coastguard Worker result = RegCloseKey(hkey);
156*1cddb830SAndroid Build Coastguard Worker if (ERROR_SUCCESS != result)
157*1cddb830SAndroid Build Coastguard Worker {
158*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("WARNING: failed to close hkey 0x%"PRIxDW"\n", result);
159*1cddb830SAndroid Build Coastguard Worker }
160*1cddb830SAndroid Build Coastguard Worker }
161*1cddb830SAndroid Build Coastguard Worker
162*1cddb830SAndroid Build Coastguard Worker return bRet;
163*1cddb830SAndroid Build Coastguard Worker }
164*1cddb830SAndroid Build Coastguard Worker
ProbeDevice(DEVINST devnode)165*1cddb830SAndroid Build Coastguard Worker static DeviceProbeResult ProbeDevice(DEVINST devnode)
166*1cddb830SAndroid Build Coastguard Worker {
167*1cddb830SAndroid Build Coastguard Worker CONFIGRET ret;
168*1cddb830SAndroid Build Coastguard Worker ULONG ulStatus;
169*1cddb830SAndroid Build Coastguard Worker ULONG ulProblem;
170*1cddb830SAndroid Build Coastguard Worker
171*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_DevNode_Status(
172*1cddb830SAndroid Build Coastguard Worker &ulStatus,
173*1cddb830SAndroid Build Coastguard Worker &ulProblem,
174*1cddb830SAndroid Build Coastguard Worker devnode,
175*1cddb830SAndroid Build Coastguard Worker 0);
176*1cddb830SAndroid Build Coastguard Worker
177*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
178*1cddb830SAndroid Build Coastguard Worker {
179*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" WARNING: failed to probe the status of the device 0x%"PRIxDW"\n", ret);
180*1cddb830SAndroid Build Coastguard Worker return ProbeFailure;
181*1cddb830SAndroid Build Coastguard Worker }
182*1cddb830SAndroid Build Coastguard Worker
183*1cddb830SAndroid Build Coastguard Worker //
184*1cddb830SAndroid Build Coastguard Worker // Careful here, we need to check 2 scenarios:
185*1cddb830SAndroid Build Coastguard Worker // 1. DN_NEED_RESTART
186*1cddb830SAndroid Build Coastguard Worker // status flag indicates that a reboot is needed when an _already started_
187*1cddb830SAndroid Build Coastguard Worker // device cannot be stopped. This covers devices that are still started with their
188*1cddb830SAndroid Build Coastguard Worker // old KMD (because they couldn't be stopped/restarted) while the UMD is updated
189*1cddb830SAndroid Build Coastguard Worker // and possibly out of sync.
190*1cddb830SAndroid Build Coastguard Worker //
191*1cddb830SAndroid Build Coastguard Worker // 2. Status & DN_HAS_PROBLEM && Problem == CM_PROB_NEED_RESTART
192*1cddb830SAndroid Build Coastguard Worker // indicates that a reboot is needed when a _stopped device_ cannot be (re)started.
193*1cddb830SAndroid Build Coastguard Worker //
194*1cddb830SAndroid Build Coastguard Worker if (((ulStatus & DN_HAS_PROBLEM) && ulProblem == CM_PROB_NEED_RESTART) ||
195*1cddb830SAndroid Build Coastguard Worker ulStatus & DN_NEED_RESTART)
196*1cddb830SAndroid Build Coastguard Worker {
197*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" WARNING: device is pending reboot (0x%" PRIxUL "), skipping...\n", ulStatus);
198*1cddb830SAndroid Build Coastguard Worker return PendingReboot;
199*1cddb830SAndroid Build Coastguard Worker }
200*1cddb830SAndroid Build Coastguard Worker
201*1cddb830SAndroid Build Coastguard Worker return Valid;
202*1cddb830SAndroid Build Coastguard Worker }
203*1cddb830SAndroid Build Coastguard Worker
204*1cddb830SAndroid Build Coastguard Worker // Tries to look for the OpenCL key under the display devices and
205*1cddb830SAndroid Build Coastguard Worker // if not found, falls back to software component devices.
khrIcdOsVendorsEnumerateHKR(void)206*1cddb830SAndroid Build Coastguard Worker bool khrIcdOsVendorsEnumerateHKR(void)
207*1cddb830SAndroid Build Coastguard Worker {
208*1cddb830SAndroid Build Coastguard Worker CONFIGRET ret;
209*1cddb830SAndroid Build Coastguard Worker int iret;
210*1cddb830SAndroid Build Coastguard Worker bool foundOpenCLKey = false;
211*1cddb830SAndroid Build Coastguard Worker DEVINST devinst = 0;
212*1cddb830SAndroid Build Coastguard Worker DEVINST devchild = 0;
213*1cddb830SAndroid Build Coastguard Worker wchar_t *deviceIdList = NULL;
214*1cddb830SAndroid Build Coastguard Worker ULONG szBuffer = 0;
215*1cddb830SAndroid Build Coastguard Worker
216*1cddb830SAndroid Build Coastguard Worker OLECHAR display_adapter_guid_str[MAX_GUID_STRING_LEN];
217*1cddb830SAndroid Build Coastguard Worker #if defined(CM_GETIDLIST_FILTER_CLASS) && defined(CM_GETIDLIST_FILTER_PRESENT)
218*1cddb830SAndroid Build Coastguard Worker ULONG ulFlags = CM_GETIDLIST_FILTER_CLASS |
219*1cddb830SAndroid Build Coastguard Worker CM_GETIDLIST_FILTER_PRESENT;
220*1cddb830SAndroid Build Coastguard Worker #else
221*1cddb830SAndroid Build Coastguard Worker ULONG ulFlags = 0x300;
222*1cddb830SAndroid Build Coastguard Worker #endif
223*1cddb830SAndroid Build Coastguard Worker
224*1cddb830SAndroid Build Coastguard Worker iret = StringFromGUID2(
225*1cddb830SAndroid Build Coastguard Worker &GUID_DEVCLASS_DISPLAY,
226*1cddb830SAndroid Build Coastguard Worker display_adapter_guid_str,
227*1cddb830SAndroid Build Coastguard Worker MAX_GUID_STRING_LEN);
228*1cddb830SAndroid Build Coastguard Worker
229*1cddb830SAndroid Build Coastguard Worker if (MAX_GUID_STRING_LEN != iret)
230*1cddb830SAndroid Build Coastguard Worker {
231*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("StringFromGUID2 failed with %d\n", iret);
232*1cddb830SAndroid Build Coastguard Worker goto out;
233*1cddb830SAndroid Build Coastguard Worker }
234*1cddb830SAndroid Build Coastguard Worker
235*1cddb830SAndroid Build Coastguard Worker // Paranoia: we might have a new device added to the list between the call
236*1cddb830SAndroid Build Coastguard Worker // to CM_Get_Device_ID_List_Size() and the call to CM_Get_Device_ID_List().
237*1cddb830SAndroid Build Coastguard Worker do
238*1cddb830SAndroid Build Coastguard Worker {
239*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_Device_ID_List_SizeW(
240*1cddb830SAndroid Build Coastguard Worker &szBuffer,
241*1cddb830SAndroid Build Coastguard Worker display_adapter_guid_str,
242*1cddb830SAndroid Build Coastguard Worker ulFlags);
243*1cddb830SAndroid Build Coastguard Worker
244*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
245*1cddb830SAndroid Build Coastguard Worker {
246*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("CM_Get_Device_ID_List_size failed with 0x%"PRIxDW"\n", ret);
247*1cddb830SAndroid Build Coastguard Worker break;
248*1cddb830SAndroid Build Coastguard Worker }
249*1cddb830SAndroid Build Coastguard Worker
250*1cddb830SAndroid Build Coastguard Worker // "pulLen [out] Receives a value representing the required buffer
251*1cddb830SAndroid Build Coastguard Worker // size, in characters."
252*1cddb830SAndroid Build Coastguard Worker // So we need to allocate the right size in bytes but we still need
253*1cddb830SAndroid Build Coastguard Worker // to keep szBuffer as it was returned from CM_Get_Device_ID_List_Size so
254*1cddb830SAndroid Build Coastguard Worker // the call to CM_Get_Device_ID_List will receive the correct size.
255*1cddb830SAndroid Build Coastguard Worker deviceIdList = malloc(szBuffer * sizeof(wchar_t));
256*1cddb830SAndroid Build Coastguard Worker if (NULL == deviceIdList)
257*1cddb830SAndroid Build Coastguard Worker {
258*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to allocate %" PRIuUL " bytes for device ID strings\n", szBuffer);
259*1cddb830SAndroid Build Coastguard Worker break;
260*1cddb830SAndroid Build Coastguard Worker }
261*1cddb830SAndroid Build Coastguard Worker
262*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_Device_ID_ListW(
263*1cddb830SAndroid Build Coastguard Worker display_adapter_guid_str,
264*1cddb830SAndroid Build Coastguard Worker deviceIdList,
265*1cddb830SAndroid Build Coastguard Worker szBuffer,
266*1cddb830SAndroid Build Coastguard Worker ulFlags);
267*1cddb830SAndroid Build Coastguard Worker
268*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
269*1cddb830SAndroid Build Coastguard Worker {
270*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("CM_Get_Device_ID_List failed with 0x%"PRIxDW"\n", ret);
271*1cddb830SAndroid Build Coastguard Worker KHR_SAFE_RELEASE(deviceIdList);
272*1cddb830SAndroid Build Coastguard Worker }
273*1cddb830SAndroid Build Coastguard Worker } while (CR_BUFFER_SMALL == ret);
274*1cddb830SAndroid Build Coastguard Worker
275*1cddb830SAndroid Build Coastguard Worker if (NULL == deviceIdList)
276*1cddb830SAndroid Build Coastguard Worker {
277*1cddb830SAndroid Build Coastguard Worker goto out;
278*1cddb830SAndroid Build Coastguard Worker }
279*1cddb830SAndroid Build Coastguard Worker
280*1cddb830SAndroid Build Coastguard Worker for (PWSTR deviceId = deviceIdList; *deviceId; deviceId += wcslen(deviceId) + 1)
281*1cddb830SAndroid Build Coastguard Worker {
282*1cddb830SAndroid Build Coastguard Worker KHR_ICD_WIDE_TRACE(L"Device ID: %ls\n", deviceId);
283*1cddb830SAndroid Build Coastguard Worker
284*1cddb830SAndroid Build Coastguard Worker ret = CM_Locate_DevNodeW(&devinst, deviceId, 0);
285*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS == ret)
286*1cddb830SAndroid Build Coastguard Worker {
287*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" devinst: %lu\n", devinst);
288*1cddb830SAndroid Build Coastguard Worker }
289*1cddb830SAndroid Build Coastguard Worker else
290*1cddb830SAndroid Build Coastguard Worker {
291*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("CM_Locate_DevNode failed with 0x%"PRIxDW"\n", ret);
292*1cddb830SAndroid Build Coastguard Worker continue;
293*1cddb830SAndroid Build Coastguard Worker }
294*1cddb830SAndroid Build Coastguard Worker
295*1cddb830SAndroid Build Coastguard Worker if (ProbeDevice(devinst) != Valid)
296*1cddb830SAndroid Build Coastguard Worker {
297*1cddb830SAndroid Build Coastguard Worker continue;
298*1cddb830SAndroid Build Coastguard Worker }
299*1cddb830SAndroid Build Coastguard Worker
300*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" Trying to look for the key in the display adapter HKR...\n");
301*1cddb830SAndroid Build Coastguard Worker if (ReadOpenCLKey(devinst))
302*1cddb830SAndroid Build Coastguard Worker {
303*1cddb830SAndroid Build Coastguard Worker foundOpenCLKey = true;
304*1cddb830SAndroid Build Coastguard Worker continue;
305*1cddb830SAndroid Build Coastguard Worker }
306*1cddb830SAndroid Build Coastguard Worker
307*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" Could not find the key, proceeding to children software components...\n");
308*1cddb830SAndroid Build Coastguard Worker
309*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_Child(
310*1cddb830SAndroid Build Coastguard Worker &devchild,
311*1cddb830SAndroid Build Coastguard Worker devinst,
312*1cddb830SAndroid Build Coastguard Worker 0);
313*1cddb830SAndroid Build Coastguard Worker
314*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
315*1cddb830SAndroid Build Coastguard Worker {
316*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" CM_Get_Child returned 0x%"PRIxDW", skipping children...\n", ret);
317*1cddb830SAndroid Build Coastguard Worker }
318*1cddb830SAndroid Build Coastguard Worker else
319*1cddb830SAndroid Build Coastguard Worker {
320*1cddb830SAndroid Build Coastguard Worker do
321*1cddb830SAndroid Build Coastguard Worker {
322*1cddb830SAndroid Build Coastguard Worker wchar_t deviceInstanceID[MAX_DEVICE_ID_LEN] = { 0 };
323*1cddb830SAndroid Build Coastguard Worker GUID guid;
324*1cddb830SAndroid Build Coastguard Worker ULONG szGuid = sizeof(guid);
325*1cddb830SAndroid Build Coastguard Worker
326*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" devchild: %lu\n", devchild);
327*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_Device_IDW(
328*1cddb830SAndroid Build Coastguard Worker devchild,
329*1cddb830SAndroid Build Coastguard Worker deviceInstanceID,
330*1cddb830SAndroid Build Coastguard Worker sizeof(deviceInstanceID),
331*1cddb830SAndroid Build Coastguard Worker 0);
332*1cddb830SAndroid Build Coastguard Worker
333*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
334*1cddb830SAndroid Build Coastguard Worker {
335*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" CM_Get_Device_ID returned 0x%"PRIxDW", skipping device...\n", ret);
336*1cddb830SAndroid Build Coastguard Worker continue;
337*1cddb830SAndroid Build Coastguard Worker }
338*1cddb830SAndroid Build Coastguard Worker else
339*1cddb830SAndroid Build Coastguard Worker {
340*1cddb830SAndroid Build Coastguard Worker KHR_ICD_WIDE_TRACE(L" deviceInstanceID: %ls\n", deviceInstanceID);
341*1cddb830SAndroid Build Coastguard Worker }
342*1cddb830SAndroid Build Coastguard Worker
343*1cddb830SAndroid Build Coastguard Worker ret = CM_Get_DevNode_Registry_PropertyW(
344*1cddb830SAndroid Build Coastguard Worker devchild,
345*1cddb830SAndroid Build Coastguard Worker CM_DRP_CLASSGUID,
346*1cddb830SAndroid Build Coastguard Worker NULL,
347*1cddb830SAndroid Build Coastguard Worker (PBYTE)&guid,
348*1cddb830SAndroid Build Coastguard Worker &szGuid,
349*1cddb830SAndroid Build Coastguard Worker 0);
350*1cddb830SAndroid Build Coastguard Worker
351*1cddb830SAndroid Build Coastguard Worker if (CR_SUCCESS != ret)
352*1cddb830SAndroid Build Coastguard Worker {
353*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" CM_Get_DevNode_Registry_PropertyW returned 0x%"PRIxDW", skipping device...\n", ret);
354*1cddb830SAndroid Build Coastguard Worker continue;
355*1cddb830SAndroid Build Coastguard Worker }
356*1cddb830SAndroid Build Coastguard Worker else if (!IsEqualGUID(&OCL_GUID_DEVCLASS_SOFTWARECOMPONENT, &guid))
357*1cddb830SAndroid Build Coastguard Worker {
358*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE(" GUID does not match, skipping device...\n");
359*1cddb830SAndroid Build Coastguard Worker continue;
360*1cddb830SAndroid Build Coastguard Worker }
361*1cddb830SAndroid Build Coastguard Worker
362*1cddb830SAndroid Build Coastguard Worker if (ProbeDevice(devchild) != Valid)
363*1cddb830SAndroid Build Coastguard Worker {
364*1cddb830SAndroid Build Coastguard Worker continue;
365*1cddb830SAndroid Build Coastguard Worker }
366*1cddb830SAndroid Build Coastguard Worker
367*1cddb830SAndroid Build Coastguard Worker if (ReadOpenCLKey(devchild))
368*1cddb830SAndroid Build Coastguard Worker {
369*1cddb830SAndroid Build Coastguard Worker foundOpenCLKey = true;
370*1cddb830SAndroid Build Coastguard Worker break;
371*1cddb830SAndroid Build Coastguard Worker }
372*1cddb830SAndroid Build Coastguard Worker } while (CM_Get_Sibling(&devchild, devchild, 0) == CR_SUCCESS);
373*1cddb830SAndroid Build Coastguard Worker }
374*1cddb830SAndroid Build Coastguard Worker }
375*1cddb830SAndroid Build Coastguard Worker
376*1cddb830SAndroid Build Coastguard Worker out:
377*1cddb830SAndroid Build Coastguard Worker free(deviceIdList);
378*1cddb830SAndroid Build Coastguard Worker return foundOpenCLKey;
379*1cddb830SAndroid Build Coastguard Worker }
380