Have TTM create and reference ioctl call return the actual TTM size.

This commit is contained in:
Thomas Hellstrom 2006-08-27 19:45:38 +02:00
parent 4fa58aa152
commit ac26b51503
2 changed files with 22 additions and 11 deletions

View file

@ -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)

View file

@ -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;
} }