@ -507,14 +507,16 @@ static int amdgpu_gem_va_check(void *param, struct amdgpu_bo *bo)
* amdgpu_gem_va_update_vm - update the bo_va in its VM
* amdgpu_gem_va_update_vm - update the bo_va in its VM
*
*
* @ adev : amdgpu_device pointer
* @ adev : amdgpu_device pointer
* @ vm : vm to update
* @ bo_va : bo_va to update
* @ bo_va : bo_va to update
* @ list : validation list
* @ list : validation list
* @ operation : map or unmap
* @ operation : map , unmap or clear
*
*
* Update the bo_va directly after setting its address . Errors are not
* Update the bo_va directly after setting its address . Errors are not
* vital here , so they are not reported back to userspace .
* vital here , so they are not reported back to userspace .
*/
*/
static void amdgpu_gem_va_update_vm ( struct amdgpu_device * adev ,
static void amdgpu_gem_va_update_vm ( struct amdgpu_device * adev ,
struct amdgpu_vm * vm ,
struct amdgpu_bo_va * bo_va ,
struct amdgpu_bo_va * bo_va ,
struct list_head * list ,
struct list_head * list ,
uint32_t operation )
uint32_t operation )
@ -529,16 +531,16 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
goto error ;
goto error ;
}
}
r = amdgpu_vm_validate_pt_bos ( adev , bo_va - > vm , amdgpu_gem_va_check ,
r = amdgpu_vm_validate_pt_bos ( adev , vm , amdgpu_gem_va_check ,
NULL ) ;
NULL ) ;
if ( r )
if ( r )
goto error ;
goto error ;
r = amdgpu_vm_update_page_directory ( adev , bo_va - > vm ) ;
r = amdgpu_vm_update_page_directory ( adev , vm ) ;
if ( r )
if ( r )
goto error ;
goto error ;
r = amdgpu_vm_clear_freed ( adev , bo_va - > vm ) ;
r = amdgpu_vm_clear_freed ( adev , vm ) ;
if ( r )
if ( r )
goto error ;
goto error ;
@ -592,6 +594,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
switch ( args - > operation ) {
switch ( args - > operation ) {
case AMDGPU_VA_OP_MAP :
case AMDGPU_VA_OP_MAP :
case AMDGPU_VA_OP_UNMAP :
case AMDGPU_VA_OP_UNMAP :
case AMDGPU_VA_OP_CLEAR :
break ;
break ;
default :
default :
dev_err ( & dev - > pdev - > dev , " unsupported operation %d \n " ,
dev_err ( & dev - > pdev - > dev , " unsupported operation %d \n " ,
@ -600,7 +603,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
}
}
INIT_LIST_HEAD ( & list ) ;
INIT_LIST_HEAD ( & list ) ;
if ( ! ( args - > flags & AMDGPU_VM_PAGE_PRT ) ) {
if ( ( args - > operation ! = AMDGPU_VA_OP_CLEAR ) & &
! ( args - > flags & AMDGPU_VM_PAGE_PRT ) ) {
gobj = drm_gem_object_lookup ( filp , args - > handle ) ;
gobj = drm_gem_object_lookup ( filp , args - > handle ) ;
if ( gobj = = NULL )
if ( gobj = = NULL )
return - ENOENT ;
return - ENOENT ;
@ -625,8 +629,10 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
r = - ENOENT ;
r = - ENOENT ;
goto error_backoff ;
goto error_backoff ;
}
}
} else {
} else if ( args - > operation ! = AMDGPU_VA_OP_CLEAR ) {
bo_va = fpriv - > prt_va ;
bo_va = fpriv - > prt_va ;
} else {
bo_va = NULL ;
}
}
switch ( args - > operation ) {
switch ( args - > operation ) {
@ -644,11 +650,18 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
case AMDGPU_VA_OP_UNMAP :
case AMDGPU_VA_OP_UNMAP :
r = amdgpu_vm_bo_unmap ( adev , bo_va , args - > va_address ) ;
r = amdgpu_vm_bo_unmap ( adev , bo_va , args - > va_address ) ;
break ;
break ;
case AMDGPU_VA_OP_CLEAR :
r = amdgpu_vm_bo_clear_mappings ( adev , & fpriv - > vm ,
args - > va_address ,
args - > map_size ) ;
break ;
default :
default :
break ;
break ;
}
}
if ( ! r & & ! ( args - > flags & AMDGPU_VM_DELAY_UPDATE ) & & ! amdgpu_vm_debug )
if ( ! r & & ! ( args - > flags & AMDGPU_VM_DELAY_UPDATE ) & & ! amdgpu_vm_debug )
amdgpu_gem_va_update_vm ( adev , bo_va , & list , args - > operation ) ;
amdgpu_gem_va_update_vm ( adev , & fpriv - > vm , bo_va , & list ,
args - > operation ) ;
error_backoff :
error_backoff :
ttm_eu_backoff_reservation ( & ticket , & list ) ;
ttm_eu_backoff_reservation ( & ticket , & list ) ;