diff options
author | Eric Anholt <eric@anholt.net> | 2009-12-01 12:01:54 -0500 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-12-01 12:01:54 -0500 |
commit | f40d6817a5c2bf84f5fe7b5d1a83f1e8f8669951 (patch) | |
tree | 1c515a34a60f65cbfd3cf1a387427d0a9fdf878f /drivers/gpu/drm/drm_drv.c | |
parent | 103a196f4224dc6872081305cf7f82ebf67aa7bd (diff) | |
parent | 46557bef3f3834ac33031c7be27d39d90d507442 (diff) |
Merge remote branch 'airlied/drm-next' into drm-intel-next
Diffstat (limited to 'drivers/gpu/drm/drm_drv.c')
-rw-r--r-- | drivers/gpu/drm/drm_drv.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index a75ca63deea6..bfaf59b02bda 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -145,6 +145,7 @@ static struct drm_ioctl_desc drm_ioctls[] = { | |||
145 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW), | 145 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW), |
146 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW), | 146 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW), |
147 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW), | 147 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW), |
148 | DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), | ||
148 | }; | 149 | }; |
149 | 150 | ||
150 | #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) | 151 | #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) |
@@ -366,6 +367,29 @@ module_init(drm_core_init); | |||
366 | module_exit(drm_core_exit); | 367 | module_exit(drm_core_exit); |
367 | 368 | ||
368 | /** | 369 | /** |
370 | * Copy and IOCTL return string to user space | ||
371 | */ | ||
372 | static int drm_copy_field(char *buf, size_t *buf_len, const char *value) | ||
373 | { | ||
374 | int len; | ||
375 | |||
376 | /* don't overflow userbuf */ | ||
377 | len = strlen(value); | ||
378 | if (len > *buf_len) | ||
379 | len = *buf_len; | ||
380 | |||
381 | /* let userspace know exact length of driver value (which could be | ||
382 | * larger than the userspace-supplied buffer) */ | ||
383 | *buf_len = strlen(value); | ||
384 | |||
385 | /* finally, try filling in the userbuf */ | ||
386 | if (len && buf) | ||
387 | if (copy_to_user(buf, value, len)) | ||
388 | return -EFAULT; | ||
389 | return 0; | ||
390 | } | ||
391 | |||
392 | /** | ||
369 | * Get version information | 393 | * Get version information |
370 | * | 394 | * |
371 | * \param inode device inode. | 395 | * \param inode device inode. |
@@ -380,16 +404,21 @@ static int drm_version(struct drm_device *dev, void *data, | |||
380 | struct drm_file *file_priv) | 404 | struct drm_file *file_priv) |
381 | { | 405 | { |
382 | struct drm_version *version = data; | 406 | struct drm_version *version = data; |
383 | int len; | 407 | int err; |
384 | 408 | ||
385 | version->version_major = dev->driver->major; | 409 | version->version_major = dev->driver->major; |
386 | version->version_minor = dev->driver->minor; | 410 | version->version_minor = dev->driver->minor; |
387 | version->version_patchlevel = dev->driver->patchlevel; | 411 | version->version_patchlevel = dev->driver->patchlevel; |
388 | DRM_COPY(version->name, dev->driver->name); | 412 | err = drm_copy_field(version->name, &version->name_len, |
389 | DRM_COPY(version->date, dev->driver->date); | 413 | dev->driver->name); |
390 | DRM_COPY(version->desc, dev->driver->desc); | 414 | if (!err) |
391 | 415 | err = drm_copy_field(version->date, &version->date_len, | |
392 | return 0; | 416 | dev->driver->date); |
417 | if (!err) | ||
418 | err = drm_copy_field(version->desc, &version->desc_len, | ||
419 | dev->driver->desc); | ||
420 | |||
421 | return err; | ||
393 | } | 422 | } |
394 | 423 | ||
395 | /** | 424 | /** |