@ -260,8 +260,32 @@ etnaviv_gem_get_vram_mapping(struct etnaviv_gem_object *obj,
return NULL ;
}
int etnaviv_gem_get_iova ( struct etnaviv_gpu * gpu ,
struct drm_gem_object * obj , u32 * iova )
void etnaviv_gem_mapping_reference ( struct etnaviv_vram_mapping * mapping )
{
struct etnaviv_gem_object * etnaviv_obj = mapping - > object ;
drm_gem_object_reference ( & etnaviv_obj - > base ) ;
mutex_lock ( & etnaviv_obj - > lock ) ;
WARN_ON ( mapping - > use = = 0 ) ;
mapping - > use + = 1 ;
mutex_unlock ( & etnaviv_obj - > lock ) ;
}
void etnaviv_gem_mapping_unreference ( struct etnaviv_vram_mapping * mapping )
{
struct etnaviv_gem_object * etnaviv_obj = mapping - > object ;
mutex_lock ( & etnaviv_obj - > lock ) ;
WARN_ON ( mapping - > use = = 0 ) ;
mapping - > use - = 1 ;
mutex_unlock ( & etnaviv_obj - > lock ) ;
drm_gem_object_unreference_unlocked ( & etnaviv_obj - > base ) ;
}
struct etnaviv_vram_mapping * etnaviv_gem_mapping_get (
struct drm_gem_object * obj , struct etnaviv_gpu * gpu )
{
struct etnaviv_gem_object * etnaviv_obj = to_etnaviv_bo ( obj ) ;
struct etnaviv_vram_mapping * mapping ;
@ -329,28 +353,12 @@ int etnaviv_gem_get_iova(struct etnaviv_gpu *gpu,
out :
mutex_unlock ( & etnaviv_obj - > lock ) ;
if ( ! ret ) {
/* Take a reference on the object */
drm_gem_object_reference ( obj ) ;
* iova = mapping - > iova ;
}
return ret ;
}
void etnaviv_gem_put_iova ( struct etnaviv_gpu * gpu , struct drm_gem_object * obj )
{
struct etnaviv_gem_object * etnaviv_obj = to_etnaviv_bo ( obj ) ;
struct etnaviv_vram_mapping * mapping ;
mutex_lock ( & etnaviv_obj - > lock ) ;
mapping = etnaviv_gem_get_vram_mapping ( etnaviv_obj , gpu - > mmu ) ;
WARN_ON ( mapping - > use = = 0 ) ;
mapping - > use - = 1 ;
mutex_unlock ( & etnaviv_obj - > lock ) ;
if ( ret )
return ERR_PTR ( ret ) ;
drm_gem_object_unreference_unlocked ( obj ) ;
/* Take a reference on the object */
drm_gem_object_reference ( obj ) ;
return mapping ;
}
void * etnaviv_gem_vmap ( struct drm_gem_object * obj )