mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm: add an fb creation ioctl that takes a pixel format v5
To properly support the various plane formats supported by different
hardware, the kernel must know the pixel format of a framebuffer object.
So add a new ioctl taking a format argument corresponding to a fourcc
name from the new drm_fourcc.h header file.  Implement the fb creation
hooks in terms of the new mode_fb_cmd2 using helpers where the old
bpp/depth values are needed.
v2: create DRM specific fourcc header file for sharing with libdrm etc
v3: fix rebase failure and use DRM fourcc codes in intel_display.c and
    update commit message
v4: make fb_cmd2 handle field into an array for multi-object formats
    pull in Ville's fix for the memcpy in drm_plane_init
    apply Ville's cleanup to zero out fb_cmd2 arg in drm_mode_addfb
v5: add 'flags' field for interlaced support (from Ville)
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Reviewed-by: Rob Clark <rob.clark@linaro.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									8cf5c91771
								
							
						
					
					
						commit
						308e5bcbdb
					
				
					 20 changed files with 327 additions and 66 deletions
				
			
		| 
						 | 
					@ -36,6 +36,7 @@
 | 
				
			||||||
#include "drmP.h"
 | 
					#include "drmP.h"
 | 
				
			||||||
#include "drm_crtc.h"
 | 
					#include "drm_crtc.h"
 | 
				
			||||||
