[PATCH] drm/radeon: add si tile mode array query

Michel Dänzer michel at daenzer.net
Thu Apr 4 01:27:47 PDT 2013


On Mit, 2013-04-03 at 17:22 -0400, j.glisse at gmail.com wrote: 
> From: Jerome Glisse <jglisse at redhat.com>
> 
> Allow userspace to query for the tile mode array so userspace can properly
> compute surface pitch and alignment requirement depending on tiling.
> 
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>

[...]

> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> index c75cb2c..8076434 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -176,80 +176,65 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>         struct radeon_device *rdev = dev->dev_private;
>         struct drm_radeon_info *info = data;
>         struct radeon_mode_info *minfo = &rdev->mode_info;
> -       uint32_t value, *value_ptr;
> -       uint64_t value64, *value_ptr64;
> +       uint32_t *value, value_tmp, *value_ptr, value_size;
> +       uint64_t value64;
>         struct drm_crtc *crtc;
>         int i, found;
>  
> -       /* TIMESTAMP is a 64-bit value, needs special handling. */
> -       if (info->request == RADEON_INFO_TIMESTAMP) {
> -               if (rdev->family >= CHIP_R600) {
> -                       value_ptr64 = (uint64_t*)((unsigned long)info->value);
> -                       value64 = radeon_get_gpu_clock_counter(rdev);
> -
> -                       if (DRM_COPY_TO_USER(value_ptr64, &value64, sizeof(value64))) {
> -                               DRM_ERROR("copy_to_user %s:%u\n", __func__, __LINE__);
> -                               return -EFAULT;
> -                       }
> -                       return 0;
> -               } else {
> -                       DRM_DEBUG_KMS("timestamp is r6xx+ only!\n");
> -                       return -EINVAL;
> -               }
> -       }
> -
>         value_ptr = (uint32_t *)((unsigned long)info->value);
> -       if (DRM_COPY_FROM_USER(&value, value_ptr, sizeof(value))) {
> -               DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
> -               return -EFAULT;
> -       }
> +       value = &value_tmp;
> +       value_size = sizeof(uint32_t);

[...]

> +       case RADEON_INFO_TIMESTAMP:
> +               if (rdev->family < CHIP_R600) {
> +                       DRM_DEBUG_KMS("timestamp is r6xx+ only!\n");
> +                       return -EINVAL;
> +               }
> +               value = (uint32_t*)&value64;
> +               value_size = sizeof(uint64_t);
> +               value64 = radeon_get_gpu_clock_counter(rdev);
> +               break;

[...]

> -       if (DRM_COPY_TO_USER(value_ptr, &value, sizeof(uint32_t))) {
> +       if (DRM_COPY_TO_USER(value_ptr, value, value_size)) {
>                 DRM_ERROR("copy_to_user %s:%u\n", __func__, __LINE__);
>                 return -EFAULT;
>         }

Are these changes safe wrt strict aliasing? Might be safer to use char*
for the second argument passed to DRM_COPY_TO_USER. 

-- 
Earthling Michel Dänzer           |                   http://www.amd.com
Libre software enthusiast         |          Debian, X and DRI developer


More information about the dri-devel mailing list