@@ -302,10 +302,50 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
302302 };
303303
304304 // These are not implemented by the plugin interface
305- if (PropName == OL_DEVICE_INFO_PLATFORM)
305+ switch (PropName) {
306+ case OL_DEVICE_INFO_PLATFORM:
306307 return Info.write <void *>(Device->Platform );
307- if (PropName == OL_DEVICE_INFO_TYPE)
308+
309+ case OL_DEVICE_INFO_TYPE:
308310 return Info.write <ol_device_type_t >(OL_DEVICE_TYPE_GPU);
311+
312+ case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
313+ case OL_DEVICE_INFO_DOUBLE_FP_CONFIG: {
314+ ol_device_fp_capability_flags_t flags{0 };
315+ flags |= OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
316+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
317+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
318+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
319+ OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
320+ OL_DEVICE_FP_CAPABILITY_FLAG_DENORM |
321+ OL_DEVICE_FP_CAPABILITY_FLAG_FMA;
322+ return Info.write (flags);
323+ }
324+
325+ case OL_DEVICE_INFO_HALF_FP_CONFIG:
326+ return Info.write <ol_device_fp_capability_flags_t >(0 );
327+
328+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
329+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
330+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
331+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
332+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
333+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
334+ return Info.write <uint32_t >(1 );
335+
336+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
337+ return Info.write <uint32_t >(0 );
338+
339+ // None of the existing plugins specify a limit on a single allocation,
340+ // so return the global memory size instead
341+ case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
342+ PropName = OL_DEVICE_INFO_GLOBAL_MEM_SIZE;
343+ break ;
344+
345+ default :
346+ break ;
347+ }
348+
309349 if (PropName >= OL_DEVICE_INFO_LAST)
310350 return createOffloadError (ErrorCode::INVALID_ENUMERATION,
311351 " getDeviceInfo enum '%i' is invalid" , PropName);
@@ -316,6 +356,7 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
316356 " plugin did not provide a response for this information" );
317357 auto Entry = *EntryOpt;
318358
359+ // Retrieve properties from the plugin interface
319360 switch (PropName) {
320361 case OL_DEVICE_INFO_NAME:
321362 case OL_DEVICE_INFO_VENDOR:
@@ -327,7 +368,20 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device,
327368 return Info.writeString (std::get<std::string>(Entry->Value ).c_str ());
328369 }
329370
330- case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE: {
371+ case OL_DEVICE_INFO_GLOBAL_MEM_SIZE: {
372+ // Uint64 values
373+ if (!std::holds_alternative<uint64_t >(Entry->Value ))
374+ return makeError (ErrorCode::BACKEND_FAILURE,
375+ " plugin returned incorrect type" );
376+ return Info.write (std::get<uint64_t >(Entry->Value ));
377+ }
378+
379+ case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
380+ case OL_DEVICE_INFO_VENDOR_ID:
381+ case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
382+ case OL_DEVICE_INFO_ADDRESS_BITS:
383+ case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
384+ case OL_DEVICE_INFO_MEMORY_CLOCK_RATE: {
331385 // Uint32 values
332386 if (!std::holds_alternative<uint64_t >(Entry->Value ))
333387 return makeError (ErrorCode::BACKEND_FAILURE,
@@ -389,9 +443,40 @@ Error olGetDeviceInfoImplDetailHost(ol_device_handle_t Device,
389443 case OL_DEVICE_INFO_DRIVER_VERSION:
390444 return Info.writeString (LLVM_VERSION_STRING);
391445 case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE:
392- return Info.write <uint64_t >(1 );
446+ return Info.write <uint32_t >(1 );
393447 case OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE_PER_DIMENSION:
394448 return Info.write <ol_dimensions_t >(ol_dimensions_t {1 , 1 , 1 });
449+ case OL_DEVICE_INFO_VENDOR_ID:
450+ return Info.write <uint32_t >(0 );
451+ case OL_DEVICE_INFO_NUM_COMPUTE_UNITS:
452+ return Info.write <uint32_t >(1 );
453+ case OL_DEVICE_INFO_SINGLE_FP_CONFIG:
454+ case OL_DEVICE_INFO_DOUBLE_FP_CONFIG:
455+ return Info.write <ol_device_fp_capability_flags_t >(
456+ OL_DEVICE_FP_CAPABILITY_FLAG_CORRECTLY_ROUNDED_DIVIDE_SQRT |
457+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST |
458+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_ZERO |
459+ OL_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_INF |
460+ OL_DEVICE_FP_CAPABILITY_FLAG_INF_NAN |
461+ OL_DEVICE_FP_CAPABILITY_FLAG_DENORM | OL_DEVICE_FP_CAPABILITY_FLAG_FMA);
462+ case OL_DEVICE_INFO_HALF_FP_CONFIG:
463+ return Info.write <ol_device_fp_capability_flags_t >(0 );
464+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR:
465+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT:
466+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT:
467+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG:
468+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT:
469+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE:
470+ return Info.write <uint32_t >(1 );
471+ case OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF:
472+ return Info.write <uint32_t >(0 );
473+ case OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY:
474+ case OL_DEVICE_INFO_MEMORY_CLOCK_RATE:
475+ case OL_DEVICE_INFO_ADDRESS_BITS:
476+ return Info.write <uint32_t >(std::numeric_limits<uintptr_t >::digits);
477+ case OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE:
478+ case OL_DEVICE_INFO_GLOBAL_MEM_SIZE:
479+ return Info.write <uint64_t >(0 );
395480 default :
396481 return createOffloadError (ErrorCode::INVALID_ENUMERATION,
397482 " getDeviceInfo enum '%i' is invalid" , PropName);
0 commit comments