xref: /aosp_15_r20/external/OpenCL-ICD-Loader/loader/windows/icd_windows_hkr.c (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
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