2021-12-08 10:10:27 +00:00
/*
* Copyright ( C ) 2021 Intel Corporation
*
* SPDX - License - Identifier : MIT
*
*/
# include "shared/source/debug_settings/debug_settings_manager.h"
2021-12-10 12:55:55 +00:00
# include "shared/source/helpers/debug_helpers.h"
# include "shared/source/os_interface/linux/cache_info.h"
2021-12-08 10:10:27 +00:00
# include "shared/source/os_interface/linux/ioctl_helper.h"
# include "third_party/uapi/prelim/drm/i915_drm.h"
2021-12-10 12:55:55 +00:00
# include <cerrno>
# include <cstring>
2021-12-15 11:08:44 +00:00
# include <sys/ioctl.h>
2021-12-10 12:55:55 +00:00
2021-12-08 10:10:27 +00:00
namespace NEO {
2021-12-22 14:25:53 +00:00
uint32_t IoctlHelperPrelim20 : : createGemExt ( Drm * drm , const std : : vector < MemoryClassInstance > & memClassInstances , size_t allocSize , uint32_t & handle ) {
uint32_t regionsSize = static_cast < uint32_t > ( memClassInstances . size ( ) ) ;
2021-12-28 13:19:45 +00:00
std : : vector < prelim_drm_i915_gem_memory_class_instance > regions ( regionsSize ) ;
2021-12-22 14:25:53 +00:00
for ( uint32_t i = 0 ; i < regionsSize ; i + + ) {
2021-12-28 13:19:45 +00:00
regions [ i ] . memory_class = memClassInstances [ i ] . memoryClass ;
regions [ i ] . memory_instance = memClassInstances [ i ] . memoryInstance ;
2021-12-22 14:25:53 +00:00
}
2021-12-08 10:10:27 +00:00
prelim_drm_i915_gem_object_param regionParam { } ;
2021-12-22 14:25:53 +00:00
regionParam . size = regionsSize ;
2021-12-28 13:19:45 +00:00
regionParam . data = reinterpret_cast < uintptr_t > ( regions . data ( ) ) ;
2021-12-08 10:10:27 +00:00
regionParam . param = PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS ;
prelim_drm_i915_gem_create_ext_setparam setparamRegion { } ;
setparamRegion . base . name = PRELIM_I915_GEM_CREATE_EXT_SETPARAM ;
setparamRegion . param = regionParam ;
prelim_drm_i915_gem_create_ext createExt { } ;
createExt . size = allocSize ;
createExt . extensions = reinterpret_cast < uintptr_t > ( & setparamRegion ) ;
printDebugString ( DebugManager . flags . PrintBOCreateDestroyResult . get ( ) , stdout , " Performing GEM_CREATE_EXT with { size: %lu, param: 0x%llX " ,
allocSize , regionParam . param ) ;
if ( DebugManager . flags . PrintBOCreateDestroyResult . get ( ) ) {
2021-12-22 14:25:53 +00:00
for ( uint32_t i = 0 ; i < regionsSize ; i + + ) {
2021-12-28 13:19:45 +00:00
auto region = regions [ i ] ;
2021-12-08 10:10:27 +00:00
printDebugString ( DebugManager . flags . PrintBOCreateDestroyResult . get ( ) , stdout , " , memory class: %d, memory instance: %d " ,
region . memory_class , region . memory_instance ) ;
}
printDebugString ( DebugManager . flags . PrintBOCreateDestroyResult . get ( ) , stdout , " %s " , " } \n " ) ;
}
auto ret = IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_CREATE_EXT , & createExt ) ;
printDebugString ( DebugManager . flags . PrintBOCreateDestroyResult . get ( ) , stdout , " GEM_CREATE_EXT has returned: %d BO-%u with size: %lu \n " , ret , createExt . handle , createExt . size ) ;
handle = createExt . handle ;
return ret ;
}
2021-12-22 14:25:53 +00:00
std : : vector < MemoryRegion > IoctlHelperPrelim20 : : translateToMemoryRegions ( const std : : vector < uint8_t > & regionInfo ) {
auto * data = reinterpret_cast < const prelim_drm_i915_query_memory_regions * > ( regionInfo . data ( ) ) ;
auto memRegions = std : : vector < MemoryRegion > ( data - > num_regions ) ;
2021-12-17 13:26:04 +00:00
for ( uint32_t i = 0 ; i < data - > num_regions ; i + + ) {
memRegions [ i ] . probedSize = data - > regions [ i ] . probed_size ;
memRegions [ i ] . unallocatedSize = data - > regions [ i ] . unallocated_size ;
memRegions [ i ] . region . memoryClass = data - > regions [ i ] . region . memory_class ;
memRegions [ i ] . region . memoryInstance = data - > regions [ i ] . region . memory_instance ;
}
return memRegions ;
2021-12-08 10:10:27 +00:00
}
2021-12-10 12:55:55 +00:00
CacheRegion IoctlHelperPrelim20 : : closAlloc ( Drm * drm ) {
struct prelim_drm_i915_gem_clos_reserve clos = { } ;
int ret = IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_CLOS_RESERVE , & clos ) ;
if ( ret ! = 0 ) {
int err = errno ;
printDebugString ( DebugManager . flags . PrintDebugMessages . get ( ) , stderr , " ioctl(I915_GEM_CLOS_RESERVE) failed with %d. errno=%d(%s) \n " , ret , err , strerror ( err ) ) ;
DEBUG_BREAK_IF ( true ) ;
return CacheRegion : : None ;
}
return static_cast < CacheRegion > ( clos . clos_index ) ;
}
uint16_t IoctlHelperPrelim20 : : closAllocWays ( Drm * drm , CacheRegion closIndex , uint16_t cacheLevel , uint16_t numWays ) {
struct prelim_drm_i915_gem_cache_reserve cache = { } ;
cache . clos_index = static_cast < uint16_t > ( closIndex ) ;
cache . cache_level = cacheLevel ;
cache . num_ways = numWays ;
int ret = IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_CACHE_RESERVE , & cache ) ;
if ( ret ! = 0 ) {
int err = errno ;
PRINT_DEBUG_STRING ( DebugManager . flags . PrintDebugMessages . get ( ) , stderr , " ioctl(I915_GEM_CACHE_RESERVE) failed with %d. errno=%d(%s) \n " , ret , err , strerror ( err ) ) ;
return 0 ;
}
return cache . num_ways ;
}
CacheRegion IoctlHelperPrelim20 : : closFree ( Drm * drm , CacheRegion closIndex ) {
struct prelim_drm_i915_gem_clos_free clos = { } ;
clos . clos_index = static_cast < uint16_t > ( closIndex ) ;
int ret = IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_CLOS_FREE , & clos ) ;
if ( ret ! = 0 ) {
int err = errno ;
printDebugString ( DebugManager . flags . PrintDebugMessages . get ( ) , stderr , " ioctl(I915_GEM_CLOS_FREE) failed with %d. errno=%d(%s) \n " , ret , err , strerror ( err ) ) ;
DEBUG_BREAK_IF ( true ) ;
return CacheRegion : : None ;
}
return closIndex ;
}
2021-12-14 09:46:01 +00:00
int IoctlHelperPrelim20 : : waitUserFence ( Drm * drm , uint32_t ctxId , uint64_t address ,
uint64_t value , uint32_t dataWidth , int64_t timeout , uint16_t flags ) {
prelim_drm_i915_gem_wait_user_fence wait = { } ;
wait . ctx_id = ctxId ;
wait . flags = flags ;
switch ( dataWidth ) {
case 3u :
wait . mask = PRELIM_I915_UFENCE_WAIT_U64 ;
break ;
case 2u :
wait . mask = PRELIM_I915_UFENCE_WAIT_U32 ;
break ;
case 1u :
wait . mask = PRELIM_I915_UFENCE_WAIT_U16 ;
break ;
default :
wait . mask = PRELIM_I915_UFENCE_WAIT_U8 ;
break ;
}
wait . op = PRELIM_I915_UFENCE_WAIT_GTE ;
wait . addr = address ;
wait . value = value ;
wait . timeout = timeout ;
return IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_WAIT_USER_FENCE , & wait ) ;
}
uint32_t IoctlHelperPrelim20 : : getHwConfigIoctlVal ( ) {
return PRELIM_DRM_I915_QUERY_HWCONFIG_TABLE ;
}
2021-12-14 14:09:19 +00:00
uint32_t IoctlHelperPrelim20 : : getAtomicAdvise ( bool isNonAtomic ) {
return isNonAtomic ? PRELIM_I915_VM_ADVISE_ATOMIC_NONE : PRELIM_I915_VM_ADVISE_ATOMIC_SYSTEM ;
}
uint32_t IoctlHelperPrelim20 : : getPreferredLocationAdvise ( ) {
return PRELIM_I915_VM_ADVISE_PREFERRED_LOCATION ;
}
bool IoctlHelperPrelim20 : : setVmBoAdvise ( Drm * drm , int32_t handle , uint32_t attribute , void * region ) {
prelim_drm_i915_gem_vm_advise vmAdvise { } ;
vmAdvise . handle = handle ;
vmAdvise . attribute = attribute ;
if ( region ! = nullptr ) {
vmAdvise . region = * reinterpret_cast < prelim_drm_i915_gem_memory_class_instance * > ( region ) ;
}
int ret = IoctlHelper : : ioctl ( drm , PRELIM_DRM_IOCTL_I915_GEM_VM_ADVISE , & vmAdvise ) ;
if ( ret ! = 0 ) {
int err = errno ;
PRINT_DEBUG_STRING ( DebugManager . flags . PrintDebugMessages . get ( ) , stderr , " ioctl(PRELIM_DRM_I915_GEM_VM_ADVISE) failed with %d. errno=%d(%s) \n " , ret , err , strerror ( err ) ) ;
DEBUG_BREAK_IF ( true ) ;
return false ;
}
return true ;
}
2021-12-14 12:41:38 +00:00
uint32_t IoctlHelperPrelim20 : : getDirectSubmissionFlag ( ) {
return PRELIM_I915_CONTEXT_CREATE_FLAGS_ULLS ;
}
2021-12-28 15:56:13 +00:00
int32_t IoctlHelperPrelim20 : : getMemRegionsIoctlVal ( ) {
return PRELIM_DRM_I915_QUERY_MEMORY_REGIONS ;
}
2021-12-08 10:10:27 +00:00
} // namespace NEO