#include "drm_edid.h"
 | 
					#include "drm_edid.h"
 | 
				
			||||||
 | 
					#include "drm_fourcc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct drm_prop_enum_list {
 | 
					struct drm_prop_enum_list {
 | 
				
			||||||
	int type;
 | 
						int type;
 | 
				
			||||||
| 
						 | 
					@ -568,7 +569,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcpy(plane->format_types, formats, format_count);
 | 
						memcpy(plane->format_types, formats, format_count * sizeof(uint32_t));
 | 
				
			||||||
	plane->format_count = format_count;
 | 
						plane->format_count = format_count;
 | 
				
			||||||
	plane->possible_crtcs = possible_crtcs;
 | 
						plane->possible_crtcs = possible_crtcs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1915,6 +1916,42 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Original addfb only supported RGB formats, so figure out which one */
 | 
				
			||||||
 | 
					uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t fmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (bpp) {
 | 
				
			||||||
 | 
						case 8:
 | 
				
			||||||
 | 
							fmt = DRM_FOURCC_RGB332;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 16:
 | 
				
			||||||
 | 
							if (depth == 15)
 | 
				
			||||||
 | 
								fmt = DRM_FOURCC_RGB555;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								fmt = DRM_FOURCC_RGB565;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 24:
 | 
				
			||||||
 | 
							fmt = DRM_FOURCC_RGB24;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 32:
 | 
				
			||||||
 | 
							if (depth == 24)
 | 
				
			||||||
 | 
								fmt = DRM_FOURCC_RGB24;
 | 
				
			||||||
 | 
							else if (depth == 30)
 | 
				
			||||||
 | 
								fmt = DRM_INTEL_RGB30;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								fmt = DRM_FOURCC_RGB32;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							DRM_ERROR("bad bpp, assuming RGB24 pixel format\n");
 | 
				
			||||||
 | 
							fmt = DRM_FOURCC_RGB24;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return fmt;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(drm_mode_legacy_fb_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * drm_mode_addfb - add an FB to the graphics configuration
 | 
					 * drm_mode_addfb - add an FB to the graphics configuration
 | 
				
			||||||
 * @inode: inode from the ioctl
 | 
					 * @inode: inode from the ioctl
 | 
				
			||||||
| 
						 | 
					@ -1935,7 +1972,74 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
 | 
				
			||||||
int drm_mode_addfb(struct drm_device *dev,
 | 
					int drm_mode_addfb(struct drm_device *dev,
 | 
				
			||||||
		   void *data, struct drm_file *file_priv)
 | 
							   void *data, struct drm_file *file_priv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct drm_mode_fb_cmd *r = data;
 | 
						struct drm_mode_fb_cmd *or = data;
 | 
				
			||||||
 | 
						struct drm_mode_fb_cmd2 r = {};
 | 
				
			||||||
 | 
						struct drm_mode_config *config = &dev->mode_config;
 | 
				
			||||||
 | 
						struct drm_framebuffer *fb;
 | 
				
			||||||
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Use new struct with format internally */
 | 
				
			||||||
 | 
						r.fb_id = or->fb_id;
 | 
				
			||||||
 | 
						r.width = or->width;
 | 
				
			||||||
 | 
						r.height = or->height;
 | 
				
			||||||
 | 
						r.pitches[0] = or->pitch;
 | 
				
			||||||
 | 
						r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth);
 | 
				
			||||||
 | 
						r.handles[0] = or->handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!drm_core_check_feature(dev, DRIVER_MODESET))
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((config->min_width > r.width) || (r.width > config->max_width)) {
 | 
				
			||||||
 | 
							DRM_ERROR("mode new framebuffer width not within limits\n");
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ((config->min_height > r.height) || (r.height > config->max_height)) {
 | 
				
			||||||
 | 
							DRM_ERROR("mode new framebuffer height not within limits\n");
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutex_lock(&dev->mode_config.mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* TODO check buffer is sufficiently large */
 | 
				
			||||||
 | 
						/* TODO setup destructor callback */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fb = dev->mode_config.funcs->fb_create(dev, file_priv, &r);
 | 
				
			||||||
 | 
						if (IS_ERR(fb)) {
 | 
				
			||||||
 | 
							DRM_ERROR("could not create framebuffer\n");
 | 
				
			||||||
 | 
							ret = PTR_ERR(fb);
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						or->fb_id = fb->base.id;
 | 
				
			||||||
 | 
						list_add(&fb->filp_head, &file_priv->fbs);
 | 
				
			||||||
 | 
						DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
						mutex_unlock(&dev->mode_config.mutex);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * drm_mode_addfb2 - add an FB to the graphics configuration
 | 
				
			||||||
 | 
					 * @inode: inode from the ioctl
 | 
				
			||||||
 | 
					 * @filp: file * from the ioctl
 | 
				
			||||||
 | 
					 * @cmd: cmd from ioctl
 | 
				
			||||||
 | 
					 * @arg: arg from ioctl
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * LOCKING:
 | 
				
			||||||
 | 
					 * Takes mode config lock.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Add a new FB to the specified CRTC, given a user request with format.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Called by the user via ioctl.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * RETURNS:
 | 
				
			||||||
 | 
					 * Zero on success, errno on failure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int drm_mode_addfb2(struct drm_device *dev,
 | 
				
			||||||
 | 
							    void *data, struct drm_file *file_priv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct drm_mode_fb_cmd2 *r = data;
 | 
				
			||||||
	struct drm_mode_config *config = &dev->mode_config;
 | 
						struct drm_mode_config *config = &dev->mode_config;
 | 
				
			||||||
	struct drm_framebuffer *fb;
 | 
						struct drm_framebuffer *fb;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
| 
						 | 
					@ -1956,9 +2060,6 @@ int drm_mode_addfb(struct drm_device *dev,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&dev->mode_config.mutex);
 | 
						mutex_lock(&dev->mode_config.mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TODO check buffer is sufficiently large */
 | 
					 | 
				
			||||||
	/* TODO setup destructor callback */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
 | 
						fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
 | 
				
			||||||
	if (IS_ERR(fb)) {
 | 
						if (IS_ERR(fb)) {
 | 
				
			||||||
		DRM_ERROR("could not create framebuffer\n");
 | 
							DRM_ERROR("could not create framebuffer\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "drmP.h"
 | 
					#include "drmP.h"
 | 
				
			||||||
#include "drm_crtc.h"
 | 
					#include "drm_crtc.h"
 | 
				
			||||||
 | 
					#include "drm_fourcc.h"
 | 
				
			||||||
#include "drm_crtc_helper.h"
 | 
					#include "drm_crtc_helper.h"
 | 
				
			||||||
#include "drm_fb_helper.h"
 | 
					#include "drm_fb_helper.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -810,14 +811,56 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(drm_helper_connector_dpms);
 | 
					EXPORT_SYMBOL(drm_helper_connector_dpms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Just need to support RGB formats here for compat with code that doesn't
 | 
				
			||||||
 | 
					 * use pixel formats directly yet.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void drm_helper_get_fb_bpp_depth(uint32_t format, unsigned int *depth,
 | 
				
			||||||
 | 
									 int *bpp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (format) {
 | 
				
			||||||
 | 
						case DRM_FOURCC_RGB332:
 | 
				
			||||||
 | 
							*depth = 8;
 | 
				
			||||||
 | 
							*bpp = 8;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_FOURCC_RGB555:
 | 
				
			||||||
 | 
							*depth = 15;
 | 
				
			||||||
 | 
							*bpp = 16;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_FOURCC_RGB565:
 | 
				
			||||||
 | 
							*depth = 16;
 | 
				
			||||||
 | 
							*bpp = 16;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_FOURCC_RGB24:
 | 
				
			||||||
 | 
							*depth = 24;
 | 
				
			||||||
 | 
							*bpp = 32;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_INTEL_RGB30:
 | 
				
			||||||
 | 
							*depth = 30;
 | 
				
			||||||
 | 
							*bpp = 32;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_FOURCC_RGB32:
 | 
				
			||||||
 | 
							*depth = 32;
 | 
				
			||||||
 | 
							*bpp = 32;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							DRM_DEBUG_KMS("unsupported pixel format\n");
 | 
				
			||||||
 | 
							*depth = 0;
 | 
				
			||||||
 | 
							*bpp = 0;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(drm_helper_get_fb_bpp_depth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
 | 
					int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
 | 
				
			||||||
				   struct drm_mode_fb_cmd *mode_cmd)
 | 
									   struct drm_mode_fb_cmd2 *mode_cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	fb->width = mode_cmd->width;
 | 
						fb->width = mode_cmd->width;
 | 
				
			||||||
	fb->height = mode_cmd->height;
 | 
						fb->height = mode_cmd->height;
 | 
				
			||||||
	fb->pitch = mode_cmd->pitch;
 | 
						fb->pitch = mode_cmd->pitches[0];
 | 
				
			||||||
	fb->bits_per_pixel = mode_cmd->bpp;
 | 
						drm_helper_get_fb_bpp_depth(mode_cmd->pixel_format, &fb->depth,
 | 
				
			||||||
	fb->depth = mode_cmd->depth;
 | 
									    &fb->bits_per_pixel);
 | 
				
			||||||
 | 
						fb->pixel_format = mode_cmd->pixel_format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,6 +153,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
						DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6279,7 +6279,7 @@ static struct drm_display_mode load_detect_mode = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct drm_framebuffer *
 | 
					static struct drm_framebuffer *
 | 
				
			||||||
intel_framebuffer_create(struct drm_device *dev,
 | 
					intel_framebuffer_create(struct drm_device *dev,
 | 
				
			||||||
			 struct drm_mode_fb_cmd *mode_cmd,
 | 
								 struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
			 struct drm_i915_gem_object *obj)
 | 
								 struct drm_i915_gem_object *obj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct intel_framebuffer *intel_fb;
 | 
						struct intel_framebuffer *intel_fb;
 | 
				
			||||||
| 
						 | 
					@ -6321,7 +6321,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
 | 
				
			||||||
				  int depth, int bpp)
 | 
									  int depth, int bpp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct drm_i915_gem_object *obj;
 | 
						struct drm_i915_gem_object *obj;
 | 
				
			||||||
	struct drm_mode_fb_cmd mode_cmd;
 | 
						struct drm_mode_fb_cmd2 mode_cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj = i915_gem_alloc_object(dev,
 | 
						obj = i915_gem_alloc_object(dev,
 | 
				
			||||||
				    intel_framebuffer_size_for_mode(mode, bpp));
 | 
									    intel_framebuffer_size_for_mode(mode, bpp));
 | 
				
			||||||
| 
						 | 
					@ -6330,9 +6330,9 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode_cmd.width = mode->hdisplay;
 | 
						mode_cmd.width = mode->hdisplay;
 | 
				
			||||||
	mode_cmd.height = mode->vdisplay;
 | 
						mode_cmd.height = mode->vdisplay;
 | 
				
			||||||
	mode_cmd.depth = depth;
 | 
						mode_cmd.pitches[0] = intel_framebuffer_pitch_for_width(mode_cmd.width,
 | 
				
			||||||
	mode_cmd.bpp = bpp;
 | 
													bpp);
 | 
				
			||||||
	mode_cmd.pitch = intel_framebuffer_pitch_for_width(mode_cmd.width, bpp);
 | 
						mode_cmd.pixel_format = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return intel_framebuffer_create(dev, &mode_cmd, obj);
 | 
						return intel_framebuffer_create(dev, &mode_cmd, obj);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -7573,7 +7573,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int intel_framebuffer_init(struct drm_device *dev,
 | 
					int intel_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
			   struct intel_framebuffer *intel_fb,
 | 
								   struct intel_framebuffer *intel_fb,
 | 
				
			||||||
			   struct drm_mode_fb_cmd *mode_cmd,
 | 
								   struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
			   struct drm_i915_gem_object *obj)
 | 
								   struct drm_i915_gem_object *obj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
| 
						 | 
					@ -7581,21 +7581,23 @@ int intel_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
	if (obj->tiling_mode == I915_TILING_Y)
 | 
						if (obj->tiling_mode == I915_TILING_Y)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (mode_cmd->pitch & 63)
 | 
						if (mode_cmd->pitches[0] & 63)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (mode_cmd->bpp) {
 | 
						switch (mode_cmd->pixel_format) {
 | 
				
			||||||
	case 8:
 | 
						case DRM_FOURCC_RGB332:
 | 
				
			||||||
	case 16:
 | 
						case DRM_FOURCC_RGB565:
 | 
				
			||||||
		/* Only pre-ILK can handle 5:5:5 */
 | 
						case DRM_FOURCC_RGB24:
 | 
				
			||||||
		if (mode_cmd->depth == 15 && !HAS_PCH_SPLIT(dev))
 | 
						case DRM_INTEL_RGB30:
 | 
				
			||||||
			return -EINVAL;
 | 
							/* RGB formats are common across chipsets */
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case DRM_FOURCC_YUYV:
 | 
				
			||||||
	case 24:
 | 
						case DRM_FOURCC_UYVY:
 | 
				
			||||||
	case 32:
 | 
						case DRM_FOURCC_YVYU:
 | 
				
			||||||
 | 
						case DRM_FOURCC_VYUY:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							DRM_ERROR("unsupported pixel format\n");
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7613,11 +7615,12 @@ int intel_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
static struct drm_framebuffer *
 | 
					static struct drm_framebuffer *
 | 
				
			||||||
intel_user_framebuffer_create(struct drm_device *dev,
 | 
					intel_user_framebuffer_create(struct drm_device *dev,
 | 
				
			||||||
			      struct drm_file *filp,
 | 
								      struct drm_file *filp,
 | 
				
			||||||
			      struct drm_mode_fb_cmd *mode_cmd)
 | 
								      struct drm_mode_fb_cmd2 *mode_cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct drm_i915_gem_object *obj;
 | 
						struct drm_i915_gem_object *obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj = to_intel_bo(drm_gem_object_lookup(dev, filp, mode_cmd->handle));
 | 
						obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
 | 
				
			||||||
 | 
											mode_cmd->handles[0]));
 | 
				
			||||||
	if (&obj->base == NULL)
 | 
						if (&obj->base == NULL)
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -359,7 +359,7 @@ extern int intel_pin_and_fence_fb_obj(struct drm_device *dev,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int intel_framebuffer_init(struct drm_device *dev,
 | 
					extern int intel_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
				  struct intel_framebuffer *ifb,
 | 
									  struct intel_framebuffer *ifb,
 | 
				
			||||||
				  struct drm_mode_fb_cmd *mode_cmd,
 | 
									  struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
				  struct drm_i915_gem_object *obj);
 | 
									  struct drm_i915_gem_object *obj);
 | 
				
			||||||
extern int intel_fbdev_init(struct drm_device *dev);
 | 
					extern int intel_fbdev_init(struct drm_device *dev);
 | 
				
			||||||
extern void intel_fbdev_fini(struct drm_device *dev);
 | 
					extern void intel_fbdev_fini(struct drm_device *dev);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
 | 
				
			||||||
	struct drm_i915_private *dev_priv = dev->dev_private;
 | 
						struct drm_i915_private *dev_priv = dev->dev_private;
 | 
				
			||||||
	struct fb_info *info;
 | 
						struct fb_info *info;
 | 
				
			||||||
	struct drm_framebuffer *fb;
 | 
						struct drm_framebuffer *fb;
 | 
				
			||||||
	struct drm_mode_fb_cmd mode_cmd;
 | 
						struct drm_mode_fb_cmd2 mode_cmd;
 | 
				
			||||||
	struct drm_i915_gem_object *obj;
 | 
						struct drm_i915_gem_object *obj;
 | 
				
			||||||
	struct device *device = &dev->pdev->dev;
 | 
						struct device *device = &dev->pdev->dev;
 | 
				
			||||||
	int size, ret;
 | 
						int size, ret;
 | 
				
			||||||
| 
						 | 
					@ -77,11 +77,12 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
 | 
				
			||||||
	mode_cmd.width = sizes->surface_width;
 | 
						mode_cmd.width = sizes->surface_width;
 | 
				
			||||||
	mode_cmd.height = sizes->surface_height;
 | 
						mode_cmd.height = sizes->surface_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode_cmd.bpp = sizes->surface_bpp;
 | 
						mode_cmd.pitches[0] = ALIGN(mode_cmd.width * ((sizes->surface_bpp + 7) /
 | 
				
			||||||
	mode_cmd.pitch = ALIGN(mode_cmd.width * ((mode_cmd.bpp + 7) / 8), 64);
 | 
											      8), 64);
 | 
				
			||||||
	mode_cmd.depth = sizes->surface_depth;
 | 
						mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
 | 
				
			||||||
 | 
												  sizes->surface_depth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	size = mode_cmd.pitch * mode_cmd.height;
 | 
						size = mode_cmd.pitches[0] * mode_cmd.height;
 | 
				
			||||||
	size = ALIGN(size, PAGE_SIZE);
 | 
						size = ALIGN(size, PAGE_SIZE);
 | 
				
			||||||
	obj = i915_gem_alloc_object(dev, size);
 | 
						obj = i915_gem_alloc_object(dev, size);
 | 
				
			||||||
	if (!obj) {
 | 
						if (!obj) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
nouveau_framebuffer_init(struct drm_device *dev,
 | 
					nouveau_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
			 struct nouveau_framebuffer *nv_fb,
 | 
								 struct nouveau_framebuffer *nv_fb,
 | 
				
			||||||
			 struct drm_mode_fb_cmd *mode_cmd,
 | 
								 struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
			 struct nouveau_bo *nvbo)
 | 
								 struct nouveau_bo *nvbo)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct drm_nouveau_private *dev_priv = dev->dev_private;
 | 
						struct drm_nouveau_private *dev_priv = dev->dev_private;
 | 
				
			||||||
| 
						 | 
					@ -124,13 +124,13 @@ nouveau_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
static struct drm_framebuffer *
 | 
					static struct drm_framebuffer *
 | 
				
			||||||
nouveau_user_framebuffer_create(struct drm_device *dev,
 | 
					nouveau_user_framebuffer_create(struct drm_device *dev,
 | 
				
			||||||
				struct drm_file *file_priv,
 | 
									struct drm_file *file_priv,
 | 
				
			||||||
				struct drm_mode_fb_cmd *mode_cmd)
 | 
									struct drm_mode_fb_cmd2 *mode_cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct nouveau_framebuffer *nouveau_fb;
 | 
						struct nouveau_framebuffer *nouveau_fb;
 | 
				
			||||||
	struct drm_gem_object *gem;
 | 
						struct drm_gem_object *gem;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
 | 
						gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
 | 
				
			||||||
	if (!gem)
 | 
						if (!gem)
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,5 +45,5 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
 | 
				
			||||||
extern const struct drm_mode_config_funcs nouveau_mode_config_funcs;
 | 
					extern const struct drm_mode_config_funcs nouveau_mode_config_funcs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb,
 | 
					int nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb,
 | 
				
			||||||
			     struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo);
 | 
								     struct drm_mode_fb_cmd2 *mode_cmd, struct nouveau_bo *nvbo);
 | 
				
			||||||
#endif /* __NOUVEAU_FB_H__ */
 | 
					#endif /* __NOUVEAU_FB_H__ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -281,7 +281,7 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
 | 
				
			||||||
	struct nouveau_framebuffer *nouveau_fb;
 | 
						struct nouveau_framebuffer *nouveau_fb;
 | 
				
			||||||
	struct nouveau_channel *chan;
 | 
						struct nouveau_channel *chan;
 | 
				
			||||||
	struct nouveau_bo *nvbo;
 | 
						struct nouveau_bo *nvbo;
 | 
				
			||||||
	struct drm_mode_fb_cmd mode_cmd;
 | 
						struct drm_mode_fb_cmd2 mode_cmd;
 | 
				
			||||||
	struct pci_dev *pdev = dev->pdev;
 | 
						struct pci_dev *pdev = dev->pdev;
 | 
				
			||||||
	struct device *device = &pdev->dev;
 | 
						struct device *device = &pdev->dev;
 | 
				
			||||||
	int size, ret;
 | 
						int size, ret;
 | 
				
			||||||
| 
						 | 
					@ -289,12 +289,13 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
 | 
				
			||||||
	mode_cmd.width = sizes->surface_width;
 | 
						mode_cmd.width = sizes->surface_width;
 | 
				
			||||||
	mode_cmd.height = sizes->surface_height;
 | 
						mode_cmd.height = sizes->surface_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode_cmd.bpp = sizes->surface_bpp;
 | 
						mode_cmd.pitches[0] = mode_cmd.width * (sizes->surface_bpp >> 3);
 | 
				
			||||||
	mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3);
 | 
						mode_cmd.pitches[0] = roundup(mode_cmd.pitches[0], 256);
 | 
				
			||||||
	mode_cmd.pitch = roundup(mode_cmd.pitch, 256);
 | 
					 | 
				
			||||||
	mode_cmd.depth = sizes->surface_depth;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	size = mode_cmd.pitch * mode_cmd.height;
 | 
						mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
 | 
				
			||||||
 | 
												  sizes->surface_depth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size = mode_cmd.pitches[0] * mode_cmd.height;
 | 
				
			||||||
	size = roundup(size, PAGE_SIZE);
 | 
						size = roundup(size, PAGE_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = nouveau_gem_new(dev, size, 0, NOUVEAU_GEM_DOMAIN_VRAM,
 | 
						ret = nouveau_gem_new(dev, size, 0, NOUVEAU_GEM_DOMAIN_VRAM,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1081,7 +1081,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
radeon_framebuffer_init(struct drm_device *dev,
 | 
					radeon_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
			struct radeon_framebuffer *rfb,
 | 
								struct radeon_framebuffer *rfb,
 | 
				
			||||||
			struct drm_mode_fb_cmd *mode_cmd,
 | 
								struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
			struct drm_gem_object *obj)
 | 
								struct drm_gem_object *obj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rfb->obj = obj;
 | 
						rfb->obj = obj;
 | 
				
			||||||
| 
						 | 
					@ -1092,15 +1092,15 @@ radeon_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
static struct drm_framebuffer *
 | 
					static struct drm_framebuffer *
 | 
				
			||||||
radeon_user_framebuffer_create(struct drm_device *dev,
 | 
					radeon_user_framebuffer_create(struct drm_device *dev,
 | 
				
			||||||
			       struct drm_file *file_priv,
 | 
								       struct drm_file *file_priv,
 | 
				
			||||||
			       struct drm_mode_fb_cmd *mode_cmd)
 | 
								       struct drm_mode_fb_cmd2 *mode_cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct drm_gem_object *obj;
 | 
						struct drm_gem_object *obj;
 | 
				
			||||||
	struct radeon_framebuffer *radeon_fb;
 | 
						struct radeon_framebuffer *radeon_fb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
 | 
						obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
 | 
				
			||||||
	if (obj ==  NULL) {
 | 
						if (obj ==  NULL) {
 | 
				
			||||||
		dev_err(&dev->pdev->dev, "No GEM object associated to handle 0x%08X, "
 | 
							dev_err(&dev->pdev->dev, "No GEM object associated to handle 0x%08X, "
 | 
				
			||||||
			"can't create framebuffer\n", mode_cmd->handle);
 | 
								"can't create framebuffer\n", mode_cmd->handles[0]);
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +103,7 @@ static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
 | 
					static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
 | 
				
			||||||
					 struct drm_mode_fb_cmd *mode_cmd,
 | 
										 struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
					 struct drm_gem_object **gobj_p)
 | 
										 struct drm_gem_object **gobj_p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct radeon_device *rdev = rfbdev->rdev;
 | 
						struct radeon_device *rdev = rfbdev->rdev;
 | 
				
			||||||
| 
						 | 
					@ -114,13 +114,17 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
	int aligned_size, size;
 | 
						int aligned_size, size;
 | 
				
			||||||
	int height = mode_cmd->height;
 | 
						int height = mode_cmd->height;
 | 
				
			||||||
 | 
						u32 bpp, depth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drm_helper_get_fb_bpp_depth(mode_cmd->pixel_format, &depth, &bpp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* need to align pitch with crtc limits */
 | 
						/* need to align pitch with crtc limits */
 | 
				
			||||||
	mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
 | 
						mode_cmd->pitches[0] = radeon_align_pitch(rdev, mode_cmd->width, bpp,
 | 
				
			||||||
 | 
											  fb_tiled) * ((bpp + 1) / 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rdev->family >= CHIP_R600)
 | 
						if (rdev->family >= CHIP_R600)
 | 
				
			||||||
		height = ALIGN(mode_cmd->height, 8);
 | 
							height = ALIGN(mode_cmd->height, 8);
 | 
				
			||||||
	size = mode_cmd->pitch * height;
 | 
						size = mode_cmd->pitches[0] * height;
 | 
				
			||||||
	aligned_size = ALIGN(size, PAGE_SIZE);
 | 
						aligned_size = ALIGN(size, PAGE_SIZE);
 | 
				
			||||||
	ret = radeon_gem_object_create(rdev, aligned_size, 0,
 | 
						ret = radeon_gem_object_create(rdev, aligned_size, 0,
 | 
				
			||||||
				       RADEON_GEM_DOMAIN_VRAM,
 | 
									       RADEON_GEM_DOMAIN_VRAM,
 | 
				
			||||||
| 
						 | 
					@ -151,7 +155,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
 | 
				
			||||||
	if (tiling_flags) {
 | 
						if (tiling_flags) {
 | 
				
			||||||
		ret = radeon_bo_set_tiling_flags(rbo,
 | 
							ret = radeon_bo_set_tiling_flags(rbo,
 | 
				
			||||||
						 tiling_flags | RADEON_TILING_SURFACE,
 | 
											 tiling_flags | RADEON_TILING_SURFACE,
 | 
				
			||||||
						 mode_cmd->pitch);
 | 
											 mode_cmd->pitches[0]);
 | 
				
			||||||
		if (ret)
 | 
							if (ret)
 | 
				
			||||||
			dev_err(rdev->dev, "FB failed to set tiling flags\n");
 | 
								dev_err(rdev->dev, "FB failed to set tiling flags\n");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -187,7 +191,7 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
 | 
				
			||||||
	struct radeon_device *rdev = rfbdev->rdev;
 | 
						struct radeon_device *rdev = rfbdev->rdev;
 | 
				
			||||||
	struct fb_info *info;
 | 
						struct fb_info *info;
 | 
				
			||||||
	struct drm_framebuffer *fb = NULL;
 | 
						struct drm_framebuffer *fb = NULL;
 | 
				
			||||||
	struct drm_mode_fb_cmd mode_cmd;
 | 
						struct drm_mode_fb_cmd2 mode_cmd;
 | 
				
			||||||
	struct drm_gem_object *gobj = NULL;
 | 
						struct drm_gem_object *gobj = NULL;
 | 
				
			||||||
	struct radeon_bo *rbo = NULL;
 | 
						struct radeon_bo *rbo = NULL;
 | 
				
			||||||
	struct device *device = &rdev->pdev->dev;
 | 
						struct device *device = &rdev->pdev->dev;
 | 
				
			||||||
| 
						 | 
					@ -201,8 +205,8 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
 | 
				
			||||||
	if ((sizes->surface_bpp == 24) && ASIC_IS_AVIVO(rdev))
 | 
						if ((sizes->surface_bpp == 24) && ASIC_IS_AVIVO(rdev))
 | 
				
			||||||
		sizes->surface_bpp = 32;
 | 
							sizes->surface_bpp = 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mode_cmd.bpp = sizes->surface_bpp;
 | 
						mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
 | 
				
			||||||
	mode_cmd.depth = sizes->surface_depth;
 | 
												  sizes->surface_depth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj);
 | 
						ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj);
 | 
				
			||||||
	rbo = gem_to_radeon_bo(gobj);
 | 
						rbo = gem_to_radeon_bo(gobj);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -643,7 +643,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
 | 
				
			||||||
				     u16 *blue, int regno);
 | 
									     u16 *blue, int regno);
 | 
				
			||||||
void radeon_framebuffer_init(struct drm_device *dev,
 | 
					void radeon_framebuffer_init(struct drm_device *dev,
 | 
				
			||||||
			     struct radeon_framebuffer *rfb,
 | 
								     struct radeon_framebuffer *rfb,
 | 
				
			||||||
			     struct drm_mode_fb_cmd *mode_cmd,
 | 
								     struct drm_mode_fb_cmd2 *mode_cmd,
 | 
				
			||||||
			     struct drm_gem_object *obj);
 | 
								     struct drm_gem_object *obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
 | 
					int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -990,7 +990,7 @@ static int vmw_kms_new_framebuffer_dmabuf(struct vmw_private *dev_priv,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
					static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
						 struct drm_file *file_priv,
 | 
											 struct drm_file *file_priv,
 | 
				
			||||||
						 struct drm_mode_fb_cmd *mode_cmd)
 | 
											 struct drm_mode_fb_cmd2 *mode_cmd2)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct vmw_private *dev_priv = vmw_priv(dev);
 | 
						struct vmw_private *dev_priv = vmw_priv(dev);
 | 
				
			||||||
	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
 | 
						struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
 | 
				
			||||||
| 
						 | 
					@ -998,16 +998,24 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
	struct vmw_surface *surface = NULL;
 | 
						struct vmw_surface *surface = NULL;
 | 
				
			||||||
	struct vmw_dma_buffer *bo = NULL;
 | 
						struct vmw_dma_buffer *bo = NULL;
 | 
				
			||||||
	struct ttm_base_object *user_obj;
 | 
						struct ttm_base_object *user_obj;
 | 
				
			||||||
 | 
						struct drm_mode_fb_cmd mode_cmd;
 | 
				
			||||||
	u64 required_size;
 | 
						u64 required_size;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mode_cmd.width = mode_cmd2->width;
 | 
				
			||||||
 | 
						mode_cmd.height = mode_cmd2->height;
 | 
				
			||||||
 | 
						mode_cmd.pitch = mode_cmd2->pitches[0];
 | 
				
			||||||
 | 
						mode_cmd.handle = mode_cmd2->handles[0];
 | 
				
			||||||
 | 
						drm_helper_get_fb_bpp_depth(mode_cmd2->pixel_format, &mode_cmd.depth,
 | 
				
			||||||
 | 
									    &mode_cmd.bpp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * This code should be conditioned on Screen Objects not being used.
 | 
						 * This code should be conditioned on Screen Objects not being used.
 | 
				
			||||||
	 * If screen objects are used, we can allocate a GMR to hold the
 | 
						 * If screen objects are used, we can allocate a GMR to hold the
 | 
				
			||||||
	 * requested framebuffer.
 | 
						 * requested framebuffer.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	required_size = mode_cmd->pitch * mode_cmd->height;
 | 
						required_size = mode_cmd.pitch * mode_cmd.height;
 | 
				
			||||||
	if (unlikely(required_size > (u64) dev_priv->vram_size)) {
 | 
						if (unlikely(required_size > (u64) dev_priv->vram_size)) {
 | 
				
			||||||
		DRM_ERROR("VRAM size is too small for requested mode.\n");
 | 
							DRM_ERROR("VRAM size is too small for requested mode.\n");
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
							return ERR_PTR(-ENOMEM);
 | 
				
			||||||
| 
						 | 
					@ -1022,7 +1030,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
	 * command stream using user-space handles.
 | 
						 * command stream using user-space handles.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	user_obj = ttm_base_object_lookup(tfile, mode_cmd->handle);
 | 
						user_obj = ttm_base_object_lookup(tfile, mode_cmd.handle);
 | 
				
			||||||
	if (unlikely(user_obj == NULL)) {
 | 
						if (unlikely(user_obj == NULL)) {
 | 
				
			||||||
		DRM_ERROR("Could not locate requested kms frame buffer.\n");
 | 
							DRM_ERROR("Could not locate requested kms frame buffer.\n");
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
| 
						 | 
					@ -1033,7 +1041,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
 | 
						ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
 | 
				
			||||||
					     mode_cmd->handle, &surface);
 | 
										     mode_cmd.handle, &surface);
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		goto try_dmabuf;
 | 
							goto try_dmabuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1041,7 +1049,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
		goto err_not_scanout;
 | 
							goto err_not_scanout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, surface,
 | 
						ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, surface,
 | 
				
			||||||
					      &vfb, mode_cmd);
 | 
										      &vfb, &mode_cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* vmw_user_surface_lookup takes one ref so does new_fb */
 | 
						/* vmw_user_surface_lookup takes one ref so does new_fb */
 | 
				
			||||||
	vmw_surface_unreference(&surface);
 | 
						vmw_surface_unreference(&surface);
 | 
				
			||||||
| 
						 | 
					@ -1057,14 +1065,14 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 | 
				
			||||||
try_dmabuf:
 | 
					try_dmabuf:
 | 
				
			||||||
	DRM_INFO("%s: trying buffer\n", __func__);
 | 
						DRM_INFO("%s: trying buffer\n", __func__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = vmw_user_dmabuf_lookup(tfile, mode_cmd->handle, &bo);
 | 
						ret = vmw_user_dmabuf_lookup(tfile, mode_cmd.handle, &bo);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
		DRM_ERROR("failed to find buffer: %i\n", ret);
 | 
							DRM_ERROR("failed to find buffer: %i\n", ret);
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb,
 | 
						ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb,
 | 
				
			||||||
					     mode_cmd);
 | 
										     &mode_cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* vmw_user_dmabuf_lookup takes one ref so does new_fb */
 | 
						/* vmw_user_dmabuf_lookup takes one ref so does new_fb */
 | 
				
			||||||
	vmw_dmabuf_unreference(&bo);
 | 
						vmw_dmabuf_unreference(&bo);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@
 | 
				
			||||||
#define VMWGFX_KMS_H_
 | 
					#define VMWGFX_KMS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "drmP.h"
 | 
					#include "drmP.h"
 | 
				
			||||||
 | 
					#include "drm_crtc_helper.h"
 | 
				
			||||||
#include "vmwgfx_drv.h"
 | 
					#include "vmwgfx_drv.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VMWGFX_NUM_DISPLAY_UNITS 8
 | 
					#define VMWGFX_NUM_DISPLAY_UNITS 8
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -546,7 +546,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static struct drm_framebuffer *psb_user_framebuffer_create
 | 
					static struct drm_framebuffer *psb_user_framebuffer_create
 | 
				
			||||||
			(struct drm_device *dev, struct drm_file *filp,
 | 
								(struct drm_device *dev, struct drm_file *filp,
 | 
				
			||||||
			 struct drm_mode_fb_cmd *cmd)
 | 
								 struct drm_mode_fb_cmd2 *cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gtt_range *r;
 | 
						struct gtt_range *r;
 | 
				
			||||||
	struct drm_gem_object *obj;
 | 
						struct drm_gem_object *obj;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -717,6 +717,7 @@ struct drm_get_cap {
 | 
				
			||||||
#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
 | 
					#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
 | 
				
			||||||
#define DRM_IOCTL_MODE_GETPLANE	DRM_IOWR(0xB6, struct drm_mode_get_plane)
 | 
					#define DRM_IOCTL_MODE_GETPLANE	DRM_IOWR(0xB6, struct drm_mode_get_plane)
 | 
				
			||||||
#define DRM_IOCTL_MODE_SETPLANE	DRM_IOWR(0xB7, struct drm_mode_set_plane)
 | 
					#define DRM_IOCTL_MODE_SETPLANE	DRM_IOWR(0xB7, struct drm_mode_set_plane)
 | 
				
			||||||
 | 
					#define DRM_IOCTL_MODE_ADDFB2		DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Device specific ioctls should only be in their respective headers
 | 
					 * Device specific ioctls should only be in their respective headers
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,9 +29,10 @@
 | 
				
			||||||
#include <linux/spinlock.h>
 | 
					#include <linux/spinlock.h>
 | 
				
			||||||
#include <linux/types.h>
 | 
					#include <linux/types.h>
 | 
				
			||||||
#include <linux/idr.h>
 | 
					#include <linux/idr.h>
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <linux/fb.h>
 | 
					#include <linux/fb.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <drm/drm_fourcc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct drm_device;
 | 
					struct drm_device;
 | 
				
			||||||
struct drm_mode_set;
 | 
					struct drm_mode_set;
 | 
				
			||||||
struct drm_framebuffer;
 | 
					struct drm_framebuffer;
 | 
				
			||||||
| 
						 | 
					@ -246,6 +247,7 @@ struct drm_framebuffer {
 | 
				
			||||||
	unsigned int depth;
 | 
						unsigned int depth;
 | 
				
			||||||
	int bits_per_pixel;
 | 
						int bits_per_pixel;
 | 
				
			||||||
	int flags;
 | 
						int flags;
 | 
				
			||||||
 | 
						uint32_t pixel_format; /* fourcc format */
 | 
				
			||||||
	struct list_head filp_head;
 | 
						struct list_head filp_head;
 | 
				
			||||||
	/* if you are using the helper */
 | 
						/* if you are using the helper */
 | 
				
			||||||
	void *helper_private;
 | 
						void *helper_private;
 | 
				
			||||||
| 
						 | 
					@ -619,7 +621,7 @@ struct drm_mode_set {
 | 
				
			||||||
 * struct drm_mode_config_funcs - configure CRTCs for a given screen layout
 | 
					 * struct drm_mode_config_funcs - configure CRTCs for a given screen layout
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct drm_mode_config_funcs {
 | 
					struct drm_mode_config_funcs {
 | 
				
			||||||
	struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
 | 
						struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
 | 
				
			||||||
	void (*output_poll_changed)(struct drm_device *dev);
 | 
						void (*output_poll_changed)(struct drm_device *dev);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -837,6 +839,9 @@ extern int drm_mode_cursor_ioctl(struct drm_device *dev,
 | 
				
			||||||
				void *data, struct drm_file *file_priv);
 | 
									void *data, struct drm_file *file_priv);
 | 
				
			||||||
extern int drm_mode_addfb(struct drm_device *dev,
 | 
					extern int drm_mode_addfb(struct drm_device *dev,
 | 
				
			||||||
			  void *data, struct drm_file *file_priv);
 | 
								  void *data, struct drm_file *file_priv);
 | 
				
			||||||
 | 
					extern int drm_mode_addfb2(struct drm_device *dev,
 | 
				
			||||||
 | 
								   void *data, struct drm_file *file_priv);
 | 
				
			||||||
 | 
					extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
 | 
				
			||||||
extern int drm_mode_rmfb(struct drm_device *dev,
 | 
					extern int drm_mode_rmfb(struct drm_device *dev,
 | 
				
			||||||
			 void *data, struct drm_file *file_priv);
 | 
								 void *data, struct drm_file *file_priv);
 | 
				
			||||||
extern int drm_mode_getfb(struct drm_device *dev,
 | 
					extern int drm_mode_getfb(struct drm_device *dev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,8 +116,10 @@ extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode);
 | 
					extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void drm_helper_get_fb_bpp_depth(uint32_t format, unsigned int *depth,
 | 
				
			||||||
 | 
										int *bpp);
 | 
				
			||||||
extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
 | 
					extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
 | 
				
			||||||
					  struct drm_mode_fb_cmd *mode_cmd);
 | 
										  struct drm_mode_fb_cmd2 *mode_cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
 | 
					static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
 | 
				
			||||||
				       const struct drm_crtc_helper_funcs *funcs)
 | 
									       const struct drm_crtc_helper_funcs *funcs)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								include/drm/drm_fourcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								include/drm/drm_fourcc.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2011 Intel Corporation
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
				
			||||||
 | 
					 * copy of this software and associated documentation files (the "Software"),
 | 
				
			||||||
 | 
					 * to deal in the Software without restriction, including without limitation
 | 
				
			||||||
 | 
					 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
				
			||||||
 | 
					 * and/or sell copies of the Software, and to permit persons to whom the
 | 
				
			||||||
 | 
					 * Software is furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice (including the next
 | 
				
			||||||
 | 
					 * paragraph) shall be included in all copies or substantial portions of the
 | 
				
			||||||
 | 
					 * Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
				
			||||||
 | 
					 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
				
			||||||
 | 
					 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
				
			||||||
 | 
					 * OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DRM_FOURCC_H
 | 
				
			||||||
 | 
					#define DRM_FOURCC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * We don't use the V4L header because
 | 
				
			||||||
 | 
					 * 1) the fourcc codes are well defined and trivial to construct
 | 
				
			||||||
 | 
					 * 2) we don't want user apps to have to pull in v4l headers just for fourcc
 | 
				
			||||||
 | 
					 * 3) the v4l fourcc codes are mixed up with a bunch of other code and are
 | 
				
			||||||
 | 
					 *    part of the v4l API, so changing them to something linux-generic isn't
 | 
				
			||||||
 | 
					 *    feasible
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * So the below includes the fourcc codes used by the DRM and its drivers,
 | 
				
			||||||
 | 
					 * along with potential device specific codes.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \
 | 
				
			||||||
 | 
								      ((u32)(c) << 16) | ((u32)(d) << 24))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* RGB codes */
 | 
				
			||||||
 | 
					#define DRM_FOURCC_RGB332 fourcc_code('R','G','B','1')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_RGB555 fourcc_code('R','G','B','O')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_RGB565 fourcc_code('R','G','B','P')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_RGB24  fourcc_code('R','G','B','3')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_RGB32  fourcc_code('R','G','B','4')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DRM_FOURCC_BGR24  fourcc_code('B','G','R','3')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_BGR32  fourcc_code('B','G','R','4')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* YUV codes */
 | 
				
			||||||
 | 
					#define DRM_FOURCC_YUYV   fourcc_code('Y', 'U', 'Y', 'V')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_YVYU   fourcc_code('Y', 'V', 'Y', 'U')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_UYVY   fourcc_code('U', 'Y', 'V', 'Y')
 | 
				
			||||||
 | 
					#define DRM_FOURCC_VYUY   fourcc_code('V', 'Y', 'U', 'Y')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* DRM specific codes */
 | 
				
			||||||
 | 
					#define DRM_INTEL_RGB30   fourcc_code('R','G','B','0') /* RGB x:10:10:10 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* DRM_FOURCC_H */
 | 
				
			||||||
| 
						 | 
					@ -268,6 +268,33 @@ struct drm_mode_fb_cmd {
 | 
				
			||||||
	__u32 handle;
 | 
						__u32 handle;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DRM_MODE_FB_INTERLACED	(1<<0 /* for interlaced framebuffers */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct drm_mode_fb_cmd2 {
 | 
				
			||||||
 | 
						__u32 fb_id;
 | 
				
			||||||
 | 
						__u32 width, height;
 | 
				
			||||||
 | 
						__u32 pixel_format; /* fourcc code from drm_fourcc.h */
 | 
				
			||||||
 | 
						__u32 flags; /* see above flags */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * In case of planar formats, this ioctl allows up to 4
 | 
				
			||||||
 | 
						 * buffer objects with offets and pitches per plane.
 | 
				
			||||||
 | 
						 * The pitch and offset order is dictated by the fourcc,
 | 
				
			||||||
 | 
						 * e.g. NV12 (http://fourcc.org/yuv.php#NV12) is described as:
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *   YUV 4:2:0 image with a plane of 8 bit Y samples
 | 
				
			||||||
 | 
						 *   followed by an interleaved U/V plane containing
 | 
				
			||||||
 | 
						 *   8 bit 2x2 subsampled colour difference samples.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * So it would consist of Y as offset[0] and UV as
 | 
				
			||||||
 | 
						 * offeset[1].  Note that offset[0] will generally
 | 
				
			||||||
 | 
						 * be 0.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						__u32 handles[4];
 | 
				
			||||||
 | 
						__u32 pitches[4]; /* pitch for each plane */
 | 
				
			||||||
 | 
						__u32 offsets[4]; /* offset of each plane */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
 | 
					#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
 | 
				
			||||||
#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
 | 
					#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
 | 
				
			||||||
#define DRM_MODE_FB_DIRTY_FLAGS         0x03
 | 
					#define DRM_MODE_FB_DIRTY_FLAGS         0x03
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue