2021-12-01 11:45:29 +00:00
/*
2025-03-04 13:40:44 +00:00
* Copyright ( C ) 2021 - 2025 Intel Corporation
2021-12-01 11:45:29 +00:00
*
* SPDX - License - Identifier : MIT
*
*/
# include "shared/source/os_interface/linux/ioctl_helper.h"
2022-05-17 19:04:23 +00:00
# include "shared/source/debug_settings/debug_settings_manager.h"
2022-05-30 18:05:42 +00:00
# include "shared/source/execution_environment/root_device_environment.h"
2023-04-18 08:54:04 +00:00
# include "shared/source/helpers/compiler_product_helper.h"
2022-05-30 18:05:42 +00:00
# include "shared/source/helpers/hw_info.h"
2025-03-04 13:40:44 +00:00
# include "shared/source/memory_manager/allocation_properties.h"
2024-11-08 13:42:15 +00:00
# include "shared/source/memory_manager/gfx_partition.h"
# include "shared/source/os_interface/linux/drm_allocation.h"
# include "shared/source/os_interface/linux/drm_memory_manager.h"
2021-12-01 11:45:29 +00:00
# include "shared/source/os_interface/linux/drm_neo.h"
2022-05-17 17:16:13 +00:00
# include "shared/source/os_interface/linux/drm_wrappers.h"
2025-04-08 22:05:33 +00:00
# include "shared/source/os_interface/linux/file_descriptor.h"
2024-09-20 17:16:45 +00:00
# include "shared/source/os_interface/linux/os_context_linux.h"
2024-03-09 01:22:47 +00:00
# include "shared/source/os_interface/linux/sys_calls.h"
2023-12-27 16:23:42 +00:00
2024-03-28 13:31:57 +00:00
# include "drm.h"
2021-12-01 11:45:29 +00:00
2022-11-18 14:38:56 +00:00
# include <fcntl.h>
2022-05-17 19:04:23 +00:00
# include <sstream>
2021-12-01 11:45:29 +00:00
namespace NEO {
2024-12-18 09:45:58 +00:00
std : : optional < std : : function < std : : unique_ptr < IoctlHelper > ( Drm & drm ) > > ioctlHelperFactory [ IGFX_MAX_PRODUCT ] = { } ;
2024-09-03 17:20:54 +00:00
void IoctlHelper : : setExternalContext ( ExternalCtx * ctx ) {
externalCtx = ctx ;
}
2023-01-18 20:22:32 +00:00
int IoctlHelper : : ioctl ( DrmIoctl request , void * arg ) {
2024-09-03 17:20:54 +00:00
if ( externalCtx ) {
return externalCtx - > ioctl ( externalCtx - > handle , drm . getFileDescriptor ( ) , getIoctlRequestValue ( request ) , arg , false ) ;
}
2022-06-29 16:49:29 +00:00
return drm . ioctl ( request , arg ) ;
2021-12-01 11:45:29 +00:00
}
2024-03-09 01:22:47 +00:00
int IoctlHelper : : ioctl ( int fd , DrmIoctl request , void * arg ) {
return NEO : : SysCalls : : ioctl ( fd , getIoctlRequestValue ( request ) , arg ) ;
}
2023-05-22 15:15:17 +00:00
void IoctlHelper : : setupIpVersion ( ) {
auto & rootDeviceEnvironment = drm . getRootDeviceEnvironment ( ) ;
auto & hwInfo = * rootDeviceEnvironment . getMutableHardwareInfo ( ) ;
2023-04-18 08:54:04 +00:00
auto & compilerProductHelper = rootDeviceEnvironment . getHelper < CompilerProductHelper > ( ) ;
hwInfo . ipVersion . value = compilerProductHelper . getHwIpVersion ( hwInfo ) ;
2023-05-22 15:15:17 +00:00
}
2022-07-26 18:11:27 +00:00
uint32_t IoctlHelper : : getFlagsForPrimeHandleToFd ( ) const {
return DRM_CLOEXEC | DRM_RDWR ;
}
2025-04-08 22:05:33 +00:00
void IoctlHelper : : writeCcsMode ( const std : : string & gtFile , uint32_t ccsMode ,
std : : vector < std : : tuple < std : : string , uint32_t > > & deviceCcsModeVec ) {
std : : string ccsFile = gtFile + " /ccs_mode " ;
auto fd = FileDescriptor ( ccsFile . c_str ( ) , O_RDWR ) ;
if ( fd < 0 ) {
if ( ( errno = = - EACCES ) | | ( errno = = - EPERM ) ) {
fprintf ( stderr , " No read and write permissions for %s, System administrator needs to grant permissions to allow modification of this file from user space \n " , ccsFile . c_str ( ) ) ;
fprintf ( stdout , " No read and write permissions for %s, System administrator needs to grant permissions to allow modification of this file from user space \n " , ccsFile . c_str ( ) ) ;
}
return ;
}
uint32_t ccsValue = 0 ;
ssize_t ret = SysCalls : : read ( fd , & ccsValue , sizeof ( uint32_t ) ) ;
PRINT_DEBUG_STRING ( debugManager . flags . PrintDebugMessages . get ( ) & & ( ret < 0 ) , stderr , " read() on %s failed errno = %d | ret = %d \n " ,
ccsFile . c_str ( ) , errno , ret ) ;
if ( ( ret < 0 ) | | ( ccsValue = = ccsMode ) ) {
return ;
}
do {
ret = SysCalls : : write ( fd , & ccsMode , sizeof ( uint32_t ) ) ;
} while ( ret = = - 1 & & errno = = - EBUSY ) ;
if ( ret > 0 ) {
deviceCcsModeVec . emplace_back ( ccsFile , ccsValue ) ;
}
} ;
2022-06-01 18:53:00 +00:00
unsigned int IoctlHelper : : getIoctlRequestValueBase ( DrmIoctl ioctlRequest ) const {
switch ( ioctlRequest ) {
2023-12-12 08:48:32 +00:00
case DrmIoctl : : gemClose :
2022-06-01 18:53:00 +00:00
return DRM_IOCTL_GEM_CLOSE ;
2023-12-12 08:48:32 +00:00
case DrmIoctl : : primeFdToHandle :
2022-06-01 18:53:00 +00:00
return DRM_IOCTL_PRIME_FD_TO_HANDLE ;
2023-12-12 08:48:32 +00:00
case DrmIoctl : : primeHandleToFd :
2022-06-01 18:53:00 +00:00
return DRM_IOCTL_PRIME_HANDLE_TO_FD ;
2025-05-13 16:44:10 +00:00
case DrmIoctl : : syncObjFdToHandle :
return DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE ;
2025-05-18 18:08:22 +00:00
case DrmIoctl : : syncObjWait :
return DRM_IOCTL_SYNCOBJ_WAIT ;
case DrmIoctl : : syncObjSignal :
return DRM_IOCTL_SYNCOBJ_SIGNAL ;
2025-05-22 23:13:11 +00:00
case DrmIoctl : : syncObjTimelineWait :
return DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT ;
case DrmIoctl : : syncObjTimelineSignal :
return DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL ;
2022-06-01 18:53:00 +00:00
default :
UNRECOVERABLE_IF ( true ) ;
return 0u ;
}
}
2022-07-14 15:32:26 +00:00
std : : string IoctlHelper : : getIoctlStringBase ( DrmIoctl ioctlRequest ) const {
2022-06-06 15:48:31 +00:00
switch ( ioctlRequest ) {
2023-12-12 08:48:32 +00:00
case DrmIoctl : : gemClose :
2022-06-06 15:48:31 +00:00
return " DRM_IOCTL_GEM_CLOSE " ;
2023-12-12 08:48:32 +00:00
case DrmIoctl : : primeFdToHandle :
2022-06-06 15:48:31 +00:00
return " DRM_IOCTL_PRIME_FD_TO_HANDLE " ;
2023-12-12 08:48:32 +00:00
case DrmIoctl : : primeHandleToFd :
2022-06-06 15:48:31 +00:00
return " DRM_IOCTL_PRIME_HANDLE_TO_FD " ;
2025-05-13 16:44:10 +00:00
case DrmIoctl : : syncObjFdToHandle :
return " DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE " ;
2025-05-18 18:08:22 +00:00
case DrmIoctl : : syncObjWait :
return " DRM_IOCTL_SYNCOBJ_WAIT " ;
case DrmIoctl : : syncObjSignal :
return " DRM_IOCTL_SYNCOBJ_SIGNAL " ;
2025-05-22 23:13:11 +00:00
case DrmIoctl : : syncObjTimelineWait :
return " DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT " ;
case DrmIoctl : : syncObjTimelineSignal :
return " DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL " ;
2022-07-14 15:32:26 +00:00
default :
UNRECOVERABLE_IF ( true ) ;
return " " ;
2022-06-06 15:48:31 +00:00
}
}
2022-10-18 18:37:33 +00:00
bool IoctlHelper : : checkIfIoctlReinvokeRequired ( int error , DrmIoctl ioctlRequest ) const {
return ( error = = EINTR | | error = = EAGAIN | | error = = EBUSY | | error = = - EBUSY ) ;
}
2024-09-20 17:16:45 +00:00
uint64_t * IoctlHelper : : getPagingFenceAddress ( uint32_t vmHandleId , OsContextLinux * osContext ) {
if ( osContext ) {
return osContext - > getFenceAddr ( vmHandleId ) ;
} else {
return drm . getFenceAddr ( vmHandleId ) ;
}
}
2025-05-21 13:12:14 +00:00
uint64_t IoctlHelper : : acquireGpuRange ( DrmMemoryManager & memoryManager , size_t & size , uint32_t rootDeviceIndex , AllocationType allocType , HeapIndex heapIndex ) {
2024-11-08 13:42:15 +00:00
if ( heapIndex > = HeapIndex : : totalHeaps ) {
return 0 ;
}
return memoryManager . acquireGpuRange ( size , rootDeviceIndex , heapIndex ) ;
}
2025-05-21 13:12:14 +00:00
void IoctlHelper : : releaseGpuRange ( DrmMemoryManager & memoryManager , void * address , size_t size , uint32_t rootDeviceIndex , AllocationType allocType ) {
2024-11-08 13:42:15 +00:00
memoryManager . releaseGpuRange ( address , size , rootDeviceIndex ) ;
}
void * IoctlHelper : : mmapFunction ( DrmMemoryManager & memoryManager , void * ptr , size_t size , int prot , int flags , int fd , off_t offset ) {
return memoryManager . mmapFunction ( ptr , size , prot , flags , fd , offset ) ;
}
int IoctlHelper : : munmapFunction ( DrmMemoryManager & memoryManager , void * ptr , size_t size ) {
return memoryManager . munmapFunction ( ptr , size ) ;
}
void IoctlHelper : : registerMemoryToUnmap ( DrmAllocation & allocation , void * pointer , size_t size , DrmAllocation : : MemoryUnmapFunction unmapFunction ) {
return allocation . registerMemoryToUnmap ( pointer , size , unmapFunction ) ;
}
2024-11-22 17:02:47 +00:00
BufferObject * IoctlHelper : : allocUserptr ( DrmMemoryManager & memoryManager , const AllocationData & allocData , uintptr_t address , size_t size , uint32_t rootDeviceIndex ) {
2025-03-04 13:40:44 +00:00
return memoryManager . allocUserptr ( address , size , allocData . type , rootDeviceIndex ) ;
2024-11-15 20:48:49 +00:00
}
2021-12-01 11:45:29 +00:00
} // namespace NEO