mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
drm: Check that the requested pixel format is valid
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
62443be626
commit
935b597740
1 changed files with 75 additions and 0 deletions
|
@ -2061,6 +2061,75 @@ int drm_mode_addfb(struct drm_device *dev,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int format_check(struct drm_mode_fb_cmd2 *r)
|
||||||
|
{
|
||||||
|
uint32_t format = r->pixel_format & ~DRM_FORMAT_BIG_ENDIAN;
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case DRM_FORMAT_C8:
|
||||||
|
case DRM_FORMAT_RGB332:
|
||||||
|
case DRM_FORMAT_BGR233:
|
||||||
|
case DRM_FORMAT_XRGB4444:
|
||||||
|
case DRM_FORMAT_XBGR4444:
|
||||||
|
case DRM_FORMAT_RGBX4444:
|
||||||
|
case DRM_FORMAT_BGRX4444:
|
||||||
|
case DRM_FORMAT_ARGB4444:
|
||||||
|
case DRM_FORMAT_ABGR4444:
|
||||||
|
case DRM_FORMAT_RGBA4444:
|
||||||
|
case DRM_FORMAT_BGRA4444:
|
||||||
|
case DRM_FORMAT_XRGB1555:
|
||||||
|
case DRM_FORMAT_XBGR1555:
|
||||||
|
case DRM_FORMAT_RGBX5551:
|
||||||
|
case DRM_FORMAT_BGRX5551:
|
||||||
|
case DRM_FORMAT_ARGB1555:
|
||||||
|
case DRM_FORMAT_ABGR1555:
|
||||||
|
case DRM_FORMAT_RGBA5551:
|
||||||
|
case DRM_FORMAT_BGRA5551:
|
||||||
|
case DRM_FORMAT_RGB565:
|
||||||
|
case DRM_FORMAT_BGR565:
|
||||||
|
case DRM_FORMAT_RGB888:
|
||||||
|
case DRM_FORMAT_BGR888:
|
||||||
|
case DRM_FORMAT_XRGB8888:
|
||||||
|
case DRM_FORMAT_XBGR8888:
|
||||||
|
case DRM_FORMAT_RGBX8888:
|
||||||
|
case DRM_FORMAT_BGRX8888:
|
||||||
|
case DRM_FORMAT_ARGB8888:
|
||||||
|
case DRM_FORMAT_ABGR8888:
|
||||||
|
case DRM_FORMAT_RGBA8888:
|
||||||
|
case DRM_FORMAT_BGRA8888:
|
||||||
|
case DRM_FORMAT_XRGB2101010:
|
||||||
|
case DRM_FORMAT_XBGR2101010:
|
||||||
|
case DRM_FORMAT_RGBX1010102:
|
||||||
|
case DRM_FORMAT_BGRX1010102:
|
||||||
|
case DRM_FORMAT_ARGB2101010:
|
||||||
|
case DRM_FORMAT_ABGR2101010:
|
||||||
|
case DRM_FORMAT_RGBA1010102:
|
||||||
|
case DRM_FORMAT_BGRA1010102:
|
||||||
|
case DRM_FORMAT_YUYV:
|
||||||
|
case DRM_FORMAT_YVYU:
|
||||||
|
case DRM_FORMAT_UYVY:
|
||||||
|
case DRM_FORMAT_VYUY:
|
||||||
|
case DRM_FORMAT_AYUV:
|
||||||
|
case DRM_FORMAT_NV12:
|
||||||
|
case DRM_FORMAT_NV21:
|
||||||
|
case DRM_FORMAT_NV16:
|
||||||
|
case DRM_FORMAT_NV61:
|
||||||
|
case DRM_FORMAT_YUV410:
|
||||||
|
case DRM_FORMAT_YVU410:
|
||||||
|
case DRM_FORMAT_YUV411:
|
||||||
|
case DRM_FORMAT_YVU411:
|
||||||
|
case DRM_FORMAT_YUV420:
|
||||||
|
case DRM_FORMAT_YVU420:
|
||||||
|
case DRM_FORMAT_YUV422:
|
||||||
|
case DRM_FORMAT_YVU422:
|
||||||
|
case DRM_FORMAT_YUV444:
|
||||||
|
case DRM_FORMAT_YVU444:
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_mode_addfb2 - add an FB to the graphics configuration
|
* drm_mode_addfb2 - add an FB to the graphics configuration
|
||||||
* @inode: inode from the ioctl
|
* @inode: inode from the ioctl
|
||||||
|
@ -2100,6 +2169,12 @@ int drm_mode_addfb2(struct drm_device *dev,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = format_check(r);
|
||||||
|
if (ret) {
|
||||||
|
DRM_ERROR("bad framebuffer format 0x%08x\n", r->pixel_format);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&dev->mode_config.mutex);
|
mutex_lock(&dev->mode_config.mutex);
|
||||||
|
|
||||||
fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
|
fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
|
||||||
|
|
Loading…
Reference in a new issue