mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-20 21:00:12 +01:00
Have TTM create and reference ioctl call return the actual TTM size.
This commit is contained in:
parent
4fa58aa152
commit
ac26b51503
2 changed files with 22 additions and 11 deletions
|
|
@ -1363,14 +1363,23 @@ extern int drm_bo_ioctl(DRM_IOCTL_ARGS);
|
||||||
static __inline__ unsigned long combine_64(uint32_t lo, uint32_t hi)
|
static __inline__ unsigned long combine_64(uint32_t lo, uint32_t hi)
|
||||||
{
|
{
|
||||||
unsigned long ret = lo;
|
unsigned long ret = lo;
|
||||||
|
#if (BITS_PER_LONG == 64)
|
||||||
if (sizeof(ret) > 4) {
|
ret |= (hi << 32);
|
||||||
int shift = 32;
|
#endif
|
||||||
lo |= (hi << shift);
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __inline__ void split_32(unsigned long val, uint32_t *lo, uint32_t *hi)
|
||||||
|
{
|
||||||
|
*lo = val & 0xFFFFFFFFUL;
|
||||||
|
#if (BITS_PER_LONG == 64)
|
||||||
|
*hi = val >> 32;
|
||||||
|
#else
|
||||||
|
*hi = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Inline replacements for DRM_IOREMAP macros */
|
/* Inline replacements for DRM_IOREMAP macros */
|
||||||
static __inline__ void drm_core_ioremap(struct drm_map *map,
|
static __inline__ void drm_core_ioremap(struct drm_map *map,
|
||||||
struct drm_device *dev)
|
struct drm_device *dev)
|
||||||
|
|
|
||||||
|
|
@ -828,7 +828,7 @@ int drm_ttm_object_create(drm_device_t *dev, unsigned long size,
|
||||||
map->offset = ttm->lhandle;
|
map->offset = ttm->lhandle;
|
||||||
map->type = _DRM_TTM;
|
map->type = _DRM_TTM;
|
||||||
map->flags = _DRM_REMOVABLE;
|
map->flags = _DRM_REMOVABLE;
|
||||||
map->size = size;
|
map->size = ttm->num_pages * PAGE_SIZE;
|
||||||
map->handle = (void *)object;
|
map->handle = (void *)object;
|
||||||
|
|
||||||
if (drm_ht_just_insert_please(&dev->map_hash, &list->hash,
|
if (drm_ht_just_insert_please(&dev->map_hash, &list->hash,
|
||||||
|
|
@ -877,9 +877,7 @@ int drm_ttm_ioctl(drm_file_t *priv, drm_ttm_arg_t __user *data)
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
arg.handle = entry->base.hash.key;
|
atomic_inc(&entry->usage);
|
||||||
arg.user_token = entry->map_list.user_token;
|
|
||||||
mutex_unlock(&dev->struct_mutex);
|
|
||||||
break;
|
break;
|
||||||
case drm_ttm_reference:
|
case drm_ttm_reference:
|
||||||
ret = drm_user_object_ref(priv, arg.handle, drm_ttm_type, &uo);
|
ret = drm_user_object_ref(priv, arg.handle, drm_ttm_type, &uo);
|
||||||
|
|
@ -888,8 +886,6 @@ int drm_ttm_ioctl(drm_file_t *priv, drm_ttm_arg_t __user *data)
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
uo = drm_lookup_user_object(priv, arg.handle);
|
uo = drm_lookup_user_object(priv, arg.handle);
|
||||||
entry = drm_user_object_entry(uo, drm_ttm_object_t, base);
|
entry = drm_user_object_entry(uo, drm_ttm_object_t, base);
|
||||||
arg.user_token = entry->map_list.user_token;
|
|
||||||
mutex_unlock(&dev->struct_mutex);
|
|
||||||
break;
|
break;
|
||||||
case drm_ttm_unreference:
|
case drm_ttm_unreference:
|
||||||
return drm_user_object_unref(priv, arg.handle, drm_ttm_type);
|
return drm_user_object_unref(priv, arg.handle, drm_ttm_type);
|
||||||
|
|
@ -904,6 +900,12 @@ int drm_ttm_ioctl(drm_file_t *priv, drm_ttm_arg_t __user *data)
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
arg.handle = entry->base.hash.key;
|
||||||
|
arg.user_token = entry->map_list.user_token;
|
||||||
|
split_32(entry->map_list.map->size, &arg.size_lo, &arg.size_hi);
|
||||||
|
atomic_dec(&entry->usage);
|
||||||
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
|
||||||
DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
|
DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue