diff options
Diffstat (limited to 'include/drm')
58 files changed, 5081 insertions, 7260 deletions
diff --git a/include/drm/Kbuild b/include/drm/Kbuild deleted file mode 100644 index ffec177f348..00000000000 --- a/include/drm/Kbuild +++ /dev/null @@ -1,14 +0,0 @@ -header-y += drm.h -header-y += drm_mode.h -header-y += drm_sarea.h -header-y += i810_drm.h -header-y += i830_drm.h -header-y += i915_drm.h -header-y += mga_drm.h -header-y += nouveau_drm.h -header-y += r128_drm.h -header-y += radeon_drm.h -header-y += savage_drm.h -header-y += sis_drm.h -header-y += via_drm.h -header-y += vmwgfx_drm.h diff --git a/include/drm/bridge/ptn3460.h b/include/drm/bridge/ptn3460.h new file mode 100644 index 00000000000..ff62344fec6 --- /dev/null +++ b/include/drm/bridge/ptn3460.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2013 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef _DRM_BRIDGE_PTN3460_H_ +#define _DRM_BRIDGE_PTN3460_H_ + +struct drm_device; +struct drm_encoder; +struct i2c_client; +struct device_node; + +#if defined(CONFIG_DRM_PTN3460) || defined(CONFIG_DRM_PTN3460_MODULE) + +int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, +		struct i2c_client *client, struct device_node *node); +#else + +static inline int ptn3460_init(struct drm_device *dev, +		struct drm_encoder *encoder, struct i2c_client *client, +		struct device_node *node) +{ +	return 0; +} + +#endif + +#endif diff --git a/include/drm/drm.h b/include/drm/drm.h deleted file mode 100644 index e5f70617dec..00000000000 --- a/include/drm/drm.h +++ /dev/null @@ -1,789 +0,0 @@ -/** - * \file drm.h - * Header for the Direct Rendering Manager - * - * \author Rickard E. (Rik) Faith <faith@valinux.com> - * - * \par Acknowledgments: - * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic \c cmpxchg. - */ - -/* - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. - * All rights reserved. - * - * 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_H_ -#define _DRM_H_ - -#if defined(__linux__) - -#include <linux/types.h> -#include <asm/ioctl.h> -typedef unsigned int drm_handle_t; - -#else /* One of the BSDs */ - -#include <sys/ioccom.h> -#include <sys/types.h> -typedef int8_t   __s8; -typedef uint8_t  __u8; -typedef int16_t  __s16; -typedef uint16_t __u16; -typedef int32_t  __s32; -typedef uint32_t __u32; -typedef int64_t  __s64; -typedef uint64_t __u64; -typedef unsigned long drm_handle_t; - -#endif - -#define DRM_NAME	"drm"	  /**< Name in kernel, /dev, and /proc */ -#define DRM_MIN_ORDER	5	  /**< At least 2^5 bytes = 32 bytes */ -#define DRM_MAX_ORDER	22	  /**< Up to 2^22 bytes = 4MB */ -#define DRM_RAM_PERCENT 10	  /**< How much system ram can we lock? */ - -#define _DRM_LOCK_HELD	0x80000000U /**< Hardware lock is held */ -#define _DRM_LOCK_CONT	0x40000000U /**< Hardware lock is contended */ -#define _DRM_LOCK_IS_HELD(lock)	   ((lock) & _DRM_LOCK_HELD) -#define _DRM_LOCK_IS_CONT(lock)	   ((lock) & _DRM_LOCK_CONT) -#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT)) - -typedef unsigned int drm_context_t; -typedef unsigned int drm_drawable_t; -typedef unsigned int drm_magic_t; - -/** - * Cliprect. - * - * \warning: If you change this structure, make sure you change - * XF86DRIClipRectRec in the server as well - * - * \note KW: Actually it's illegal to change either for - * backwards-compatibility reasons. - */ -struct drm_clip_rect { -	unsigned short x1; -	unsigned short y1; -	unsigned short x2; -	unsigned short y2; -}; - -/** - * Drawable information. - */ -struct drm_drawable_info { -	unsigned int num_rects; -	struct drm_clip_rect *rects; -}; - -/** - * Texture region, - */ -struct drm_tex_region { -	unsigned char next; -	unsigned char prev; -	unsigned char in_use; -	unsigned char padding; -	unsigned int age; -}; - -/** - * Hardware lock. - * - * The lock structure is a simple cache-line aligned integer.  To avoid - * processor bus contention on a multiprocessor system, there should not be any - * other data stored in the same cache line. - */ -struct drm_hw_lock { -	__volatile__ unsigned int lock;		/**< lock variable */ -	char padding[60];			/**< Pad to cache line */ -}; - -/** - * DRM_IOCTL_VERSION ioctl argument type. - * - * \sa drmGetVersion(). - */ -struct drm_version { -	int version_major;	  /**< Major version */ -	int version_minor;	  /**< Minor version */ -	int version_patchlevel;	  /**< Patch level */ -	size_t name_len;	  /**< Length of name buffer */ -	char __user *name;	  /**< Name of driver */ -	size_t date_len;	  /**< Length of date buffer */ -	char __user *date;	  /**< User-space buffer to hold date */ -	size_t desc_len;	  /**< Length of desc buffer */ -	char __user *desc;	  /**< User-space buffer to hold desc */ -}; - -/** - * DRM_IOCTL_GET_UNIQUE ioctl argument type. - * - * \sa drmGetBusid() and drmSetBusId(). - */ -struct drm_unique { -	size_t unique_len;	  /**< Length of unique */ -	char __user *unique;	  /**< Unique name for driver instantiation */ -}; - -struct drm_list { -	int count;		  /**< Length of user-space structures */ -	struct drm_version __user *version; -}; - -struct drm_block { -	int unused; -}; - -/** - * DRM_IOCTL_CONTROL ioctl argument type. - * - * \sa drmCtlInstHandler() and drmCtlUninstHandler(). - */ -struct drm_control { -	enum { -		DRM_ADD_COMMAND, -		DRM_RM_COMMAND, -		DRM_INST_HANDLER, -		DRM_UNINST_HANDLER -	} func; -	int irq; -}; - -/** - * Type of memory to map. - */ -enum drm_map_type { -	_DRM_FRAME_BUFFER = 0,	  /**< WC (no caching), no core dump */ -	_DRM_REGISTERS = 1,	  /**< no caching, no core dump */ -	_DRM_SHM = 2,		  /**< shared, cached */ -	_DRM_AGP = 3,		  /**< AGP/GART */ -	_DRM_SCATTER_GATHER = 4,  /**< Scatter/gather memory for PCI DMA */ -	_DRM_CONSISTENT = 5,	  /**< Consistent memory for PCI DMA */ -	_DRM_GEM = 6,		  /**< GEM object */ -}; - -/** - * Memory mapping flags. - */ -enum drm_map_flags { -	_DRM_RESTRICTED = 0x01,	     /**< Cannot be mapped to user-virtual */ -	_DRM_READ_ONLY = 0x02, -	_DRM_LOCKED = 0x04,	     /**< shared, cached, locked */ -	_DRM_KERNEL = 0x08,	     /**< kernel requires access */ -	_DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */ -	_DRM_CONTAINS_LOCK = 0x20,   /**< SHM page that contains lock */ -	_DRM_REMOVABLE = 0x40,	     /**< Removable mapping */ -	_DRM_DRIVER = 0x80	     /**< Managed by driver */ -}; - -struct drm_ctx_priv_map { -	unsigned int ctx_id;	 /**< Context requesting private mapping */ -	void *handle;		 /**< Handle of map */ -}; - -/** - * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls - * argument type. - * - * \sa drmAddMap(). - */ -struct drm_map { -	unsigned long offset;	 /**< Requested physical address (0 for SAREA)*/ -	unsigned long size;	 /**< Requested physical size (bytes) */ -	enum drm_map_type type;	 /**< Type of memory to map */ -	enum drm_map_flags flags;	 /**< Flags */ -	void *handle;		 /**< User-space: "Handle" to pass to mmap() */ -				 /**< Kernel-space: kernel-virtual address */ -	int mtrr;		 /**< MTRR slot used */ -	/*   Private data */ -}; - -/** - * DRM_IOCTL_GET_CLIENT ioctl argument type. - */ -struct drm_client { -	int idx;		/**< Which client desired? */ -	int auth;		/**< Is client authenticated? */ -	unsigned long pid;	/**< Process ID */ -	unsigned long uid;	/**< User ID */ -	unsigned long magic;	/**< Magic */ -	unsigned long iocs;	/**< Ioctl count */ -}; - -enum drm_stat_type { -	_DRM_STAT_LOCK, -	_DRM_STAT_OPENS, -	_DRM_STAT_CLOSES, -	_DRM_STAT_IOCTLS, -	_DRM_STAT_LOCKS, -	_DRM_STAT_UNLOCKS, -	_DRM_STAT_VALUE,	/**< Generic value */ -	_DRM_STAT_BYTE,		/**< Generic byte counter (1024bytes/K) */ -	_DRM_STAT_COUNT,	/**< Generic non-byte counter (1000/k) */ - -	_DRM_STAT_IRQ,		/**< IRQ */ -	_DRM_STAT_PRIMARY,	/**< Primary DMA bytes */ -	_DRM_STAT_SECONDARY,	/**< Secondary DMA bytes */ -	_DRM_STAT_DMA,		/**< DMA */ -	_DRM_STAT_SPECIAL,	/**< Special DMA (e.g., priority or polled) */ -	_DRM_STAT_MISSED	/**< Missed DMA opportunity */ -	    /* Add to the *END* of the list */ -}; - -/** - * DRM_IOCTL_GET_STATS ioctl argument type. - */ -struct drm_stats { -	unsigned long count; -	struct { -		unsigned long value; -		enum drm_stat_type type; -	} data[15]; -}; - -/** - * Hardware locking flags. - */ -enum drm_lock_flags { -	_DRM_LOCK_READY = 0x01,	     /**< Wait until hardware is ready for DMA */ -	_DRM_LOCK_QUIESCENT = 0x02,  /**< Wait until hardware quiescent */ -	_DRM_LOCK_FLUSH = 0x04,	     /**< Flush this context's DMA queue first */ -	_DRM_LOCK_FLUSH_ALL = 0x08,  /**< Flush all DMA queues first */ -	/* These *HALT* flags aren't supported yet -	   -- they will be used to support the -	   full-screen DGA-like mode. */ -	_DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */ -	_DRM_HALT_CUR_QUEUES = 0x20  /**< Halt all current queues */ -}; - -/** - * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type. - * - * \sa drmGetLock() and drmUnlock(). - */ -struct drm_lock { -	int context; -	enum drm_lock_flags flags; -}; - -/** - * DMA flags - * - * \warning - * These values \e must match xf86drm.h. - * - * \sa drm_dma. - */ -enum drm_dma_flags { -	/* Flags for DMA buffer dispatch */ -	_DRM_DMA_BLOCK = 0x01,	      /**< -				       * Block until buffer dispatched. -				       * -				       * \note The buffer may not yet have -				       * been processed by the hardware -- -				       * getting a hardware lock with the -				       * hardware quiescent will ensure -				       * that the buffer has been -				       * processed. -				       */ -	_DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */ -	_DRM_DMA_PRIORITY = 0x04,     /**< High priority dispatch */ - -	/* Flags for DMA buffer request */ -	_DRM_DMA_WAIT = 0x10,	      /**< Wait for free buffers */ -	_DRM_DMA_SMALLER_OK = 0x20,   /**< Smaller-than-requested buffers OK */ -	_DRM_DMA_LARGER_OK = 0x40     /**< Larger-than-requested buffers OK */ -}; - -/** - * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type. - * - * \sa drmAddBufs(). - */ -struct drm_buf_desc { -	int count;		 /**< Number of buffers of this size */ -	int size;		 /**< Size in bytes */ -	int low_mark;		 /**< Low water mark */ -	int high_mark;		 /**< High water mark */ -	enum { -		_DRM_PAGE_ALIGN = 0x01,	/**< Align on page boundaries for DMA */ -		_DRM_AGP_BUFFER = 0x02,	/**< Buffer is in AGP space */ -		_DRM_SG_BUFFER = 0x04,	/**< Scatter/gather memory buffer */ -		_DRM_FB_BUFFER = 0x08,	/**< Buffer is in frame buffer */ -		_DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */ -	} flags; -	unsigned long agp_start; /**< -				  * Start address of where the AGP buffers are -				  * in the AGP aperture -				  */ -}; - -/** - * DRM_IOCTL_INFO_BUFS ioctl argument type. - */ -struct drm_buf_info { -	int count;		/**< Entries in list */ -	struct drm_buf_desc __user *list; -}; - -/** - * DRM_IOCTL_FREE_BUFS ioctl argument type. - */ -struct drm_buf_free { -	int count; -	int __user *list; -}; - -/** - * Buffer information - * - * \sa drm_buf_map. - */ -struct drm_buf_pub { -	int idx;		       /**< Index into the master buffer list */ -	int total;		       /**< Buffer size */ -	int used;		       /**< Amount of buffer in use (for DMA) */ -	void __user *address;	       /**< Address of buffer */ -}; - -/** - * DRM_IOCTL_MAP_BUFS ioctl argument type. - */ -struct drm_buf_map { -	int count;		/**< Length of the buffer list */ -	void __user *virtual;		/**< Mmap'd area in user-virtual */ -	struct drm_buf_pub __user *list;	/**< Buffer information */ -}; - -/** - * DRM_IOCTL_DMA ioctl argument type. - * - * Indices here refer to the offset into the buffer list in drm_buf_get. - * - * \sa drmDMA(). - */ -struct drm_dma { -	int context;			  /**< Context handle */ -	int send_count;			  /**< Number of buffers to send */ -	int __user *send_indices;	  /**< List of handles to buffers */ -	int __user *send_sizes;		  /**< Lengths of data to send */ -	enum drm_dma_flags flags;	  /**< Flags */ -	int request_count;		  /**< Number of buffers requested */ -	int request_size;		  /**< Desired size for buffers */ -	int __user *request_indices;	  /**< Buffer information */ -	int __user *request_sizes; -	int granted_count;		  /**< Number of buffers granted */ -}; - -enum drm_ctx_flags { -	_DRM_CONTEXT_PRESERVED = 0x01, -	_DRM_CONTEXT_2DONLY = 0x02 -}; - -/** - * DRM_IOCTL_ADD_CTX ioctl argument type. - * - * \sa drmCreateContext() and drmDestroyContext(). - */ -struct drm_ctx { -	drm_context_t handle; -	enum drm_ctx_flags flags; -}; - -/** - * DRM_IOCTL_RES_CTX ioctl argument type. - */ -struct drm_ctx_res { -	int count; -	struct drm_ctx __user *contexts; -}; - -/** - * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type. - */ -struct drm_draw { -	drm_drawable_t handle; -}; - -/** - * DRM_IOCTL_UPDATE_DRAW ioctl argument type. - */ -typedef enum { -	DRM_DRAWABLE_CLIPRECTS, -} drm_drawable_info_type_t; - -struct drm_update_draw { -	drm_drawable_t handle; -	unsigned int type; -	unsigned int num; -	unsigned long long data; -}; - -/** - * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type. - */ -struct drm_auth { -	drm_magic_t magic; -}; - -/** - * DRM_IOCTL_IRQ_BUSID ioctl argument type. - * - * \sa drmGetInterruptFromBusID(). - */ -struct drm_irq_busid { -	int irq;	/**< IRQ number */ -	int busnum;	/**< bus number */ -	int devnum;	/**< device number */ -	int funcnum;	/**< function number */ -}; - -enum drm_vblank_seq_type { -	_DRM_VBLANK_ABSOLUTE = 0x0,	/**< Wait for specific vblank sequence number */ -	_DRM_VBLANK_RELATIVE = 0x1,	/**< Wait for given number of vblanks */ -	_DRM_VBLANK_EVENT = 0x4000000,   /**< Send event instead of blocking */ -	_DRM_VBLANK_FLIP = 0x8000000,   /**< Scheduled buffer swap should flip */ -	_DRM_VBLANK_NEXTONMISS = 0x10000000,	/**< If missed, wait for next vblank */ -	_DRM_VBLANK_SECONDARY = 0x20000000,	/**< Secondary display controller */ -	_DRM_VBLANK_SIGNAL = 0x40000000	/**< Send signal instead of blocking, unsupported */ -}; - -#define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE) -#define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \ -				_DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS) - -struct drm_wait_vblank_request { -	enum drm_vblank_seq_type type; -	unsigned int sequence; -	unsigned long signal; -}; - -struct drm_wait_vblank_reply { -	enum drm_vblank_seq_type type; -	unsigned int sequence; -	long tval_sec; -	long tval_usec; -}; - -/** - * DRM_IOCTL_WAIT_VBLANK ioctl argument type. - * - * \sa drmWaitVBlank(). - */ -union drm_wait_vblank { -	struct drm_wait_vblank_request request; -	struct drm_wait_vblank_reply reply; -}; - -#define _DRM_PRE_MODESET 1 -#define _DRM_POST_MODESET 2 - -/** - * DRM_IOCTL_MODESET_CTL ioctl argument type - * - * \sa drmModesetCtl(). - */ -struct drm_modeset_ctl { -	__u32 crtc; -	__u32 cmd; -}; - -/** - * DRM_IOCTL_AGP_ENABLE ioctl argument type. - * - * \sa drmAgpEnable(). - */ -struct drm_agp_mode { -	unsigned long mode;	/**< AGP mode */ -}; - -/** - * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type. - * - * \sa drmAgpAlloc() and drmAgpFree(). - */ -struct drm_agp_buffer { -	unsigned long size;	/**< In bytes -- will round to page boundary */ -	unsigned long handle;	/**< Used for binding / unbinding */ -	unsigned long type;	/**< Type of memory to allocate */ -	unsigned long physical;	/**< Physical used by i810 */ -}; - -/** - * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type. - * - * \sa drmAgpBind() and drmAgpUnbind(). - */ -struct drm_agp_binding { -	unsigned long handle;	/**< From drm_agp_buffer */ -	unsigned long offset;	/**< In bytes -- will round to page boundary */ -}; - -/** - * DRM_IOCTL_AGP_INFO ioctl argument type. - * - * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(), - * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(), - * drmAgpVendorId() and drmAgpDeviceId(). - */ -struct drm_agp_info { -	int agp_version_major; -	int agp_version_minor; -	unsigned long mode; -	unsigned long aperture_base;	/* physical address */ -	unsigned long aperture_size;	/* bytes */ -	unsigned long memory_allowed;	/* bytes */ -	unsigned long memory_used; - -	/* PCI information */ -	unsigned short id_vendor; -	unsigned short id_device; -}; - -/** - * DRM_IOCTL_SG_ALLOC ioctl argument type. - */ -struct drm_scatter_gather { -	unsigned long size;	/**< In bytes -- will round to page boundary */ -	unsigned long handle;	/**< Used for mapping / unmapping */ -}; - -/** - * DRM_IOCTL_SET_VERSION ioctl argument type. - */ -struct drm_set_version { -	int drm_di_major; -	int drm_di_minor; -	int drm_dd_major; -	int drm_dd_minor; -}; - -/** DRM_IOCTL_GEM_CLOSE ioctl argument type */ -struct drm_gem_close { -	/** Handle of the object to be closed. */ -	__u32 handle; -	__u32 pad; -}; - -/** DRM_IOCTL_GEM_FLINK ioctl argument type */ -struct drm_gem_flink { -	/** Handle for the object being named */ -	__u32 handle; - -	/** Returned global name */ -	__u32 name; -}; - -/** DRM_IOCTL_GEM_OPEN ioctl argument type */ -struct drm_gem_open { -	/** Name of object being opened */ -	__u32 name; - -	/** Returned handle for the object */ -	__u32 handle; - -	/** Returned size of the object */ -	__u64 size; -}; - -#include "drm_mode.h" - -#define DRM_IOCTL_BASE			'd' -#define DRM_IO(nr)			_IO(DRM_IOCTL_BASE,nr) -#define DRM_IOR(nr,type)		_IOR(DRM_IOCTL_BASE,nr,type) -#define DRM_IOW(nr,type)		_IOW(DRM_IOCTL_BASE,nr,type) -#define DRM_IOWR(nr,type)		_IOWR(DRM_IOCTL_BASE,nr,type) - -#define DRM_IOCTL_VERSION		DRM_IOWR(0x00, struct drm_version) -#define DRM_IOCTL_GET_UNIQUE		DRM_IOWR(0x01, struct drm_unique) -#define DRM_IOCTL_GET_MAGIC		DRM_IOR( 0x02, struct drm_auth) -#define DRM_IOCTL_IRQ_BUSID		DRM_IOWR(0x03, struct drm_irq_busid) -#define DRM_IOCTL_GET_MAP               DRM_IOWR(0x04, struct drm_map) -#define DRM_IOCTL_GET_CLIENT            DRM_IOWR(0x05, struct drm_client) -#define DRM_IOCTL_GET_STATS             DRM_IOR( 0x06, struct drm_stats) -#define DRM_IOCTL_SET_VERSION		DRM_IOWR(0x07, struct drm_set_version) -#define DRM_IOCTL_MODESET_CTL           DRM_IOW(0x08, struct drm_modeset_ctl) -#define DRM_IOCTL_GEM_CLOSE		DRM_IOW (0x09, struct drm_gem_close) -#define DRM_IOCTL_GEM_FLINK		DRM_IOWR(0x0a, struct drm_gem_flink) -#define DRM_IOCTL_GEM_OPEN		DRM_IOWR(0x0b, struct drm_gem_open) - -#define DRM_IOCTL_SET_UNIQUE		DRM_IOW( 0x10, struct drm_unique) -#define DRM_IOCTL_AUTH_MAGIC		DRM_IOW( 0x11, struct drm_auth) -#define DRM_IOCTL_BLOCK			DRM_IOWR(0x12, struct drm_block) -#define DRM_IOCTL_UNBLOCK		DRM_IOWR(0x13, struct drm_block) -#define DRM_IOCTL_CONTROL		DRM_IOW( 0x14, struct drm_control) -#define DRM_IOCTL_ADD_MAP		DRM_IOWR(0x15, struct drm_map) -#define DRM_IOCTL_ADD_BUFS		DRM_IOWR(0x16, struct drm_buf_desc) -#define DRM_IOCTL_MARK_BUFS		DRM_IOW( 0x17, struct drm_buf_desc) -#define DRM_IOCTL_INFO_BUFS		DRM_IOWR(0x18, struct drm_buf_info) -#define DRM_IOCTL_MAP_BUFS		DRM_IOWR(0x19, struct drm_buf_map) -#define DRM_IOCTL_FREE_BUFS		DRM_IOW( 0x1a, struct drm_buf_free) - -#define DRM_IOCTL_RM_MAP		DRM_IOW( 0x1b, struct drm_map) - -#define DRM_IOCTL_SET_SAREA_CTX		DRM_IOW( 0x1c, struct drm_ctx_priv_map) -#define DRM_IOCTL_GET_SAREA_CTX 	DRM_IOWR(0x1d, struct drm_ctx_priv_map) - -#define DRM_IOCTL_SET_MASTER            DRM_IO(0x1e) -#define DRM_IOCTL_DROP_MASTER           DRM_IO(0x1f) - -#define DRM_IOCTL_ADD_CTX		DRM_IOWR(0x20, struct drm_ctx) -#define DRM_IOCTL_RM_CTX		DRM_IOWR(0x21, struct drm_ctx) -#define DRM_IOCTL_MOD_CTX		DRM_IOW( 0x22, struct drm_ctx) -#define DRM_IOCTL_GET_CTX		DRM_IOWR(0x23, struct drm_ctx) -#define DRM_IOCTL_SWITCH_CTX		DRM_IOW( 0x24, struct drm_ctx) -#define DRM_IOCTL_NEW_CTX		DRM_IOW( 0x25, struct drm_ctx) -#define DRM_IOCTL_RES_CTX		DRM_IOWR(0x26, struct drm_ctx_res) -#define DRM_IOCTL_ADD_DRAW		DRM_IOWR(0x27, struct drm_draw) -#define DRM_IOCTL_RM_DRAW		DRM_IOWR(0x28, struct drm_draw) -#define DRM_IOCTL_DMA			DRM_IOWR(0x29, struct drm_dma) -#define DRM_IOCTL_LOCK			DRM_IOW( 0x2a, struct drm_lock) -#define DRM_IOCTL_UNLOCK		DRM_IOW( 0x2b, struct drm_lock) -#define DRM_IOCTL_FINISH		DRM_IOW( 0x2c, struct drm_lock) - -#define DRM_IOCTL_GEM_PRIME_OPEN        DRM_IOWR(0x2e, struct drm_gem_open) - -#define DRM_IOCTL_AGP_ACQUIRE		DRM_IO(  0x30) -#define DRM_IOCTL_AGP_RELEASE		DRM_IO(  0x31) -#define DRM_IOCTL_AGP_ENABLE		DRM_IOW( 0x32, struct drm_agp_mode) -#define DRM_IOCTL_AGP_INFO		DRM_IOR( 0x33, struct drm_agp_info) -#define DRM_IOCTL_AGP_ALLOC		DRM_IOWR(0x34, struct drm_agp_buffer) -#define DRM_IOCTL_AGP_FREE		DRM_IOW( 0x35, struct drm_agp_buffer) -#define DRM_IOCTL_AGP_BIND		DRM_IOW( 0x36, struct drm_agp_binding) -#define DRM_IOCTL_AGP_UNBIND		DRM_IOW( 0x37, struct drm_agp_binding) - -#define DRM_IOCTL_SG_ALLOC		DRM_IOWR(0x38, struct drm_scatter_gather) -#define DRM_IOCTL_SG_FREE		DRM_IOW( 0x39, struct drm_scatter_gather) - -#define DRM_IOCTL_WAIT_VBLANK		DRM_IOWR(0x3a, union drm_wait_vblank) - -#define DRM_IOCTL_UPDATE_DRAW		DRM_IOW(0x3f, struct drm_update_draw) - -#define DRM_IOCTL_MODE_GETRESOURCES	DRM_IOWR(0xA0, struct drm_mode_card_res) -#define DRM_IOCTL_MODE_GETCRTC		DRM_IOWR(0xA1, struct drm_mode_crtc) -#define DRM_IOCTL_MODE_SETCRTC		DRM_IOWR(0xA2, struct drm_mode_crtc) -#define DRM_IOCTL_MODE_CURSOR		DRM_IOWR(0xA3, struct drm_mode_cursor) -#define DRM_IOCTL_MODE_GETGAMMA		DRM_IOWR(0xA4, struct drm_mode_crtc_lut) -#define DRM_IOCTL_MODE_SETGAMMA		DRM_IOWR(0xA5, struct drm_mode_crtc_lut) -#define DRM_IOCTL_MODE_GETENCODER	DRM_IOWR(0xA6, struct drm_mode_get_encoder) -#define DRM_IOCTL_MODE_GETCONNECTOR	DRM_IOWR(0xA7, struct drm_mode_get_connector) -#define DRM_IOCTL_MODE_ATTACHMODE	DRM_IOWR(0xA8, struct drm_mode_mode_cmd) -#define DRM_IOCTL_MODE_DETACHMODE	DRM_IOWR(0xA9, struct drm_mode_mode_cmd) - -#define DRM_IOCTL_MODE_GETPROPERTY	DRM_IOWR(0xAA, struct drm_mode_get_property) -#define DRM_IOCTL_MODE_SETPROPERTY	DRM_IOWR(0xAB, struct drm_mode_connector_set_property) -#define DRM_IOCTL_MODE_GETPROPBLOB	DRM_IOWR(0xAC, struct drm_mode_get_blob) -#define DRM_IOCTL_MODE_GETFB		DRM_IOWR(0xAD, struct drm_mode_fb_cmd) -#define DRM_IOCTL_MODE_ADDFB		DRM_IOWR(0xAE, struct drm_mode_fb_cmd) -#define DRM_IOCTL_MODE_RMFB		DRM_IOWR(0xAF, unsigned int) -#define DRM_IOCTL_MODE_PAGE_FLIP	DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip) -#define DRM_IOCTL_MODE_DIRTYFB		DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd) - -/** - * Device specific ioctls should only be in their respective headers - * The device specific ioctl range is from 0x40 to 0x99. - * Generic IOCTLS restart at 0xA0. - * - * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and - * drmCommandReadWrite(). - */ -#define DRM_COMMAND_BASE                0x40 -#define DRM_COMMAND_END			0xA0 - -/** - * Header for events written back to userspace on the drm fd.  The - * type defines the type of event, the length specifies the total - * length of the event (including the header), and user_data is - * typically a 64 bit value passed with the ioctl that triggered the - * event.  A read on the drm fd will always only return complete - * events, that is, if for example the read buffer is 100 bytes, and - * there are two 64 byte events pending, only one will be returned. - * - * Event types 0 - 0x7fffffff are generic drm events, 0x80000000 and - * up are chipset specific. - */ -struct drm_event { -	__u32 type; -	__u32 length; -}; - -#define DRM_EVENT_VBLANK 0x01 -#define DRM_EVENT_FLIP_COMPLETE 0x02 - -struct drm_event_vblank { -	struct drm_event base; -	__u64 user_data; -	__u32 tv_sec; -	__u32 tv_usec; -	__u32 sequence; -	__u32 reserved; -}; - -/* typedef area */ -#ifndef __KERNEL__ -typedef struct drm_clip_rect drm_clip_rect_t; -typedef struct drm_drawable_info drm_drawable_info_t; -typedef struct drm_tex_region drm_tex_region_t; -typedef struct drm_hw_lock drm_hw_lock_t; -typedef struct drm_version drm_version_t; -typedef struct drm_unique drm_unique_t; -typedef struct drm_list drm_list_t; -typedef struct drm_block drm_block_t; -typedef struct drm_control drm_control_t; -typedef enum drm_map_type drm_map_type_t; -typedef enum drm_map_flags drm_map_flags_t; -typedef struct drm_ctx_priv_map drm_ctx_priv_map_t; -typedef struct drm_map drm_map_t; -typedef struct drm_client drm_client_t; -typedef enum drm_stat_type drm_stat_type_t; -typedef struct drm_stats drm_stats_t; -typedef enum drm_lock_flags drm_lock_flags_t; -typedef struct drm_lock drm_lock_t; -typedef enum drm_dma_flags drm_dma_flags_t; -typedef struct drm_buf_desc drm_buf_desc_t; -typedef struct drm_buf_info drm_buf_info_t; -typedef struct drm_buf_free drm_buf_free_t; -typedef struct drm_buf_pub drm_buf_pub_t; -typedef struct drm_buf_map drm_buf_map_t; -typedef struct drm_dma drm_dma_t; -typedef union drm_wait_vblank drm_wait_vblank_t; -typedef struct drm_agp_mode drm_agp_mode_t; -typedef enum drm_ctx_flags drm_ctx_flags_t; -typedef struct drm_ctx drm_ctx_t; -typedef struct drm_ctx_res drm_ctx_res_t; -typedef struct drm_draw drm_draw_t; -typedef struct drm_update_draw drm_update_draw_t; -typedef struct drm_auth drm_auth_t; -typedef struct drm_irq_busid drm_irq_busid_t; -typedef enum drm_vblank_seq_type drm_vblank_seq_type_t; - -typedef struct drm_agp_buffer drm_agp_buffer_t; -typedef struct drm_agp_binding drm_agp_binding_t; -typedef struct drm_agp_info drm_agp_info_t; -typedef struct drm_scatter_gather drm_scatter_gather_t; -typedef struct drm_set_version drm_set_version_t; -#endif - -#endif diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 274eaaa15c3..8af71a8e2c0 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -42,11 +42,10 @@   * can build the DRM (part of PI DRI). 4/21/2000 S + B */  #include <asm/current.h>  #endif				/* __alpha__ */ -#include <linux/module.h>  #include <linux/kernel.h> +#include <linux/kref.h>  #include <linux/miscdevice.h>  #include <linux/fs.h> -#include <linux/proc_fs.h>  #include <linux/init.h>  #include <linux/file.h>  #include <linux/platform_device.h> @@ -56,96 +55,93 @@  #include <linux/mm.h>  #include <linux/cdev.h>  #include <linux/mutex.h> +#include <linux/io.h>  #include <linux/slab.h> +#include <linux/ratelimit.h>  #if defined(__alpha__) || defined(__powerpc__)  #include <asm/pgtable.h>	/* For pte_wrprotect */  #endif -#include <asm/io.h>  #include <asm/mman.h>  #include <asm/uaccess.h> -#ifdef CONFIG_MTRR -#include <asm/mtrr.h> -#endif -#if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE)  #include <linux/types.h>  #include <linux/agp_backend.h> -#endif  #include <linux/workqueue.h>  #include <linux/poll.h>  #include <asm/pgalloc.h> -#include "drm.h" +#include <drm/drm.h> +#include <drm/drm_sarea.h> +#include <drm/drm_vma_manager.h>  #include <linux/idr.h>  #define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE))) -#define __OS_HAS_MTRR (defined(CONFIG_MTRR)) + +struct module;  struct drm_file;  struct drm_device; -#include "drm_os_linux.h" -#include "drm_hashtab.h" -#include "drm_mm.h" +struct device_node; +struct videomode; + +#include <drm/drm_os_linux.h> +#include <drm/drm_hashtab.h> +#include <drm/drm_mm.h> -#define DRM_UT_CORE 		0x01 -#define DRM_UT_DRIVER		0x02 -#define DRM_UT_KMS		0x04  /* - * Three debug levels are defined. - * drm_core, drm_driver, drm_kms - * drm_core level can be used in the generic drm code. For example: - * 	drm_ioctl, drm_mm, drm_memory - * The macro definiton of DRM_DEBUG is used. - * 	DRM_DEBUG(fmt, args...) - * 	The debug info by using the DRM_DEBUG can be obtained by adding - * 	the boot option of "drm.debug=1". + * 4 debug categories are defined: + * + * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... + *	 This is the category used by the DRM_DEBUG() macro.   * - * drm_driver level can be used in the specific drm driver. It is used - * to add the debug info related with the drm driver. For example: - * i915_drv, i915_dma, i915_gem, radeon_drv, - * 	The macro definition of DRM_DEBUG_DRIVER can be used. - * 	DRM_DEBUG_DRIVER(fmt, args...) - * 	The debug info by using the DRM_DEBUG_DRIVER can be obtained by - * 	adding the boot option of "drm.debug=0x02" + * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ... + *	   This is the category used by the DRM_DEBUG_DRIVER() macro.   * - * drm_kms level can be used in the KMS code related with specific drm driver. - * It is used to add the debug info related with KMS mode. For example: - * the connector/crtc , - * 	The macro definition of DRM_DEBUG_KMS can be used. - * 	DRM_DEBUG_KMS(fmt, args...) - * 	The debug info by using the DRM_DEBUG_KMS can be obtained by - * 	adding the boot option of "drm.debug=0x04" + * KMS: used in the modesetting code. + *	This is the category used by the DRM_DEBUG_KMS() macro.   * - * If we add the boot option of "drm.debug=0x06", we can get the debug info by - * using the DRM_DEBUG_KMS and DRM_DEBUG_DRIVER. - * If we add the boot option of "drm.debug=0x05", we can get the debug info by - * using the DRM_DEBUG_KMS and DRM_DEBUG. + * PRIME: used in the prime code. + *	  This is the category used by the DRM_DEBUG_PRIME() macro. + * + * Enabling verbose debug messages is done through the drm.debug parameter, + * each category being enabled by a bit. + * + * drm.debug=0x1 will enable CORE messages + * drm.debug=0x2 will enable DRIVER messages + * drm.debug=0x3 will enable CORE and DRIVER messages + * ... + * drm.debug=0xf will enable all messages + * + * An interesting feature is that it's possible to enable verbose logging at + * run-time by echoing the debug value in its sysfs node: + *   # echo 0xf > /sys/module/drm/parameters/debug   */ +#define DRM_UT_CORE 		0x01 +#define DRM_UT_DRIVER		0x02 +#define DRM_UT_KMS		0x04 +#define DRM_UT_PRIME		0x08 + +extern __printf(2, 3) +void drm_ut_debug_printk(const char *function_name, +			 const char *format, ...); +extern __printf(2, 3) +int drm_err(const char *func, const char *format, ...); -extern void drm_ut_debug_printk(unsigned int request_level, -				const char *prefix, -				const char *function_name, -				const char *format, ...);  /***********************************************************************/  /** \name DRM template customization defaults */  /*@{*/  /* driver capabilities and requirements mask */  #define DRIVER_USE_AGP     0x1 -#define DRIVER_REQUIRE_AGP 0x2 -#define DRIVER_USE_MTRR    0x4  #define DRIVER_PCI_DMA     0x8  #define DRIVER_SG          0x10  #define DRIVER_HAVE_DMA    0x20  #define DRIVER_HAVE_IRQ    0x40  #define DRIVER_IRQ_SHARED  0x80 -#define DRIVER_IRQ_VBL     0x100 -#define DRIVER_DMA_QUEUE   0x200 -#define DRIVER_FB_DMA      0x400 -#define DRIVER_IRQ_VBL2    0x800  #define DRIVER_GEM         0x1000  #define DRIVER_MODESET     0x2000 -#define DRIVER_USE_PLATFORM_DEVICE  0x4000 +#define DRIVER_PRIME       0x4000 +#define DRIVER_RENDER      0x8000  /***********************************************************************/  /** \name Begin the DRM... */ @@ -157,13 +153,7 @@ extern void drm_ut_debug_printk(unsigned int request_level,  #define DRM_MAGIC_HASH_ORDER  4  /**< Size of key hash table. Must be power of 2. */  #define DRM_KERNEL_CONTEXT    0	 /**< Change drm_resctx if changed */  #define DRM_RESERVED_CONTEXTS 1	 /**< Change drm_resctx if changed */ -#define DRM_LOOPING_LIMIT     5000000 -#define DRM_TIME_SLICE	      (HZ/20)  /**< Time slice for GLXContexts */ -#define DRM_LOCK_SLICE	      1	/**< Time slice for lock, in jiffies */ -#define DRM_FLAG_DEBUG	  0x01 - -#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)  #define DRM_MAP_HASH_OFFSET 0x10000000  /*@}*/ @@ -178,21 +168,30 @@ extern void drm_ut_debug_printk(unsigned int request_level,   * \param fmt printf() like format string.   * \param arg arguments   */ -#define DRM_ERROR(fmt, arg...) \ -	printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg) +#define DRM_ERROR(fmt, ...)				\ +	drm_err(__func__, fmt, ##__VA_ARGS__)  /** - * Memory error output. + * Rate limited error output.  Like DRM_ERROR() but won't flood the log.   * - * \param area memory area where the error occurred.   * \param fmt printf() like format string.   * \param arg arguments   */ -#define DRM_MEM_ERROR(area, fmt, arg...) \ -	printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __func__, \ -	       drm_mem_stats[area].name , ##arg) - -#define DRM_INFO(fmt, arg...)  printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg) +#define DRM_ERROR_RATELIMITED(fmt, ...)				\ +({									\ +	static DEFINE_RATELIMIT_STATE(_rs,				\ +				      DEFAULT_RATELIMIT_INTERVAL,	\ +				      DEFAULT_RATELIMIT_BURST);		\ +									\ +	if (__ratelimit(&_rs))						\ +		drm_err(__func__, fmt, ##__VA_ARGS__);			\ +}) + +#define DRM_INFO(fmt, ...)				\ +	printk(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__) + +#define DRM_INFO_ONCE(fmt, ...)				\ +	printk_once(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__)  /**   * Debug output. @@ -203,49 +202,30 @@ extern void drm_ut_debug_printk(unsigned int request_level,  #if DRM_DEBUG_CODE  #define DRM_DEBUG(fmt, args...)						\  	do {								\ -		drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, 		\ -					__func__, fmt, ##args);		\ +		if (unlikely(drm_debug & DRM_UT_CORE))			\ +			drm_ut_debug_printk(__func__, fmt, ##args);	\  	} while (0)  #define DRM_DEBUG_DRIVER(fmt, args...)					\  	do {								\ -		drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME,		\ -					__func__, fmt, ##args);		\ -	} while (0) -#define DRM_DEBUG_KMS(fmt, args...)				\ -	do {								\ -		drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, 		\ -					 __func__, fmt, ##args);	\ -	} while (0) -#define DRM_LOG(fmt, args...)						\ -	do {								\ -		drm_ut_debug_printk(DRM_UT_CORE, NULL,			\ -					NULL, fmt, ##args);		\ -	} while (0) -#define DRM_LOG_KMS(fmt, args...)					\ -	do {								\ -		drm_ut_debug_printk(DRM_UT_KMS, NULL,			\ -					NULL, fmt, ##args);		\ +		if (unlikely(drm_debug & DRM_UT_DRIVER))		\ +			drm_ut_debug_printk(__func__, fmt, ##args);	\  	} while (0) -#define DRM_LOG_MODE(fmt, args...)					\ +#define DRM_DEBUG_KMS(fmt, args...)					\  	do {								\ -		drm_ut_debug_printk(DRM_UT_MODE, NULL,			\ -					NULL, fmt, ##args);		\ +		if (unlikely(drm_debug & DRM_UT_KMS))			\ +			drm_ut_debug_printk(__func__, fmt, ##args);	\  	} while (0) -#define DRM_LOG_DRIVER(fmt, args...)					\ +#define DRM_DEBUG_PRIME(fmt, args...)					\  	do {								\ -		drm_ut_debug_printk(DRM_UT_DRIVER, NULL,		\ -					NULL, fmt, ##args);		\ +		if (unlikely(drm_debug & DRM_UT_PRIME))			\ +			drm_ut_debug_printk(__func__, fmt, ##args);	\  	} while (0)  #else  #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)  #define DRM_DEBUG_KMS(fmt, args...)	do { } while (0) +#define DRM_DEBUG_PRIME(fmt, args...)	do { } while (0)  #define DRM_DEBUG(fmt, arg...)		 do { } while (0) -#define DRM_LOG(fmt, arg...)		do { } while (0) -#define DRM_LOG_KMS(fmt, args...) do { } while (0) -#define DRM_LOG_MODE(fmt, arg...) do { } while (0) -#define DRM_LOG_DRIVER(fmt, arg...) do { } while (0) -  #endif  /*@}*/ @@ -254,11 +234,6 @@ extern void drm_ut_debug_printk(unsigned int request_level,  /** \name Internal types and structures */  /*@{*/ -#define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x) - -#define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1)) -#define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x)) -  #define DRM_IF_VERSION(maj, min) (maj << 16 | min)  /** @@ -300,12 +275,14 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,  #define DRM_ROOT_ONLY	0x4  #define DRM_CONTROL_ALLOW 0x8  #define DRM_UNLOCKED	0x10 +#define DRM_RENDER_ALLOW 0x20  struct drm_ioctl_desc {  	unsigned int cmd;  	int flags;  	drm_ioctl_t *func;  	unsigned int cmd_drv; +	const char *name;  };  /** @@ -314,7 +291,7 @@ struct drm_ioctl_desc {   */  #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags)			\ -	[DRM_IOCTL_NR(DRM_##ioctl)] = {.cmd = DRM_##ioctl, .func = _func, .flags = _flags, .cmd_drv = DRM_IOCTL_##ioctl} +	[DRM_IOCTL_NR(DRM_##ioctl)] = {.cmd = DRM_##ioctl, .func = _func, .flags = _flags, .cmd_drv = DRM_IOCTL_##ioctl, .name = #ioctl}  struct drm_magic_entry {  	struct list_head head; @@ -342,7 +319,6 @@ struct drm_buf {  	struct drm_buf *next;	       /**< Kernel-only: used for free list */  	__volatile__ int waiting;      /**< On kernel DMA queue */  	__volatile__ int pending;      /**< On hardware DMA queue */ -	wait_queue_head_t dma_wait;    /**< Processes waiting */  	struct drm_file *file_priv;    /**< Private of holding file descr */  	int context;		       /**< Kernel queue for this buffer */  	int while_locked;	       /**< Dispatch this buffer while locked */ @@ -412,13 +388,29 @@ struct drm_pending_event {  	void (*destroy)(struct drm_pending_event *event);  }; +/* initial implementaton using a linked list - todo hashtab */ +struct drm_prime_file_private { +	struct list_head head; +	struct mutex lock; +}; +  /** File private data */  struct drm_file { -	int authenticated; -	pid_t pid; -	uid_t uid; +	unsigned always_authenticated :1; +	unsigned authenticated :1; +	/* Whether we're master for a minor. Protected by master_mutex */ +	unsigned is_master :1; +	/* true when the client has asked us to expose stereo 3D mode flags */ +	unsigned stereo_allowed :1; +	/* +	 * true if client understands CRTC primary planes and cursor planes +	 * in the plane list +	 */ +	unsigned universal_planes:1; + +	struct pid *pid; +	kuid_t uid;  	drm_magic_t magic; -	unsigned long ioctl_count;  	struct list_head lhead;  	struct drm_minor *minor;  	unsigned long lock_count; @@ -431,14 +423,22 @@ struct drm_file {  	struct file *filp;  	void *driver_priv; -	int is_master; /* this file private is a master for a minor */  	struct drm_master *master; /* master this node is currently associated with  				      N.B. not always minor->master */ +	/** +	 * fbs - List of framebuffers associated with this file. +	 * +	 * Protected by fbs_lock. Note that the fbs list holds a reference on +	 * the fb object to prevent it from untimely disappearing. +	 */  	struct list_head fbs; +	struct mutex fbs_lock;  	wait_queue_head_t event_wait;  	struct list_head event_list;  	int event_space; + +	struct drm_prime_file_private prime;  };  /** Wait queue */ @@ -499,7 +499,7 @@ struct drm_device_dma {   */  struct drm_agp_mem {  	unsigned long handle;		/**< handle */ -	DRM_AGP_MEM *memory; +	struct agp_memory *memory;  	unsigned long bound;		/**< address */  	int pages;  	struct list_head head; @@ -511,7 +511,7 @@ struct drm_agp_mem {   * \sa drm_agp_init() and drm_device::agp.   */  struct drm_agp_head { -	DRM_AGP_KERN agp_info;		/**< AGP device information */ +	struct agp_kern_info agp_info;		/**< AGP device information */  	struct list_head memory;  	unsigned long mode;		/**< AGP mode */  	struct agp_bridge_data *bridge; @@ -564,7 +564,6 @@ struct drm_map_list {  	struct drm_local_map *map;	/**< mapping */  	uint64_t user_token;  	struct drm_master *master; -	struct drm_mm_node *file_offset_node;	/**< fake offset */  };  /** @@ -596,14 +595,6 @@ struct drm_ati_pcigart_info {  };  /** - * GEM specific mm private for tracking GEM objects - */ -struct drm_gem_mm { -	struct drm_mm offset_manager;	/**< Offset mgmt for buffer objects */ -	struct drm_open_hash offset_hash; /**< User token hash table for maps */ -}; - -/**   * This structure defines the drm_mm memory object, which will be used by the   * DRM for its buffer objects.   */ @@ -611,8 +602,16 @@ struct drm_gem_object {  	/** Reference count of this object */  	struct kref refcount; -	/** Handle count of this object. Each handle also holds a reference */ -	atomic_t handle_count; /* number of handles on this object */ +	/** +	 * handle_count - gem file_priv handle count of this object +	 * +	 * Each handle also holds a reference. Note that when the handle_count +	 * drops to 0 any global names (e.g. the id in the flink namespace) will +	 * be cleared. +	 * +	 * Protected by dev->object_name_lock. +	 * */ +	unsigned handle_count;  	/** Related drm device */  	struct drm_device *dev; @@ -621,7 +620,7 @@ struct drm_gem_object {  	struct file *filp;  	/* Mapping info for this object */ -	struct drm_map_list map_list; +	struct drm_vma_offset_node vma_node;  	/**  	 * Size of the object, in bytes.  Immutable over the object's @@ -653,34 +652,79 @@ struct drm_gem_object {  	uint32_t pending_read_domains;  	uint32_t pending_write_domain; -	void *driver_private; +	/** +	 * dma_buf - dma buf associated with this GEM object +	 * +	 * Pointer to the dma-buf associated with this gem object (either +	 * through importing or exporting). We break the resulting reference +	 * loop when the last gem handle for this object is released. +	 * +	 * Protected by obj->object_name_lock +	 */ +	struct dma_buf *dma_buf; + +	/** +	 * import_attach - dma buf attachment backing this object +	 * +	 * Any foreign dma_buf imported as a gem object has this set to the +	 * attachment point for the device. This is invariant over the lifetime +	 * of a gem object. +	 * +	 * The driver's ->gem_free_object callback is responsible for cleaning +	 * up the dma_buf attachment and references acquired at import time. +	 * +	 * Note that the drm gem/prime core does not depend upon drivers setting +	 * this field any more. So for drivers where this doesn't make sense +	 * (e.g. virtual devices or a displaylink behind an usb bus) they can +	 * simply leave it as NULL. +	 */ +	struct dma_buf_attachment *import_attach;  }; -#include "drm_crtc.h" +#include <drm/drm_crtc.h> -/* per-master structure */ +/** + * struct drm_master - drm master structure + * + * @refcount: Refcount for this master object. + * @minor: Link back to minor char device we are master for. Immutable. + * @unique: Unique identifier: e.g. busid. Protected by drm_global_mutex. + * @unique_len: Length of unique field. Protected by drm_global_mutex. + * @unique_size: Amount allocated. Protected by drm_global_mutex. + * @magiclist: Hash of used authentication tokens. Protected by struct_mutex. + * @magicfree: List of used authentication tokens. Protected by struct_mutex. + * @lock: DRI lock information. + * @driver_priv: Pointer to driver-private information. + */  struct drm_master { - -	struct kref refcount; /* refcount for this master */ - -	struct list_head head; /**< each minor contains a list of masters */ -	struct drm_minor *minor; /**< link back to minor we are a master for */ - -	char *unique;			/**< Unique identifier: e.g., busid */ -	int unique_len;			/**< Length of unique field */ -	int unique_size;		/**< amount allocated */ - -	int blocked;			/**< Blocked due to VC switch? */ - -	/** \name Authentication */ -	/*@{ */ +	struct kref refcount; +	struct drm_minor *minor; +	char *unique; +	int unique_len; +	int unique_size;  	struct drm_open_hash magiclist;  	struct list_head magicfree; -	/*@} */ +	struct drm_lock_data lock; +	void *driver_priv; +}; -	struct drm_lock_data lock;	/**< Information on hardware lock */ +/* Size of ringbuffer for vblank timestamps. Just double-buffer + * in initial implementation. + */ +#define DRM_VBLANKTIME_RBSIZE 2 -	void *driver_priv; /**< Private structure for driver to use */ +/* Flags and return codes for get_vblank_timestamp() driver function. */ +#define DRM_CALLED_FROM_VBLIRQ 1 +#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0) +#define DRM_VBLANKTIME_INVBL             (1 << 1) + +/* get_scanout_position() return flags */ +#define DRM_SCANOUTPOS_VALID        (1 << 0) +#define DRM_SCANOUTPOS_INVBL        (1 << 1) +#define DRM_SCANOUTPOS_ACCURATE     (1 << 2) + +struct drm_bus { +	int (*set_busid)(struct drm_device *dev, struct drm_master *master);  };  /** @@ -707,11 +751,11 @@ struct drm_driver {  	 * @dev: DRM device  	 * @crtc: counter to fetch  	 * -	 * Driver callback for fetching a raw hardware vblank counter -	 * for @crtc.  If a device doesn't have a hardware counter, the -	 * driver can simply return the value of drm_vblank_count and -	 * make the enable_vblank() and disable_vblank() hooks into no-ops, -	 * leaving interrupts enabled at all times. +	 * Driver callback for fetching a raw hardware vblank counter for @crtc. +	 * If a device doesn't have a hardware counter, the driver can simply +	 * return the value of drm_vblank_count. The DRM core will account for +	 * missed vblank events while interrupts where disabled based on system +	 * timestamps.  	 *  	 * Wraparound handling and loss of events due to modesetting is dealt  	 * with in the DRM core code. @@ -760,20 +804,82 @@ struct drm_driver {  	 */  	int (*device_is_agp) (struct drm_device *dev); +	/** +	 * Called by vblank timestamping code. +	 * +	 * Return the current display scanout position from a crtc, and an +	 * optional accurate ktime_get timestamp of when position was measured. +	 * +	 * \param dev  DRM device. +	 * \param crtc Id of the crtc to query. +	 * \param flags Flags from the caller (DRM_CALLED_FROM_VBLIRQ or 0). +	 * \param *vpos Target location for current vertical scanout position. +	 * \param *hpos Target location for current horizontal scanout position. +	 * \param *stime Target location for timestamp taken immediately before +	 *               scanout position query. Can be NULL to skip timestamp. +	 * \param *etime Target location for timestamp taken immediately after +	 *               scanout position query. Can be NULL to skip timestamp. +	 * +	 * Returns vpos as a positive number while in active scanout area. +	 * Returns vpos as a negative number inside vblank, counting the number +	 * of scanlines to go until end of vblank, e.g., -1 means "one scanline +	 * until start of active scanout / end of vblank." +	 * +	 * \return Flags, or'ed together as follows: +	 * +	 * DRM_SCANOUTPOS_VALID = Query successful. +	 * DRM_SCANOUTPOS_INVBL = Inside vblank. +	 * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of +	 * this flag means that returned position may be offset by a constant +	 * but unknown small number of scanlines wrt. real scanout position. +	 * +	 */ +	int (*get_scanout_position) (struct drm_device *dev, int crtc, +				     unsigned int flags, +				     int *vpos, int *hpos, ktime_t *stime, +				     ktime_t *etime); + +	/** +	 * Called by \c drm_get_last_vbltimestamp. Should return a precise +	 * timestamp when the most recent VBLANK interval ended or will end. +	 * +	 * Specifically, the timestamp in @vblank_time should correspond as +	 * closely as possible to the time when the first video scanline of +	 * the video frame after the end of VBLANK will start scanning out, +	 * the time immediately after end of the VBLANK interval. If the +	 * @crtc is currently inside VBLANK, this will be a time in the future. +	 * If the @crtc is currently scanning out a frame, this will be the +	 * past start time of the current scanout. This is meant to adhere +	 * to the OpenML OML_sync_control extension specification. +	 * +	 * \param dev dev DRM device handle. +	 * \param crtc crtc for which timestamp should be returned. +	 * \param *max_error Maximum allowable timestamp error in nanoseconds. +	 *                   Implementation should strive to provide timestamp +	 *                   with an error of at most *max_error nanoseconds. +	 *                   Returns true upper bound on error for timestamp. +	 * \param *vblank_time Target location for returned vblank timestamp. +	 * \param flags 0 = Defaults, no special treatment needed. +	 * \param       DRM_CALLED_FROM_VBLIRQ = Function is called from vblank +	 *	        irq handler. Some drivers need to apply some workarounds +	 *              for gpu-specific vblank irq quirks if flag is set. +	 * +	 * \returns +	 * Zero if timestamping isn't supported in current display mode or a +	 * negative number on failure. A positive status code on success, +	 * which describes how the vblank_time timestamp was computed. +	 */ +	int (*get_vblank_timestamp) (struct drm_device *dev, int crtc, +				     int *max_error, +				     struct timeval *vblank_time, +				     unsigned flags); +  	/* these have to be filled in */ -	irqreturn_t(*irq_handler) (DRM_IRQ_ARGS); +	irqreturn_t(*irq_handler) (int irq, void *arg);  	void (*irq_preinstall) (struct drm_device *dev);  	int (*irq_postinstall) (struct drm_device *dev);  	void (*irq_uninstall) (struct drm_device *dev); -	void (*reclaim_buffers) (struct drm_device *dev, -				 struct drm_file * file_priv); -	void (*reclaim_buffers_locked) (struct drm_device *dev, -					struct drm_file *file_priv); -	void (*reclaim_buffers_idlelocked) (struct drm_device *dev, -					    struct drm_file *file_priv); -	void (*set_version) (struct drm_device *dev, -			     struct drm_set_version *sv);  	/* Master routines */  	int (*master_create)(struct drm_device *dev, struct drm_master *master); @@ -797,14 +903,51 @@ struct drm_driver {  	 *  	 * Returns 0 on success.  	 */ -	int (*gem_init_object) (struct drm_gem_object *obj);  	void (*gem_free_object) (struct drm_gem_object *obj); +	int (*gem_open_object) (struct drm_gem_object *, struct drm_file *); +	void (*gem_close_object) (struct drm_gem_object *, struct drm_file *); + +	/* prime: */ +	/* export handle -> fd (see drm_gem_prime_handle_to_fd() helper) */ +	int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, +				uint32_t handle, uint32_t flags, int *prime_fd); +	/* import fd -> handle (see drm_gem_prime_fd_to_handle() helper) */ +	int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, +				int prime_fd, uint32_t *handle); +	/* export GEM -> dmabuf */ +	struct dma_buf * (*gem_prime_export)(struct drm_device *dev, +				struct drm_gem_object *obj, int flags); +	/* import dmabuf -> GEM */ +	struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, +				struct dma_buf *dma_buf); +	/* low-level interface used by drm_gem_prime_{import,export} */ +	int (*gem_prime_pin)(struct drm_gem_object *obj); +	void (*gem_prime_unpin)(struct drm_gem_object *obj); +	struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj); +	struct drm_gem_object *(*gem_prime_import_sg_table)( +				struct drm_device *dev, size_t size, +				struct sg_table *sgt); +	void *(*gem_prime_vmap)(struct drm_gem_object *obj); +	void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr); +	int (*gem_prime_mmap)(struct drm_gem_object *obj, +				struct vm_area_struct *vma);  	/* vga arb irq handler */  	void (*vgaarb_irq)(struct drm_device *dev, bool state); +	/* dumb alloc support */ +	int (*dumb_create)(struct drm_file *file_priv, +			   struct drm_device *dev, +			   struct drm_mode_create_dumb *args); +	int (*dumb_map_offset)(struct drm_file *file_priv, +			       struct drm_device *dev, uint32_t handle, +			       uint64_t *offset); +	int (*dumb_destroy)(struct drm_file *file_priv, +			    struct drm_device *dev, +			    uint32_t handle); +  	/* Driver private ops for this object */ -	struct vm_operations_struct *gem_vm_ops; +	const struct vm_operations_struct *gem_vm_ops;  	int major;  	int minor; @@ -815,39 +958,20 @@ struct drm_driver {  	u32 driver_features;  	int dev_priv_size; -	struct drm_ioctl_desc *ioctls; +	const struct drm_ioctl_desc *ioctls;  	int num_ioctls; -	struct file_operations fops; -	struct pci_driver pci_driver; -	struct platform_device *platform_device; -	/* List of devices hanging off this driver */ -	struct list_head device_list; -}; +	const struct file_operations *fops; +	struct drm_bus *bus; -#define DRM_MINOR_UNASSIGNED 0 -#define DRM_MINOR_LEGACY 1 -#define DRM_MINOR_CONTROL 2 -#define DRM_MINOR_RENDER 3 - - -/** - * debugfs node list. This structure represents a debugfs file to - * be created by the drm core - */ -struct drm_debugfs_list { -	const char *name; /** file name */ -	int (*show)(struct seq_file*, void*); /** show callback */ -	u32 driver_features; /**< Required driver features for this entry */ +	/* List of devices hanging off this driver with stealth attach. */ +	struct list_head legacy_dev_list;  }; -/** - * debugfs node structure. This structure represents a debugfs file. - */ -struct drm_debugfs_node { -	struct list_head list; -	struct drm_minor *minor; -	struct drm_debugfs_list *debugfs_ent; -	struct dentry *dent; +enum drm_minor_type { +	DRM_MINOR_LEGACY, +	DRM_MINOR_CONTROL, +	DRM_MINOR_RENDER, +	DRM_MINOR_CNT,  };  /** @@ -867,7 +991,7 @@ struct drm_info_list {  struct drm_info_node {  	struct list_head list;  	struct drm_minor *minor; -	struct drm_info_list *info_ent; +	const struct drm_info_list *info_ent;  	struct dentry *dent;  }; @@ -877,69 +1001,88 @@ struct drm_info_node {  struct drm_minor {  	int index;			/**< Minor device number */  	int type;                       /**< Control or render */ -	dev_t device;			/**< Device number for mknod */ -	struct device kdev;		/**< Linux device */ +	struct device *kdev;		/**< Linux device */  	struct drm_device *dev; -	struct proc_dir_entry *proc_root;  /**< proc directory entry */ -	struct drm_info_node proc_nodes;  	struct dentry *debugfs_root; -	struct drm_info_node debugfs_nodes; -	struct drm_master *master; /* currently active master for this node */ -	struct list_head master_list; +	struct list_head debugfs_list; +	struct mutex debugfs_lock; /* Protects debugfs_list. */ + +	/* currently active master for this node. Protected by master_mutex */ +	struct drm_master *master;  	struct drm_mode_group mode_group;  }; +  struct drm_pending_vblank_event {  	struct drm_pending_event base;  	int pipe;  	struct drm_event_vblank event;  }; +struct drm_vblank_crtc { +	struct drm_device *dev;		/* pointer to the drm_device */ +	wait_queue_head_t queue;	/**< VBLANK wait queue */ +	struct timeval time[DRM_VBLANKTIME_RBSIZE];	/**< timestamp of current count */ +	struct timer_list disable_timer;		/* delayed disable timer */ +	atomic_t count;			/**< number of VBLANK interrupts */ +	atomic_t refcount;		/* number of users of vblank interruptsper crtc */ +	u32 last;			/* protected by dev->vbl_lock, used */ +					/* for wraparound handling */ +	u32 last_wait;			/* Last vblank seqno waited per CRTC */ +	unsigned int inmodeset;		/* Display driver is setting mode */ +	int crtc;			/* crtc index */ +	bool enabled;			/* so we don't call enable more than +					   once per disable */ +}; +  /**   * DRM device structure. This structure represent a complete card that   * may contain multiple heads.   */  struct drm_device { -	struct list_head driver_item;	/**< list of devices per driver */ -	char *devname;			/**< For /proc/interrupts */ +	struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */  	int if_version;			/**< Highest interface version set */ +	/** \name Lifetime Management */ +	/*@{ */ +	struct kref ref;		/**< Object ref-count */ +	struct device *dev;		/**< Device structure of bus-device */ +	struct drm_driver *driver;	/**< DRM driver managing the device */ +	void *dev_private;		/**< DRM driver private data */ +	struct drm_minor *control;		/**< Control node */ +	struct drm_minor *primary;		/**< Primary node */ +	struct drm_minor *render;		/**< Render node */ +	atomic_t unplugged;			/**< Flag whether dev is dead */ +	struct inode *anon_inode;		/**< inode for private address-space */ +	char *unique;				/**< unique name of the device */ +	/*@} */ +  	/** \name Locks */  	/*@{ */ -	spinlock_t count_lock;		/**< For inuse, drm_device::open_count, drm_device::buf_use */  	struct mutex struct_mutex;	/**< For others */ +	struct mutex master_mutex;      /**< For drm_minor::master and drm_file::is_master */  	/*@} */  	/** \name Usage Counters */  	/*@{ */ -	int open_count;			/**< Outstanding files open */ -	atomic_t ioctl_count;		/**< Outstanding IOCTLs pending */ -	atomic_t vma_count;		/**< Outstanding vma areas open */ +	int open_count;			/**< Outstanding files open, protected by drm_global_mutex. */ +	spinlock_t buf_lock;		/**< For drm_device::buf_use and a few other things. */  	int buf_use;			/**< Buffers in use -- cannot alloc */  	atomic_t buf_alloc;		/**< Buffer allocation in progress */  	/*@} */ -	/** \name Performance counters */ -	/*@{ */ -	unsigned long counters; -	enum drm_stat_type types[15]; -	atomic_t counts[15]; -	/*@} */ -  	struct list_head filelist;  	/** \name Memory management */  	/*@{ */  	struct list_head maplist;	/**< Linked list of regions */ -	int map_count;			/**< Number of mappable regions */  	struct drm_open_hash map_hash;	/**< User token hash table for maps */  	/** \name Context handle management */  	/*@{ */  	struct list_head ctxlist;	/**< Linked list of context handles */ -	int ctx_count;			/**< Number of context handles */  	struct mutex ctxlist_mutex;	/**< For ctxlist */  	struct idr ctx_idr; @@ -948,28 +1091,20 @@ struct drm_device {  	/*@} */ -	/** \name DMA queues (contexts) */ +	/** \name DMA support */  	/*@{ */ -	int queue_count;		/**< Number of active DMA queues */ -	int queue_reserved;		  /**< Number of reserved DMA queues */ -	int queue_slots;		/**< Actual length of queuelist */ -	struct drm_queue **queuelist;	/**< Vector of pointers to DMA queues */  	struct drm_device_dma *dma;		/**< Optional pointer for DMA support */  	/*@} */  	/** \name Context support */  	/*@{ */ -	int irq_enabled;		/**< True if irq handler is enabled */ +	bool irq_enabled;		/**< True if irq handler is enabled */ +	int irq; +  	__volatile__ long context_flag;	/**< Context swapping flag */ -	__volatile__ long interrupt_flag; /**< Interruption handler flag */ -	__volatile__ long dma_flag;	/**< DMA dispatch flag */ -	wait_queue_head_t context_wait;	/**< Processes waiting on ctx switch */ -	int last_checked;		/**< Last context checked for DMA */  	int last_context;		/**< Last current context */ -	unsigned long last_switch;	/**< jiffies at last context switch */  	/*@} */ -	struct work_struct work;  	/** \name VBLANK IRQ support */  	/*@{ */ @@ -979,19 +1114,13 @@ struct drm_device {  	 * Once the modeset ioctl *has* been called though, we can safely  	 * disable them when unused.  	 */ -	int vblank_disable_allowed; +	bool vblank_disable_allowed; -	wait_queue_head_t *vbl_queue;   /**< VBLANK wait queue */ -	atomic_t *_vblank_count;        /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ +	/* array of size num_crtcs */ +	struct drm_vblank_crtc *vblank; + +	spinlock_t vblank_time_lock;    /**< Protects vblank count and time updates during vblank enable/disable */  	spinlock_t vbl_lock; -	atomic_t *vblank_refcount;      /* number of users of vblank interruptsper crtc */ -	u32 *last_vblank;               /* protected by dev->vbl_lock, used */ -					/* for wraparound handling */ -	int *vblank_enabled;            /* so we don't call enable more than -					   once per disable */ -	int *vblank_inmodeset;          /* Display driver is setting mode */ -	u32 *last_vblank_wait;		/* Last vblank seqno waited per CRTC */ -	struct timer_list vblank_disable_timer;  	u32 max_vblank_count;           /**< size of vblank counter register */ @@ -1002,147 +1131,91 @@ struct drm_device {  	spinlock_t event_lock;  	/*@} */ -	cycles_t ctx_start; -	cycles_t lck_start; - -	struct fasync_struct *buf_async;/**< Processes waiting for SIGIO */ -	wait_queue_head_t buf_readers;	/**< Processes waiting to read */ -	wait_queue_head_t buf_writers;	/**< Processes waiting to ctx switch */  	struct drm_agp_head *agp;	/**< AGP data */ -	struct device *dev;             /**< Device structure */  	struct pci_dev *pdev;		/**< PCI device structure */ -	int pci_vendor;			/**< PCI vendor id */ -	int pci_device;			/**< PCI device id */  #ifdef __alpha__  	struct pci_controller *hose;  #endif  	struct platform_device *platformdev; /**< Platform device struture */ +	struct usb_device *usbdev;  	struct drm_sg_mem *sg;	/**< Scatter gather memory */ -	int num_crtcs;                  /**< Number of CRTCs on this device */ -	void *dev_private;		/**< device private data */ -	void *mm_private; -	struct address_space *dev_mapping; +	unsigned int num_crtcs;                  /**< Number of CRTCs on this device */  	struct drm_sigdata sigdata;	   /**< For block_all_signals */  	sigset_t sigmask; -	struct drm_driver *driver;  	struct drm_local_map *agp_buffer_map;  	unsigned int agp_buffer_token; -	struct drm_minor *control;		/**< Control node for card */ -	struct drm_minor *primary;		/**< render type primary screen head */          struct drm_mode_config mode_config;	/**< Current mode config */  	/** \name GEM information */  	/*@{ */ -	spinlock_t object_name_lock; +	struct mutex object_name_lock;  	struct idr object_name_idr; -	uint32_t invalidate_domains;    /* domains pending invalidation */ -	uint32_t flush_domains;         /* domains pending flush */ +	struct drm_vma_offset_manager *vma_offset_manager;  	/*@} */ - +	int switch_power_state;  }; +#define DRM_SWITCH_POWER_ON 0 +#define DRM_SWITCH_POWER_OFF 1 +#define DRM_SWITCH_POWER_CHANGING 2 +#define DRM_SWITCH_POWER_DYNAMIC_OFF 3 +  static __inline__ int drm_core_check_feature(struct drm_device *dev,  					     int feature)  {  	return ((dev->driver->driver_features & feature) ? 1 : 0);  } -static inline int drm_dev_to_irq(struct drm_device *dev) +static inline void drm_device_set_unplugged(struct drm_device *dev)  { -	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) -		return platform_get_irq(dev->platformdev, 0); -	else -		return dev->pdev->irq; +	smp_wmb(); +	atomic_set(&dev->unplugged, 1);  } -static inline int drm_get_pci_domain(struct drm_device *dev) +static inline int drm_device_is_unplugged(struct drm_device *dev)  { -	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) -		return 0; - -#ifndef __alpha__ -	/* For historical reasons, drm_get_pci_domain() is busticated -	 * on most archs and has to remain so for userspace interface -	 * < 1.4, except on alpha which was right from the beginning -	 */ -	if (dev->if_version < 0x10004) -		return 0; -#endif /* __alpha__ */ - -	return pci_domain_nr(dev->pdev->bus); +	int ret = atomic_read(&dev->unplugged); +	smp_rmb(); +	return ret;  } -#if __OS_HAS_AGP -static inline int drm_core_has_AGP(struct drm_device *dev) +static inline bool drm_is_render_client(const struct drm_file *file_priv)  { -	return drm_core_check_feature(dev, DRIVER_USE_AGP); +	return file_priv->minor->type == DRM_MINOR_RENDER;  } -#else -#define drm_core_has_AGP(dev) (0) -#endif -#if __OS_HAS_MTRR -static inline int drm_core_has_MTRR(struct drm_device *dev) +static inline bool drm_is_control_client(const struct drm_file *file_priv)  { -	return drm_core_check_feature(dev, DRIVER_USE_MTRR); +	return file_priv->minor->type == DRM_MINOR_CONTROL;  } -#define DRM_MTRR_WC		MTRR_TYPE_WRCOMB - -static inline int drm_mtrr_add(unsigned long offset, unsigned long size, -			       unsigned int flags) -{ -	return mtrr_add(offset, size, flags, 1); -} - -static inline int drm_mtrr_del(int handle, unsigned long offset, -			       unsigned long size, unsigned int flags) -{ -	return mtrr_del(handle, offset, size); -} - -#else -#define drm_core_has_MTRR(dev) (0) - -#define DRM_MTRR_WC		0 - -static inline int drm_mtrr_add(unsigned long offset, unsigned long size, -			       unsigned int flags) +static inline bool drm_is_primary_client(const struct drm_file *file_priv)  { -	return 0; +	return file_priv->minor->type == DRM_MINOR_LEGACY;  } -static inline int drm_mtrr_del(int handle, unsigned long offset, -			       unsigned long size, unsigned int flags) -{ -	return 0; -} -#endif -  /******************************************************************/  /** \name Internal function definitions */  /*@{*/  				/* Driver support (drm_drv.h) */ -extern int drm_init(struct drm_driver *driver); -extern void drm_exit(struct drm_driver *driver);  extern long drm_ioctl(struct file *filp,  		      unsigned int cmd, unsigned long arg);  extern long drm_compat_ioctl(struct file *filp,  			     unsigned int cmd, unsigned long arg);  extern int drm_lastclose(struct drm_device *dev); +extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);  				/* Device support (drm_fops.h) */  extern struct mutex drm_global_mutex;  extern int drm_open(struct inode *inode, struct file *filp);  extern int drm_stub_open(struct inode *inode, struct file *filp); -extern int drm_fasync(int fd, struct file *filp, int on);  extern ssize_t drm_read(struct file *filp, char __user *buffer,  			size_t count, loff_t *offset);  extern int drm_release(struct inode *inode, struct file *filp); @@ -1150,25 +1223,13 @@ extern int drm_release(struct inode *inode, struct file *filp);  				/* Mapping support (drm_vm.h) */  extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);  extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); -extern void drm_vm_open_locked(struct vm_area_struct *vma); -extern void drm_vm_close_locked(struct vm_area_struct *vma); +extern void drm_vm_open_locked(struct drm_device *dev, struct vm_area_struct *vma); +extern void drm_vm_close_locked(struct drm_device *dev, struct vm_area_struct *vma);  extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);  				/* Memory management support (drm_memory.h) */ -#include "drm_memory.h" -extern void drm_mem_init(void); -extern int drm_mem_info(char *buf, char **start, off_t offset, -			int request, int *eof, void *data); -extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area); - -extern void drm_free_agp(DRM_AGP_MEM * handle, int pages); -extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); -extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev, -				       struct page **pages, -				       unsigned long num_pages, -				       uint32_t gtt_offset, -				       uint32_t type); -extern int drm_unbind_agp(DRM_AGP_MEM * handle); +#include <drm/drm_memory.h> +  				/* Misc. IOCTL support (drm_ioctl.h) */  extern int drm_irq_by_busid(struct drm_device *dev, void *data, @@ -1183,6 +1244,10 @@ extern int drm_getclient(struct drm_device *dev, void *data,  			 struct drm_file *file_priv);  extern int drm_getstats(struct drm_device *dev, void *data,  			struct drm_file *file_priv); +extern int drm_getcap(struct drm_device *dev, void *data, +		      struct drm_file *file_priv); +extern int drm_setclientcap(struct drm_device *dev, void *data, +			    struct drm_file *file_priv);  extern int drm_setversion(struct drm_device *dev, void *data,  			  struct drm_file *file_priv);  extern int drm_noop(struct drm_device *dev, void *data, @@ -1193,8 +1258,6 @@ extern int drm_resctx(struct drm_device *dev, void *data,  		      struct drm_file *file_priv);  extern int drm_addctx(struct drm_device *dev, void *data,  		      struct drm_file *file_priv); -extern int drm_modctx(struct drm_device *dev, void *data, -		      struct drm_file *file_priv);  extern int drm_getctx(struct drm_device *dev, void *data,  		      struct drm_file *file_priv);  extern int drm_switchctx(struct drm_device *dev, void *data, @@ -1218,9 +1281,12 @@ extern int drm_getmagic(struct drm_device *dev, void *data,  			struct drm_file *file_priv);  extern int drm_authmagic(struct drm_device *dev, void *data,  			 struct drm_file *file_priv); +extern int drm_remove_magic(struct drm_master *master, drm_magic_t magic);  /* Cache management (drm_cache.c) */  void drm_clflush_pages(struct page *pages[], unsigned long num_pages); +void drm_clflush_sg(struct sg_table *st); +void drm_clflush_virt_range(void *addr, unsigned long length);  				/* Locking IOCTL support (drm_lock.h) */  extern int drm_lock(struct drm_device *dev, void *data, @@ -1260,11 +1326,12 @@ extern int drm_freebufs(struct drm_device *dev, void *data,  			struct drm_file *file_priv);  extern int drm_mapbufs(struct drm_device *dev, void *data,  		       struct drm_file *file_priv); -extern int drm_order(unsigned long size); +extern int drm_dma_ioctl(struct drm_device *dev, void *data, +			 struct drm_file *file_priv);  				/* DMA support (drm_dma.h) */ -extern int drm_dma_setup(struct drm_device *dev); -extern void drm_dma_takedown(struct drm_device *dev); +extern int drm_legacy_dma_setup(struct drm_device *dev); +extern void drm_legacy_dma_takedown(struct drm_device *dev);  extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);  extern void drm_core_reclaim_buffers(struct drm_device *dev,  				     struct drm_file *filp); @@ -1272,23 +1339,40 @@ extern void drm_core_reclaim_buffers(struct drm_device *dev,  				/* IRQ support (drm_irq.h) */  extern int drm_control(struct drm_device *dev, void *data,  		       struct drm_file *file_priv); -extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS); -extern int drm_irq_install(struct drm_device *dev); +extern int drm_irq_install(struct drm_device *dev, int irq);  extern int drm_irq_uninstall(struct drm_device *dev); -extern void drm_driver_irq_preinstall(struct drm_device *dev); -extern void drm_driver_irq_postinstall(struct drm_device *dev); -extern void drm_driver_irq_uninstall(struct drm_device *dev);  extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);  extern int drm_wait_vblank(struct drm_device *dev, void *data,  			   struct drm_file *filp); -extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);  extern u32 drm_vblank_count(struct drm_device *dev, int crtc); -extern void drm_handle_vblank(struct drm_device *dev, int crtc); +extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, +				     struct timeval *vblanktime); +extern void drm_send_vblank_event(struct drm_device *dev, int crtc, +				     struct drm_pending_vblank_event *e); +extern bool drm_handle_vblank(struct drm_device *dev, int crtc);  extern int drm_vblank_get(struct drm_device *dev, int crtc);  extern void drm_vblank_put(struct drm_device *dev, int crtc); +extern int drm_crtc_vblank_get(struct drm_crtc *crtc); +extern void drm_crtc_vblank_put(struct drm_crtc *crtc);  extern void drm_vblank_off(struct drm_device *dev, int crtc); +extern void drm_vblank_on(struct drm_device *dev, int crtc); +extern void drm_crtc_vblank_off(struct drm_crtc *crtc); +extern void drm_crtc_vblank_on(struct drm_crtc *crtc);  extern void drm_vblank_cleanup(struct drm_device *dev); + +extern u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, +				     struct timeval *tvblank, unsigned flags); +extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, +						 int crtc, int *max_error, +						 struct timeval *vblank_time, +						 unsigned flags, +						 const struct drm_crtc *refcrtc, +						 const struct drm_display_mode *mode); +extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, +					    const struct drm_display_mode *mode); + +  /* Modesetting support */  extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);  extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); @@ -1296,32 +1380,8 @@ extern int drm_modeset_ctl(struct drm_device *dev, void *data,  			   struct drm_file *file_priv);  				/* AGP/GART support (drm_agpsupport.h) */ -extern struct drm_agp_head *drm_agp_init(struct drm_device *dev); -extern int drm_agp_acquire(struct drm_device *dev); -extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, -				 struct drm_file *file_priv); -extern int drm_agp_release(struct drm_device *dev); -extern int drm_agp_release_ioctl(struct drm_device *dev, void *data, -				 struct drm_file *file_priv); -extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); -extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data, -				struct drm_file *file_priv); -extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info); -extern int drm_agp_info_ioctl(struct drm_device *dev, void *data, -			struct drm_file *file_priv); -extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); -extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, -			 struct drm_file *file_priv); -extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); -extern int drm_agp_free_ioctl(struct drm_device *dev, void *data, -			struct drm_file *file_priv); -extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); -extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, -			  struct drm_file *file_priv); -extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); -extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data, -			struct drm_file *file_priv); -extern void drm_agp_chipset_flush(struct drm_device *dev); + +#include <drm/drm_agpsupport.h>  				/* Stub support (drm_stub.h) */  extern int drm_setmaster_ioctl(struct drm_device *dev, void *data, @@ -1331,57 +1391,106 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,  struct drm_master *drm_master_create(struct drm_minor *minor);  extern struct drm_master *drm_master_get(struct drm_master *master);  extern void drm_master_put(struct drm_master **master); -extern int drm_get_pci_dev(struct pci_dev *pdev, -			   const struct pci_device_id *ent, -			   struct drm_driver *driver); -extern int drm_get_platform_dev(struct platform_device *pdev, -				struct drm_driver *driver); +  extern void drm_put_dev(struct drm_device *dev); -extern int drm_put_minor(struct drm_minor **minor); +extern void drm_unplug_dev(struct drm_device *dev);  extern unsigned int drm_debug; +extern unsigned int drm_rnodes; +extern unsigned int drm_universal_planes; + +extern unsigned int drm_vblank_offdelay; +extern unsigned int drm_timestamp_precision; +extern unsigned int drm_timestamp_monotonic;  extern struct class *drm_class; -extern struct proc_dir_entry *drm_proc_root;  extern struct dentry *drm_debugfs_root;  extern struct idr drm_minors_idr;  extern struct drm_local_map *drm_getsarea(struct drm_device *dev); -				/* Proc support (drm_proc.h) */ -extern int drm_proc_init(struct drm_minor *minor, int minor_id, -			 struct proc_dir_entry *root); -extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root); -  				/* Debugfs support */  #if defined(CONFIG_DEBUG_FS)  extern int drm_debugfs_init(struct drm_minor *minor, int minor_id,  			    struct dentry *root); -extern int drm_debugfs_create_files(struct drm_info_list *files, int count, -				    struct dentry *root, struct drm_minor *minor); -extern int drm_debugfs_remove_files(struct drm_info_list *files, int count, -                                    struct drm_minor *minor); +extern int drm_debugfs_create_files(const struct drm_info_list *files, +				    int count, struct dentry *root, +				    struct drm_minor *minor); +extern int drm_debugfs_remove_files(const struct drm_info_list *files, +				    int count, struct drm_minor *minor);  extern int drm_debugfs_cleanup(struct drm_minor *minor); +#else +static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id, +				   struct dentry *root) +{ +	return 0; +} + +static inline int drm_debugfs_create_files(const struct drm_info_list *files, +					   int count, struct dentry *root, +					   struct drm_minor *minor) +{ +	return 0; +} + +static inline int drm_debugfs_remove_files(const struct drm_info_list *files, +					   int count, struct drm_minor *minor) +{ +	return 0; +} + +static inline int drm_debugfs_cleanup(struct drm_minor *minor) +{ +	return 0; +}  #endif  				/* Info file support */  extern int drm_name_info(struct seq_file *m, void *data);  extern int drm_vm_info(struct seq_file *m, void *data); -extern int drm_queues_info(struct seq_file *m, void *data);  extern int drm_bufs_info(struct seq_file *m, void *data);  extern int drm_vblank_info(struct seq_file *m, void *data);  extern int drm_clients_info(struct seq_file *m, void* data);  extern int drm_gem_name_info(struct seq_file *m, void *data); + +extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev, +		struct drm_gem_object *obj, int flags); +extern int drm_gem_prime_handle_to_fd(struct drm_device *dev, +		struct drm_file *file_priv, uint32_t handle, uint32_t flags, +		int *prime_fd); +extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, +		struct dma_buf *dma_buf); +extern int drm_gem_prime_fd_to_handle(struct drm_device *dev, +		struct drm_file *file_priv, int prime_fd, uint32_t *handle); +extern void drm_gem_dmabuf_release(struct dma_buf *dma_buf); + +extern int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv); +extern int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv); + +extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages, +					    dma_addr_t *addrs, int max_pages); +extern struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages); +extern void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg); + +int drm_gem_dumb_destroy(struct drm_file *file, +			 struct drm_device *dev, +			 uint32_t handle); + +void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); +void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); +void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf); +  #if DRM_DEBUG_CODE  extern int drm_vma_info(struct seq_file *m, void *data);  #endif  				/* Scatter Gather Support (drm_scatter.h) */ -extern void drm_sg_cleanup(struct drm_sg_mem * entry); -extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data, +extern void drm_legacy_sg_cleanup(struct drm_device *dev); +extern int drm_sg_alloc(struct drm_device *dev, void *data,  			struct drm_file *file_priv); -extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);  extern int drm_sg_free(struct drm_device *dev, void *data,  		       struct drm_file *file_priv); @@ -1395,6 +1504,9 @@ extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,  				       size_t align);  extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);  extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah); +extern int drm_pci_set_unique(struct drm_device *dev, +			      struct drm_master *master, +			      struct drm_unique *u);  			       /* sysfs support (drm_sysfs.c) */  struct drm_sysfs_class; @@ -1403,7 +1515,6 @@ extern void drm_sysfs_destroy(void);  extern int drm_sysfs_device_add(struct drm_minor *minor);  extern void drm_sysfs_hotplug_event(struct drm_device *dev);  extern void drm_sysfs_device_remove(struct drm_minor *minor); -extern char *drm_get_connector_status_name(enum drm_connector_status status);  extern int drm_sysfs_connector_add(struct drm_connector *connector);  extern void drm_sysfs_connector_remove(struct drm_connector *connector); @@ -1412,16 +1523,17 @@ int drm_gem_init(struct drm_device *dev);  void drm_gem_destroy(struct drm_device *dev);  void drm_gem_object_release(struct drm_gem_object *obj);  void drm_gem_object_free(struct kref *kref); -struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, -					    size_t size);  int drm_gem_object_init(struct drm_device *dev,  			struct drm_gem_object *obj, size_t size); -void drm_gem_object_handle_free(struct drm_gem_object *obj); +void drm_gem_private_object_init(struct drm_device *dev, +				 struct drm_gem_object *obj, size_t size);  void drm_gem_vm_open(struct vm_area_struct *vma);  void drm_gem_vm_close(struct vm_area_struct *vma); +int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size, +		     struct vm_area_struct *vma);  int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); -#include "drm_global.h" +#include <drm/drm_global.h>  static inline void  drm_gem_object_reference(struct drm_gem_object *obj) @@ -1439,62 +1551,32 @@ drm_gem_object_unreference(struct drm_gem_object *obj)  static inline void  drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)  { -	if (obj != NULL) { +	if (obj && !atomic_add_unless(&obj->refcount.refcount, -1, 1)) {  		struct drm_device *dev = obj->dev; +  		mutex_lock(&dev->struct_mutex); -		kref_put(&obj->refcount, drm_gem_object_free); +		if (likely(atomic_dec_and_test(&obj->refcount.refcount))) +			drm_gem_object_free(&obj->refcount);  		mutex_unlock(&dev->struct_mutex);  	}  } +int drm_gem_handle_create_tail(struct drm_file *file_priv, +			       struct drm_gem_object *obj, +			       u32 *handlep);  int drm_gem_handle_create(struct drm_file *file_priv,  			  struct drm_gem_object *obj,  			  u32 *handlep); +int drm_gem_handle_delete(struct drm_file *filp, u32 handle); -static inline void -drm_gem_object_handle_reference(struct drm_gem_object *obj) -{ -	drm_gem_object_reference(obj); -	atomic_inc(&obj->handle_count); -} -static inline void -drm_gem_object_handle_unreference(struct drm_gem_object *obj) -{ -	if (obj == NULL) -		return; +void drm_gem_free_mmap_offset(struct drm_gem_object *obj); +int drm_gem_create_mmap_offset(struct drm_gem_object *obj); +int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size); -	if (atomic_read(&obj->handle_count) == 0) -		return; -	/* -	 * Must bump handle count first as this may be the last -	 * ref, in which case the object would disappear before we -	 * checked for a name -	 */ -	if (atomic_dec_and_test(&obj->handle_count)) -		drm_gem_object_handle_free(obj); -	drm_gem_object_unreference(obj); -} - -static inline void -drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj) -{ -	if (obj == NULL) -		return; - -	if (atomic_read(&obj->handle_count) == 0) -		return; - -	/* -	* Must bump handle count first as this may be the last -	* ref, in which case the object would disappear before we -	* checked for a name -	*/ - -	if (atomic_dec_and_test(&obj->handle_count)) -		drm_gem_object_handle_free(obj); -	drm_gem_object_unreference_unlocked(obj); -} +struct page **drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); +void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, +		bool dirty, bool accessed);  struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,  					     struct drm_file *filp, @@ -1522,11 +1604,28 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,  	return NULL;  } -static __inline__ int drm_device_is_agp(struct drm_device *dev) +static __inline__ void drm_core_dropmap(struct drm_local_map *map)  { -	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) -		return 0; +} + +#include <drm/drm_mem_util.h> + +struct drm_device *drm_dev_alloc(struct drm_driver *driver, +				 struct device *parent); +void drm_dev_ref(struct drm_device *dev); +void drm_dev_unref(struct drm_device *dev); +int drm_dev_register(struct drm_device *dev, unsigned long flags); +void drm_dev_unregister(struct drm_device *dev); +int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...); + +struct drm_minor *drm_minor_acquire(unsigned int minor_id); +void drm_minor_release(struct drm_minor *minor); + +/*@}*/ +/* PCI section */ +static __inline__ int drm_pci_device_is_agp(struct drm_device *dev) +{  	if (dev->driver->device_is_agp != NULL) {  		int err = (*dev->driver->device_is_agp) (dev); @@ -1537,36 +1636,30 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev)  	return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);  } +void drm_pci_agp_destroy(struct drm_device *dev); -static __inline__ int drm_device_is_pcie(struct drm_device *dev) -{ -	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) -		return 0; -	else -		return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP); -} +extern int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver); +extern void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver); +extern int drm_get_pci_dev(struct pci_dev *pdev, +			   const struct pci_device_id *ent, +			   struct drm_driver *driver); -static __inline__ void drm_core_dropmap(struct drm_local_map *map) -{ -} +#define DRM_PCIE_SPEED_25 1 +#define DRM_PCIE_SPEED_50 2 +#define DRM_PCIE_SPEED_80 4 -#include "drm_mem_util.h" +extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask); -static inline void *drm_get_device(struct drm_device *dev) +/* platform section */ +extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device); + +/* returns true if currently okay to sleep */ +static __inline__ bool drm_can_sleep(void)  { -	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) -		return dev->platformdev; -	else -		return dev->pdev; +	if (in_atomic() || in_dbg_master() || irqs_disabled()) +		return false; +	return true;  } -extern int drm_platform_init(struct drm_driver *driver); -extern int drm_pci_init(struct drm_driver *driver); -extern int drm_fill_in_dev(struct drm_device *dev, -			   const struct pci_device_id *ent, -			   struct drm_driver *driver); -int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); -/*@}*/ -  #endif				/* __KERNEL__ */  #endif diff --git a/include/drm/drm_agpsupport.h b/include/drm/drm_agpsupport.h new file mode 100644 index 00000000000..86a02188074 --- /dev/null +++ b/include/drm/drm_agpsupport.h @@ -0,0 +1,177 @@ +#ifndef _DRM_AGPSUPPORT_H_ +#define _DRM_AGPSUPPORT_H_ + +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/mutex.h> +#include <linux/types.h> +#include <linux/agp_backend.h> +#include <drm/drmP.h> + +#if __OS_HAS_AGP + +void drm_free_agp(struct agp_memory * handle, int pages); +int drm_bind_agp(struct agp_memory * handle, unsigned int start); +int drm_unbind_agp(struct agp_memory * handle); +struct agp_memory *drm_agp_bind_pages(struct drm_device *dev, +				struct page **pages, +				unsigned long num_pages, +				uint32_t gtt_offset, +				uint32_t type); + +struct drm_agp_head *drm_agp_init(struct drm_device *dev); +void drm_agp_clear(struct drm_device *dev); +int drm_agp_acquire(struct drm_device *dev); +int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, +			  struct drm_file *file_priv); +int drm_agp_release(struct drm_device *dev); +int drm_agp_release_ioctl(struct drm_device *dev, void *data, +			  struct drm_file *file_priv); +int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); +int drm_agp_enable_ioctl(struct drm_device *dev, void *data, +			 struct drm_file *file_priv); +int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info); +int drm_agp_info_ioctl(struct drm_device *dev, void *data, +		       struct drm_file *file_priv); +int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); +int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, +			struct drm_file *file_priv); +int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); +int drm_agp_free_ioctl(struct drm_device *dev, void *data, +		       struct drm_file *file_priv); +int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); +int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, +			 struct drm_file *file_priv); +int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); +int drm_agp_bind_ioctl(struct drm_device *dev, void *data, +		       struct drm_file *file_priv); +#else /* __OS_HAS_AGP */ + +static inline void drm_free_agp(struct agp_memory * handle, int pages) +{ +} + +static inline int drm_bind_agp(struct agp_memory * handle, unsigned int start) +{ +	return -ENODEV; +} + +static inline int drm_unbind_agp(struct agp_memory * handle) +{ +	return -ENODEV; +} + +static inline struct agp_memory *drm_agp_bind_pages(struct drm_device *dev, +					      struct page **pages, +					      unsigned long num_pages, +					      uint32_t gtt_offset, +					      uint32_t type) +{ +	return NULL; +} + +static inline struct drm_agp_head *drm_agp_init(struct drm_device *dev) +{ +	return NULL; +} + +static inline void drm_agp_clear(struct drm_device *dev) +{ +} + +static inline int drm_agp_acquire(struct drm_device *dev) +{ +	return -ENODEV; +} + +static inline int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_release(struct drm_device *dev) +{ +	return -ENODEV; +} + +static inline int drm_agp_release_ioctl(struct drm_device *dev, void *data, +					struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_enable(struct drm_device *dev, +				 struct drm_agp_mode mode) +{ +	return -ENODEV; +} + +static inline int drm_agp_enable_ioctl(struct drm_device *dev, void *data, +				       struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_info(struct drm_device *dev, +			       struct drm_agp_info *info) +{ +	return -ENODEV; +} + +static inline int drm_agp_info_ioctl(struct drm_device *dev, void *data, +				     struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_alloc(struct drm_device *dev, +				struct drm_agp_buffer *request) +{ +	return -ENODEV; +} + +static inline int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, +				      struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_free(struct drm_device *dev, +			       struct drm_agp_buffer *request) +{ +	return -ENODEV; +} + +static inline int drm_agp_free_ioctl(struct drm_device *dev, void *data, +				     struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_unbind(struct drm_device *dev, +				 struct drm_agp_binding *request) +{ +	return -ENODEV; +} + +static inline int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, +				       struct drm_file *file_priv) +{ +	return -ENODEV; +} + +static inline int drm_agp_bind(struct drm_device *dev, +			       struct drm_agp_binding *request) +{ +	return -ENODEV; +} + +static inline int drm_agp_bind_ioctl(struct drm_device *dev, void *data, +				     struct drm_file *file_priv) +{ +	return -ENODEV; +} +#endif /* __OS_HAS_AGP */ + +#endif /* _DRM_AGPSUPPORT_H_ */ diff --git a/include/drm/drm_buffer.h b/include/drm/drm_buffer.h index 322dbff3f86..c80d3a340b9 100644 --- a/include/drm/drm_buffer.h +++ b/include/drm/drm_buffer.h @@ -35,7 +35,7 @@  #ifndef _DRM_BUFFER_H_  #define _DRM_BUFFER_H_ -#include "drmP.h" +#include <drm/drmP.h>  struct drm_buffer {  	int iterator; diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 029aa688e78..251b75e6bf7 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -29,13 +29,18 @@  #include <linux/spinlock.h>  #include <linux/types.h>  #include <linux/idr.h> -  #include <linux/fb.h> +#include <linux/hdmi.h> +#include <drm/drm_mode.h> +#include <drm/drm_fourcc.h> +#include <drm/drm_modeset_lock.h>  struct drm_device;  struct drm_mode_set;  struct drm_framebuffer; - +struct drm_object_properties; +struct drm_file; +struct drm_clip_rect;  #define DRM_MODE_OBJECT_CRTC 0xcccccccc  #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 @@ -44,130 +49,41 @@ struct drm_framebuffer;  #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0  #define DRM_MODE_OBJECT_FB 0xfbfbfbfb  #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb +#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee +#define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd +#define DRM_MODE_OBJECT_ANY 0  struct drm_mode_object {  	uint32_t id;  	uint32_t type; +	struct drm_object_properties *properties;  }; -/* - * Note on terminology:  here, for brevity and convenience, we refer to connector - * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS, - * DVI, etc.  And 'screen' refers to the whole of the visible display, which - * may span multiple monitors (and therefore multiple CRTC and connector - * structures). - */ - -enum drm_mode_status { -    MODE_OK	= 0,	/* Mode OK */ -    MODE_HSYNC,		/* hsync out of range */ -    MODE_VSYNC,		/* vsync out of range */ -    MODE_H_ILLEGAL,	/* mode has illegal horizontal timings */ -    MODE_V_ILLEGAL,	/* mode has illegal horizontal timings */ -    MODE_BAD_WIDTH,	/* requires an unsupported linepitch */ -    MODE_NOMODE,	/* no mode with a maching name */ -    MODE_NO_INTERLACE,	/* interlaced mode not supported */ -    MODE_NO_DBLESCAN,	/* doublescan mode not supported */ -    MODE_NO_VSCAN,	/* multiscan mode not supported */ -    MODE_MEM,		/* insufficient video memory */ -    MODE_VIRTUAL_X,	/* mode width too large for specified virtual size */ -    MODE_VIRTUAL_Y,	/* mode height too large for specified virtual size */ -    MODE_MEM_VIRT,	/* insufficient video memory given virtual size */ -    MODE_NOCLOCK,	/* no fixed clock available */ -    MODE_CLOCK_HIGH,	/* clock required is too high */ -    MODE_CLOCK_LOW,	/* clock required is too low */ -    MODE_CLOCK_RANGE,	/* clock/mode isn't in a ClockRange */ -    MODE_BAD_HVALUE,	/* horizontal timing was out of range */ -    MODE_BAD_VVALUE,	/* vertical timing was out of range */ -    MODE_BAD_VSCAN,	/* VScan value out of range */ -    MODE_HSYNC_NARROW,	/* horizontal sync too narrow */ -    MODE_HSYNC_WIDE,	/* horizontal sync too wide */ -    MODE_HBLANK_NARROW,	/* horizontal blanking too narrow */ -    MODE_HBLANK_WIDE,	/* horizontal blanking too wide */ -    MODE_VSYNC_NARROW,	/* vertical sync too narrow */ -    MODE_VSYNC_WIDE,	/* vertical sync too wide */ -    MODE_VBLANK_NARROW,	/* vertical blanking too narrow */ -    MODE_VBLANK_WIDE,	/* vertical blanking too wide */ -    MODE_PANEL,         /* exceeds panel dimensions */ -    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ -    MODE_ONE_WIDTH,     /* only one width is supported */ -    MODE_ONE_HEIGHT,    /* only one height is supported */ -    MODE_ONE_SIZE,      /* only one resolution is supported */ -    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */ -    MODE_UNVERIFIED = -3, /* mode needs to reverified */ -    MODE_BAD = -2,	/* unspecified reason */ -    MODE_ERROR	= -1	/* error condition */ +#define DRM_OBJECT_MAX_PROPERTY 24 +struct drm_object_properties { +	int count; +	uint32_t ids[DRM_OBJECT_MAX_PROPERTY]; +	uint64_t values[DRM_OBJECT_MAX_PROPERTY];  }; -#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ -				    DRM_MODE_TYPE_CRTC_C) +static inline int64_t U642I64(uint64_t val) +{ +	return (int64_t)*((int64_t *)&val); +} +static inline uint64_t I642U64(int64_t val) +{ +	return (uint64_t)*((uint64_t *)&val); +} -#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ -	.name = nm, .status = 0, .type = (t), .clock = (c), \ -	.hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ -	.htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ -	.vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ -	.vscan = (vs), .flags = (f), .vrefresh = 0 - -#define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ - -struct drm_display_mode { -	/* Header */ -	struct list_head head; -	struct drm_mode_object base; - -	char name[DRM_DISPLAY_MODE_LEN]; - -	int connector_count; -	enum drm_mode_status status; -	int type; - -	/* Proposed mode values */ -	int clock;		/* in kHz */ -	int hdisplay; -	int hsync_start; -	int hsync_end; -	int htotal; -	int hskew; -	int vdisplay; -	int vsync_start; -	int vsync_end; -	int vtotal; -	int vscan; -	unsigned int flags; - -	/* Addressable image size (may be 0 for projectors, etc.) */ -	int width_mm; -	int height_mm; - -	/* Actual mode we give to hw */ -	int clock_index; -	int synth_clock; -	int crtc_hdisplay; -	int crtc_hblank_start; -	int crtc_hblank_end; -	int crtc_hsync_start; -	int crtc_hsync_end; -	int crtc_htotal; -	int crtc_hskew; -	int crtc_vdisplay; -	int crtc_vblank_start; -	int crtc_vblank_end; -	int crtc_vsync_start; -	int crtc_vsync_end; -	int crtc_vtotal; -	int crtc_hadjusted; -	int crtc_vadjusted; - -	/* Driver private mode info */ -	int private_size; -	int *private; -	int private_flags; - -	int vrefresh;		/* in Hz */ -	int hsync;		/* in kHz */ +enum drm_connector_force { +	DRM_FORCE_UNSPECIFIED, +	DRM_FORCE_OFF, +	DRM_FORCE_ON,         /* force on analog part normally */ +	DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */  }; +#include <drm/drm_modes.h> +  enum drm_connector_status {  	connector_status_connected = 1,  	connector_status_disconnected = 2, @@ -183,7 +99,9 @@ enum subpixel_order {  	SubPixelNone,  }; - +#define DRM_COLOR_FORMAT_RGB444		(1<<0) +#define DRM_COLOR_FORMAT_YCRCB444	(1<<1) +#define DRM_COLOR_FORMAT_YCRCB422	(1<<2)  /*   * Describes a given display (e.g. CRT or flat panel) and its limitations.   */ @@ -198,13 +116,19 @@ struct drm_display_info {  	unsigned int min_vfreq, max_vfreq;  	unsigned int min_hfreq, max_hfreq;  	unsigned int pixel_clock; +	unsigned int bpc;  	enum subpixel_order subpixel_order; +	u32 color_formats; + +	/* Mask of supported hdmi deep color modes */ +	u8 edid_hdmi_dc_modes; -	char *raw_edid; /* if any */ +	u8 cea_rev;  };  struct drm_framebuffer_funcs { +	/* note: use drm_framebuffer_remove() */  	void (*destroy)(struct drm_framebuffer *framebuffer);  	int (*create_handle)(struct drm_framebuffer *fb,  			     struct drm_file *file_priv, @@ -229,16 +153,32 @@ struct drm_framebuffer_funcs {  struct drm_framebuffer {  	struct drm_device *dev; +	/* +	 * Note that the fb is refcounted for the benefit of driver internals, +	 * for example some hw, disabling a CRTC/plane is asynchronous, and +	 * scanout does not actually complete until the next vblank.  So some +	 * cleanup (like releasing the reference(s) on the backing GEM bo(s)) +	 * should be deferred.  In cases like this, the driver would like to +	 * hold a ref to the fb even though it has already been removed from +	 * userspace perspective. +	 */ +	struct kref refcount; +	/* +	 * Place on the dev->mode_config.fb_list, access protected by +	 * dev->mode_config.fb_lock. +	 */  	struct list_head head;  	struct drm_mode_object base;  	const struct drm_framebuffer_funcs *funcs; -	unsigned int pitch; +	unsigned int pitches[4]; +	unsigned int offsets[4];  	unsigned int width;  	unsigned int height;  	/* depth can be 15 or 16 */  	unsigned int depth;  	int bits_per_pixel;  	int flags; +	uint32_t pixel_format; /* fourcc format */  	struct list_head filp_head;  	/* if you are using the helper */  	void *helper_private; @@ -248,7 +188,7 @@ struct drm_property_blob {  	struct drm_mode_object base;  	struct list_head head;  	unsigned int length; -	void *data; +	unsigned char data[];  };  struct drm_property_enum { @@ -264,29 +204,34 @@ struct drm_property {  	char name[DRM_PROP_NAME_LEN];  	uint32_t num_values;  	uint64_t *values; +	struct drm_device *dev;  	struct list_head enum_blob_list;  }; +void drm_modeset_lock_all(struct drm_device *dev); +void drm_modeset_unlock_all(struct drm_device *dev); +void drm_warn_on_modeset_not_all_locked(struct drm_device *dev); +  struct drm_crtc;  struct drm_connector;  struct drm_encoder;  struct drm_pending_vblank_event; +struct drm_plane; +struct drm_bridge;  /**   * drm_crtc_funcs - control CRTCs for a given device - * @dpms: control display power levels   * @save: save CRTC state - * @resore: restore CRTC state - * @lock: lock the CRTC - * @unlock: unlock the CRTC - * @shadow_allocate: allocate shadow pixmap - * @shadow_create: create shadow pixmap for rotation support - * @shadow_destroy: free shadow pixmap - * @mode_fixup: fixup proposed mode - * @mode_set: set the desired mode on the CRTC + * @restore: restore CRTC state + * @reset: reset CRTC after state has been invalidated (e.g. resume) + * @cursor_set: setup the cursor + * @cursor_move: move the cursor   * @gamma_set: specify color ramp for CRTC - * @destroy: deinit and free object. + * @destroy: deinit and free object + * @set_property: called when a property is changed + * @set_config: apply a new CRTC configuration + * @page_flip: initiate a page flip   *   * The drm_crtc_funcs structure is the central CRTC management structure   * in the DRM.  Each CRTC controls one or more connectors (note that the name @@ -302,10 +247,15 @@ struct drm_crtc_funcs {  	void (*save)(struct drm_crtc *crtc); /* suspend? */  	/* Restore CRTC state */  	void (*restore)(struct drm_crtc *crtc); /* resume? */ +	/* Reset CRTC state */ +	void (*reset)(struct drm_crtc *crtc);  	/* cursor controls */  	int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,  			  uint32_t handle, uint32_t width, uint32_t height); +	int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv, +			   uint32_t handle, uint32_t width, uint32_t height, +			   int32_t hot_x, int32_t hot_y);  	int (*cursor_move)(struct drm_crtc *crtc, int x, int y);  	/* Set gamma on the CRTC */ @@ -318,7 +268,7 @@ struct drm_crtc_funcs {  	/*  	 * Flip to the given framebuffer.  This implements the page -	 * flip ioctl descibed in drm_mode.h, specifically, the +	 * flip ioctl described in drm_mode.h, specifically, the  	 * implementation must return immediately and block all  	 * rendering to the current fb until the flip has completed.  	 * If userspace set the event flag in the ioctl, the event @@ -327,15 +277,37 @@ struct drm_crtc_funcs {  	 */  	int (*page_flip)(struct drm_crtc *crtc,  			 struct drm_framebuffer *fb, -			 struct drm_pending_vblank_event *event); +			 struct drm_pending_vblank_event *event, +			 uint32_t flags); + +	int (*set_property)(struct drm_crtc *crtc, +			    struct drm_property *property, uint64_t val);  };  /**   * drm_crtc - central CRTC control structure + * @dev: parent DRM device + * @head: list management + * @mutex: per-CRTC locking + * @base: base KMS object for ID tracking etc. + * @primary: primary plane for this CRTC + * @cursor: cursor plane for this CRTC   * @enabled: is this CRTC enabled? + * @mode: current mode timings + * @hwmode: mode timings as programmed to hw regs + * @invert_dimensions: for purposes of error checking crtc vs fb sizes, + *    invert the width/height of the crtc.  This is used if the driver + *    is performing 90 or 270 degree rotated scanout   * @x: x position on screen   * @y: y position on screen   * @funcs: CRTC control functions + * @gamma_size: size of gamma ramp + * @gamma_store: gamma ramp values + * @framedur_ns: precise frame timing + * @framedur_ns: precise line timing + * @pixeldur_ns: precise pixel timing + * @helper_private: mid-layer private data + * @properties: property tracking for this CRTC   *   * Each CRTC may have one or more connectors associated with it.  This structure   * allows the CRTC to be controlled. @@ -344,15 +316,37 @@ struct drm_crtc {  	struct drm_device *dev;  	struct list_head head; +	/** +	 * crtc mutex +	 * +	 * This provides a read lock for the overall crtc state (mode, dpms +	 * state, ...) and a write lock for everything which can be update +	 * without a full modeset (fb, cursor data, ...) +	 */ +	struct drm_modeset_lock mutex; +  	struct drm_mode_object base; -	/* framebuffer the connector is currently bound to */ -	struct drm_framebuffer *fb; +	/* primary and cursor planes for CRTC */ +	struct drm_plane *primary; +	struct drm_plane *cursor; + +	/* Temporary tracking of the old fb while a modeset is ongoing. Used +	 * by drm_mode_set_config_internal to implement correct refcounting. */ +	struct drm_framebuffer *old_fb;  	bool enabled; +	/* Requested mode from modesetting. */  	struct drm_display_mode mode; +	/* Programmed mode in hw, after adjustments for encoders, +	 * crtc, panel scaling etc. Needed for timestamping etc. +	 */ +	struct drm_display_mode hwmode; + +	bool invert_dimensions; +  	int x, y;  	const struct drm_crtc_funcs *funcs; @@ -360,8 +354,13 @@ struct drm_crtc {  	uint32_t gamma_size;  	uint16_t *gamma_store; +	/* Constants needed for precise vblank and swap timestamping. */ +	int framedur_ns, linedur_ns, pixeldur_ns; +  	/* if you are using the helper */  	void *helper_private; + +	struct drm_object_properties properties;  }; @@ -370,14 +369,12 @@ struct drm_crtc {   * @dpms: set power state (see drm_crtc_funcs above)   * @save: save connector state   * @restore: restore connector state - * @mode_valid: is this mode valid on the given connector? - * @mode_fixup: try to fixup proposed mode for this connector - * @mode_set: set this mode + * @reset: reset connector after state has been invalidated (e.g. resume)   * @detect: is this connector active? - * @get_modes: get mode list for this connector - * @set_property: property for this connector may need update + * @fill_modes: fill mode list for this connector + * @set_property: property for this connector may need an update   * @destroy: make object go away - * @force: notify the driver the connector is forced on + * @force: notify the driver that the connector is forced on   *   * Each CRTC may have one or more connectors attached to it.  The functions   * below allow the core DRM code to control connectors, enumerate available modes, @@ -387,6 +384,7 @@ struct drm_connector_funcs {  	void (*dpms)(struct drm_connector *connector, int mode);  	void (*save)(struct drm_connector *connector);  	void (*restore)(struct drm_connector *connector); +	void (*reset)(struct drm_connector *connector);  	/* Check to see if anything is attached to the connector.  	 * @force is set to false whilst polling, true when checking the @@ -403,39 +401,53 @@ struct drm_connector_funcs {  	void (*force)(struct drm_connector *connector);  }; +/** + * drm_encoder_funcs - encoder controls + * @reset: reset state (e.g. at init or resume time) + * @destroy: cleanup and free associated data + * + * Encoders sit between CRTCs and connectors. + */  struct drm_encoder_funcs { +	void (*reset)(struct drm_encoder *encoder);  	void (*destroy)(struct drm_encoder *encoder);  }; -#define DRM_CONNECTOR_MAX_UMODES 16 -#define DRM_CONNECTOR_MAX_PROPERTY 16 -#define DRM_CONNECTOR_LEN 32 -#define DRM_CONNECTOR_MAX_ENCODER 2 +#define DRM_CONNECTOR_MAX_ENCODER 3  /**   * drm_encoder - central DRM encoder structure + * @dev: parent DRM device + * @head: list management + * @base: base KMS object + * @name: encoder name + * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h + * @possible_crtcs: bitmask of potential CRTC bindings + * @possible_clones: bitmask of potential sibling encoders for cloning + * @crtc: currently bound CRTC + * @bridge: bridge associated to the encoder + * @funcs: control functions + * @helper_private: mid-layer private data + * + * CRTCs drive pixels to encoders, which convert them into signals + * appropriate for a given connector or set of connectors.   */  struct drm_encoder {  	struct drm_device *dev;  	struct list_head head;  	struct drm_mode_object base; +	char *name;  	int encoder_type;  	uint32_t possible_crtcs;  	uint32_t possible_clones;  	struct drm_crtc *crtc; +	struct drm_bridge *bridge;  	const struct drm_encoder_funcs *funcs;  	void *helper_private;  }; -enum drm_connector_force { -	DRM_FORCE_UNSPECIFIED, -	DRM_FORCE_OFF, -	DRM_FORCE_ON,         /* force on analog part normally */ -	DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ -}; -  /* should we poll this connector for connects and disconnects */  /* hot plug detectable */  #define DRM_CONNECTOR_POLL_HPD (1 << 0) @@ -445,16 +457,40 @@ enum drm_connector_force {  /* DACs should rarely do this without a lot of testing */  #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) +#define MAX_ELD_BYTES	128 +  /**   * drm_connector - central DRM connector control structure - * @crtc: CRTC this connector is currently connected to, NULL if none + * @dev: parent DRM device + * @kdev: kernel device for sysfs attributes + * @attr: sysfs attributes + * @head: list management + * @base: base KMS object + * @name: connector name + * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h + * @connector_type_id: index into connector type enum   * @interlace_allowed: can this connector handle interlaced modes?   * @doublescan_allowed: can this connector handle doublescan? - * @available_modes: modes available on this connector (from get_modes() + user) - * @initial_x: initial x position for this connector - * @initial_y: initial y position for this connector - * @status: connector connected? + * @modes: modes available on this connector (from fill_modes() + user) + * @status: one of the drm_connector_status enums (connected, not, or unknown) + * @probed_modes: list of modes derived directly from the display + * @display_info: information about attached display (e.g. from EDID)   * @funcs: connector control functions + * @edid_blob_ptr: DRM property containing EDID if present + * @properties: property tracking for this connector + * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling + * @dpms: current dpms state + * @helper_private: mid-layer private data + * @force: a %DRM_FORCE_<foo> state for forced mode sets + * @encoder_ids: valid encoders for this connector + * @encoder: encoder driving this connector, if any + * @eld: EDID-like data, if present + * @dvi_dual: dual link DVI, if found + * @max_tmds_clock: max clock rate, if found + * @latency_present: AV delay info from ELD, if found + * @video_latency: video latency info from ELD, if found + * @audio_latency: audio latency info from ELD, if found + * @null_edid_counter: track sinks that give us all zeros for the EDID   *   * Each connector may be connected to one or more CRTCs, or may be clonable by   * another connector if they can share a CRTC.  Each connector also has a specific @@ -463,19 +499,20 @@ enum drm_connector_force {   */  struct drm_connector {  	struct drm_device *dev; -	struct device kdev; +	struct device *kdev;  	struct device_attribute *attr;  	struct list_head head;  	struct drm_mode_object base; +	char *name;  	int connector_type;  	int connector_type_id;  	bool interlace_allowed;  	bool doublescan_allowed; +	bool stereo_allowed;  	struct list_head modes; /* list of modes on this connector */ -	int initial_x, initial_y;  	enum drm_connector_status status;  	/* these are modes added by probing with DDC or the BIOS */ @@ -484,10 +521,8 @@ struct drm_connector {  	struct drm_display_info display_info;  	const struct drm_connector_funcs *funcs; -	struct list_head user_modes;  	struct drm_property_blob *edid_blob_ptr; -	u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY]; -	uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY]; +	struct drm_object_properties properties;  	uint8_t polled; /* DRM_CONNECTOR_POLL_* */ @@ -499,12 +534,132 @@ struct drm_connector {  	/* forced on connector */  	enum drm_connector_force force;  	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; -	uint32_t force_encoder_id;  	struct drm_encoder *encoder; /* currently active encoder */ + +	/* EDID bits */ +	uint8_t eld[MAX_ELD_BYTES]; +	bool dvi_dual; +	int max_tmds_clock;	/* in MHz */ +	bool latency_present[2]; +	int video_latency[2];	/* [0]: progressive, [1]: interlaced */ +	int audio_latency[2]; +	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */ +	unsigned bad_edid_counter; +}; + +/** + * drm_plane_funcs - driver plane control functions + * @update_plane: update the plane configuration + * @disable_plane: shut down the plane + * @destroy: clean up plane resources + * @set_property: called when a property is changed + */ +struct drm_plane_funcs { +	int (*update_plane)(struct drm_plane *plane, +			    struct drm_crtc *crtc, struct drm_framebuffer *fb, +			    int crtc_x, int crtc_y, +			    unsigned int crtc_w, unsigned int crtc_h, +			    uint32_t src_x, uint32_t src_y, +			    uint32_t src_w, uint32_t src_h); +	int (*disable_plane)(struct drm_plane *plane); +	void (*destroy)(struct drm_plane *plane); + +	int (*set_property)(struct drm_plane *plane, +			    struct drm_property *property, uint64_t val); +}; + +enum drm_plane_type { +	DRM_PLANE_TYPE_OVERLAY, +	DRM_PLANE_TYPE_PRIMARY, +	DRM_PLANE_TYPE_CURSOR, +}; + +/** + * drm_plane - central DRM plane control structure + * @dev: DRM device this plane belongs to + * @head: for list management + * @base: base mode object + * @possible_crtcs: pipes this plane can be bound to + * @format_types: array of formats supported by this plane + * @format_count: number of formats supported + * @crtc: currently bound CRTC + * @fb: currently bound fb + * @funcs: helper functions + * @properties: property tracking for this plane + * @type: type of plane (overlay, primary, cursor) + */ +struct drm_plane { +	struct drm_device *dev; +	struct list_head head; + +	struct drm_mode_object base; + +	uint32_t possible_crtcs; +	uint32_t *format_types; +	uint32_t format_count; + +	struct drm_crtc *crtc; +	struct drm_framebuffer *fb; + +	const struct drm_plane_funcs *funcs; + +	struct drm_object_properties properties; + +	enum drm_plane_type type;  };  /** - * struct drm_mode_set + * drm_bridge_funcs - drm_bridge control functions + * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge + * @disable: Called right before encoder prepare, disables the bridge + * @post_disable: Called right after encoder prepare, for lockstepped disable + * @mode_set: Set this mode to the bridge + * @pre_enable: Called right before encoder commit, for lockstepped commit + * @enable: Called right after encoder commit, enables the bridge + * @destroy: make object go away + */ +struct drm_bridge_funcs { +	bool (*mode_fixup)(struct drm_bridge *bridge, +			   const struct drm_display_mode *mode, +			   struct drm_display_mode *adjusted_mode); +	void (*disable)(struct drm_bridge *bridge); +	void (*post_disable)(struct drm_bridge *bridge); +	void (*mode_set)(struct drm_bridge *bridge, +			 struct drm_display_mode *mode, +			 struct drm_display_mode *adjusted_mode); +	void (*pre_enable)(struct drm_bridge *bridge); +	void (*enable)(struct drm_bridge *bridge); +	void (*destroy)(struct drm_bridge *bridge); +}; + +/** + * drm_bridge - central DRM bridge control structure + * @dev: DRM device this bridge belongs to + * @head: list management + * @base: base mode object + * @funcs: control functions + * @driver_private: pointer to the bridge driver's internal context + */ +struct drm_bridge { +	struct drm_device *dev; +	struct list_head head; + +	struct drm_mode_object base; + +	const struct drm_bridge_funcs *funcs; +	void *driver_private; +}; + +/** + * drm_mode_set - new values for a CRTC config change + * @head: list management + * @fb: framebuffer to use for new config + * @crtc: CRTC whose configuration we're about to change + * @mode: mode timings to use + * @x: position of this CRTC relative to @fb + * @y: position of this CRTC relative to @fb + * @connectors: array of connectors to drive with this CRTC if possible + * @num_connectors: size of @connectors array   *   * Represents a single crtc the connectors that it drives with what mode   * and from which framebuffer it scans out from. @@ -512,8 +667,6 @@ struct drm_connector {   * This is used to set modes.   */  struct drm_mode_set { -	struct list_head head; -  	struct drm_framebuffer *fb;  	struct drm_crtc *crtc;  	struct drm_display_mode *mode; @@ -526,17 +679,38 @@ struct drm_mode_set {  };  /** - * struct drm_mode_config_funcs - configure CRTCs for a given screen layout + * struct drm_mode_config_funcs - basic driver provided mode setting functions + * @fb_create: create a new framebuffer object + * @output_poll_changed: function to handle output configuration changes + * + * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that + * involve drivers.   */  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);  }; +/** + * drm_mode_group - group of mode setting resources for potential sub-grouping + * @num_crtcs: CRTC count + * @num_encoders: encoder count + * @num_connectors: connector count + * @id_list: list of KMS object IDs in this group + * + * Currently this simply tracks the global mode setting state.  But in the + * future it could allow groups of objects to be set aside into independent + * control groups for use by different user level processes (e.g. two X servers + * running simultaneously on different heads, each with their own mode + * configuration and freedom of mode setting). + */  struct drm_mode_group {  	uint32_t num_crtcs;  	uint32_t num_encoders;  	uint32_t num_connectors; +	uint32_t num_bridges;  	/* list of object IDs for this group */  	uint32_t *id_list; @@ -544,20 +718,69 @@ struct drm_mode_group {  /**   * drm_mode_config - Mode configuration control structure + * @mutex: mutex protecting KMS related lists and structures + * @idr_mutex: mutex for KMS ID allocation and management + * @crtc_idr: main KMS ID tracking object + * @num_fb: number of fbs available + * @fb_list: list of framebuffers available + * @num_connector: number of connectors on this device + * @connector_list: list of connector objects + * @num_bridge: number of bridges on this device + * @bridge_list: list of bridge objects + * @num_encoder: number of encoders on this device + * @encoder_list: list of encoder objects + * @num_crtc: number of CRTCs on this device + * @crtc_list: list of CRTC objects + * @min_width: minimum pixel width on this device + * @min_height: minimum pixel height on this device + * @max_width: maximum pixel width on this device + * @max_height: maximum pixel height on this device + * @funcs: core driver provided mode setting functions + * @fb_base: base address of the framebuffer + * @poll_enabled: track polling status for this device + * @output_poll_work: delayed work for polling in process context + * @*_property: core property tracking   * + * Core mode resource tracking structure.  All CRTC, encoders, and connectors + * enumerated by the driver are added here, as are global properties.  Some + * global restrictions are also here, e.g. dimension restrictions.   */  struct drm_mode_config {  	struct mutex mutex; /* protects configuration (mode lists etc.) */ +	struct drm_modeset_lock connection_mutex; /* protects connector->encoder and encoder->crtc links */ +	struct drm_modeset_acquire_ctx *acquire_ctx; /* for legacy _lock_all() / _unlock_all() */  	struct mutex idr_mutex; /* for IDR management */  	struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */  	/* this is limited to one for now */ + + +	/** +	 * fb_lock - mutex to protect fb state +	 * +	 * Besides the global fb list his also protects the fbs list in the +	 * file_priv +	 */ +	struct mutex fb_lock;  	int num_fb;  	struct list_head fb_list; +  	int num_connector;  	struct list_head connector_list; +	int num_bridge; +	struct list_head bridge_list;  	int num_encoder;  	struct list_head encoder_list; +	/* +	 * Track # of overlay planes separately from # of total planes.  By +	 * default we only advertise overlay planes to userspace; if userspace +	 * sets the "universal plane" capability bit, we'll go ahead and +	 * expose all planes. +	 */ +	int num_overlay_plane; +	int num_total_plane; +	struct list_head plane_list; +  	int num_crtc;  	struct list_head crtc_list; @@ -565,17 +788,19 @@ struct drm_mode_config {  	int min_width, min_height;  	int max_width, max_height; -	struct drm_mode_config_funcs *funcs; +	const struct drm_mode_config_funcs *funcs;  	resource_size_t fb_base;  	/* output poll support */  	bool poll_enabled; +	bool poll_running;  	struct delayed_work output_poll_work;  	/* pointers to standard properties */  	struct list_head property_blob_list;  	struct drm_property *edid_property;  	struct drm_property *dpms_property; +	struct drm_property *plane_type_property;  	/* DVI-I properties */  	struct drm_property *dvi_i_subconnector_property; @@ -598,8 +823,16 @@ struct drm_mode_config {  	/* Optional properties */  	struct drm_property *scaling_mode_property; -	struct drm_property *dithering_mode_property;  	struct drm_property *dirty_info_property; + +	/* dumb ioctl parameters */ +	uint32_t preferred_depth, prefer_shadow; + +	/* whether async page flip is supported or not */ +	bool async_page_flip; + +	/* cursor size */ +	uint32_t cursor_width, cursor_height;  };  #define obj_to_crtc(x) container_of(x, struct drm_crtc, base) @@ -609,95 +842,167 @@ struct drm_mode_config {  #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)  #define obj_to_property(x) container_of(x, struct drm_property, base)  #define obj_to_blob(x) container_of(x, struct drm_property_blob, base) +#define obj_to_plane(x) container_of(x, struct drm_plane, base) +struct drm_prop_enum_list { +	int type; +	char *name; +}; -extern void drm_crtc_init(struct drm_device *dev, -			  struct drm_crtc *crtc, -			  const struct drm_crtc_funcs *funcs); +extern int drm_crtc_init_with_planes(struct drm_device *dev, +				     struct drm_crtc *crtc, +				     struct drm_plane *primary, +				     void *cursor, +				     const struct drm_crtc_funcs *funcs); +extern int drm_crtc_init(struct drm_device *dev, +			 struct drm_crtc *crtc, +			 const struct drm_crtc_funcs *funcs);  extern void drm_crtc_cleanup(struct drm_crtc *crtc); +extern unsigned int drm_crtc_index(struct drm_crtc *crtc); -extern void drm_connector_init(struct drm_device *dev, -			    struct drm_connector *connector, -			    const struct drm_connector_funcs *funcs, -			    int connector_type); +/** + * drm_crtc_mask - find the mask of a registered CRTC + * @crtc: CRTC to find mask for + * + * Given a registered CRTC, return the mask bit of that CRTC for an + * encoder's possible_crtcs field. + */ +static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc) +{ +	return 1 << drm_crtc_index(crtc); +} + +extern void drm_connector_ida_init(void); +extern void drm_connector_ida_destroy(void); +extern int drm_connector_init(struct drm_device *dev, +			      struct drm_connector *connector, +			      const struct drm_connector_funcs *funcs, +			      int connector_type);  extern void drm_connector_cleanup(struct drm_connector *connector); +/* helper to unplug all connectors from sysfs for device */ +extern void drm_connector_unplug_all(struct drm_device *dev); + +extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge, +			   const struct drm_bridge_funcs *funcs); +extern void drm_bridge_cleanup(struct drm_bridge *bridge); -extern void drm_encoder_init(struct drm_device *dev, -			     struct drm_encoder *encoder, -			     const struct drm_encoder_funcs *funcs, -			     int encoder_type); +extern int drm_encoder_init(struct drm_device *dev, +			    struct drm_encoder *encoder, +			    const struct drm_encoder_funcs *funcs, +			    int encoder_type); + +/** + * drm_encoder_crtc_ok - can a given crtc drive a given encoder? + * @encoder: encoder to test + * @crtc: crtc to test + * + * Return false if @encoder can't be driven by @crtc, true otherwise. + */ +static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder, +				       struct drm_crtc *crtc) +{ +	return !!(encoder->possible_crtcs & drm_crtc_mask(crtc)); +} + +extern int drm_universal_plane_init(struct drm_device *dev, +				    struct drm_plane *plane, +				    unsigned long possible_crtcs, +				    const struct drm_plane_funcs *funcs, +				    const uint32_t *formats, +				    uint32_t format_count, +				    enum drm_plane_type type); +extern int drm_plane_init(struct drm_device *dev, +			  struct drm_plane *plane, +			  unsigned long possible_crtcs, +			  const struct drm_plane_funcs *funcs, +			  const uint32_t *formats, uint32_t format_count, +			  bool is_primary); +extern void drm_plane_cleanup(struct drm_plane *plane); +extern void drm_plane_force_disable(struct drm_plane *plane); +extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, +				   int x, int y, +				   const struct drm_display_mode *mode, +				   const struct drm_framebuffer *fb);  extern void drm_encoder_cleanup(struct drm_encoder *encoder); -extern char *drm_get_connector_name(struct drm_connector *connector); -extern char *drm_get_dpms_name(int val); -extern char *drm_get_dvi_i_subconnector_name(int val); -extern char *drm_get_dvi_i_select_name(int val); -extern char *drm_get_tv_subconnector_name(int val); -extern char *drm_get_tv_select_name(int val); +extern const char *drm_get_connector_status_name(enum drm_connector_status status); +extern const char *drm_get_subpixel_order_name(enum subpixel_order order); +extern const char *drm_get_dpms_name(int val); +extern const char *drm_get_dvi_i_subconnector_name(int val); +extern const char *drm_get_dvi_i_select_name(int val); +extern const char *drm_get_tv_subconnector_name(int val); +extern const char *drm_get_tv_select_name(int val);  extern void drm_fb_release(struct drm_file *file_priv);  extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); +extern void drm_mode_group_destroy(struct drm_mode_group *group); +extern bool drm_probe_ddc(struct i2c_adapter *adapter);  extern struct edid *drm_get_edid(struct drm_connector *connector,  				 struct i2c_adapter *adapter); +extern struct edid *drm_edid_duplicate(const struct edid *edid);  extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); -extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); -extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); -extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, -						   struct drm_display_mode *mode); -extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode);  extern void drm_mode_config_init(struct drm_device *dev); +extern void drm_mode_config_reset(struct drm_device *dev);  extern void drm_mode_config_cleanup(struct drm_device *dev); -extern void drm_mode_set_name(struct drm_display_mode *mode); -extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2); -extern int drm_mode_width(struct drm_display_mode *mode); -extern int drm_mode_height(struct drm_display_mode *mode); - -/* for us by fb module */ -extern int drm_mode_attachmode_crtc(struct drm_device *dev, -				    struct drm_crtc *crtc, -				    struct drm_display_mode *mode); -extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode); - -extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); -extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); -extern void drm_mode_list_concat(struct list_head *head, -				 struct list_head *new); -extern void drm_mode_validate_size(struct drm_device *dev, -				   struct list_head *mode_list, -				   int maxX, int maxY, int maxPitch); -extern void drm_mode_prune_invalid(struct drm_device *dev, -				   struct list_head *mode_list, bool verbose); -extern void drm_mode_sort(struct list_head *mode_list); -extern int drm_mode_hsync(struct drm_display_mode *mode); -extern int drm_mode_vrefresh(struct drm_display_mode *mode); -extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, -				  int adjust_flags); -extern void drm_mode_connector_list_update(struct drm_connector *connector); +  extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,  						struct edid *edid); -extern int drm_connector_property_set_value(struct drm_connector *connector, + +static inline bool drm_property_type_is(struct drm_property *property, +		uint32_t type) +{ +	/* instanceof for props.. handles extended type vs original types: */ +	if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) +		return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type; +	return property->flags & type; +} + +static inline bool drm_property_type_valid(struct drm_property *property) +{ +	if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) +		return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE); +	return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE); +} + +extern int drm_object_property_set_value(struct drm_mode_object *obj,  					 struct drm_property *property, -					 uint64_t value); -extern int drm_connector_property_get_value(struct drm_connector *connector, +					 uint64_t val); +extern int drm_object_property_get_value(struct drm_mode_object *obj,  					 struct drm_property *property,  					 uint64_t *value); -extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev); -extern void drm_framebuffer_set_object(struct drm_device *dev, -				       unsigned long handle);  extern int drm_framebuffer_init(struct drm_device *dev,  				struct drm_framebuffer *fb,  				const struct drm_framebuffer_funcs *funcs); +extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev, +						      uint32_t id); +extern void drm_framebuffer_unreference(struct drm_framebuffer *fb); +extern void drm_framebuffer_reference(struct drm_framebuffer *fb); +extern void drm_framebuffer_remove(struct drm_framebuffer *fb);  extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); -extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc); -extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); -extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY); -extern bool drm_crtc_in_use(struct drm_crtc *crtc); +extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb); -extern int drm_connector_attach_property(struct drm_connector *connector, -				      struct drm_property *property, uint64_t init_val); +extern void drm_object_attach_property(struct drm_mode_object *obj, +				       struct drm_property *property, +				       uint64_t init_val);  extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,  						const char *name, int num_values); +extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags, +					 const char *name, +					 const struct drm_prop_enum_list *props, +					 int num_values); +struct drm_property *drm_property_create_bitmask(struct drm_device *dev, +					 int flags, const char *name, +					 const struct drm_prop_enum_list *props, +					 int num_values); +struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, +					 const char *name, +					 uint64_t min, uint64_t max); +struct drm_property *drm_property_create_signed_range(struct drm_device *dev, +					 int flags, const char *name, +					 int64_t min, int64_t max); +struct drm_property *drm_property_create_object(struct drm_device *dev, +					 int flags, const char *name, uint32_t type);  extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);  extern int drm_property_add_enum(struct drm_property *property, int index,  				 uint64_t value, const char *name); @@ -705,46 +1010,46 @@ extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);  extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,  				     char *formats[]);  extern int drm_mode_create_scaling_mode_property(struct drm_device *dev); -extern int drm_mode_create_dithering_property(struct drm_device *dev);  extern int drm_mode_create_dirty_info_property(struct drm_device *dev); -extern char *drm_get_encoder_name(struct drm_encoder *encoder);  extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,  					     struct drm_encoder *encoder); -extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, -					   struct drm_encoder *encoder); -extern bool drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, +extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,  					 int gamma_size);  extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,  		uint32_t id, uint32_t type); +  /* IOCTLs */  extern int drm_mode_getresources(struct drm_device *dev,  				 void *data, struct drm_file *file_priv); - +extern int drm_mode_getplane_res(struct drm_device *dev, void *data, +				   struct drm_file *file_priv);  extern int drm_mode_getcrtc(struct drm_device *dev,  			    void *data, struct drm_file *file_priv);  extern int drm_mode_getconnector(struct drm_device *dev,  			      void *data, struct drm_file *file_priv); +extern int drm_mode_set_config_internal(struct drm_mode_set *set);  extern int drm_mode_setcrtc(struct drm_device *dev,  			    void *data, struct drm_file *file_priv); +extern int drm_mode_getplane(struct drm_device *dev, +			       void *data, struct drm_file *file_priv); +extern int drm_mode_setplane(struct drm_device *dev, +			       void *data, struct drm_file *file_priv);  extern int drm_mode_cursor_ioctl(struct drm_device *dev,  				void *data, struct drm_file *file_priv); +extern int drm_mode_cursor2_ioctl(struct drm_device *dev, +				void *data, struct drm_file *file_priv);  extern int drm_mode_addfb(struct drm_device *dev,  			  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,  			 void *data, struct drm_file *file_priv);  extern int drm_mode_getfb(struct drm_device *dev,  			  void *data, struct drm_file *file_priv);  extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,  				  void *data, struct drm_file *file_priv); -extern int drm_mode_addmode_ioctl(struct drm_device *dev, -				  void *data, struct drm_file *file_priv); -extern int drm_mode_rmmode_ioctl(struct drm_device *dev, -				 void *data, struct drm_file *file_priv); -extern int drm_mode_attachmode_ioctl(struct drm_device *dev, -				     void *data, struct drm_file *file_priv); -extern int drm_mode_detachmode_ioctl(struct drm_device *dev, -				     void *data, struct drm_file *file_priv);  extern int drm_mode_getproperty_ioctl(struct drm_device *dev,  				      void *data, struct drm_file *file_priv); @@ -752,34 +1057,103 @@ extern int drm_mode_getblob_ioctl(struct drm_device *dev,  				  void *data, struct drm_file *file_priv);  extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,  					      void *data, struct drm_file *file_priv); -extern int drm_mode_hotplug_ioctl(struct drm_device *dev, -				  void *data, struct drm_file *file_priv); -extern int drm_mode_replacefb(struct drm_device *dev, -			      void *data, struct drm_file *file_priv);  extern int drm_mode_getencoder(struct drm_device *dev,  			       void *data, struct drm_file *file_priv);  extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,  				    void *data, struct drm_file *file_priv);  extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,  				    void *data, struct drm_file *file_priv); +extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match); +extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);  extern bool drm_detect_hdmi_monitor(struct edid *edid);  extern bool drm_detect_monitor_audio(struct edid *edid); +extern bool drm_rgb_quant_range_selectable(struct edid *edid);  extern int drm_mode_page_flip_ioctl(struct drm_device *dev,  				    void *data, struct drm_file *file_priv); -extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, -				int hdisplay, int vdisplay, int vrefresh, -				bool reduced, bool interlaced, bool margins); -extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, -				int hdisplay, int vdisplay, int vrefresh, -				bool interlaced, int margins); -extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, -				int hdisplay, int vdisplay, int vrefresh, -				bool interlaced, int margins, int GTF_M, -				int GTF_2C, int GTF_K, int GTF_2J);  extern int drm_add_modes_noedid(struct drm_connector *connector,  				int hdisplay, int vdisplay); +extern void drm_set_preferred_mode(struct drm_connector *connector, +				   int hpref, int vpref); +extern int drm_edid_header_is_valid(const u8 *raw_edid); +extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid);  extern bool drm_edid_is_valid(struct edid *edid);  struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, -					   int hsize, int vsize, int fresh); +					   int hsize, int vsize, int fresh, +					   bool rb); + +extern int drm_mode_create_dumb_ioctl(struct drm_device *dev, +				      void *data, struct drm_file *file_priv); +extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, +				    void *data, struct drm_file *file_priv); +extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, +				      void *data, struct drm_file *file_priv); +extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data, +					     struct drm_file *file_priv); +extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data, +					   struct drm_file *file_priv); + +extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, +				 int *bpp); +extern int drm_format_num_planes(uint32_t format); +extern int drm_format_plane_cpp(uint32_t format, int plane); +extern int drm_format_horz_chroma_subsampling(uint32_t format); +extern int drm_format_vert_chroma_subsampling(uint32_t format); +extern const char *drm_get_format_name(uint32_t format); + +/* Helpers */ + +static inline struct drm_plane *drm_plane_find(struct drm_device *dev, +		uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PLANE); +	return mo ? obj_to_plane(mo) : NULL; +} + +static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev, +	uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC); +	return mo ? obj_to_crtc(mo) : NULL; +} + +static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev, +	uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER); +	return mo ? obj_to_encoder(mo) : NULL; +} + +static inline struct drm_connector *drm_connector_find(struct drm_device *dev, +		uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR); +	return mo ? obj_to_connector(mo) : NULL; +} + +static inline struct drm_property *drm_property_find(struct drm_device *dev, +		uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY); +	return mo ? obj_to_property(mo) : NULL; +} + +static inline struct drm_property_blob * +drm_property_blob_find(struct drm_device *dev, uint32_t id) +{ +	struct drm_mode_object *mo; +	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_BLOB); +	return mo ? obj_to_blob(mo) : NULL; +} + +/* Plane list iterator for legacy (overlay only) planes. */ +#define drm_for_each_legacy_plane(plane, planelist) \ +	list_for_each_entry(plane, planelist, head) \ +		if (plane->type == DRM_PLANE_TYPE_OVERLAY) +  #endif /* __DRM_CRTC_H__ */ diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index 73b071203dc..a3d75fefd01 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h @@ -44,6 +44,13 @@ enum mode_set_atomic {  	ENTER_ATOMIC_MODE_SET,  }; +/** + * drm_crtc_helper_funcs - helper operations for CRTCs + * @mode_fixup: try to fixup proposed mode for this connector + * @mode_set: set this mode + * + * The helper operations are called by the mid-layer CRTC helper. + */  struct drm_crtc_helper_funcs {  	/*  	 * Control power levels on the CRTC.  If the mode passed in is @@ -55,7 +62,7 @@ struct drm_crtc_helper_funcs {  	/* Provider can fixup or change mode timings before modeset occurs */  	bool (*mode_fixup)(struct drm_crtc *crtc, -			   struct drm_display_mode *mode, +			   const struct drm_display_mode *mode,  			   struct drm_display_mode *adjusted_mode);  	/* Actually set the mode */  	int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, @@ -76,13 +83,20 @@ struct drm_crtc_helper_funcs {  	void (*disable)(struct drm_crtc *crtc);  }; +/** + * drm_encoder_helper_funcs - helper operations for encoders + * @mode_fixup: try to fixup proposed mode for this connector + * @mode_set: set this mode + * + * The helper operations are called by the mid-layer CRTC helper. + */  struct drm_encoder_helper_funcs {  	void (*dpms)(struct drm_encoder *encoder, int mode);  	void (*save)(struct drm_encoder *encoder);  	void (*restore)(struct drm_encoder *encoder);  	bool (*mode_fixup)(struct drm_encoder *encoder, -			   struct drm_display_mode *mode, +			   const struct drm_display_mode *mode,  			   struct drm_display_mode *adjusted_mode);  	void (*prepare)(struct drm_encoder *encoder);  	void (*commit)(struct drm_encoder *encoder); @@ -97,14 +111,20 @@ struct drm_encoder_helper_funcs {  	void (*disable)(struct drm_encoder *encoder);  }; +/** + * drm_connector_helper_funcs - helper operations for connectors + * @get_modes: get mode list for this connector + * @mode_valid (optional): is this mode valid on the given connector? + * + * The helper operations are called by the mid-layer CRTC helper. + */  struct drm_connector_helper_funcs {  	int (*get_modes)(struct drm_connector *connector); -	int (*mode_valid)(struct drm_connector *connector, -			  struct drm_display_mode *mode); +	enum drm_mode_status (*mode_valid)(struct drm_connector *connector, +					   struct drm_display_mode *mode);  	struct drm_encoder *(*best_encoder)(struct drm_connector *connector);  }; -extern int drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY);  extern void drm_helper_disable_unused_functions(struct drm_device *dev);  extern int drm_crtc_helper_set_config(struct drm_mode_set *set);  extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, @@ -116,8 +136,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 int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, -					  struct drm_mode_fb_cmd *mode_cmd); +extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); + +extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, +					   struct drm_mode_fb_cmd2 *mode_cmd);  static inline void drm_crtc_helper_add(struct drm_crtc *crtc,  				       const struct drm_crtc_helper_funcs *funcs) @@ -137,11 +159,22 @@ static inline void drm_connector_helper_add(struct drm_connector *connector,  	connector->helper_private = (void *)funcs;  } -extern int drm_helper_resume_force_mode(struct drm_device *dev); +extern void drm_helper_resume_force_mode(struct drm_device *dev); + +/* drm_probe_helper.c */ +extern int drm_helper_probe_single_connector_modes(struct drm_connector +						   *connector, uint32_t maxX, +						   uint32_t maxY); +extern int drm_helper_probe_single_connector_modes_nomerge(struct drm_connector +							   *connector, +							   uint32_t maxX, +							   uint32_t maxY);  extern void drm_kms_helper_poll_init(struct drm_device *dev);  extern void drm_kms_helper_poll_fini(struct drm_device *dev); -extern void drm_helper_hpd_irq_event(struct drm_device *dev); +extern bool drm_helper_hpd_irq_event(struct drm_device *dev); +extern void drm_kms_helper_hotplug_event(struct drm_device *dev);  extern void drm_kms_helper_poll_disable(struct drm_device *dev);  extern void drm_kms_helper_poll_enable(struct drm_device *dev); +  #endif diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 83a389e4454..a21568bf151 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -25,25 +25,39 @@  #include <linux/types.h>  #include <linux/i2c.h> +#include <linux/delay.h> -/* From the VESA DisplayPort spec */ +/* + * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that + * DP and DPCD versions are independent.  Differences from 1.0 are not noted, + * 1.0 devices basically don't exist in the wild. + * + * Abbreviations, in chronological order: + * + * eDP: Embedded DisplayPort version 1 + * DPI: DisplayPort Interoperability Guideline v1.1a + * 1.2: DisplayPort 1.2 + * MST: Multistream Transport - part of DP 1.2a + * + * 1.2 formally includes both eDP and DPI definitions. + */ -#define AUX_NATIVE_WRITE	0x8 -#define AUX_NATIVE_READ		0x9 -#define AUX_I2C_WRITE		0x0 -#define AUX_I2C_READ		0x1 -#define AUX_I2C_STATUS		0x2 -#define AUX_I2C_MOT		0x4 +#define DP_AUX_I2C_WRITE		0x0 +#define DP_AUX_I2C_READ			0x1 +#define DP_AUX_I2C_STATUS		0x2 +#define DP_AUX_I2C_MOT			0x4 +#define DP_AUX_NATIVE_WRITE		0x8 +#define DP_AUX_NATIVE_READ		0x9 -#define AUX_NATIVE_REPLY_ACK	(0x0 << 4) -#define AUX_NATIVE_REPLY_NACK	(0x1 << 4) -#define AUX_NATIVE_REPLY_DEFER	(0x2 << 4) -#define AUX_NATIVE_REPLY_MASK	(0x3 << 4) +#define DP_AUX_NATIVE_REPLY_ACK		(0x0 << 0) +#define DP_AUX_NATIVE_REPLY_NACK	(0x1 << 0) +#define DP_AUX_NATIVE_REPLY_DEFER	(0x2 << 0) +#define DP_AUX_NATIVE_REPLY_MASK	(0x3 << 0) -#define AUX_I2C_REPLY_ACK	(0x0 << 6) -#define AUX_I2C_REPLY_NACK	(0x1 << 6) -#define AUX_I2C_REPLY_DEFER	(0x2 << 6) -#define AUX_I2C_REPLY_MASK	(0x3 << 6) +#define DP_AUX_I2C_REPLY_ACK		(0x0 << 2) +#define DP_AUX_I2C_REPLY_NACK		(0x1 << 2) +#define DP_AUX_I2C_REPLY_DEFER		(0x2 << 2) +#define DP_AUX_I2C_REPLY_MASK		(0x3 << 2)  /* AUX CH addresses */  /* DPCD */ @@ -53,6 +67,7 @@  #define DP_MAX_LANE_COUNT                   0x002  # define DP_MAX_LANE_COUNT_MASK		    0x1f +# define DP_TPS3_SUPPORTED		    (1 << 6) /* 1.2 */  # define DP_ENHANCED_FRAME_CAP		    (1 << 7)  #define DP_MAX_DOWNSPREAD                   0x003 @@ -63,18 +78,84 @@  #define DP_DOWNSTREAMPORT_PRESENT           0x005  # define DP_DWN_STRM_PORT_PRESENT           (1 << 0)  # define DP_DWN_STRM_PORT_TYPE_MASK         0x06 -/* 00b = DisplayPort */ -/* 01b = Analog */ -/* 10b = TMDS or HDMI */ -/* 11b = Other */ +# define DP_DWN_STRM_PORT_TYPE_DP           (0 << 1) +# define DP_DWN_STRM_PORT_TYPE_ANALOG       (1 << 1) +# define DP_DWN_STRM_PORT_TYPE_TMDS         (2 << 1) +# define DP_DWN_STRM_PORT_TYPE_OTHER        (3 << 1)  # define DP_FORMAT_CONVERSION               (1 << 3) +# define DP_DETAILED_CAP_INFO_AVAILABLE	    (1 << 4) /* DPI */  #define DP_MAIN_LINK_CHANNEL_CODING         0x006 +#define DP_DOWN_STREAM_PORT_COUNT	    0x007 +# define DP_PORT_COUNT_MASK		    0x0f +# define DP_MSA_TIMING_PAR_IGNORED	    (1 << 6) /* eDP */ +# define DP_OUI_SUPPORT			    (1 << 7) + +#define DP_I2C_SPEED_CAP		    0x00c    /* DPI */ +# define DP_I2C_SPEED_1K		    0x01 +# define DP_I2C_SPEED_5K		    0x02 +# define DP_I2C_SPEED_10K		    0x04 +# define DP_I2C_SPEED_100K		    0x08 +# define DP_I2C_SPEED_400K		    0x10 +# define DP_I2C_SPEED_1M		    0x20 + +#define DP_EDP_CONFIGURATION_CAP            0x00d   /* XXX 1.2? */ +#define DP_TRAINING_AUX_RD_INTERVAL         0x00e   /* XXX 1.2? */ + +/* Multiple stream transport */ +#define DP_FAUX_CAP			    0x020   /* 1.2 */ +# define DP_FAUX_CAP_1			    (1 << 0) + +#define DP_MSTM_CAP			    0x021   /* 1.2 */ +# define DP_MST_CAP			    (1 << 0) + +#define DP_GUID				    0x030   /* 1.2 */ + +#define DP_PSR_SUPPORT                      0x070   /* XXX 1.2? */ +# define DP_PSR_IS_SUPPORTED                1 +#define DP_PSR_CAPS                         0x071   /* XXX 1.2? */ +# define DP_PSR_NO_TRAIN_ON_EXIT            1 +# define DP_PSR_SETUP_TIME_330              (0 << 1) +# define DP_PSR_SETUP_TIME_275              (1 << 1) +# define DP_PSR_SETUP_TIME_220              (2 << 1) +# define DP_PSR_SETUP_TIME_165              (3 << 1) +# define DP_PSR_SETUP_TIME_110              (4 << 1) +# define DP_PSR_SETUP_TIME_55               (5 << 1) +# define DP_PSR_SETUP_TIME_0                (6 << 1) +# define DP_PSR_SETUP_TIME_MASK             (7 << 1) +# define DP_PSR_SETUP_TIME_SHIFT            1 + +/* + * 0x80-0x8f describe downstream port capabilities, but there are two layouts + * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set.  If it was not, + * each port's descriptor is one byte wide.  If it was set, each port's is + * four bytes wide, starting with the one byte from the base info.  As of + * DP interop v1.1a only VGA defines additional detail. + */ + +/* offset 0 */ +#define DP_DOWNSTREAM_PORT_0		    0x80 +# define DP_DS_PORT_TYPE_MASK		    (7 << 0) +# define DP_DS_PORT_TYPE_DP		    0 +# define DP_DS_PORT_TYPE_VGA		    1 +# define DP_DS_PORT_TYPE_DVI		    2 +# define DP_DS_PORT_TYPE_HDMI		    3 +# define DP_DS_PORT_TYPE_NON_EDID	    4 +# define DP_DS_PORT_HPD			    (1 << 3) +/* offset 1 for VGA is maximum megapixels per second / 8 */ +/* offset 2 */ +# define DP_DS_VGA_MAX_BPC_MASK		    (3 << 0) +# define DP_DS_VGA_8BPC			    0 +# define DP_DS_VGA_10BPC		    1 +# define DP_DS_VGA_12BPC		    2 +# define DP_DS_VGA_16BPC		    3 +  /* link configuration */  #define	DP_LINK_BW_SET		            0x100  # define DP_LINK_BW_1_62		    0x06  # define DP_LINK_BW_2_7			    0x0a +# define DP_LINK_BW_5_4			    0x14    /* 1.2 */  #define DP_LANE_COUNT_SET	            0x101  # define DP_LANE_COUNT_MASK		    0x0f @@ -84,6 +165,7 @@  # define DP_TRAINING_PATTERN_DISABLE	    0  # define DP_TRAINING_PATTERN_1		    1  # define DP_TRAINING_PATTERN_2		    2 +# define DP_TRAINING_PATTERN_3		    3	    /* 1.2 */  # define DP_TRAINING_PATTERN_MASK	    0x3  # define DP_LINK_QUAL_PATTERN_DISABLE	    (0 << 2) @@ -124,10 +206,51 @@  #define DP_DOWNSPREAD_CTRL		    0x107  # define DP_SPREAD_AMP_0_5		    (1 << 4) +# define DP_MSA_TIMING_PAR_IGNORE_EN	    (1 << 7) /* eDP */  #define DP_MAIN_LINK_CHANNEL_CODING_SET	    0x108  # define DP_SET_ANSI_8B10B		    (1 << 0) +#define DP_I2C_SPEED_CONTROL_STATUS	    0x109   /* DPI */ +/* bitmask as for DP_I2C_SPEED_CAP */ + +#define DP_EDP_CONFIGURATION_SET            0x10a   /* XXX 1.2? */ + +#define DP_MSTM_CTRL			    0x111   /* 1.2 */ +# define DP_MST_EN			    (1 << 0) +# define DP_UP_REQ_EN			    (1 << 1) +# define DP_UPSTREAM_IS_SRC		    (1 << 2) + +#define DP_PSR_EN_CFG			    0x170   /* XXX 1.2? */ +# define DP_PSR_ENABLE			    (1 << 0) +# define DP_PSR_MAIN_LINK_ACTIVE	    (1 << 1) +# define DP_PSR_CRC_VERIFICATION	    (1 << 2) +# define DP_PSR_FRAME_CAPTURE		    (1 << 3) + +#define DP_ADAPTER_CTRL			    0x1a0 +# define DP_ADAPTER_CTRL_FORCE_LOAD_SENSE   (1 << 0) + +#define DP_BRANCH_DEVICE_CTRL		    0x1a1 +# define DP_BRANCH_DEVICE_IRQ_HPD	    (1 << 0) + +#define DP_PAYLOAD_ALLOCATE_SET		    0x1c0 +#define DP_PAYLOAD_ALLOCATE_START_TIME_SLOT 0x1c1 +#define DP_PAYLOAD_ALLOCATE_TIME_SLOT_COUNT 0x1c2 + +#define DP_SINK_COUNT			    0x200 +/* prior to 1.2 bit 7 was reserved mbz */ +# define DP_GET_SINK_COUNT(x)		    ((((x) & 0x80) >> 1) | ((x) & 0x3f)) +# define DP_SINK_CP_READY		    (1 << 6) + +#define DP_DEVICE_SERVICE_IRQ_VECTOR	    0x201 +# define DP_REMOTE_CONTROL_COMMAND_PENDING  (1 << 0) +# define DP_AUTOMATED_TEST_REQUEST	    (1 << 1) +# define DP_CP_IRQ			    (1 << 2) +# define DP_MCCS_IRQ			    (1 << 3) +# define DP_DOWN_REP_MSG_RDY		    (1 << 4) /* 1.2 MST */ +# define DP_UP_REQ_MSG_RDY		    (1 << 5) /* 1.2 MST */ +# define DP_SINK_SPECIFIC_IRQ		    (1 << 6) +  #define DP_LANE0_1_STATUS		    0x202  #define DP_LANE2_3_STATUS		    0x203  # define DP_LANE_CR_DONE		    (1 << 0) @@ -160,15 +283,135 @@  # define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK   0xc0  # define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT  6 +#define DP_TEST_REQUEST			    0x218 +# define DP_TEST_LINK_TRAINING		    (1 << 0) +# define DP_TEST_LINK_VIDEO_PATTERN	    (1 << 1) +# define DP_TEST_LINK_EDID_READ		    (1 << 2) +# define DP_TEST_LINK_PHY_TEST_PATTERN	    (1 << 3) /* DPCD >= 1.1 */ +# define DP_TEST_LINK_FAUX_PATTERN	    (1 << 4) /* DPCD >= 1.2 */ + +#define DP_TEST_LINK_RATE		    0x219 +# define DP_LINK_RATE_162		    (0x6) +# define DP_LINK_RATE_27		    (0xa) + +#define DP_TEST_LANE_COUNT		    0x220 + +#define DP_TEST_PATTERN			    0x221 + +#define DP_TEST_CRC_R_CR		    0x240 +#define DP_TEST_CRC_G_Y			    0x242 +#define DP_TEST_CRC_B_CB		    0x244 + +#define DP_TEST_SINK_MISC		    0x246 +#define DP_TEST_CRC_SUPPORTED		    (1 << 5) + +#define DP_TEST_RESPONSE		    0x260 +# define DP_TEST_ACK			    (1 << 0) +# define DP_TEST_NAK			    (1 << 1) +# define DP_TEST_EDID_CHECKSUM_WRITE	    (1 << 2) + +#define DP_TEST_EDID_CHECKSUM		    0x261 + +#define DP_TEST_SINK			    0x270 +#define DP_TEST_SINK_START	    (1 << 0) + +#define DP_PAYLOAD_TABLE_UPDATE_STATUS      0x2c0   /* 1.2 MST */ +# define DP_PAYLOAD_TABLE_UPDATED           (1 << 0) +# define DP_PAYLOAD_ACT_HANDLED             (1 << 1) + +#define DP_VC_PAYLOAD_ID_SLOT_1             0x2c1   /* 1.2 MST */ +/* up to ID_SLOT_63 at 0x2ff */ + +#define DP_SOURCE_OUI			    0x300 +#define DP_SINK_OUI			    0x400 +#define DP_BRANCH_OUI			    0x500 +  #define DP_SET_POWER                        0x600  # define DP_SET_POWER_D0                    0x1  # define DP_SET_POWER_D3                    0x2 +# define DP_SET_POWER_MASK                  0x3 + +#define DP_SIDEBAND_MSG_DOWN_REQ_BASE	    0x1000   /* 1.2 MST */ +#define DP_SIDEBAND_MSG_UP_REP_BASE	    0x1200   /* 1.2 MST */ +#define DP_SIDEBAND_MSG_DOWN_REP_BASE	    0x1400   /* 1.2 MST */ +#define DP_SIDEBAND_MSG_UP_REQ_BASE	    0x1600   /* 1.2 MST */ + +#define DP_SINK_COUNT_ESI		    0x2002   /* 1.2 */ +/* 0-5 sink count */ +# define DP_SINK_COUNT_CP_READY             (1 << 6) + +#define DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0   0x2003   /* 1.2 */ + +#define DP_DEVICE_SERVICE_IRQ_VECTOR_ESI1   0x2004   /* 1.2 */ + +#define DP_LINK_SERVICE_IRQ_VECTOR_ESI0     0x2005   /* 1.2 */ + +#define DP_PSR_ERROR_STATUS                 0x2006  /* XXX 1.2? */ +# define DP_PSR_LINK_CRC_ERROR              (1 << 0) +# define DP_PSR_RFB_STORAGE_ERROR           (1 << 1) + +#define DP_PSR_ESI                          0x2007  /* XXX 1.2? */ +# define DP_PSR_CAPS_CHANGE                 (1 << 0) + +#define DP_PSR_STATUS                       0x2008  /* XXX 1.2? */ +# define DP_PSR_SINK_INACTIVE               0 +# define DP_PSR_SINK_ACTIVE_SRC_SYNCED      1 +# define DP_PSR_SINK_ACTIVE_RFB             2 +# define DP_PSR_SINK_ACTIVE_SINK_SYNCED     3 +# define DP_PSR_SINK_ACTIVE_RESYNC          4 +# define DP_PSR_SINK_INTERNAL_ERROR         7 +# define DP_PSR_SINK_STATE_MASK             0x07 + +/* DP 1.2 Sideband message defines */ +/* peer device type - DP 1.2a Table 2-92 */ +#define DP_PEER_DEVICE_NONE		0x0 +#define DP_PEER_DEVICE_SOURCE_OR_SST	0x1 +#define DP_PEER_DEVICE_MST_BRANCHING	0x2 +#define DP_PEER_DEVICE_SST_SINK		0x3 +#define DP_PEER_DEVICE_DP_LEGACY_CONV	0x4 + +/* DP 1.2 MST sideband request names DP 1.2a Table 2-80 */ +#define DP_LINK_ADDRESS			0x01 +#define DP_CONNECTION_STATUS_NOTIFY	0x02 +#define DP_ENUM_PATH_RESOURCES		0x10 +#define DP_ALLOCATE_PAYLOAD		0x11 +#define DP_QUERY_PAYLOAD		0x12 +#define DP_RESOURCE_STATUS_NOTIFY	0x13 +#define DP_CLEAR_PAYLOAD_ID_TABLE	0x14 +#define DP_REMOTE_DPCD_READ		0x20 +#define DP_REMOTE_DPCD_WRITE		0x21 +#define DP_REMOTE_I2C_READ		0x22 +#define DP_REMOTE_I2C_WRITE		0x23 +#define DP_POWER_UP_PHY			0x24 +#define DP_POWER_DOWN_PHY		0x25 +#define DP_SINK_EVENT_NOTIFY		0x30 +#define DP_QUERY_STREAM_ENC_STATUS	0x38 + +/* DP 1.2 MST sideband nak reasons - table 2.84 */ +#define DP_NAK_WRITE_FAILURE		0x01 +#define DP_NAK_INVALID_READ		0x02 +#define DP_NAK_CRC_FAILURE		0x03 +#define DP_NAK_BAD_PARAM		0x04 +#define DP_NAK_DEFER			0x05 +#define DP_NAK_LINK_FAILURE		0x06 +#define DP_NAK_NO_RESOURCES		0x07 +#define DP_NAK_DPCD_FAIL		0x08 +#define DP_NAK_I2C_NAK			0x09 +#define DP_NAK_ALLOCATE_FAIL		0x0a  #define MODE_I2C_START	1  #define MODE_I2C_WRITE	2  #define MODE_I2C_READ	4  #define MODE_I2C_STOP	8 +/** + * struct i2c_algo_dp_aux_data - driver interface structure for i2c over dp + * 				 aux algorithm + * @running: set by the algo indicating whether an i2c is ongoing or whether + * 	     the i2c bus is quiescent + * @address: i2c target address for the currently ongoing transfer + * @aux_ch: driver callback to transfer a single byte of the i2c payload + */  struct i2c_algo_dp_aux_data {  	bool running;  	u16 address; @@ -180,4 +423,190 @@ struct i2c_algo_dp_aux_data {  int  i2c_dp_aux_add_bus(struct i2c_adapter *adapter); + +#define DP_LINK_STATUS_SIZE	   6 +bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE], +			  int lane_count); +bool drm_dp_clock_recovery_ok(const u8 link_status[DP_LINK_STATUS_SIZE], +			      int lane_count); +u8 drm_dp_get_adjust_request_voltage(const u8 link_status[DP_LINK_STATUS_SIZE], +				     int lane); +u8 drm_dp_get_adjust_request_pre_emphasis(const u8 link_status[DP_LINK_STATUS_SIZE], +					  int lane); + +#define DP_RECEIVER_CAP_SIZE		0xf +#define EDP_PSR_RECEIVER_CAP_SIZE	2 + +void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]); +void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]); + +u8 drm_dp_link_rate_to_bw_code(int link_rate); +int drm_dp_bw_code_to_link_rate(u8 link_bw); + +struct edp_sdp_header { +	u8 HB0; /* Secondary Data Packet ID */ +	u8 HB1; /* Secondary Data Packet Type */ +	u8 HB2; /* 7:5 reserved, 4:0 revision number */ +	u8 HB3; /* 7:5 reserved, 4:0 number of valid data bytes */ +} __packed; + +#define EDP_SDP_HEADER_REVISION_MASK		0x1F +#define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES	0x1F + +struct edp_vsc_psr { +	struct edp_sdp_header sdp_header; +	u8 DB0; /* Stereo Interface */ +	u8 DB1; /* 0 - PSR State; 1 - Update RFB; 2 - CRC Valid */ +	u8 DB2; /* CRC value bits 7:0 of the R or Cr component */ +	u8 DB3; /* CRC value bits 15:8 of the R or Cr component */ +	u8 DB4; /* CRC value bits 7:0 of the G or Y component */ +	u8 DB5; /* CRC value bits 15:8 of the G or Y component */ +	u8 DB6; /* CRC value bits 7:0 of the B or Cb component */ +	u8 DB7; /* CRC value bits 15:8 of the B or Cb component */ +	u8 DB8_31[24]; /* Reserved */ +} __packed; + +#define EDP_VSC_PSR_STATE_ACTIVE	(1<<0) +#define EDP_VSC_PSR_UPDATE_RFB		(1<<1) +#define EDP_VSC_PSR_CRC_VALUES_VALID	(1<<2) + +static inline int +drm_dp_max_link_rate(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	return drm_dp_bw_code_to_link_rate(dpcd[DP_MAX_LINK_RATE]); +} + +static inline u8 +drm_dp_max_lane_count(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	return dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK; +} + +static inline bool +drm_dp_enhanced_frame_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	return dpcd[DP_DPCD_REV] >= 0x11 && +		(dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP); +} + +/* + * DisplayPort AUX channel + */ + +/** + * struct drm_dp_aux_msg - DisplayPort AUX channel transaction + * @address: address of the (first) register to access + * @request: contains the type of transaction (see DP_AUX_* macros) + * @reply: upon completion, contains the reply type of the transaction + * @buffer: pointer to a transmission or reception buffer + * @size: size of @buffer + */ +struct drm_dp_aux_msg { +	unsigned int address; +	u8 request; +	u8 reply; +	void *buffer; +	size_t size; +}; + +/** + * struct drm_dp_aux - DisplayPort AUX channel + * @name: user-visible name of this AUX channel and the I2C-over-AUX adapter + * @ddc: I2C adapter that can be used for I2C-over-AUX communication + * @dev: pointer to struct device that is the parent for this AUX channel + * @hw_mutex: internal mutex used for locking transfers + * @transfer: transfers a message representing a single AUX transaction + * + * The .dev field should be set to a pointer to the device that implements + * the AUX channel. + * + * The .name field may be used to specify the name of the I2C adapter. If set to + * NULL, dev_name() of .dev will be used. + * + * Drivers provide a hardware-specific implementation of how transactions + * are executed via the .transfer() function. A pointer to a drm_dp_aux_msg + * structure describing the transaction is passed into this function. Upon + * success, the implementation should return the number of payload bytes + * that were transferred, or a negative error-code on failure. Helpers + * propagate errors from the .transfer() function, with the exception of + * the -EBUSY error, which causes a transaction to be retried. On a short, + * helpers will return -EPROTO to make it simpler to check for failure. + * + * An AUX channel can also be used to transport I2C messages to a sink. A + * typical application of that is to access an EDID that's present in the + * sink device. The .transfer() function can also be used to execute such + * transactions. The drm_dp_aux_register_i2c_bus() function registers an + * I2C adapter that can be passed to drm_probe_ddc(). Upon removal, drivers + * should call drm_dp_aux_unregister_i2c_bus() to remove the I2C adapter. + * + * Note that the aux helper code assumes that the .transfer() function + * only modifies the reply field of the drm_dp_aux_msg structure.  The + * retry logic and i2c helpers assume this is the case. + */ +struct drm_dp_aux { +	const char *name; +	struct i2c_adapter ddc; +	struct device *dev; +	struct mutex hw_mutex; +	ssize_t (*transfer)(struct drm_dp_aux *aux, +			    struct drm_dp_aux_msg *msg); +}; + +ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, +			 void *buffer, size_t size); +ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset, +			  void *buffer, size_t size); + +/** + * drm_dp_dpcd_readb() - read a single byte from the DPCD + * @aux: DisplayPort AUX channel + * @offset: address of the register to read + * @valuep: location where the value of the register will be stored + * + * Returns the number of bytes transferred (1) on success, or a negative + * error code on failure. + */ +static inline ssize_t drm_dp_dpcd_readb(struct drm_dp_aux *aux, +					unsigned int offset, u8 *valuep) +{ +	return drm_dp_dpcd_read(aux, offset, valuep, 1); +} + +/** + * drm_dp_dpcd_writeb() - write a single byte to the DPCD + * @aux: DisplayPort AUX channel + * @offset: address of the register to write + * @value: value to write to the register + * + * Returns the number of bytes transferred (1) on success, or a negative + * error code on failure. + */ +static inline ssize_t drm_dp_dpcd_writeb(struct drm_dp_aux *aux, +					 unsigned int offset, u8 value) +{ +	return drm_dp_dpcd_write(aux, offset, &value, 1); +} + +int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, +				 u8 status[DP_LINK_STATUS_SIZE]); + +/* + * DisplayPort link + */ +#define DP_LINK_CAP_ENHANCED_FRAMING (1 << 0) + +struct drm_dp_link { +	unsigned char revision; +	unsigned int rate; +	unsigned int num_lanes; +	unsigned long capabilities; +}; + +int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link); +int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link); +int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); + +int drm_dp_aux_register(struct drm_dp_aux *aux); +void drm_dp_aux_unregister(struct drm_dp_aux *aux); +  #endif /* _DRM_DP_HELPER_H_ */ diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index 5881fad91fa..b96031d947a 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -90,12 +90,26 @@ struct detailed_data_monitor_range {  	u8 min_hfreq_khz;  	u8 max_hfreq_khz;  	u8 pixel_clock_mhz; /* need to multiply by 10 */ -	__le16 sec_gtf_toggle; /* A000=use above, 20=use below */ -	u8 hfreq_start_khz; /* need to multiply by 2 */ -	u8 c; /* need to divide by 2 */ -	__le16 m; -	u8 k; -	u8 j; /* need to divide by 2 */ +	u8 flags; +	union { +		struct { +			u8 reserved; +			u8 hfreq_start_khz; /* need to multiply by 2 */ +			u8 c; /* need to divide by 2 */ +			__le16 m; +			u8 k; +			u8 j; /* need to divide by 2 */ +		} __attribute__((packed)) gtf2; +		struct { +			u8 version; +			u8 data1; /* high 6 bits: extra clock resolution */ +			u8 data2; /* plus low 2 of above: max hactive */ +			u8 supported_aspects; +			u8 flags; /* preferred aspect and blanking support */ +			u8 supported_scalings; +			u8 preferred_refresh; +		} __attribute__((packed)) cvt; +	} formula;  } __attribute__((packed));  struct detailed_data_wpindex { @@ -155,16 +169,44 @@ struct detailed_timing {  #define DRM_EDID_INPUT_SEPARATE_SYNCS  (1 << 3)  #define DRM_EDID_INPUT_BLANK_TO_BLACK  (1 << 4)  #define DRM_EDID_INPUT_VIDEO_LEVEL     (3 << 5) -#define DRM_EDID_INPUT_DIGITAL         (1 << 7) /* bits below must be zero if set */ +#define DRM_EDID_INPUT_DIGITAL         (1 << 7) +#define DRM_EDID_DIGITAL_DEPTH_MASK    (7 << 4) +#define DRM_EDID_DIGITAL_DEPTH_UNDEF   (0 << 4) +#define DRM_EDID_DIGITAL_DEPTH_6       (1 << 4) +#define DRM_EDID_DIGITAL_DEPTH_8       (2 << 4) +#define DRM_EDID_DIGITAL_DEPTH_10      (3 << 4) +#define DRM_EDID_DIGITAL_DEPTH_12      (4 << 4) +#define DRM_EDID_DIGITAL_DEPTH_14      (5 << 4) +#define DRM_EDID_DIGITAL_DEPTH_16      (6 << 4) +#define DRM_EDID_DIGITAL_DEPTH_RSVD    (7 << 4) +#define DRM_EDID_DIGITAL_TYPE_UNDEF    (0) +#define DRM_EDID_DIGITAL_TYPE_DVI      (1) +#define DRM_EDID_DIGITAL_TYPE_HDMI_A   (2) +#define DRM_EDID_DIGITAL_TYPE_HDMI_B   (3) +#define DRM_EDID_DIGITAL_TYPE_MDDI     (4) +#define DRM_EDID_DIGITAL_TYPE_DP       (5)  #define DRM_EDID_FEATURE_DEFAULT_GTF      (1 << 0)  #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1)  #define DRM_EDID_FEATURE_STANDARD_COLOR   (1 << 2) +/* If analog */  #define DRM_EDID_FEATURE_DISPLAY_TYPE     (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ +/* If digital */ +#define DRM_EDID_FEATURE_COLOR_MASK	  (3 << 3) +#define DRM_EDID_FEATURE_RGB		  (0 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB444	  (1 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB422	  (2 << 3) +#define DRM_EDID_FEATURE_RGB_YCRCB	  (3 << 3) /* both 4:4:4 and 4:2:2 */ +  #define DRM_EDID_FEATURE_PM_ACTIVE_OFF    (1 << 5)  #define DRM_EDID_FEATURE_PM_SUSPEND       (1 << 6)  #define DRM_EDID_FEATURE_PM_STANDBY       (1 << 7) +#define DRM_EDID_HDMI_DC_48               (1 << 6) +#define DRM_EDID_HDMI_DC_36               (1 << 5) +#define DRM_EDID_HDMI_DC_30               (1 << 4) +#define DRM_EDID_HDMI_DC_Y444             (1 << 3) +  struct edid {  	u8 header[8];  	/* Vendor & product info */ @@ -207,4 +249,34 @@ struct edid {  #define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8)) +/* Short Audio Descriptor */ +struct cea_sad { +	u8 format; +	u8 channels; /* max number of channels - 1 */ +	u8 freq; +	u8 byte2; /* meaning depends on format */ +}; + +struct drm_encoder; +struct drm_connector; +struct drm_display_mode; +struct hdmi_avi_infoframe; +struct hdmi_vendor_infoframe; + +void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid); +int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads); +int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb); +int drm_av_sync_delay(struct drm_connector *connector, +		      struct drm_display_mode *mode); +struct drm_connector *drm_select_eld(struct drm_encoder *encoder, +				     struct drm_display_mode *mode); +int drm_load_edid_firmware(struct drm_connector *connector); + +int +drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, +					 const struct drm_display_mode *mode); +int +drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, +					    const struct drm_display_mode *mode); +  #endif /* __DRM_EDID_H__ */ diff --git a/include/drm/drm_encoder_slave.h b/include/drm/drm_encoder_slave.h index 2f65633d28a..8b9cc367185 100644 --- a/include/drm/drm_encoder_slave.h +++ b/include/drm/drm_encoder_slave.h @@ -27,8 +27,8 @@  #ifndef __DRM_ENCODER_SLAVE_H__  #define __DRM_ENCODER_SLAVE_H__ -#include "drmP.h" -#include "drm_crtc.h" +#include <drm/drmP.h> +#include <drm/drm_crtc.h>  /**   * struct drm_encoder_slave_funcs - Entry points exposed by a slave encoder driver @@ -54,7 +54,7 @@ struct drm_encoder_slave_funcs {  	void (*save)(struct drm_encoder *encoder);  	void (*restore)(struct drm_encoder *encoder);  	bool (*mode_fixup)(struct drm_encoder *encoder, -			   struct drm_display_mode *mode, +			   const struct drm_display_mode *mode,  			   struct drm_display_mode *adjusted_mode);  	int (*mode_valid)(struct drm_encoder *encoder,  			  struct drm_display_mode *mode); @@ -159,4 +159,24 @@ static inline void drm_i2c_encoder_unregister(struct drm_i2c_encoder_driver *dri  void drm_i2c_encoder_destroy(struct drm_encoder *encoder); + +/* + * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs: + */ + +void drm_i2c_encoder_dpms(struct drm_encoder *encoder, int mode); +bool drm_i2c_encoder_mode_fixup(struct drm_encoder *encoder, +		const struct drm_display_mode *mode, +		struct drm_display_mode *adjusted_mode); +void drm_i2c_encoder_prepare(struct drm_encoder *encoder); +void drm_i2c_encoder_commit(struct drm_encoder *encoder); +void drm_i2c_encoder_mode_set(struct drm_encoder *encoder, +		struct drm_display_mode *mode, +		struct drm_display_mode *adjusted_mode); +enum drm_connector_status drm_i2c_encoder_detect(struct drm_encoder *encoder, +	    struct drm_connector *connector); +void drm_i2c_encoder_save(struct drm_encoder *encoder); +void drm_i2c_encoder_restore(struct drm_encoder *encoder); + +  #endif diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h new file mode 100644 index 00000000000..c54cf3d4a03 --- /dev/null +++ b/include/drm/drm_fb_cma_helper.h @@ -0,0 +1,31 @@ +#ifndef __DRM_FB_CMA_HELPER_H__ +#define __DRM_FB_CMA_HELPER_H__ + +struct drm_fbdev_cma; +struct drm_gem_cma_object; + +struct drm_framebuffer; +struct drm_device; +struct drm_file; +struct drm_mode_fb_cmd2; + +struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev, +	unsigned int preferred_bpp, unsigned int num_crtc, +	unsigned int max_conn_count); +void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma); + +void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma); +void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma); + +struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev, +	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd); + +struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, +	unsigned int plane); + +#ifdef CONFIG_DEBUG_FS +int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg); +#endif + +#endif + diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index f22e7fe4b6d..7997246d403 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -35,25 +35,10 @@ struct drm_fb_helper;  #include <linux/kgdb.h>  struct drm_fb_helper_crtc { -	uint32_t crtc_id;  	struct drm_mode_set mode_set;  	struct drm_display_mode *desired_mode;  }; -/* mode specified on the command line */ -struct drm_fb_helper_cmdline_mode { -	bool specified; -	bool refresh_specified; -	bool bpp_specified; -	int xres, yres; -	int bpp; -	int refresh; -	bool rb; -	bool interlace; -	bool cvt; -	bool margins; -}; -  struct drm_fb_helper_surface_size {  	u32 fb_width;  	u32 fb_height; @@ -63,6 +48,19 @@ struct drm_fb_helper_surface_size {  	u32 surface_depth;  }; +/** + * struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library + * @gamma_set: Set the given gamma lut register on the given crtc. + * @gamma_get: Read the given gamma lut register on the given crtc, used to + *             save the current lut when force-restoring the fbdev for e.g. + *             kdbg. + * @fb_probe: Driver callback to allocate and initialize the fbdev info + *            structure. Furthermore it also needs to allocate the drm + *            framebuffer used to back the fbdev. + * @initial_config: Setup an initial fbdev display configuration + * + * Driver callbacks used by the fbdev emulation helper library. + */  struct drm_fb_helper_funcs {  	void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,  			  u16 blue, int regno); @@ -71,24 +69,25 @@ struct drm_fb_helper_funcs {  	int (*fb_probe)(struct drm_fb_helper *helper,  			struct drm_fb_helper_surface_size *sizes); +	bool (*initial_config)(struct drm_fb_helper *fb_helper, +			       struct drm_fb_helper_crtc **crtcs, +			       struct drm_display_mode **modes, +			       bool *enabled, int width, int height);  };  struct drm_fb_helper_connector { -	struct drm_fb_helper_cmdline_mode cmdline_mode;  	struct drm_connector *connector; +	struct drm_cmdline_mode cmdline_mode;  };  struct drm_fb_helper {  	struct drm_framebuffer *fb; -	struct drm_framebuffer *saved_fb;  	struct drm_device *dev; -	struct drm_display_mode *mode;  	int crtc_count;  	struct drm_fb_helper_crtc *crtc_info;  	int connector_count;  	struct drm_fb_helper_connector **connector_info;  	struct drm_fb_helper_funcs *funcs; -	int conn_limit;  	struct fb_info *fbdev;  	u32 pseudo_palette[17];  	struct list_head kernel_fb_list; @@ -98,9 +97,6 @@ struct drm_fb_helper {  	bool delayed_hotplug;  }; -int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper, -				  int preferred_bpp); -  int drm_fb_helper_init(struct drm_device *dev,  		       struct drm_fb_helper *helper, int crtc_count,  		       int max_conn); @@ -111,14 +107,8 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,  int drm_fb_helper_set_par(struct fb_info *info);  int drm_fb_helper_check_var(struct fb_var_screeninfo *var,  			    struct fb_info *info); -int drm_fb_helper_setcolreg(unsigned regno, -			    unsigned red, -			    unsigned green, -			    unsigned blue, -			    unsigned transp, -			    struct fb_info *info); -void drm_fb_helper_restore(void); +bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);  void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,  			    uint32_t fb_width, uint32_t fb_height);  void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, @@ -126,10 +116,16 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,  int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); -bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); +int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);  bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);  int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);  int drm_fb_helper_debug_enter(struct fb_info *info);  int drm_fb_helper_debug_leave(struct fb_info *info); +struct drm_display_mode * +drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, +			int width, int height); +struct drm_display_mode * +drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, +		      int width, int height);  #endif diff --git a/include/drm/drm_fixed.h b/include/drm/drm_fixed.h index 4a08a664ff1..d639049a613 100644 --- a/include/drm/drm_fixed.h +++ b/include/drm/drm_fixed.h @@ -20,10 +20,13 @@   * OTHER DEALINGS IN THE SOFTWARE.   *   * Authors: Dave Airlie + *          Christian König   */  #ifndef DRM_FIXED_H  #define DRM_FIXED_H +#include <linux/math64.h> +  typedef union dfixed {  	u32 full;  } fixed20_12; @@ -37,6 +40,7 @@ typedef union dfixed {  #define dfixed_init(A) { .full = dfixed_const((A)) }  #define dfixed_init_half(A) { .full = dfixed_const_half((A)) }  #define dfixed_trunc(A) ((A).full >> 12) +#define dfixed_frac(A) ((A).full & ((1 << 12) - 1))  static inline u32 dfixed_floor(fixed20_12 A)  { @@ -64,4 +68,95 @@ static inline u32 dfixed_div(fixed20_12 A, fixed20_12 B)  	tmp /= 2;  	return lower_32_bits(tmp);  } + +#define DRM_FIXED_POINT		32 +#define DRM_FIXED_ONE		(1ULL << DRM_FIXED_POINT) +#define DRM_FIXED_DECIMAL_MASK	(DRM_FIXED_ONE - 1) +#define DRM_FIXED_DIGITS_MASK	(~DRM_FIXED_DECIMAL_MASK) + +static inline s64 drm_int2fixp(int a) +{ +	return ((s64)a) << DRM_FIXED_POINT; +} + +static inline int drm_fixp2int(int64_t a) +{ +	return ((s64)a) >> DRM_FIXED_POINT; +} + +static inline unsigned drm_fixp_msbset(int64_t a) +{ +	unsigned shift, sign = (a >> 63) & 1; + +	for (shift = 62; shift > 0; --shift) +		if (((a >> shift) & 1) != sign) +			return shift; + +	return 0; +} + +static inline s64 drm_fixp_mul(s64 a, s64 b) +{ +	unsigned shift = drm_fixp_msbset(a) + drm_fixp_msbset(b); +	s64 result; + +	if (shift > 61) { +		shift = shift - 61; +		a >>= (shift >> 1) + (shift & 1); +		b >>= shift >> 1; +	} else +		shift = 0; + +	result = a * b; + +	if (shift > DRM_FIXED_POINT) +		return result << (shift - DRM_FIXED_POINT); + +	if (shift < DRM_FIXED_POINT) +		return result >> (DRM_FIXED_POINT - shift); + +	return result; +} + +static inline s64 drm_fixp_div(s64 a, s64 b) +{ +	unsigned shift = 62 - drm_fixp_msbset(a); +	s64 result; + +	a <<= shift; + +	if (shift < DRM_FIXED_POINT) +		b >>= (DRM_FIXED_POINT - shift); + +	result = div64_s64(a, b); + +	if (shift > DRM_FIXED_POINT) +		return result >> (shift - DRM_FIXED_POINT); + +	return result; +} + +static inline s64 drm_fixp_exp(s64 x) +{ +	s64 tolerance = div64_s64(DRM_FIXED_ONE, 1000000); +	s64 sum = DRM_FIXED_ONE, term, y = x; +	u64 count = 1; + +	if (x < 0) +		y = -1 * x; + +	term = y; + +	while (term >= tolerance) { +		sum = sum + term; +		count = count + 1; +		term = drm_fixp_mul(term, div64_s64(y, count)); +	} + +	if (x < 0) +		sum = drm_fixp_div(DRM_FIXED_ONE, sum); + +	return sum; +} +  #endif diff --git a/include/drm/drm_flip_work.h b/include/drm/drm_flip_work.h new file mode 100644 index 00000000000..9eed34dcd6a --- /dev/null +++ b/include/drm/drm_flip_work.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2013 Red Hat + * + * 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 + * THE AUTHORS OR COPYRIGHT HOLDERS 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_FLIP_WORK_H +#define DRM_FLIP_WORK_H + +#include <linux/kfifo.h> +#include <linux/workqueue.h> + +/** + * DOC: flip utils + * + * Util to queue up work to run from work-queue context after flip/vblank. + * Typically this can be used to defer unref of framebuffer's, cursor + * bo's, etc until after vblank.  The APIs are all safe (and lockless) + * for up to one producer and once consumer at a time.  The single-consumer + * aspect is ensured by committing the queued work to a single work-queue. + */ + +struct drm_flip_work; + +/* + * drm_flip_func_t - callback function + * + * @work: the flip work + * @val: value queued via drm_flip_work_queue() + * + * Callback function to be called for each of the  queue'd work items after + * drm_flip_work_commit() is called. + */ +typedef void (*drm_flip_func_t)(struct drm_flip_work *work, void *val); + +/** + * struct drm_flip_work - flip work queue + * @name: debug name + * @pending: number of queued but not committed items + * @count: number of committed items + * @func: callback fxn called for each committed item + * @worker: worker which calls @func + * @fifo: queue of committed items + */ +struct drm_flip_work { +	const char *name; +	atomic_t pending, count; +	drm_flip_func_t func; +	struct work_struct worker; +	DECLARE_KFIFO_PTR(fifo, void *); +}; + +void drm_flip_work_queue(struct drm_flip_work *work, void *val); +void drm_flip_work_commit(struct drm_flip_work *work, +		struct workqueue_struct *wq); +int drm_flip_work_init(struct drm_flip_work *work, int size, +		const char *name, drm_flip_func_t func); +void drm_flip_work_cleanup(struct drm_flip_work *work); + +#endif  /* DRM_FLIP_WORK_H */ diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h new file mode 100644 index 00000000000..2a3cea91606 --- /dev/null +++ b/include/drm/drm_gem_cma_helper.h @@ -0,0 +1,54 @@ +#ifndef __DRM_GEM_CMA_HELPER_H__ +#define __DRM_GEM_CMA_HELPER_H__ + +#include <drm/drmP.h> + +struct drm_gem_cma_object { +	struct drm_gem_object base; +	dma_addr_t paddr; +	struct sg_table *sgt; + +	/* For objects with DMA memory allocated by GEM CMA */ +	void *vaddr; +}; + +static inline struct drm_gem_cma_object * +to_drm_gem_cma_obj(struct drm_gem_object *gem_obj) +{ +	return container_of(gem_obj, struct drm_gem_cma_object, base); +} + +/* free gem object. */ +void drm_gem_cma_free_object(struct drm_gem_object *gem_obj); + +/* create memory region for drm framebuffer. */ +int drm_gem_cma_dumb_create(struct drm_file *file_priv, +		struct drm_device *drm, struct drm_mode_create_dumb *args); + +/* map memory region for drm framebuffer to user space. */ +int drm_gem_cma_dumb_map_offset(struct drm_file *file_priv, +		struct drm_device *drm, uint32_t handle, uint64_t *offset); + +/* set vm_flags and we can change the vm attribute to other one at here. */ +int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma); + +/* allocate physical memory. */ +struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm, +		unsigned int size); + +extern const struct vm_operations_struct drm_gem_cma_vm_ops; + +#ifdef CONFIG_DEBUG_FS +void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m); +#endif + +struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj); +struct drm_gem_object * +drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size, +				  struct sg_table *sgt); +int drm_gem_cma_prime_mmap(struct drm_gem_object *obj, +			   struct vm_area_struct *vma); +void *drm_gem_cma_prime_vmap(struct drm_gem_object *obj); +void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr); + +#endif /* __DRM_GEM_CMA_HELPER_H__ */ diff --git a/include/drm/drm_hashtab.h b/include/drm/drm_hashtab.h index 0af087a4d3b..fce2ef3fdff 100644 --- a/include/drm/drm_hashtab.h +++ b/include/drm/drm_hashtab.h @@ -45,14 +45,10 @@ struct drm_hash_item {  };  struct drm_open_hash { -	unsigned int size; -	unsigned int order; -	unsigned int fill;  	struct hlist_head *table; -	int use_vmalloc; +	u8 order;  }; -  extern int drm_ht_create(struct drm_open_hash *ht, unsigned int order);  extern int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item);  extern int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, @@ -65,5 +61,19 @@ extern int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key);  extern int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item);  extern void drm_ht_remove(struct drm_open_hash *ht); +/* + * RCU-safe interface + * + * The user of this API needs to make sure that two or more instances of the + * hash table manipulation functions are never run simultaneously. + * The lookup function drm_ht_find_item_rcu may, however, run simultaneously + * with any of the manipulation functions as long as it's called from within + * an RCU read-locked section. + */ +#define drm_ht_insert_item_rcu drm_ht_insert_item +#define drm_ht_just_insert_please_rcu drm_ht_just_insert_please +#define drm_ht_remove_key_rcu drm_ht_remove_key +#define drm_ht_remove_item_rcu drm_ht_remove_item +#define drm_ht_find_item_rcu drm_ht_find_item  #endif diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h index 6bd325fedc8..19a240446fc 100644 --- a/include/drm/drm_mem_util.h +++ b/include/drm/drm_mem_util.h @@ -31,7 +31,7 @@  static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)  { -	if (size != 0 && nmemb > ULONG_MAX / size) +	if (size != 0 && nmemb > SIZE_MAX / size)  		return NULL;  	if (size * nmemb <= PAGE_SIZE) @@ -44,7 +44,7 @@ static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)  /* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */  static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)  { -	if (size != 0 && nmemb > ULONG_MAX / size) +	if (size != 0 && nmemb > SIZE_MAX / size)  		return NULL;  	if (size * nmemb <= PAGE_SIZE) diff --git a/include/drm/drm_memory.h b/include/drm/drm_memory.h index 15af9b32ae4..4baf57a207e 100644 --- a/include/drm/drm_memory.h +++ b/include/drm/drm_memory.h @@ -35,7 +35,7 @@  #include <linux/highmem.h>  #include <linux/vmalloc.h> -#include "drmP.h" +#include <drm/drmP.h>  /**   * Cut down version of drm_memory_debug.h, which used to be called diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h new file mode 100644 index 00000000000..944f33f8ba3 --- /dev/null +++ b/include/drm/drm_mipi_dsi.h @@ -0,0 +1,166 @@ +/* + * MIPI DSI Bus + * + * Copyright (C) 2012-2013, Samsung Electronics, Co., Ltd. + * Andrzej Hajda <a.hajda@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __DRM_MIPI_DSI_H__ +#define __DRM_MIPI_DSI_H__ + +#include <linux/device.h> + +struct mipi_dsi_host; +struct mipi_dsi_device; + +/* request ACK from peripheral */ +#define MIPI_DSI_MSG_REQ_ACK	BIT(0) +/* use Low Power Mode to transmit message */ +#define MIPI_DSI_MSG_USE_LPM	BIT(1) + +/** + * struct mipi_dsi_msg - read/write DSI buffer + * @channel: virtual channel id + * @type: payload data type + * @tx_len: length of @tx_buf + * @tx_buf: data to be written + * @rx_len: length of @rx_buf + * @rx_buf: data to be read, or NULL + */ +struct mipi_dsi_msg { +	u8 channel; +	u8 type; +	u16 flags; + +	size_t tx_len; +	const void *tx_buf; + +	size_t rx_len; +	void *rx_buf; +}; + +/** + * struct mipi_dsi_host_ops - DSI bus operations + * @attach: attach DSI device to DSI host + * @detach: detach DSI device from DSI host + * @transfer: send and/or receive DSI packet, return number of received bytes, + * 	      or error + */ +struct mipi_dsi_host_ops { +	int (*attach)(struct mipi_dsi_host *host, +		      struct mipi_dsi_device *dsi); +	int (*detach)(struct mipi_dsi_host *host, +		      struct mipi_dsi_device *dsi); +	ssize_t (*transfer)(struct mipi_dsi_host *host, +			    struct mipi_dsi_msg *msg); +}; + +/** + * struct mipi_dsi_host - DSI host device + * @dev: driver model device node for this DSI host + * @ops: DSI host operations + */ +struct mipi_dsi_host { +	struct device *dev; +	const struct mipi_dsi_host_ops *ops; +}; + +int mipi_dsi_host_register(struct mipi_dsi_host *host); +void mipi_dsi_host_unregister(struct mipi_dsi_host *host); + +/* DSI mode flags */ + +/* video mode */ +#define MIPI_DSI_MODE_VIDEO		BIT(0) +/* video burst mode */ +#define MIPI_DSI_MODE_VIDEO_BURST	BIT(1) +/* video pulse mode */ +#define MIPI_DSI_MODE_VIDEO_SYNC_PULSE	BIT(2) +/* enable auto vertical count mode */ +#define MIPI_DSI_MODE_VIDEO_AUTO_VERT	BIT(3) +/* enable hsync-end packets in vsync-pulse and v-porch area */ +#define MIPI_DSI_MODE_VIDEO_HSE		BIT(4) +/* disable hfront-porch area */ +#define MIPI_DSI_MODE_VIDEO_HFP		BIT(5) +/* disable hback-porch area */ +#define MIPI_DSI_MODE_VIDEO_HBP		BIT(6) +/* disable hsync-active area */ +#define MIPI_DSI_MODE_VIDEO_HSA		BIT(7) +/* flush display FIFO on vsync pulse */ +#define MIPI_DSI_MODE_VSYNC_FLUSH	BIT(8) +/* disable EoT packets in HS mode */ +#define MIPI_DSI_MODE_EOT_PACKET	BIT(9) + +enum mipi_dsi_pixel_format { +	MIPI_DSI_FMT_RGB888, +	MIPI_DSI_FMT_RGB666, +	MIPI_DSI_FMT_RGB666_PACKED, +	MIPI_DSI_FMT_RGB565, +}; + +/** + * struct mipi_dsi_device - DSI peripheral device + * @host: DSI host for this peripheral + * @dev: driver model device node for this peripheral + * @channel: virtual channel assigned to the peripheral + * @format: pixel format for video mode + * @lanes: number of active data lanes + * @mode_flags: DSI operation mode related flags + */ +struct mipi_dsi_device { +	struct mipi_dsi_host *host; +	struct device dev; + +	unsigned int channel; +	unsigned int lanes; +	enum mipi_dsi_pixel_format format; +	unsigned long mode_flags; +}; + +#define to_mipi_dsi_device(d) container_of(d, struct mipi_dsi_device, dev) + +int mipi_dsi_attach(struct mipi_dsi_device *dsi); +int mipi_dsi_detach(struct mipi_dsi_device *dsi); +int mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, unsigned int channel, +		       const void *data, size_t len); +ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, unsigned int channel, +			  u8 cmd, void *data, size_t len); + +/** + * struct mipi_dsi_driver - DSI driver + * @driver: device driver model driver + * @probe: callback for device binding + * @remove: callback for device unbinding + * @shutdown: called at shutdown time to quiesce the device + */ +struct mipi_dsi_driver { +	struct device_driver driver; +	int(*probe)(struct mipi_dsi_device *dsi); +	int(*remove)(struct mipi_dsi_device *dsi); +	void (*shutdown)(struct mipi_dsi_device *dsi); +}; + +#define to_mipi_dsi_driver(d) container_of(d, struct mipi_dsi_driver, driver) + +static inline void *mipi_dsi_get_drvdata(const struct mipi_dsi_device *dsi) +{ +	return dev_get_drvdata(&dsi->dev); +} + +static inline void mipi_dsi_set_drvdata(struct mipi_dsi_device *dsi, void *data) +{ +	dev_set_drvdata(&dsi->dev, data); +} + +int mipi_dsi_driver_register(struct mipi_dsi_driver *driver); +void mipi_dsi_driver_unregister(struct mipi_dsi_driver *driver); + +#define module_mipi_dsi_driver(__mipi_dsi_driver) \ +	module_driver(__mipi_dsi_driver, mipi_dsi_driver_register, \ +			mipi_dsi_driver_unregister) + +#endif /* __DRM_MIPI_DSI__ */ diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index bf01531193d..a24addfdfce 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -36,119 +36,285 @@  /*   * Generic range manager structs   */ +#include <linux/bug.h> +#include <linux/kernel.h>  #include <linux/list.h> +#include <linux/spinlock.h>  #ifdef CONFIG_DEBUG_FS  #include <linux/seq_file.h>  #endif +enum drm_mm_search_flags { +	DRM_MM_SEARCH_DEFAULT =		0, +	DRM_MM_SEARCH_BEST =		1 << 0, +	DRM_MM_SEARCH_BELOW =		1 << 1, +}; + +enum drm_mm_allocator_flags { +	DRM_MM_CREATE_DEFAULT =		0, +	DRM_MM_CREATE_TOP =		1 << 0, +}; + +#define DRM_MM_BOTTOMUP DRM_MM_SEARCH_DEFAULT, DRM_MM_CREATE_DEFAULT +#define DRM_MM_TOPDOWN DRM_MM_SEARCH_BELOW, DRM_MM_CREATE_TOP +  struct drm_mm_node { -	struct list_head free_stack;  	struct list_head node_list; -	unsigned free : 1; +	struct list_head hole_stack; +	unsigned hole_follows : 1;  	unsigned scanned_block : 1;  	unsigned scanned_prev_free : 1;  	unsigned scanned_next_free : 1; +	unsigned scanned_preceeds_hole : 1; +	unsigned allocated : 1; +	unsigned long color;  	unsigned long start;  	unsigned long size;  	struct drm_mm *mm;  };  struct drm_mm { -	/* List of free memory blocks, most recently freed ordered. */ -	struct list_head free_stack; -	/* List of all memory nodes, ordered according to the (increasing) start -	 * address of the memory node. */ -	struct list_head node_list; -	struct list_head unused_nodes; -	int num_unused; -	spinlock_t unused_lock; +	/* List of all memory nodes that immediately precede a free hole. */ +	struct list_head hole_stack; +	/* head_node.node_list is the list of all memory nodes, ordered +	 * according to the (increasing) start address of the memory node. */ +	struct drm_mm_node head_node; +	unsigned int scan_check_range : 1;  	unsigned scan_alignment; +	unsigned long scan_color;  	unsigned long scan_size;  	unsigned long scan_hit_start; -	unsigned scan_hit_size; +	unsigned long scan_hit_end;  	unsigned scanned_blocks; +	unsigned long scan_start; +	unsigned long scan_end; +	struct drm_mm_node *prev_scanned_node; + +	void (*color_adjust)(struct drm_mm_node *node, unsigned long color, +			     unsigned long *start, unsigned long *end);  }; -/* - * Basic range manager support (drm_mm.c) +/** + * drm_mm_node_allocated - checks whether a node is allocated + * @node: drm_mm_node to check + * + * Drivers should use this helpers for proper encapusulation of drm_mm + * internals. + * + * Returns: + * True if the @node is allocated. + */ +static inline bool drm_mm_node_allocated(struct drm_mm_node *node) +{ +	return node->allocated; +} + +/** + * drm_mm_initialized - checks whether an allocator is initialized + * @mm: drm_mm to check + * + * Drivers should use this helpers for proper encapusulation of drm_mm + * internals. + * + * Returns: + * True if the @mm is initialized.   */ -extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, -						    unsigned long size, -						    unsigned alignment, -						    int atomic); -extern struct drm_mm_node *drm_mm_get_block_range_generic( -						struct drm_mm_node *node, -						unsigned long size, -						unsigned alignment, -						unsigned long start, -						unsigned long end, -						int atomic); -static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent, -						   unsigned long size, -						   unsigned alignment) +static inline bool drm_mm_initialized(struct drm_mm *mm)  { -	return drm_mm_get_block_generic(parent, size, alignment, 0); +	return mm->hole_stack.next;  } -static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent, -							  unsigned long size, -							  unsigned alignment) + +static inline unsigned long __drm_mm_hole_node_start(struct drm_mm_node *hole_node)  { -	return drm_mm_get_block_generic(parent, size, alignment, 1); +	return hole_node->start + hole_node->size;  } -static inline struct drm_mm_node *drm_mm_get_block_range( -						struct drm_mm_node *parent, -						unsigned long size, -						unsigned alignment, -						unsigned long start, -						unsigned long end) + +/** + * drm_mm_hole_node_start - computes the start of the hole following @node + * @hole_node: drm_mm_node which implicitly tracks the following hole + * + * This is useful for driver-sepific debug dumpers. Otherwise drivers should not + * inspect holes themselves. Drivers must check first whether a hole indeed + * follows by looking at node->hole_follows. + * + * Returns: + * Start of the subsequent hole. + */ +static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node)  { -	return drm_mm_get_block_range_generic(parent, size, alignment, -						start, end, 0); +	BUG_ON(!hole_node->hole_follows); +	return __drm_mm_hole_node_start(hole_node);  } -static inline struct drm_mm_node *drm_mm_get_block_atomic_range( -						struct drm_mm_node *parent, -						unsigned long size, -						unsigned alignment, -						unsigned long start, -						unsigned long end) + +static inline unsigned long __drm_mm_hole_node_end(struct drm_mm_node *hole_node)  { -	return drm_mm_get_block_range_generic(parent, size, alignment, -						start, end, 1); +	return list_entry(hole_node->node_list.next, +			  struct drm_mm_node, node_list)->start;  } -extern void drm_mm_put_block(struct drm_mm_node *cur); -extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, + +/** + * drm_mm_hole_node_end - computes the end of the hole following @node + * @hole_node: drm_mm_node which implicitly tracks the following hole + * + * This is useful for driver-sepific debug dumpers. Otherwise drivers should not + * inspect holes themselves. Drivers must check first whether a hole indeed + * follows by looking at node->hole_follows. + * + * Returns: + * End of the subsequent hole. + */ +static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ +	return __drm_mm_hole_node_end(hole_node); +} + +/** + * drm_mm_for_each_node - iterator to walk over all allocated nodes + * @entry: drm_mm_node structure to assign to in each iteration step + * @mm: drm_mm allocator to walk + * + * This iterator walks over all nodes in the range allocator. It is implemented + * with list_for_each, so not save against removal of elements. + */ +#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ +						&(mm)->head_node.node_list, \ +						node_list) + +/** + * drm_mm_for_each_hole - iterator to walk over all holes + * @entry: drm_mm_node used internally to track progress + * @mm: drm_mm allocator to walk + * @hole_start: ulong variable to assign the hole start to on each iteration + * @hole_end: ulong variable to assign the hole end to on each iteration + * + * This iterator walks over all holes in the range allocator. It is implemented + * with list_for_each, so not save against removal of elements. @entry is used + * internally and will not reflect a real drm_mm_node for the very first hole. + * Hence users of this iterator may not access it. + * + * Implementation Note: + * We need to inline list_for_each_entry in order to be able to set hole_start + * and hole_end on each iteration while keeping the macro sane. + * + * The __drm_mm_for_each_hole version is similar, but with added support for + * going backwards. + */ +#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ +	for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ +	     &entry->hole_stack != &(mm)->hole_stack ? \ +	     hole_start = drm_mm_hole_node_start(entry), \ +	     hole_end = drm_mm_hole_node_end(entry), \ +	     1 : 0; \ +	     entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack)) + +#define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \ +	for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ +	     &entry->hole_stack != &(mm)->hole_stack ? \ +	     hole_start = drm_mm_hole_node_start(entry), \ +	     hole_end = drm_mm_hole_node_end(entry), \ +	     1 : 0; \ +	     entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack)) + +/* + * Basic range manager support (drm_mm.c) + */ +int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); + +int drm_mm_insert_node_generic(struct drm_mm *mm, +			       struct drm_mm_node *node, +			       unsigned long size, +			       unsigned alignment, +			       unsigned long color, +			       enum drm_mm_search_flags sflags, +			       enum drm_mm_allocator_flags aflags); +/** + * drm_mm_insert_node - search for space and insert @node + * @mm: drm_mm to allocate from + * @node: preallocate node to insert + * @size: size of the allocation + * @alignment: alignment of the allocation + * @flags: flags to fine-tune the allocation + * + * This is a simplified version of drm_mm_insert_node_generic() with @color set + * to 0. + * + * The preallocated node must be cleared to 0. + * + * Returns: + * 0 on success, -ENOSPC if there's no suitable hole. + */ +static inline int drm_mm_insert_node(struct drm_mm *mm, +				     struct drm_mm_node *node, +				     unsigned long size, +				     unsigned alignment, +				     enum drm_mm_search_flags flags) +{ +	return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags, +					  DRM_MM_CREATE_DEFAULT); +} + +int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, +					struct drm_mm_node *node, +					unsigned long size, +					unsigned alignment, +					unsigned long color, +					unsigned long start, +					unsigned long end, +					enum drm_mm_search_flags sflags, +					enum drm_mm_allocator_flags aflags); +/** + * drm_mm_insert_node_in_range - ranged search for space and insert @node + * @mm: drm_mm to allocate from + * @node: preallocate node to insert + * @size: size of the allocation + * @alignment: alignment of the allocation + * @start: start of the allowed range for this node + * @end: end of the allowed range for this node + * @flags: flags to fine-tune the allocation + * + * This is a simplified version of drm_mm_insert_node_in_range_generic() with + * @color set to 0. + * + * The preallocated node must be cleared to 0. + * + * Returns: + * 0 on success, -ENOSPC if there's no suitable hole. + */ +static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, +					      struct drm_mm_node *node,  					      unsigned long size,  					      unsigned alignment, -					      int best_match); -extern struct drm_mm_node *drm_mm_search_free_in_range( -						const struct drm_mm *mm, -						unsigned long size, -						unsigned alignment, -						unsigned long start, -						unsigned long end, -						int best_match); -extern int drm_mm_init(struct drm_mm *mm, unsigned long start, -		       unsigned long size); -extern void drm_mm_takedown(struct drm_mm *mm); -extern int drm_mm_clean(struct drm_mm *mm); -extern unsigned long drm_mm_tail_space(struct drm_mm *mm); -extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, -					 unsigned long size); -extern int drm_mm_add_space_to_tail(struct drm_mm *mm, -				    unsigned long size, int atomic); -extern int drm_mm_pre_get(struct drm_mm *mm); - -static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) +					      unsigned long start, +					      unsigned long end, +					      enum drm_mm_search_flags flags)  { -	return block->mm; +	return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, +						   0, start, end, flags, +						   DRM_MM_CREATE_DEFAULT);  } -void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, -		      unsigned alignment); -int drm_mm_scan_add_block(struct drm_mm_node *node); -int drm_mm_scan_remove_block(struct drm_mm_node *node); +void drm_mm_remove_node(struct drm_mm_node *node); +void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); +void drm_mm_init(struct drm_mm *mm, +		 unsigned long start, +		 unsigned long size); +void drm_mm_takedown(struct drm_mm *mm); +bool drm_mm_clean(struct drm_mm *mm); + +void drm_mm_init_scan(struct drm_mm *mm, +		      unsigned long size, +		      unsigned alignment, +		      unsigned long color); +void drm_mm_init_scan_with_range(struct drm_mm *mm, +				 unsigned long size, +				 unsigned alignment, +				 unsigned long color, +				 unsigned long start, +				 unsigned long end); +bool drm_mm_scan_add_block(struct drm_mm_node *node); +bool drm_mm_scan_remove_block(struct drm_mm_node *node); -extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); +void drm_mm_debug_table(struct drm_mm *mm, const char *prefix);  #ifdef CONFIG_DEBUG_FS  int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm);  #endif diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h deleted file mode 100644 index 0fc7397c8f1..00000000000 --- a/include/drm/drm_mode.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> - * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com> - * Copyright (c) 2008 Red Hat Inc. - * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA - * Copyright (c) 2007-2008 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 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 THE - * AUTHORS OR COPYRIGHT HOLDERS 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_MODE_H -#define _DRM_MODE_H - -#define DRM_DISPLAY_INFO_LEN	32 -#define DRM_CONNECTOR_NAME_LEN	32 -#define DRM_DISPLAY_MODE_LEN	32 -#define DRM_PROP_NAME_LEN	32 - -#define DRM_MODE_TYPE_BUILTIN	(1<<0) -#define DRM_MODE_TYPE_CLOCK_C	((1<<1) | DRM_MODE_TYPE_BUILTIN) -#define DRM_MODE_TYPE_CRTC_C	((1<<2) | DRM_MODE_TYPE_BUILTIN) -#define DRM_MODE_TYPE_PREFERRED	(1<<3) -#define DRM_MODE_TYPE_DEFAULT	(1<<4) -#define DRM_MODE_TYPE_USERDEF	(1<<5) -#define DRM_MODE_TYPE_DRIVER	(1<<6) - -/* Video mode flags */ -/* bit compatible with the xorg definitions. */ -#define DRM_MODE_FLAG_PHSYNC	(1<<0) -#define DRM_MODE_FLAG_NHSYNC	(1<<1) -#define DRM_MODE_FLAG_PVSYNC	(1<<2) -#define DRM_MODE_FLAG_NVSYNC	(1<<3) -#define DRM_MODE_FLAG_INTERLACE	(1<<4) -#define DRM_MODE_FLAG_DBLSCAN	(1<<5) -#define DRM_MODE_FLAG_CSYNC	(1<<6) -#define DRM_MODE_FLAG_PCSYNC	(1<<7) -#define DRM_MODE_FLAG_NCSYNC	(1<<8) -#define DRM_MODE_FLAG_HSKEW	(1<<9) /* hskew provided */ -#define DRM_MODE_FLAG_BCAST	(1<<10) -#define DRM_MODE_FLAG_PIXMUX	(1<<11) -#define DRM_MODE_FLAG_DBLCLK	(1<<12) -#define DRM_MODE_FLAG_CLKDIV2	(1<<13) - -/* DPMS flags */ -/* bit compatible with the xorg definitions. */ -#define DRM_MODE_DPMS_ON	0 -#define DRM_MODE_DPMS_STANDBY	1 -#define DRM_MODE_DPMS_SUSPEND	2 -#define DRM_MODE_DPMS_OFF	3 - -/* Scaling mode options */ -#define DRM_MODE_SCALE_NONE		0 /* Unmodified timing (display or -					     software can still scale) */ -#define DRM_MODE_SCALE_FULLSCREEN	1 /* Full screen, ignore aspect */ -#define DRM_MODE_SCALE_CENTER		2 /* Centered, no scaling */ -#define DRM_MODE_SCALE_ASPECT		3 /* Full screen, preserve aspect */ - -/* Dithering mode options */ -#define DRM_MODE_DITHERING_OFF	0 -#define DRM_MODE_DITHERING_ON	1 -#define DRM_MODE_DITHERING_AUTO 2 - -/* Dirty info options */ -#define DRM_MODE_DIRTY_OFF      0 -#define DRM_MODE_DIRTY_ON       1 -#define DRM_MODE_DIRTY_ANNOTATE 2 - -struct drm_mode_modeinfo { -	__u32 clock; -	__u16 hdisplay, hsync_start, hsync_end, htotal, hskew; -	__u16 vdisplay, vsync_start, vsync_end, vtotal, vscan; - -	__u32 vrefresh; - -	__u32 flags; -	__u32 type; -	char name[DRM_DISPLAY_MODE_LEN]; -}; - -struct drm_mode_card_res { -	__u64 fb_id_ptr; -	__u64 crtc_id_ptr; -	__u64 connector_id_ptr; -	__u64 encoder_id_ptr; -	__u32 count_fbs; -	__u32 count_crtcs; -	__u32 count_connectors; -	__u32 count_encoders; -	__u32 min_width, max_width; -	__u32 min_height, max_height; -}; - -struct drm_mode_crtc { -	__u64 set_connectors_ptr; -	__u32 count_connectors; - -	__u32 crtc_id; /**< Id */ -	__u32 fb_id; /**< Id of framebuffer */ - -	__u32 x, y; /**< Position on the frameuffer */ - -	__u32 gamma_size; -	__u32 mode_valid; -	struct drm_mode_modeinfo mode; -}; - -#define DRM_MODE_ENCODER_NONE	0 -#define DRM_MODE_ENCODER_DAC	1 -#define DRM_MODE_ENCODER_TMDS	2 -#define DRM_MODE_ENCODER_LVDS	3 -#define DRM_MODE_ENCODER_TVDAC	4 - -struct drm_mode_get_encoder { -	__u32 encoder_id; -	__u32 encoder_type; - -	__u32 crtc_id; /**< Id of crtc */ - -	__u32 possible_crtcs; -	__u32 possible_clones; -}; - -/* This is for connectors with multiple signal types. */ -/* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */ -#define DRM_MODE_SUBCONNECTOR_Automatic	0 -#define DRM_MODE_SUBCONNECTOR_Unknown	0 -#define DRM_MODE_SUBCONNECTOR_DVID	3 -#define DRM_MODE_SUBCONNECTOR_DVIA	4 -#define DRM_MODE_SUBCONNECTOR_Composite	5 -#define DRM_MODE_SUBCONNECTOR_SVIDEO	6 -#define DRM_MODE_SUBCONNECTOR_Component	8 -#define DRM_MODE_SUBCONNECTOR_SCART	9 - -#define DRM_MODE_CONNECTOR_Unknown	0 -#define DRM_MODE_CONNECTOR_VGA		1 -#define DRM_MODE_CONNECTOR_DVII		2 -#define DRM_MODE_CONNECTOR_DVID		3 -#define DRM_MODE_CONNECTOR_DVIA		4 -#define DRM_MODE_CONNECTOR_Composite	5 -#define DRM_MODE_CONNECTOR_SVIDEO	6 -#define DRM_MODE_CONNECTOR_LVDS		7 -#define DRM_MODE_CONNECTOR_Component	8 -#define DRM_MODE_CONNECTOR_9PinDIN	9 -#define DRM_MODE_CONNECTOR_DisplayPort	10 -#define DRM_MODE_CONNECTOR_HDMIA	11 -#define DRM_MODE_CONNECTOR_HDMIB	12 -#define DRM_MODE_CONNECTOR_TV		13 -#define DRM_MODE_CONNECTOR_eDP		14 - -struct drm_mode_get_connector { - -	__u64 encoders_ptr; -	__u64 modes_ptr; -	__u64 props_ptr; -	__u64 prop_values_ptr; - -	__u32 count_modes; -	__u32 count_props; -	__u32 count_encoders; - -	__u32 encoder_id; /**< Current Encoder */ -	__u32 connector_id; /**< Id */ -	__u32 connector_type; -	__u32 connector_type_id; - -	__u32 connection; -	__u32 mm_width, mm_height; /**< HxW in millimeters */ -	__u32 subpixel; -}; - -#define DRM_MODE_PROP_PENDING	(1<<0) -#define DRM_MODE_PROP_RANGE	(1<<1) -#define DRM_MODE_PROP_IMMUTABLE	(1<<2) -#define DRM_MODE_PROP_ENUM	(1<<3) /* enumerated type with text strings */ -#define DRM_MODE_PROP_BLOB	(1<<4) - -struct drm_mode_property_enum { -	__u64 value; -	char name[DRM_PROP_NAME_LEN]; -}; - -struct drm_mode_get_property { -	__u64 values_ptr; /* values and blob lengths */ -	__u64 enum_blob_ptr; /* enum and blob id ptrs */ - -	__u32 prop_id; -	__u32 flags; -	char name[DRM_PROP_NAME_LEN]; - -	__u32 count_values; -	__u32 count_enum_blobs; -}; - -struct drm_mode_connector_set_property { -	__u64 value; -	__u32 prop_id; -	__u32 connector_id; -}; - -struct drm_mode_get_blob { -	__u32 blob_id; -	__u32 length; -	__u64 data; -}; - -struct drm_mode_fb_cmd { -	__u32 fb_id; -	__u32 width, height; -	__u32 pitch; -	__u32 bpp; -	__u32 depth; -	/* driver specific handle */ -	__u32 handle; -}; - -#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01 -#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02 -#define DRM_MODE_FB_DIRTY_FLAGS         0x03 - -/* - * Mark a region of a framebuffer as dirty. - * - * Some hardware does not automatically update display contents - * as a hardware or software draw to a framebuffer. This ioctl - * allows userspace to tell the kernel and the hardware what - * regions of the framebuffer have changed. - * - * The kernel or hardware is free to update more then just the - * region specified by the clip rects. The kernel or hardware - * may also delay and/or coalesce several calls to dirty into a - * single update. - * - * Userspace may annotate the updates, the annotates are a - * promise made by the caller that the change is either a copy - * of pixels or a fill of a single color in the region specified. - * - * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then - * the number of updated regions are half of num_clips given, - * where the clip rects are paired in src and dst. The width and - * height of each one of the pairs must match. - * - * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller - * promises that the region specified of the clip rects is filled - * completely with a single color as given in the color argument. - */ - -struct drm_mode_fb_dirty_cmd { -	__u32 fb_id; -	__u32 flags; -	__u32 color; -	__u32 num_clips; -	__u64 clips_ptr; -}; - -struct drm_mode_mode_cmd { -	__u32 connector_id; -	struct drm_mode_modeinfo mode; -}; - -#define DRM_MODE_CURSOR_BO	(1<<0) -#define DRM_MODE_CURSOR_MOVE	(1<<1) - -/* - * depending on the value in flags diffrent members are used. - * - * CURSOR_BO uses - *    crtc - *    width - *    height - *    handle - if 0 turns the cursor of - * - * CURSOR_MOVE uses - *    crtc - *    x - *    y - */ -struct drm_mode_cursor { -	__u32 flags; -	__u32 crtc_id; -	__s32 x; -	__s32 y; -	__u32 width; -	__u32 height; -	/* driver specific handle */ -	__u32 handle; -}; - -struct drm_mode_crtc_lut { -	__u32 crtc_id; -	__u32 gamma_size; - -	/* pointers to arrays */ -	__u64 red; -	__u64 green; -	__u64 blue; -}; - -#define DRM_MODE_PAGE_FLIP_EVENT 0x01 -#define DRM_MODE_PAGE_FLIP_FLAGS DRM_MODE_PAGE_FLIP_EVENT - -/* - * Request a page flip on the specified crtc. - * - * This ioctl will ask KMS to schedule a page flip for the specified - * crtc.  Once any pending rendering targeting the specified fb (as of - * ioctl time) has completed, the crtc will be reprogrammed to display - * that fb after the next vertical refresh.  The ioctl returns - * immediately, but subsequent rendering to the current fb will block - * in the execbuffer ioctl until the page flip happens.  If a page - * flip is already pending as the ioctl is called, EBUSY will be - * returned. - * - * The ioctl supports one flag, DRM_MODE_PAGE_FLIP_EVENT, which will - * request that drm sends back a vblank event (see drm.h: struct - * drm_event_vblank) when the page flip is done.  The user_data field - * passed in with this ioctl will be returned as the user_data field - * in the vblank event struct. - * - * The reserved field must be zero until we figure out something - * clever to use it for. - */ - -struct drm_mode_crtc_page_flip { -	__u32 crtc_id; -	__u32 fb_id; -	__u32 flags; -	__u32 reserved; -	__u64 user_data; -}; - -#endif diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h new file mode 100644 index 00000000000..91d0582f924 --- /dev/null +++ b/include/drm/drm_modes.h @@ -0,0 +1,237 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2007-2008 Dave Airlie + * Copyright © 2007-2008 Intel Corporation + *   Jesse Barnes <jesse.barnes@intel.com> + * Copyright © 2014 Intel Corporation + *   Daniel Vetter <daniel.vetter@ffwll.ch> + * + * 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 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 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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_MODES_H__ +#define __DRM_MODES_H__ + +/* + * Note on terminology:  here, for brevity and convenience, we refer to connector + * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS, + * DVI, etc.  And 'screen' refers to the whole of the visible display, which + * may span multiple monitors (and therefore multiple CRTC and connector + * structures). + */ + +enum drm_mode_status { +    MODE_OK	= 0,	/* Mode OK */ +    MODE_HSYNC,		/* hsync out of range */ +    MODE_VSYNC,		/* vsync out of range */ +    MODE_H_ILLEGAL,	/* mode has illegal horizontal timings */ +    MODE_V_ILLEGAL,	/* mode has illegal horizontal timings */ +    MODE_BAD_WIDTH,	/* requires an unsupported linepitch */ +    MODE_NOMODE,	/* no mode with a matching name */ +    MODE_NO_INTERLACE,	/* interlaced mode not supported */ +    MODE_NO_DBLESCAN,	/* doublescan mode not supported */ +    MODE_NO_VSCAN,	/* multiscan mode not supported */ +    MODE_MEM,		/* insufficient video memory */ +    MODE_VIRTUAL_X,	/* mode width too large for specified virtual size */ +    MODE_VIRTUAL_Y,	/* mode height too large for specified virtual size */ +    MODE_MEM_VIRT,	/* insufficient video memory given virtual size */ +    MODE_NOCLOCK,	/* no fixed clock available */ +    MODE_CLOCK_HIGH,	/* clock required is too high */ +    MODE_CLOCK_LOW,	/* clock required is too low */ +    MODE_CLOCK_RANGE,	/* clock/mode isn't in a ClockRange */ +    MODE_BAD_HVALUE,	/* horizontal timing was out of range */ +    MODE_BAD_VVALUE,	/* vertical timing was out of range */ +    MODE_BAD_VSCAN,	/* VScan value out of range */ +    MODE_HSYNC_NARROW,	/* horizontal sync too narrow */ +    MODE_HSYNC_WIDE,	/* horizontal sync too wide */ +    MODE_HBLANK_NARROW,	/* horizontal blanking too narrow */ +    MODE_HBLANK_WIDE,	/* horizontal blanking too wide */ +    MODE_VSYNC_NARROW,	/* vertical sync too narrow */ +    MODE_VSYNC_WIDE,	/* vertical sync too wide */ +    MODE_VBLANK_NARROW,	/* vertical blanking too narrow */ +    MODE_VBLANK_WIDE,	/* vertical blanking too wide */ +    MODE_PANEL,         /* exceeds panel dimensions */ +    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ +    MODE_ONE_WIDTH,     /* only one width is supported */ +    MODE_ONE_HEIGHT,    /* only one height is supported */ +    MODE_ONE_SIZE,      /* only one resolution is supported */ +    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */ +    MODE_NO_STEREO,	/* stereo modes not supported */ +    MODE_UNVERIFIED = -3, /* mode needs to reverified */ +    MODE_BAD = -2,	/* unspecified reason */ +    MODE_ERROR	= -1	/* error condition */ +}; + +#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ +				    DRM_MODE_TYPE_CRTC_C) + +#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ +	.name = nm, .status = 0, .type = (t), .clock = (c), \ +	.hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ +	.htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ +	.vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ +	.vscan = (vs), .flags = (f), \ +	.base.type = DRM_MODE_OBJECT_MODE + +#define CRTC_INTERLACE_HALVE_V	(1 << 0) /* halve V values for interlacing */ +#define CRTC_STEREO_DOUBLE	(1 << 1) /* adjust timings for stereo modes */ + +#define DRM_MODE_FLAG_3D_MAX	DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF + +struct drm_display_mode { +	/* Header */ +	struct list_head head; +	struct drm_mode_object base; + +	char name[DRM_DISPLAY_MODE_LEN]; + +	enum drm_mode_status status; +	unsigned int type; + +	/* Proposed mode values */ +	int clock;		/* in kHz */ +	int hdisplay; +	int hsync_start; +	int hsync_end; +	int htotal; +	int hskew; +	int vdisplay; +	int vsync_start; +	int vsync_end; +	int vtotal; +	int vscan; +	unsigned int flags; + +	/* Addressable image size (may be 0 for projectors, etc.) */ +	int width_mm; +	int height_mm; + +	/* Actual mode we give to hw */ +	int crtc_clock;		/* in KHz */ +	int crtc_hdisplay; +	int crtc_hblank_start; +	int crtc_hblank_end; +	int crtc_hsync_start; +	int crtc_hsync_end; +	int crtc_htotal; +	int crtc_hskew; +	int crtc_vdisplay; +	int crtc_vblank_start; +	int crtc_vblank_end; +	int crtc_vsync_start; +	int crtc_vsync_end; +	int crtc_vtotal; + +	/* Driver private mode info */ +	int *private; +	int private_flags; + +	int vrefresh;		/* in Hz */ +	int hsync;		/* in kHz */ +	enum hdmi_picture_aspect picture_aspect_ratio; +}; + +/* mode specified on the command line */ +struct drm_cmdline_mode { +	bool specified; +	bool refresh_specified; +	bool bpp_specified; +	int xres, yres; +	int bpp; +	int refresh; +	bool rb; +	bool interlace; +	bool cvt; +	bool margins; +	enum drm_connector_force force; +}; + +/** + * drm_mode_is_stereo - check for stereo mode flags + * @mode: drm_display_mode to check + * + * Returns: + * True if the mode is one of the stereo modes (like side-by-side), false if + * not. + */ +static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode) +{ +	return mode->flags & DRM_MODE_FLAG_3D_MASK; +} + +struct drm_connector; +struct drm_cmdline_mode; + +struct drm_display_mode *drm_mode_create(struct drm_device *dev); +void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); +void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); +void drm_mode_debug_printmodeline(const struct drm_display_mode *mode); + +struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, +				      int hdisplay, int vdisplay, int vrefresh, +				      bool reduced, bool interlaced, +				      bool margins); +struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, +				      int hdisplay, int vdisplay, int vrefresh, +				      bool interlaced, int margins); +struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, +					      int hdisplay, int vdisplay, +					      int vrefresh, bool interlaced, +					      int margins, +					      int GTF_M, int GTF_2C, +					      int GTF_K, int GTF_2J); +void drm_display_mode_from_videomode(const struct videomode *vm, +				     struct drm_display_mode *dmode); +int of_get_drm_display_mode(struct device_node *np, +			    struct drm_display_mode *dmode, +			    int index); + +void drm_mode_set_name(struct drm_display_mode *mode); +int drm_mode_hsync(const struct drm_display_mode *mode); +int drm_mode_vrefresh(const struct drm_display_mode *mode); + +void drm_mode_set_crtcinfo(struct drm_display_mode *p, +			   int adjust_flags); +void drm_mode_copy(struct drm_display_mode *dst, +		   const struct drm_display_mode *src); +struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, +					    const struct drm_display_mode *mode); +bool drm_mode_equal(const struct drm_display_mode *mode1, +		    const struct drm_display_mode *mode2); +bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, +					const struct drm_display_mode *mode2); + +/* for use by the crtc helper probe functions */ +void drm_mode_validate_size(struct drm_device *dev, +			    struct list_head *mode_list, +			    int maxX, int maxY); +void drm_mode_prune_invalid(struct drm_device *dev, +			    struct list_head *mode_list, bool verbose); +void drm_mode_sort(struct list_head *mode_list); +void drm_mode_connector_list_update(struct drm_connector *connector, bool merge_type_bits); + +/* parsing cmdline modes */ +bool +drm_mode_parse_command_line_for_connector(const char *mode_option, +					  struct drm_connector *connector, +					  struct drm_cmdline_mode *mode); +struct drm_display_mode * +drm_mode_create_from_cmdline_mode(struct drm_device *dev, +				  struct drm_cmdline_mode *cmd); + +#endif /* __DRM_MODES_H__ */ diff --git a/include/drm/drm_modeset_lock.h b/include/drm/drm_modeset_lock.h new file mode 100644 index 00000000000..402aa7a6a05 --- /dev/null +++ b/include/drm/drm_modeset_lock.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2014 Red Hat + * Author: Rob Clark <robdclark@gmail.com> + * + * 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 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 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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_MODESET_LOCK_H_ +#define DRM_MODESET_LOCK_H_ + +#include <linux/ww_mutex.h> + +struct drm_modeset_lock; + +/** + * drm_modeset_acquire_ctx - locking context (see ww_acquire_ctx) + * @ww_ctx: base acquire ctx + * @contended: used internally for -EDEADLK handling + * @locked: list of held locks + * + * Each thread competing for a set of locks must use one acquire + * ctx.  And if any lock fxn returns -EDEADLK, it must backoff and + * retry. + */ +struct drm_modeset_acquire_ctx { + +	struct ww_acquire_ctx ww_ctx; + +	/** +	 * Contended lock: if a lock is contended you should only call +	 * drm_modeset_backoff() which drops locks and slow-locks the +	 * contended lock. +	 */ +	struct drm_modeset_lock *contended; + +	/** +	 * list of held locks (drm_modeset_lock) +	 */ +	struct list_head locked; +}; + +/** + * drm_modeset_lock - used for locking modeset resources. + * @mutex: resource locking + * @head: used to hold it's place on state->locked list when + *    part of an atomic update + * + * Used for locking CRTCs and other modeset resources. + */ +struct drm_modeset_lock { +	/** +	 * modeset lock +	 */ +	struct ww_mutex mutex; + +	/** +	 * Resources that are locked as part of an atomic update are added +	 * to a list (so we know what to unlock at the end). +	 */ +	struct list_head head; +}; + +extern struct ww_class crtc_ww_class; + +void drm_modeset_acquire_init(struct drm_modeset_acquire_ctx *ctx, +		uint32_t flags); +void drm_modeset_acquire_fini(struct drm_modeset_acquire_ctx *ctx); +void drm_modeset_drop_locks(struct drm_modeset_acquire_ctx *ctx); +void drm_modeset_backoff(struct drm_modeset_acquire_ctx *ctx); +int drm_modeset_backoff_interruptible(struct drm_modeset_acquire_ctx *ctx); + +/** + * drm_modeset_lock_init - initialize lock + * @lock: lock to init + */ +static inline void drm_modeset_lock_init(struct drm_modeset_lock *lock) +{ +	ww_mutex_init(&lock->mutex, &crtc_ww_class); +	INIT_LIST_HEAD(&lock->head); +} + +/** + * drm_modeset_lock_fini - cleanup lock + * @lock: lock to cleanup + */ +static inline void drm_modeset_lock_fini(struct drm_modeset_lock *lock) +{ +	WARN_ON(!list_empty(&lock->head)); +} + +/** + * drm_modeset_is_locked - equivalent to mutex_is_locked() + * @lock: lock to check + */ +static inline bool drm_modeset_is_locked(struct drm_modeset_lock *lock) +{ +	return ww_mutex_is_locked(&lock->mutex); +} + +int drm_modeset_lock(struct drm_modeset_lock *lock, +		struct drm_modeset_acquire_ctx *ctx); +int drm_modeset_lock_interruptible(struct drm_modeset_lock *lock, +		struct drm_modeset_acquire_ctx *ctx); +void drm_modeset_unlock(struct drm_modeset_lock *lock); + +struct drm_device; +int drm_modeset_lock_all_crtcs(struct drm_device *dev, +		struct drm_modeset_acquire_ctx *ctx); + +#endif /* DRM_MODESET_LOCK_H_ */ diff --git a/include/drm/drm_os_linux.h b/include/drm/drm_os_linux.h index 393369147a2..86ab99bc0ac 100644 --- a/include/drm/drm_os_linux.h +++ b/include/drm/drm_os_linux.h @@ -21,7 +21,6 @@ static inline void writeq(u64 val, void __iomem *reg)  /** Current process ID */  #define DRM_CURRENTPID			task_pid_nr(current) -#define DRM_SUSER(p)			capable(CAP_SYS_ADMIN)  #define DRM_UDELAY(d)			udelay(d)  /** Read a byte from a MMIO region */  #define DRM_READ8(map, offset)		readb(((void __iomem *)(map)->handle) + (offset)) @@ -35,70 +34,12 @@ static inline void writeq(u64 val, void __iomem *reg)  #define DRM_WRITE16(map, offset, val)   writew(val, ((void __iomem *)(map)->handle) + (offset))  /** Write a dword into a MMIO region */  #define DRM_WRITE32(map, offset, val)	writel(val, ((void __iomem *)(map)->handle) + (offset)) -/** Read memory barrier */  /** Read a qword from a MMIO region - be careful using these unless you really understand them */  #define DRM_READ64(map, offset)		readq(((void __iomem *)(map)->handle) + (offset))  /** Write a qword into a MMIO region */  #define DRM_WRITE64(map, offset, val)	writeq(val, ((void __iomem *)(map)->handle) + (offset)) -#define DRM_READMEMORYBARRIER()		rmb() -/** Write memory barrier */ -#define DRM_WRITEMEMORYBARRIER()	wmb() -/** Read/write memory barrier */ -#define DRM_MEMORYBARRIER()		mb() - -/** IRQ handler arguments and return type and values */ -#define DRM_IRQ_ARGS		int irq, void *arg - -/** AGP types */ -#if __OS_HAS_AGP -#define DRM_AGP_MEM		struct agp_memory -#define DRM_AGP_KERN		struct agp_kern_info -#else -/* define some dummy types for non AGP supporting kernels */ -struct no_agp_kern { -	unsigned long aper_base; -	unsigned long aper_size; -}; -#define DRM_AGP_MEM             int -#define DRM_AGP_KERN            struct no_agp_kern -#endif - -#if !(__OS_HAS_MTRR) -static __inline__ int mtrr_add(unsigned long base, unsigned long size, -			       unsigned int type, char increment) -{ -	return -ENODEV; -} - -static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size) -{ -	return -ENODEV; -} - -#define MTRR_TYPE_WRCOMB     1 - -#endif - -/** Other copying of data to kernel space */ -#define DRM_COPY_FROM_USER(arg1, arg2, arg3)		\ -	copy_from_user(arg1, arg2, arg3) -/** Other copying of data from kernel space */ -#define DRM_COPY_TO_USER(arg1, arg2, arg3)		\ -	copy_to_user(arg1, arg2, arg3) -/* Macros for copyfrom user, but checking readability only once */ -#define DRM_VERIFYAREA_READ( uaddr, size )		\ -	(access_ok( VERIFY_READ, uaddr, size ) ? 0 : -EFAULT) -#define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3)	\ -	__copy_from_user(arg1, arg2, arg3) -#define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3)	\ -	__copy_to_user(arg1, arg2, arg3) -#define DRM_GET_USER_UNCHECKED(val, uaddr)		\ -	__get_user(val, uaddr) - -#define DRM_HZ HZ -  #define DRM_WAIT_ON( ret, queue, timeout, condition )		\  do {								\  	DECLARE_WAITQUEUE(entry, current);			\ @@ -122,6 +63,3 @@ do {								\  	__set_current_state(TASK_RUNNING);			\  	remove_wait_queue(&(queue), &entry);			\  } while (0) - -#define DRM_WAKEUP( queue ) wake_up( queue ) -#define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue ) diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h new file mode 100644 index 00000000000..c2ab77add67 --- /dev/null +++ b/include/drm/drm_panel.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved. + * + * 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, sub license, + * 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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_PANEL_H__ +#define __DRM_PANEL_H__ + +#include <linux/list.h> + +struct drm_connector; +struct drm_device; +struct drm_panel; + +struct drm_panel_funcs { +	int (*disable)(struct drm_panel *panel); +	int (*enable)(struct drm_panel *panel); +	int (*get_modes)(struct drm_panel *panel); +}; + +struct drm_panel { +	struct drm_device *drm; +	struct drm_connector *connector; +	struct device *dev; + +	const struct drm_panel_funcs *funcs; + +	struct list_head list; +}; + +static inline int drm_panel_disable(struct drm_panel *panel) +{ +	if (panel && panel->funcs && panel->funcs->disable) +		return panel->funcs->disable(panel); + +	return panel ? -ENOSYS : -EINVAL; +} + +static inline int drm_panel_enable(struct drm_panel *panel) +{ +	if (panel && panel->funcs && panel->funcs->enable) +		return panel->funcs->enable(panel); + +	return panel ? -ENOSYS : -EINVAL; +} + +void drm_panel_init(struct drm_panel *panel); + +int drm_panel_add(struct drm_panel *panel); +void drm_panel_remove(struct drm_panel *panel); + +int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector); +int drm_panel_detach(struct drm_panel *panel); + +#ifdef CONFIG_OF +struct drm_panel *of_drm_find_panel(struct device_node *np); +#else +static inline struct drm_panel *of_drm_find_panel(struct device_node *np) +{ +	return NULL; +} +#endif + +#endif diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 883c1d43989..6dfd64b3a60 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h @@ -1,9 +1,27 @@ -/* -   This file is auto-generated from the drm_pciids.txt in the DRM CVS -   Please contact dri-devel@lists.sf.net to add new cards to this list -*/  #define radeon_PCI_IDS \ +	{0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1305, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1306, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1307, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1309, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x130F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1313, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1315, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1316, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x1317, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x131B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x131C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x131D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ +	{0x1002, 0x3151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x3155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ @@ -28,7 +46,6 @@  	{0x1002, 0x4156, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \  	{0x1002, 0x4237, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP}, \  	{0x1002, 0x4242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ -	{0x1002, 0x4243, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \  	{0x1002, 0x4336, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \  	{0x1002, 0x4337, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \  	{0x1002, 0x4437, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ @@ -56,6 +73,7 @@  	{0x1002, 0x4C64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \  	{0x1002, 0x4C66, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \  	{0x1002, 0x4C67, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \ +	{0x1002, 0x4C6E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280|RADEON_IS_MOBILITY}, \  	{0x1002, 0x4E44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \  	{0x1002, 0x4E45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \  	{0x1002, 0x4E46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ @@ -142,6 +160,163 @@  	{0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6650, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6658, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x665c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x665d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BONAIRE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6663, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6664, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6665, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6667, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x666F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6703, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6704, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6705, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6706, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6707, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6708, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6709, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6718, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x671f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6723, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6724, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6725, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6726, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6727, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6728, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6729, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6739, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x673e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6740, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6741, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6743, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6744, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6745, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6746, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6747, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6748, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x674A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6751, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x675B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x675D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x675F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6762, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6763, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6764, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6765, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6766, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6771, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x677B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6791, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6792, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x679B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67AA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67B0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67B1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67B8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67B9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67BA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x67BE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAWAII|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6811, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6823, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6826, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6827, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x682A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x682B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x682D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x682F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x683B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x683D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x683F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6841, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6842, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6843, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6849, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x684C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6888, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6889, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ @@ -150,6 +325,7 @@  	{0x1002, 0x688D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6898, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6899, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x689b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x689c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x689d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x689e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ @@ -160,7 +336,9 @@  	{0x1002, 0x68b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x68ba, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68be, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x68bf, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68c7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ @@ -180,6 +358,7 @@  	{0x1002, 0x68f2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68f8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68f9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x68fa, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x68fe, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x7100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x7101, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ @@ -413,12 +592,104 @@  	{0x1002, 0x9614, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9616, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9642, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9643, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9644, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9645, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ +	{0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ +	{0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ +	{0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x964e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ +	{0x1002, 0x964f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\  	{0x1002, 0x9710, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9712, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9713, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9714, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0x1002, 0x9715, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9804, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9807, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x980A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9832, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9833, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9836, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9851, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9852, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9853, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9854, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9856, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9857, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9904, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9905, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9906, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9908, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9909, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x990F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9910, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9913, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9917, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9918, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9919, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9990, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9991, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9992, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9993, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9994, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9995, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9996, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9997, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9998, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x9999, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x999D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x99A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x99A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ +	{0x1002, 0x99A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \  	{0, 0, 0}  #define r128_PCI_IDS \ @@ -468,29 +739,6 @@  	{0x102b, 0x2527, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G550}, \  	{0, 0, 0} -#define mach64_PCI_IDS \ -	{0x1002, 0x4749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4751, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4744, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c51, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x474c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x474f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4752, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4753, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x474d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x474e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c52, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c53, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x1002, 0x4c4e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0, 0, 0} -  #define sisdrv_PCI_IDS \  	{0x1039, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \  	{0x1039, 0x5300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ @@ -530,18 +778,6 @@  	{0x8086, 0x1132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \  	{0, 0, 0} -#define i830_PCI_IDS \ -	{0x8086, 0x3577, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x8086, 0x2562, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x8086, 0x3582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x8086, 0x2572, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0x8086, 0x358e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0, 0, 0} - -#define gamma_PCI_IDS \ -	{0x3d3d, 0x0008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -	{0, 0, 0} -  #define savage_PCI_IDS \  	{0x5333, 0x8a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE3D}, \  	{0x5333, 0x8a21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE3D}, \ @@ -567,40 +803,3 @@  	{0x5333, 0x8d03, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \  	{0x5333, 0x8d04, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \  	{0, 0, 0} - -#define ffb_PCI_IDS \ -	{0, 0, 0} - -#define i915_PCI_IDS \ -	{0x8086, 0x3577, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2562, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x3582, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2572, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2582, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x258a, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x27a2, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x27ae, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2972, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2982, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2992, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x29a2, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x29b2, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x29c2, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x29d2, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2a02, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2a12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2a42, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x2e42, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x35e8, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x0042, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x0046, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0x8086, 0x0102, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -	{0, 0, 0} diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h new file mode 100644 index 00000000000..52e6870534b --- /dev/null +++ b/include/drm/drm_plane_helper.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2011-2013 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 + * THE AUTHORS OR COPYRIGHT HOLDERS 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_PLANE_HELPER_H +#define DRM_PLANE_HELPER_H + +#include <drm/drm_rect.h> + +/* + * Drivers that don't allow primary plane scaling may pass this macro in place + * of the min/max scale parameters of the update checker function. + * + * Due to src being in 16.16 fixed point and dest being in integer pixels, + * 1<<16 represents no scaling. + */ +#define DRM_PLANE_HELPER_NO_SCALING (1<<16) + +/** + * DOC: plane helpers + * + * Helper functions to assist with creation and handling of CRTC primary + * planes. + */ + +extern int drm_plane_helper_check_update(struct drm_plane *plane, +					 struct drm_crtc *crtc, +					 struct drm_framebuffer *fb, +					 struct drm_rect *src, +					 struct drm_rect *dest, +					 const struct drm_rect *clip, +					 int min_scale, +					 int max_scale, +					 bool can_position, +					 bool can_update_disabled, +					 bool *visible); +extern int drm_primary_helper_update(struct drm_plane *plane, +				     struct drm_crtc *crtc, +				     struct drm_framebuffer *fb, +				     int crtc_x, int crtc_y, +				     unsigned int crtc_w, unsigned int crtc_h, +				     uint32_t src_x, uint32_t src_y, +				     uint32_t src_w, uint32_t src_h); +extern int drm_primary_helper_disable(struct drm_plane *plane); +extern void drm_primary_helper_destroy(struct drm_plane *plane); +extern const struct drm_plane_funcs drm_primary_helper_funcs; +extern struct drm_plane *drm_primary_helper_create_plane(struct drm_device *dev, +							 const uint32_t *formats, +							 int num_formats); + + +#endif diff --git a/include/drm/drm_rect.h b/include/drm/drm_rect.h new file mode 100644 index 00000000000..d1286297567 --- /dev/null +++ b/include/drm/drm_rect.h @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2011-2013 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 + * THE AUTHORS OR COPYRIGHT HOLDERS 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_RECT_H +#define DRM_RECT_H + +/** + * DOC: rect utils + * + * Utility functions to help manage rectangular areas for + * clipping, scaling, etc. calculations. + */ + +/** + * struct drm_rect - two dimensional rectangle + * @x1: horizontal starting coordinate (inclusive) + * @x2: horizontal ending coordinate (exclusive) + * @y1: vertical starting coordinate (inclusive) + * @y2: vertical ending coordinate (exclusive) + */ +struct drm_rect { +	int x1, y1, x2, y2; +}; + +/** + * drm_rect_adjust_size - adjust the size of the rectangle + * @r: rectangle to be adjusted + * @dw: horizontal adjustment + * @dh: vertical adjustment + * + * Change the size of rectangle @r by @dw in the horizontal direction, + * and by @dh in the vertical direction, while keeping the center + * of @r stationary. + * + * Positive @dw and @dh increase the size, negative values decrease it. + */ +static inline void drm_rect_adjust_size(struct drm_rect *r, int dw, int dh) +{ +	r->x1 -= dw >> 1; +	r->y1 -= dh >> 1; +	r->x2 += (dw + 1) >> 1; +	r->y2 += (dh + 1) >> 1; +} + +/** + * drm_rect_translate - translate the rectangle + * @r: rectangle to be tranlated + * @dx: horizontal translation + * @dy: vertical translation + * + * Move rectangle @r by @dx in the horizontal direction, + * and by @dy in the vertical direction. + */ +static inline void drm_rect_translate(struct drm_rect *r, int dx, int dy) +{ +	r->x1 += dx; +	r->y1 += dy; +	r->x2 += dx; +	r->y2 += dy; +} + +/** + * drm_rect_downscale - downscale a rectangle + * @r: rectangle to be downscaled + * @horz: horizontal downscale factor + * @vert: vertical downscale factor + * + * Divide the coordinates of rectangle @r by @horz and @vert. + */ +static inline void drm_rect_downscale(struct drm_rect *r, int horz, int vert) +{ +	r->x1 /= horz; +	r->y1 /= vert; +	r->x2 /= horz; +	r->y2 /= vert; +} + +/** + * drm_rect_width - determine the rectangle width + * @r: rectangle whose width is returned + * + * RETURNS: + * The width of the rectangle. + */ +static inline int drm_rect_width(const struct drm_rect *r) +{ +	return r->x2 - r->x1; +} + +/** + * drm_rect_height - determine the rectangle height + * @r: rectangle whose height is returned + * + * RETURNS: + * The height of the rectangle. + */ +static inline int drm_rect_height(const struct drm_rect *r) +{ +	return r->y2 - r->y1; +} + +/** + * drm_rect_visible - determine if the the rectangle is visible + * @r: rectangle whose visibility is returned + * + * RETURNS: + * %true if the rectangle is visible, %false otherwise. + */ +static inline bool drm_rect_visible(const struct drm_rect *r) +{ +	return drm_rect_width(r) > 0 && drm_rect_height(r) > 0; +} + +/** + * drm_rect_equals - determine if two rectangles are equal + * @r1: first rectangle + * @r2: second rectangle + * + * RETURNS: + * %true if the rectangles are equal, %false otherwise. + */ +static inline bool drm_rect_equals(const struct drm_rect *r1, +				   const struct drm_rect *r2) +{ +	return r1->x1 == r2->x1 && r1->x2 == r2->x2 && +		r1->y1 == r2->y1 && r1->y2 == r2->y2; +} + +bool drm_rect_intersect(struct drm_rect *r, const struct drm_rect *clip); +bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst, +			  const struct drm_rect *clip, +			  int hscale, int vscale); +int drm_rect_calc_hscale(const struct drm_rect *src, +			 const struct drm_rect *dst, +			 int min_hscale, int max_hscale); +int drm_rect_calc_vscale(const struct drm_rect *src, +			 const struct drm_rect *dst, +			 int min_vscale, int max_vscale); +int drm_rect_calc_hscale_relaxed(struct drm_rect *src, +				 struct drm_rect *dst, +				 int min_hscale, int max_hscale); +int drm_rect_calc_vscale_relaxed(struct drm_rect *src, +				 struct drm_rect *dst, +				 int min_vscale, int max_vscale); +void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point); + +#endif diff --git a/include/drm/drm_sarea.h b/include/drm/drm_sarea.h deleted file mode 100644 index ee5389d22c6..00000000000 --- a/include/drm/drm_sarea.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * \file drm_sarea.h - * \brief SAREA definitions - * - * \author Michel Dänzer <michel@daenzer.net> - */ - -/* - * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - * - * 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 - * TUNGSTEN GRAPHICS 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_SAREA_H_ -#define _DRM_SAREA_H_ - -#include "drm.h" - -/* SAREA area needs to be at least a page */ -#if defined(__alpha__) -#define SAREA_MAX                       0x2000U -#elif defined(__ia64__) -#define SAREA_MAX                       0x10000U	/* 64kB */ -#else -/* Intel 830M driver needs at least 8k SAREA */ -#define SAREA_MAX                       0x2000U -#endif - -/** Maximum number of drawables in the SAREA */ -#define SAREA_MAX_DRAWABLES		256 - -#define SAREA_DRAWABLE_CLAIMED_ENTRY    0x80000000 - -/** SAREA drawable */ -struct drm_sarea_drawable { -	unsigned int stamp; -	unsigned int flags; -}; - -/** SAREA frame */ -struct drm_sarea_frame { -	unsigned int x; -	unsigned int y; -	unsigned int width; -	unsigned int height; -	unsigned int fullscreen; -}; - -/** SAREA */ -struct drm_sarea { -    /** first thing is always the DRM locking structure */ -	struct drm_hw_lock lock; -    /** \todo Use readers/writer lock for drm_sarea::drawable_lock */ -	struct drm_hw_lock drawable_lock; -	struct drm_sarea_drawable drawableTable[SAREA_MAX_DRAWABLES];	/**< drawables */ -	struct drm_sarea_frame frame;	/**< frame */ -	drm_context_t dummy_context; -}; - -#ifndef __KERNEL__ -typedef struct drm_sarea_drawable drm_sarea_drawable_t; -typedef struct drm_sarea_frame drm_sarea_frame_t; -typedef struct drm_sarea drm_sarea_t; -#endif - -#endif				/* _DRM_SAREA_H_ */ diff --git a/include/drm/drm_sman.h b/include/drm/drm_sman.h deleted file mode 100644 index 08ecf83ad5d..00000000000 --- a/include/drm/drm_sman.h +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************** - * - * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA. - * All Rights Reserved. - * - * 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, sub license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS, AUTHORS 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. - * - * - **************************************************************************/ -/* - * Simple memory MANager interface that keeps track on allocate regions on a - * per "owner" basis. All regions associated with an "owner" can be released - * with a simple call. Typically if the "owner" exists. The owner is any - * "unsigned long" identifier. Can typically be a pointer to a file private - * struct or a context identifier. - * - * Authors: - * Thomas Hellström <thomas-at-tungstengraphics-dot-com> - */ - -#ifndef DRM_SMAN_H -#define DRM_SMAN_H - -#include "drmP.h" -#include "drm_hashtab.h" - -/* - * A class that is an abstration of a simple memory allocator. - * The sman implementation provides a default such allocator - * using the drm_mm.c implementation. But the user can replace it. - * See the SiS implementation, which may use the SiS FB kernel module - * for memory management. - */ - -struct drm_sman_mm { -	/* private info. If allocated, needs to be destroyed by the destroy -	   function */ -	void *private; - -	/* Allocate a memory block with given size and alignment. -	   Return an opaque reference to the memory block */ - -	void *(*allocate) (void *private, unsigned long size, -			   unsigned alignment); - -	/* Free a memory block. "ref" is the opaque reference that we got from -	   the "alloc" function */ - -	void (*free) (void *private, void *ref); - -	/* Free all resources associated with this allocator */ - -	void (*destroy) (void *private); - -	/* Return a memory offset from the opaque reference returned from the -	   "alloc" function */ - -	unsigned long (*offset) (void *private, void *ref); -}; - -struct drm_memblock_item { -	struct list_head owner_list; -	struct drm_hash_item user_hash; -	void *mm_info; -	struct drm_sman_mm *mm; -	struct drm_sman *sman; -}; - -struct drm_sman { -	struct drm_sman_mm *mm; -	int num_managers; -	struct drm_open_hash owner_hash_tab; -	struct drm_open_hash user_hash_tab; -	struct list_head owner_items; -}; - -/* - * Take down a memory manager. This function should only be called after a - * successful init and after a call to drm_sman_cleanup. - */ - -extern void drm_sman_takedown(struct drm_sman * sman); - -/* - * Allocate structures for a manager. - * num_managers are the number of memory pools to manage. (VRAM, AGP, ....) - * user_order is the log2 of the number of buckets in the user hash table. - *	    set this to approximately log2 of the max number of memory regions - *	    that will be allocated for _all_ pools together. - * owner_order is the log2 of the number of buckets in the owner hash table. - *	    set this to approximately log2 of - *	    the number of client file connections that will - *	    be using the manager. - * - */ - -extern int drm_sman_init(struct drm_sman * sman, unsigned int num_managers, -			 unsigned int user_order, unsigned int owner_order); - -/* - * Initialize a drm_mm.c allocator. Should be called only once for each - * manager unless a customized allogator is used. - */ - -extern int drm_sman_set_range(struct drm_sman * sman, unsigned int manager, -			      unsigned long start, unsigned long size); - -/* - * Initialize a customized allocator for one of the managers. - * (See the SiS module). The object pointed to by "allocator" is copied, - * so it can be destroyed after this call. - */ - -extern int drm_sman_set_manager(struct drm_sman * sman, unsigned int mananger, -				struct drm_sman_mm * allocator); - -/* - * Allocate a memory block. Aligment is not implemented yet. - */ - -extern struct drm_memblock_item *drm_sman_alloc(struct drm_sman * sman, -						unsigned int manager, -						unsigned long size, -						unsigned alignment, -						unsigned long owner); -/* - * Free a memory block identified by its user hash key. - */ - -extern int drm_sman_free_key(struct drm_sman * sman, unsigned int key); - -/* - * returns 1 iff there are no stale memory blocks associated with this owner. - * Typically called to determine if we need to idle the hardware and call - * drm_sman_owner_cleanup. If there are no stale memory blocks, it removes all - * resources associated with owner. - */ - -extern int drm_sman_owner_clean(struct drm_sman * sman, unsigned long owner); - -/* - * Frees all stale memory blocks associated with this owner. Note that this - * requires that the hardware is finished with all blocks, so the graphics engine - * should be idled before this call is made. This function also frees - * any resources associated with "owner" and should be called when owner - * is not going to be referenced anymore. - */ - -extern void drm_sman_owner_cleanup(struct drm_sman * sman, unsigned long owner); - -/* - * Frees all stale memory blocks associated with the memory manager. - * See idling above. - */ - -extern void drm_sman_cleanup(struct drm_sman * sman); - -#endif diff --git a/include/drm/drm_usb.h b/include/drm/drm_usb.h new file mode 100644 index 00000000000..33506c11da8 --- /dev/null +++ b/include/drm/drm_usb.h @@ -0,0 +1,15 @@ +#ifndef DRM_USB_H +#define DRM_USB_H + +#include <drmP.h> + +#include <linux/usb.h> + +extern int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver); +extern void drm_usb_exit(struct drm_driver *driver, struct usb_driver *udriver); + +int drm_get_usb_dev(struct usb_interface *interface, +		    const struct usb_device_id *id, +		    struct drm_driver *driver); + +#endif diff --git a/include/drm/drm_vma_manager.h b/include/drm/drm_vma_manager.h new file mode 100644 index 00000000000..8cd402c73a5 --- /dev/null +++ b/include/drm/drm_vma_manager.h @@ -0,0 +1,257 @@ +#ifndef __DRM_VMA_MANAGER_H__ +#define __DRM_VMA_MANAGER_H__ + +/* + * Copyright (c) 2013 David Herrmann <dh.herrmann@gmail.com> + * + * 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 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 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#include <drm/drm_mm.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/module.h> +#include <linux/rbtree.h> +#include <linux/spinlock.h> +#include <linux/types.h> + +struct drm_vma_offset_file { +	struct rb_node vm_rb; +	struct file *vm_filp; +	unsigned long vm_count; +}; + +struct drm_vma_offset_node { +	rwlock_t vm_lock; +	struct drm_mm_node vm_node; +	struct rb_node vm_rb; +	struct rb_root vm_files; +}; + +struct drm_vma_offset_manager { +	rwlock_t vm_lock; +	struct rb_root vm_addr_space_rb; +	struct drm_mm vm_addr_space_mm; +}; + +void drm_vma_offset_manager_init(struct drm_vma_offset_manager *mgr, +				 unsigned long page_offset, unsigned long size); +void drm_vma_offset_manager_destroy(struct drm_vma_offset_manager *mgr); + +struct drm_vma_offset_node *drm_vma_offset_lookup(struct drm_vma_offset_manager *mgr, +						  unsigned long start, +						  unsigned long pages); +struct drm_vma_offset_node *drm_vma_offset_lookup_locked(struct drm_vma_offset_manager *mgr, +							   unsigned long start, +							   unsigned long pages); +int drm_vma_offset_add(struct drm_vma_offset_manager *mgr, +		       struct drm_vma_offset_node *node, unsigned long pages); +void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr, +			   struct drm_vma_offset_node *node); + +int drm_vma_node_allow(struct drm_vma_offset_node *node, struct file *filp); +void drm_vma_node_revoke(struct drm_vma_offset_node *node, struct file *filp); +bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node, +			     struct file *filp); + +/** + * drm_vma_offset_exact_lookup() - Look up node by exact address + * @mgr: Manager object + * @start: Start address (page-based, not byte-based) + * @pages: Size of object (page-based) + * + * Same as drm_vma_offset_lookup() but does not allow any offset into the node. + * It only returns the exact object with the given start address. + * + * RETURNS: + * Node at exact start address @start. + */ +static inline struct drm_vma_offset_node * +drm_vma_offset_exact_lookup(struct drm_vma_offset_manager *mgr, +			    unsigned long start, +			    unsigned long pages) +{ +	struct drm_vma_offset_node *node; + +	node = drm_vma_offset_lookup(mgr, start, pages); +	return (node && node->vm_node.start == start) ? node : NULL; +} + +/** + * drm_vma_offset_lock_lookup() - Lock lookup for extended private use + * @mgr: Manager object + * + * Lock VMA manager for extended lookups. Only *_locked() VMA function calls + * are allowed while holding this lock. All other contexts are blocked from VMA + * until the lock is released via drm_vma_offset_unlock_lookup(). + * + * Use this if you need to take a reference to the objects returned by + * drm_vma_offset_lookup_locked() before releasing this lock again. + * + * This lock must not be used for anything else than extended lookups. You must + * not call any other VMA helpers while holding this lock. + * + * Note: You're in atomic-context while holding this lock! + * + * Example: + *   drm_vma_offset_lock_lookup(mgr); + *   node = drm_vma_offset_lookup_locked(mgr); + *   if (node) + *       kref_get_unless_zero(container_of(node, sth, entr)); + *   drm_vma_offset_unlock_lookup(mgr); + */ +static inline void drm_vma_offset_lock_lookup(struct drm_vma_offset_manager *mgr) +{ +	read_lock(&mgr->vm_lock); +} + +/** + * drm_vma_offset_unlock_lookup() - Unlock lookup for extended private use + * @mgr: Manager object + * + * Release lookup-lock. See drm_vma_offset_lock_lookup() for more information. + */ +static inline void drm_vma_offset_unlock_lookup(struct drm_vma_offset_manager *mgr) +{ +	read_unlock(&mgr->vm_lock); +} + +/** + * drm_vma_node_reset() - Initialize or reset node object + * @node: Node to initialize or reset + * + * Reset a node to its initial state. This must be called before using it with + * any VMA offset manager. + * + * This must not be called on an already allocated node, or you will leak + * memory. + */ +static inline void drm_vma_node_reset(struct drm_vma_offset_node *node) +{ +	memset(node, 0, sizeof(*node)); +	node->vm_files = RB_ROOT; +	rwlock_init(&node->vm_lock); +} + +/** + * drm_vma_node_start() - Return start address for page-based addressing + * @node: Node to inspect + * + * Return the start address of the given node. This can be used as offset into + * the linear VM space that is provided by the VMA offset manager. Note that + * this can only be used for page-based addressing. If you need a proper offset + * for user-space mappings, you must apply "<< PAGE_SHIFT" or use the + * drm_vma_node_offset_addr() helper instead. + * + * RETURNS: + * Start address of @node for page-based addressing. 0 if the node does not + * have an offset allocated. + */ +static inline unsigned long drm_vma_node_start(struct drm_vma_offset_node *node) +{ +	return node->vm_node.start; +} + +/** + * drm_vma_node_size() - Return size (page-based) + * @node: Node to inspect + * + * Return the size as number of pages for the given node. This is the same size + * that was passed to drm_vma_offset_add(). If no offset is allocated for the + * node, this is 0. + * + * RETURNS: + * Size of @node as number of pages. 0 if the node does not have an offset + * allocated. + */ +static inline unsigned long drm_vma_node_size(struct drm_vma_offset_node *node) +{ +	return node->vm_node.size; +} + +/** + * drm_vma_node_has_offset() - Check whether node is added to offset manager + * @node: Node to be checked + * + * RETURNS: + * true iff the node was previously allocated an offset and added to + * an vma offset manager. + */ +static inline bool drm_vma_node_has_offset(struct drm_vma_offset_node *node) +{ +	return drm_mm_node_allocated(&node->vm_node); +} + +/** + * drm_vma_node_offset_addr() - Return sanitized offset for user-space mmaps + * @node: Linked offset node + * + * Same as drm_vma_node_start() but returns the address as a valid offset that + * can be used for user-space mappings during mmap(). + * This must not be called on unlinked nodes. + * + * RETURNS: + * Offset of @node for byte-based addressing. 0 if the node does not have an + * object allocated. + */ +static inline __u64 drm_vma_node_offset_addr(struct drm_vma_offset_node *node) +{ +	return ((__u64)node->vm_node.start) << PAGE_SHIFT; +} + +/** + * drm_vma_node_unmap() - Unmap offset node + * @node: Offset node + * @file_mapping: Address space to unmap @node from + * + * Unmap all userspace mappings for a given offset node. The mappings must be + * associated with the @file_mapping address-space. If no offset exists + * nothing is done. + * + * This call is unlocked. The caller must guarantee that drm_vma_offset_remove() + * is not called on this node concurrently. + */ +static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node, +				      struct address_space *file_mapping) +{ +	if (drm_vma_node_has_offset(node)) +		unmap_mapping_range(file_mapping, +				    drm_vma_node_offset_addr(node), +				    drm_vma_node_size(node) << PAGE_SHIFT, 1); +} + +/** + * drm_vma_node_verify_access() - Access verification helper for TTM + * @node: Offset node + * @filp: Open-file + * + * This checks whether @filp is granted access to @node. It is the same as + * drm_vma_node_is_allowed() but suitable as drop-in helper for TTM + * verify_access() callbacks. + * + * RETURNS: + * 0 if access is granted, -EACCES otherwise. + */ +static inline int drm_vma_node_verify_access(struct drm_vma_offset_node *node, +					     struct file *filp) +{ +	return drm_vma_node_is_allowed(node, filp) ? 0 : -EACCES; +} + +#endif /* __DRM_VMA_MANAGER_H__ */ diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h new file mode 100644 index 00000000000..cb65fa14acf --- /dev/null +++ b/include/drm/exynos_drm.h @@ -0,0 +1,101 @@ +/* exynos_drm.h + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * Authors: + *	Inki Dae <inki.dae@samsung.com> + *	Joonyoung Shim <jy0922.shim@samsung.com> + *	Seung-Woo Kim <sw0312.kim@samsung.com> + * + * This program is free software; you can redistribute  it and/or modify it + * under  the terms of  the GNU General  Public License as published by the + * Free Software Foundation;  either version 2 of the  License, or (at your + * option) any later version. + */ +#ifndef _EXYNOS_DRM_H_ +#define _EXYNOS_DRM_H_ + +#include <uapi/drm/exynos_drm.h> +#include <video/videomode.h> + +/** + * A structure for lcd panel information. + * + * @timing: default video mode for initializing + * @width_mm: physical size of lcd width. + * @height_mm: physical size of lcd height. + */ +struct exynos_drm_panel_info { +	struct videomode vm; +	u32 width_mm; +	u32 height_mm; +}; + +/** + * Platform Specific Structure for DRM based FIMD. + * + * @panel: default panel info for initializing + * @default_win: default window layer number to be used for UI. + * @bpp: default bit per pixel. + */ +struct exynos_drm_fimd_pdata { +	struct exynos_drm_panel_info panel; +	u32				vidcon0; +	u32				vidcon1; +	unsigned int			default_win; +	unsigned int			bpp; +}; + +/** + * Platform Specific Structure for DRM based HDMI. + * + * @hdmi_dev: device point to specific hdmi driver. + * @mixer_dev: device point to specific mixer driver. + * + * this structure is used for common hdmi driver and each device object + * would be used to access specific device driver(hdmi or mixer driver) + */ +struct exynos_drm_common_hdmi_pd { +	struct device *hdmi_dev; +	struct device *mixer_dev; +}; + +/** + * Platform Specific Structure for DRM based HDMI core. + * + * @is_v13: set if hdmi version 13 is. + * @cfg_hpd: function pointer to configure hdmi hotplug detection pin + * @get_hpd: function pointer to get value of hdmi hotplug detection pin + */ +struct exynos_drm_hdmi_pdata { +	bool is_v13; +	void (*cfg_hpd)(bool external); +	int (*get_hpd)(void); +}; + +/** + * Platform Specific Structure for DRM based IPP. + * + * @inv_pclk: if set 1. invert pixel clock + * @inv_vsync: if set 1. invert vsync signal for wb + * @inv_href: if set 1. invert href signal + * @inv_hsync: if set 1. invert hsync signal for wb + */ +struct exynos_drm_ipp_pol { +	unsigned int inv_pclk; +	unsigned int inv_vsync; +	unsigned int inv_href; +	unsigned int inv_hsync; +}; + +/** + * Platform Specific Structure for DRM based FIMC. + * + * @pol: current hardware block polarity settings. + * @clk_rate: current hardware clock rate. + */ +struct exynos_drm_fimc_pdata { +	struct exynos_drm_ipp_pol pol; +	int clk_rate; +}; + +#endif	/* _EXYNOS_DRM_H_ */ diff --git a/include/drm/gma_drm.h b/include/drm/gma_drm.h new file mode 100644 index 00000000000..87ac5e6ca55 --- /dev/null +++ b/include/drm/gma_drm.h @@ -0,0 +1,25 @@ +/************************************************************************** + * Copyright (c) 2007-2011, Intel Corporation. + * All Rights Reserved. + * Copyright (c) 2008, Tungsten Graphics Inc.  Cedar Park, TX., USA. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + **************************************************************************/ + +#ifndef _GMA_DRM_H_ +#define _GMA_DRM_H_ + +#endif diff --git a/include/drm/i2c/tda998x.h b/include/drm/i2c/tda998x.h new file mode 100644 index 00000000000..3e419d92cf5 --- /dev/null +++ b/include/drm/i2c/tda998x.h @@ -0,0 +1,30 @@ +#ifndef __DRM_I2C_TDA998X_H__ +#define __DRM_I2C_TDA998X_H__ + +struct tda998x_encoder_params { +	u8 swap_b:3; +	u8 mirr_b:1; +	u8 swap_a:3; +	u8 mirr_a:1; +	u8 swap_d:3; +	u8 mirr_d:1; +	u8 swap_c:3; +	u8 mirr_c:1; +	u8 swap_f:3; +	u8 mirr_f:1; +	u8 swap_e:3; +	u8 mirr_e:1; + +	u8 audio_cfg; +	u8 audio_clk_cfg; +	u8 audio_frame[6]; + +	enum { +		AFMT_SPDIF, +		AFMT_I2S +	} audio_format; + +	unsigned audio_sample_rate; +}; + +#endif diff --git a/include/drm/i810_drm.h b/include/drm/i810_drm.h deleted file mode 100644 index 7a10bb6f2c0..00000000000 --- a/include/drm/i810_drm.h +++ /dev/null @@ -1,281 +0,0 @@ -#ifndef _I810_DRM_H_ -#define _I810_DRM_H_ - -/* WARNING: These defines must be the same as what the Xserver uses. - * if you change them, you must change the defines in the Xserver. - */ - -#ifndef _I810_DEFINES_ -#define _I810_DEFINES_ - -#define I810_DMA_BUF_ORDER		12 -#define I810_DMA_BUF_SZ 		(1<<I810_DMA_BUF_ORDER) -#define I810_DMA_BUF_NR 		256 -#define I810_NR_SAREA_CLIPRECTS 	8 - -/* Each region is a minimum of 64k, and there are at most 64 of them. - */ -#define I810_NR_TEX_REGIONS 64 -#define I810_LOG_MIN_TEX_REGION_SIZE 16 -#endif - -#define I810_UPLOAD_TEX0IMAGE  0x1	/* handled clientside */ -#define I810_UPLOAD_TEX1IMAGE  0x2	/* handled clientside */ -#define I810_UPLOAD_CTX        0x4 -#define I810_UPLOAD_BUFFERS    0x8 -#define I810_UPLOAD_TEX0       0x10 -#define I810_UPLOAD_TEX1       0x20 -#define I810_UPLOAD_CLIPRECTS  0x40 - -/* Indices into buf.Setup where various bits of state are mirrored per - * context and per buffer.  These can be fired at the card as a unit, - * or in a piecewise fashion as required. - */ - -/* Destbuffer state - *    - backbuffer linear offset and pitch -- invarient in the current dri - *    - zbuffer linear offset and pitch -- also invarient - *    - drawing origin in back and depth buffers. - * - * Keep the depth/back buffer state here to accommodate private buffers - * in the future. - */ -#define I810_DESTREG_DI0  0	/* CMD_OP_DESTBUFFER_INFO (2 dwords) */ -#define I810_DESTREG_DI1  1 -#define I810_DESTREG_DV0  2	/* GFX_OP_DESTBUFFER_VARS (2 dwords) */ -#define I810_DESTREG_DV1  3 -#define I810_DESTREG_DR0  4	/* GFX_OP_DRAWRECT_INFO (4 dwords) */ -#define I810_DESTREG_DR1  5 -#define I810_DESTREG_DR2  6 -#define I810_DESTREG_DR3  7 -#define I810_DESTREG_DR4  8 -#define I810_DEST_SETUP_SIZE 10 - -/* Context state - */ -#define I810_CTXREG_CF0   0	/* GFX_OP_COLOR_FACTOR */ -#define I810_CTXREG_CF1   1 -#define I810_CTXREG_ST0   2	/* GFX_OP_STIPPLE */ -#define I810_CTXREG_ST1   3 -#define I810_CTXREG_VF    4	/* GFX_OP_VERTEX_FMT */ -#define I810_CTXREG_MT    5	/* GFX_OP_MAP_TEXELS */ -#define I810_CTXREG_MC0   6	/* GFX_OP_MAP_COLOR_STAGES - stage 0 */ -#define I810_CTXREG_MC1   7	/* GFX_OP_MAP_COLOR_STAGES - stage 1 */ -#define I810_CTXREG_MC2   8	/* GFX_OP_MAP_COLOR_STAGES - stage 2 */ -#define I810_CTXREG_MA0   9	/* GFX_OP_MAP_ALPHA_STAGES - stage 0 */ -#define I810_CTXREG_MA1   10	/* GFX_OP_MAP_ALPHA_STAGES - stage 1 */ -#define I810_CTXREG_MA2   11	/* GFX_OP_MAP_ALPHA_STAGES - stage 2 */ -#define I810_CTXREG_SDM   12	/* GFX_OP_SRC_DEST_MONO */ -#define I810_CTXREG_FOG   13	/* GFX_OP_FOG_COLOR */ -#define I810_CTXREG_B1    14	/* GFX_OP_BOOL_1 */ -#define I810_CTXREG_B2    15	/* GFX_OP_BOOL_2 */ -#define I810_CTXREG_LCS   16	/* GFX_OP_LINEWIDTH_CULL_SHADE_MODE */ -#define I810_CTXREG_PV    17	/* GFX_OP_PV_RULE -- Invarient! */ -#define I810_CTXREG_ZA    18	/* GFX_OP_ZBIAS_ALPHAFUNC */ -#define I810_CTXREG_AA    19	/* GFX_OP_ANTIALIAS */ -#define I810_CTX_SETUP_SIZE 20 - -/* Texture state (per tex unit) - */ -#define I810_TEXREG_MI0  0	/* GFX_OP_MAP_INFO (4 dwords) */ -#define I810_TEXREG_MI1  1 -#define I810_TEXREG_MI2  2 -#define I810_TEXREG_MI3  3 -#define I810_TEXREG_MF   4	/* GFX_OP_MAP_FILTER */ -#define I810_TEXREG_MLC  5	/* GFX_OP_MAP_LOD_CTL */ -#define I810_TEXREG_MLL  6	/* GFX_OP_MAP_LOD_LIMITS */ -#define I810_TEXREG_MCS  7	/* GFX_OP_MAP_COORD_SETS ??? */ -#define I810_TEX_SETUP_SIZE 8 - -/* Flags for clear ioctl - */ -#define I810_FRONT   0x1 -#define I810_BACK    0x2 -#define I810_DEPTH   0x4 - -typedef enum _drm_i810_init_func { -	I810_INIT_DMA = 0x01, -	I810_CLEANUP_DMA = 0x02, -	I810_INIT_DMA_1_4 = 0x03 -} drm_i810_init_func_t; - -/* This is the init structure after v1.2 */ -typedef struct _drm_i810_init { -	drm_i810_init_func_t func; -	unsigned int mmio_offset; -	unsigned int buffers_offset; -	int sarea_priv_offset; -	unsigned int ring_start; -	unsigned int ring_end; -	unsigned int ring_size; -	unsigned int front_offset; -	unsigned int back_offset; -	unsigned int depth_offset; -	unsigned int overlay_offset; -	unsigned int overlay_physical; -	unsigned int w; -	unsigned int h; -	unsigned int pitch; -	unsigned int pitch_bits; -} drm_i810_init_t; - -/* This is the init structure prior to v1.2 */ -typedef struct _drm_i810_pre12_init { -	drm_i810_init_func_t func; -	unsigned int mmio_offset; -	unsigned int buffers_offset; -	int sarea_priv_offset; -	unsigned int ring_start; -	unsigned int ring_end; -	unsigned int ring_size; -	unsigned int front_offset; -	unsigned int back_offset; -	unsigned int depth_offset; -	unsigned int w; -	unsigned int h; -	unsigned int pitch; -	unsigned int pitch_bits; -} drm_i810_pre12_init_t; - -/* Warning: If you change the SAREA structure you must change the Xserver - * structure as well */ - -typedef struct _drm_i810_tex_region { -	unsigned char next, prev;	/* indices to form a circular LRU  */ -	unsigned char in_use;	/* owned by a client, or free? */ -	int age;		/* tracked by clients to update local LRU's */ -} drm_i810_tex_region_t; - -typedef struct _drm_i810_sarea { -	unsigned int ContextState[I810_CTX_SETUP_SIZE]; -	unsigned int BufferState[I810_DEST_SETUP_SIZE]; -	unsigned int TexState[2][I810_TEX_SETUP_SIZE]; -	unsigned int dirty; - -	unsigned int nbox; -	struct drm_clip_rect boxes[I810_NR_SAREA_CLIPRECTS]; - -	/* Maintain an LRU of contiguous regions of texture space.  If -	 * you think you own a region of texture memory, and it has an -	 * age different to the one you set, then you are mistaken and -	 * it has been stolen by another client.  If global texAge -	 * hasn't changed, there is no need to walk the list. -	 * -	 * These regions can be used as a proxy for the fine-grained -	 * texture information of other clients - by maintaining them -	 * in the same lru which is used to age their own textures, -	 * clients have an approximate lru for the whole of global -	 * texture space, and can make informed decisions as to which -	 * areas to kick out.  There is no need to choose whether to -	 * kick out your own texture or someone else's - simply eject -	 * them all in LRU order. -	 */ - -	drm_i810_tex_region_t texList[I810_NR_TEX_REGIONS + 1]; -	/* Last elt is sentinal */ -	int texAge;		/* last time texture was uploaded */ -	int last_enqueue;	/* last time a buffer was enqueued */ -	int last_dispatch;	/* age of the most recently dispatched buffer */ -	int last_quiescent;	/*  */ -	int ctxOwner;		/* last context to upload state */ - -	int vertex_prim; - -	int pf_enabled;		/* is pageflipping allowed? */ -	int pf_active; -	int pf_current_page;	/* which buffer is being displayed? */ -} drm_i810_sarea_t; - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the Xserver file (xf86drmMga.h) - */ - -/* i810 specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_I810_INIT		0x00 -#define DRM_I810_VERTEX		0x01 -#define DRM_I810_CLEAR		0x02 -#define DRM_I810_FLUSH		0x03 -#define DRM_I810_GETAGE		0x04 -#define DRM_I810_GETBUF		0x05 -#define DRM_I810_SWAP		0x06 -#define DRM_I810_COPY		0x07 -#define DRM_I810_DOCOPY		0x08 -#define DRM_I810_OV0INFO	0x09 -#define DRM_I810_FSTATUS	0x0a -#define DRM_I810_OV0FLIP	0x0b -#define DRM_I810_MC		0x0c -#define DRM_I810_RSTATUS	0x0d -#define DRM_I810_FLIP		0x0e - -#define DRM_IOCTL_I810_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I810_INIT, drm_i810_init_t) -#define DRM_IOCTL_I810_VERTEX		DRM_IOW( DRM_COMMAND_BASE + DRM_I810_VERTEX, drm_i810_vertex_t) -#define DRM_IOCTL_I810_CLEAR		DRM_IOW( DRM_COMMAND_BASE + DRM_I810_CLEAR, drm_i810_clear_t) -#define DRM_IOCTL_I810_FLUSH		DRM_IO(  DRM_COMMAND_BASE + DRM_I810_FLUSH) -#define DRM_IOCTL_I810_GETAGE		DRM_IO(  DRM_COMMAND_BASE + DRM_I810_GETAGE) -#define DRM_IOCTL_I810_GETBUF		DRM_IOWR(DRM_COMMAND_BASE + DRM_I810_GETBUF, drm_i810_dma_t) -#define DRM_IOCTL_I810_SWAP		DRM_IO(  DRM_COMMAND_BASE + DRM_I810_SWAP) -#define DRM_IOCTL_I810_COPY		DRM_IOW( DRM_COMMAND_BASE + DRM_I810_COPY, drm_i810_copy_t) -#define DRM_IOCTL_I810_DOCOPY		DRM_IO(  DRM_COMMAND_BASE + DRM_I810_DOCOPY) -#define DRM_IOCTL_I810_OV0INFO		DRM_IOR( DRM_COMMAND_BASE + DRM_I810_OV0INFO, drm_i810_overlay_t) -#define DRM_IOCTL_I810_FSTATUS		DRM_IO ( DRM_COMMAND_BASE + DRM_I810_FSTATUS) -#define DRM_IOCTL_I810_OV0FLIP		DRM_IO ( DRM_COMMAND_BASE + DRM_I810_OV0FLIP) -#define DRM_IOCTL_I810_MC		DRM_IOW( DRM_COMMAND_BASE + DRM_I810_MC, drm_i810_mc_t) -#define DRM_IOCTL_I810_RSTATUS		DRM_IO ( DRM_COMMAND_BASE + DRM_I810_RSTATUS) -#define DRM_IOCTL_I810_FLIP             DRM_IO ( DRM_COMMAND_BASE + DRM_I810_FLIP) - -typedef struct _drm_i810_clear { -	int clear_color; -	int clear_depth; -	int flags; -} drm_i810_clear_t; - -/* These may be placeholders if we have more cliprects than - * I810_NR_SAREA_CLIPRECTS.  In that case, the client sets discard to - * false, indicating that the buffer will be dispatched again with a - * new set of cliprects. - */ -typedef struct _drm_i810_vertex { -	int idx;		/* buffer index */ -	int used;		/* nr bytes in use */ -	int discard;		/* client is finished with the buffer? */ -} drm_i810_vertex_t; - -typedef struct _drm_i810_copy_t { -	int idx;		/* buffer index */ -	int used;		/* nr bytes in use */ -	void *address;		/* Address to copy from */ -} drm_i810_copy_t; - -#define PR_TRIANGLES         (0x0<<18) -#define PR_TRISTRIP_0        (0x1<<18) -#define PR_TRISTRIP_1        (0x2<<18) -#define PR_TRIFAN            (0x3<<18) -#define PR_POLYGON           (0x4<<18) -#define PR_LINES             (0x5<<18) -#define PR_LINESTRIP         (0x6<<18) -#define PR_RECTS             (0x7<<18) -#define PR_MASK              (0x7<<18) - -typedef struct drm_i810_dma { -	void *virtual; -	int request_idx; -	int request_size; -	int granted; -} drm_i810_dma_t; - -typedef struct _drm_i810_overlay_t { -	unsigned int offset;	/* Address of the Overlay Regs */ -	unsigned int physical; -} drm_i810_overlay_t; - -typedef struct _drm_i810_mc { -	int idx;		/* buffer index */ -	int used;		/* nr bytes in use */ -	int num_blocks;		/* number of GFXBlocks */ -	int *length;		/* List of lengths for GFXBlocks (FUTURE) */ -	unsigned int last_render;	/* Last Render Request */ -} drm_i810_mc_t; - -#endif				/* _I810_DRM_H_ */ diff --git a/include/drm/i830_drm.h b/include/drm/i830_drm.h deleted file mode 100644 index 61315c29b8f..00000000000 --- a/include/drm/i830_drm.h +++ /dev/null @@ -1,342 +0,0 @@ -#ifndef _I830_DRM_H_ -#define _I830_DRM_H_ - -/* WARNING: These defines must be the same as what the Xserver uses. - * if you change them, you must change the defines in the Xserver. - * - * KW: Actually, you can't ever change them because doing so would - * break backwards compatibility. - */ - -#ifndef _I830_DEFINES_ -#define _I830_DEFINES_ - -#define I830_DMA_BUF_ORDER		12 -#define I830_DMA_BUF_SZ			(1<<I830_DMA_BUF_ORDER) -#define I830_DMA_BUF_NR			256 -#define I830_NR_SAREA_CLIPRECTS		8 - -/* Each region is a minimum of 64k, and there are at most 64 of them. - */ -#define I830_NR_TEX_REGIONS 64 -#define I830_LOG_MIN_TEX_REGION_SIZE 16 - -/* KW: These aren't correct but someone set them to two and then - * released the module.  Now we can't change them as doing so would - * break backwards compatibility. - */ -#define I830_TEXTURE_COUNT	2 -#define I830_TEXBLEND_COUNT	I830_TEXTURE_COUNT - -#define I830_TEXBLEND_SIZE	12	/* (4 args + op) * 2 + COLOR_FACTOR */ - -#define I830_UPLOAD_CTX			0x1 -#define I830_UPLOAD_BUFFERS		0x2 -#define I830_UPLOAD_CLIPRECTS		0x4 -#define I830_UPLOAD_TEX0_IMAGE		0x100	/* handled clientside */ -#define I830_UPLOAD_TEX0_CUBE		0x200	/* handled clientside */ -#define I830_UPLOAD_TEX1_IMAGE		0x400	/* handled clientside */ -#define I830_UPLOAD_TEX1_CUBE		0x800	/* handled clientside */ -#define I830_UPLOAD_TEX2_IMAGE		0x1000	/* handled clientside */ -#define I830_UPLOAD_TEX2_CUBE		0x2000	/* handled clientside */ -#define I830_UPLOAD_TEX3_IMAGE		0x4000	/* handled clientside */ -#define I830_UPLOAD_TEX3_CUBE		0x8000	/* handled clientside */ -#define I830_UPLOAD_TEX_N_IMAGE(n)	(0x100 << (n * 2)) -#define I830_UPLOAD_TEX_N_CUBE(n)	(0x200 << (n * 2)) -#define I830_UPLOAD_TEXIMAGE_MASK	0xff00 -#define I830_UPLOAD_TEX0			0x10000 -#define I830_UPLOAD_TEX1			0x20000 -#define I830_UPLOAD_TEX2			0x40000 -#define I830_UPLOAD_TEX3			0x80000 -#define I830_UPLOAD_TEX_N(n)		(0x10000 << (n)) -#define I830_UPLOAD_TEX_MASK		0xf0000 -#define I830_UPLOAD_TEXBLEND0		0x100000 -#define I830_UPLOAD_TEXBLEND1		0x200000 -#define I830_UPLOAD_TEXBLEND2		0x400000 -#define I830_UPLOAD_TEXBLEND3		0x800000 -#define I830_UPLOAD_TEXBLEND_N(n)	(0x100000 << (n)) -#define I830_UPLOAD_TEXBLEND_MASK	0xf00000 -#define I830_UPLOAD_TEX_PALETTE_N(n)    (0x1000000 << (n)) -#define I830_UPLOAD_TEX_PALETTE_SHARED	0x4000000 -#define I830_UPLOAD_STIPPLE		0x8000000 - -/* Indices into buf.Setup where various bits of state are mirrored per - * context and per buffer.  These can be fired at the card as a unit, - * or in a piecewise fashion as required. - */ - -/* Destbuffer state - *    - backbuffer linear offset and pitch -- invarient in the current dri - *    - zbuffer linear offset and pitch -- also invarient - *    - drawing origin in back and depth buffers. - * - * Keep the depth/back buffer state here to accommodate private buffers - * in the future. - */ - -#define I830_DESTREG_CBUFADDR 0 -#define I830_DESTREG_DBUFADDR 1 -#define I830_DESTREG_DV0 2 -#define I830_DESTREG_DV1 3 -#define I830_DESTREG_SENABLE 4 -#define I830_DESTREG_SR0 5 -#define I830_DESTREG_SR1 6 -#define I830_DESTREG_SR2 7 -#define I830_DESTREG_DR0 8 -#define I830_DESTREG_DR1 9 -#define I830_DESTREG_DR2 10 -#define I830_DESTREG_DR3 11 -#define I830_DESTREG_DR4 12 -#define I830_DEST_SETUP_SIZE 13 - -/* Context state - */ -#define I830_CTXREG_STATE1		0 -#define I830_CTXREG_STATE2		1 -#define I830_CTXREG_STATE3		2 -#define I830_CTXREG_STATE4		3 -#define I830_CTXREG_STATE5		4 -#define I830_CTXREG_IALPHAB		5 -#define I830_CTXREG_STENCILTST		6 -#define I830_CTXREG_ENABLES_1		7 -#define I830_CTXREG_ENABLES_2		8 -#define I830_CTXREG_AA			9 -#define I830_CTXREG_FOGCOLOR		10 -#define I830_CTXREG_BLENDCOLR0		11 -#define I830_CTXREG_BLENDCOLR		12	/* Dword 1 of 2 dword command */ -#define I830_CTXREG_VF			13 -#define I830_CTXREG_VF2			14 -#define I830_CTXREG_MCSB0		15 -#define I830_CTXREG_MCSB1		16 -#define I830_CTX_SETUP_SIZE		17 - -/* 1.3: Stipple state - */ -#define I830_STPREG_ST0 0 -#define I830_STPREG_ST1 1 -#define I830_STP_SETUP_SIZE 2 - -/* Texture state (per tex unit) - */ - -#define I830_TEXREG_MI0	0	/* GFX_OP_MAP_INFO (6 dwords) */ -#define I830_TEXREG_MI1	1 -#define I830_TEXREG_MI2	2 -#define I830_TEXREG_MI3	3 -#define I830_TEXREG_MI4	4 -#define I830_TEXREG_MI5	5 -#define I830_TEXREG_MF	6	/* GFX_OP_MAP_FILTER */ -#define I830_TEXREG_MLC	7	/* GFX_OP_MAP_LOD_CTL */ -#define I830_TEXREG_MLL	8	/* GFX_OP_MAP_LOD_LIMITS */ -#define I830_TEXREG_MCS	9	/* GFX_OP_MAP_COORD_SETS */ -#define I830_TEX_SETUP_SIZE 10 - -#define I830_TEXREG_TM0LI      0	/* load immediate 2 texture map n */ -#define I830_TEXREG_TM0S0      1 -#define I830_TEXREG_TM0S1      2 -#define I830_TEXREG_TM0S2      3 -#define I830_TEXREG_TM0S3      4 -#define I830_TEXREG_TM0S4      5 -#define I830_TEXREG_NOP0       6	/* noop */ -#define I830_TEXREG_NOP1       7	/* noop */ -#define I830_TEXREG_NOP2       8	/* noop */ -#define __I830_TEXREG_MCS      9	/* GFX_OP_MAP_COORD_SETS -- shared */ -#define __I830_TEX_SETUP_SIZE   10 - -#define I830_FRONT   0x1 -#define I830_BACK    0x2 -#define I830_DEPTH   0x4 - -#endif				/* _I830_DEFINES_ */ - -typedef struct _drm_i830_init { -	enum { -		I830_INIT_DMA = 0x01, -		I830_CLEANUP_DMA = 0x02 -	} func; -	unsigned int mmio_offset; -	unsigned int buffers_offset; -	int sarea_priv_offset; -	unsigned int ring_start; -	unsigned int ring_end; -	unsigned int ring_size; -	unsigned int front_offset; -	unsigned int back_offset; -	unsigned int depth_offset; -	unsigned int w; -	unsigned int h; -	unsigned int pitch; -	unsigned int pitch_bits; -	unsigned int back_pitch; -	unsigned int depth_pitch; -	unsigned int cpp; -} drm_i830_init_t; - -/* Warning: If you change the SAREA structure you must change the Xserver - * structure as well */ - -typedef struct _drm_i830_tex_region { -	unsigned char next, prev;	/* indices to form a circular LRU  */ -	unsigned char in_use;	/* owned by a client, or free? */ -	int age;		/* tracked by clients to update local LRU's */ -} drm_i830_tex_region_t; - -typedef struct _drm_i830_sarea { -	unsigned int ContextState[I830_CTX_SETUP_SIZE]; -	unsigned int BufferState[I830_DEST_SETUP_SIZE]; -	unsigned int TexState[I830_TEXTURE_COUNT][I830_TEX_SETUP_SIZE]; -	unsigned int TexBlendState[I830_TEXBLEND_COUNT][I830_TEXBLEND_SIZE]; -	unsigned int TexBlendStateWordsUsed[I830_TEXBLEND_COUNT]; -	unsigned int Palette[2][256]; -	unsigned int dirty; - -	unsigned int nbox; -	struct drm_clip_rect boxes[I830_NR_SAREA_CLIPRECTS]; - -	/* Maintain an LRU of contiguous regions of texture space.  If -	 * you think you own a region of texture memory, and it has an -	 * age different to the one you set, then you are mistaken and -	 * it has been stolen by another client.  If global texAge -	 * hasn't changed, there is no need to walk the list. -	 * -	 * These regions can be used as a proxy for the fine-grained -	 * texture information of other clients - by maintaining them -	 * in the same lru which is used to age their own textures, -	 * clients have an approximate lru for the whole of global -	 * texture space, and can make informed decisions as to which -	 * areas to kick out.  There is no need to choose whether to -	 * kick out your own texture or someone else's - simply eject -	 * them all in LRU order. -	 */ - -	drm_i830_tex_region_t texList[I830_NR_TEX_REGIONS + 1]; -	/* Last elt is sentinal */ -	int texAge;		/* last time texture was uploaded */ -	int last_enqueue;	/* last time a buffer was enqueued */ -	int last_dispatch;	/* age of the most recently dispatched buffer */ -	int last_quiescent;	/*  */ -	int ctxOwner;		/* last context to upload state */ - -	int vertex_prim; - -	int pf_enabled;		/* is pageflipping allowed? */ -	int pf_active; -	int pf_current_page;	/* which buffer is being displayed? */ - -	int perf_boxes;		/* performance boxes to be displayed */ - -	/* Here's the state for texunits 2,3: -	 */ -	unsigned int TexState2[I830_TEX_SETUP_SIZE]; -	unsigned int TexBlendState2[I830_TEXBLEND_SIZE]; -	unsigned int TexBlendStateWordsUsed2; - -	unsigned int TexState3[I830_TEX_SETUP_SIZE]; -	unsigned int TexBlendState3[I830_TEXBLEND_SIZE]; -	unsigned int TexBlendStateWordsUsed3; - -	unsigned int StippleState[I830_STP_SETUP_SIZE]; -} drm_i830_sarea_t; - -/* Flags for perf_boxes - */ -#define I830_BOX_RING_EMPTY    0x1	/* populated by kernel */ -#define I830_BOX_FLIP          0x2	/* populated by kernel */ -#define I830_BOX_WAIT          0x4	/* populated by kernel & client */ -#define I830_BOX_TEXTURE_LOAD  0x8	/* populated by kernel */ -#define I830_BOX_LOST_CONTEXT  0x10	/* populated by client */ - -/* I830 specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_I830_INIT	0x00 -#define DRM_I830_VERTEX	0x01 -#define DRM_I830_CLEAR	0x02 -#define DRM_I830_FLUSH	0x03 -#define DRM_I830_GETAGE	0x04 -#define DRM_I830_GETBUF	0x05 -#define DRM_I830_SWAP	0x06 -#define DRM_I830_COPY	0x07 -#define DRM_I830_DOCOPY	0x08 -#define DRM_I830_FLIP	0x09 -#define DRM_I830_IRQ_EMIT	0x0a -#define DRM_I830_IRQ_WAIT	0x0b -#define DRM_I830_GETPARAM	0x0c -#define DRM_I830_SETPARAM	0x0d - -#define DRM_IOCTL_I830_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I830_INIT, drm_i830_init_t) -#define DRM_IOCTL_I830_VERTEX		DRM_IOW( DRM_COMMAND_BASE + DRM_I830_VERTEX, drm_i830_vertex_t) -#define DRM_IOCTL_I830_CLEAR		DRM_IOW( DRM_COMMAND_BASE + DRM_I830_CLEAR, drm_i830_clear_t) -#define DRM_IOCTL_I830_FLUSH		DRM_IO ( DRM_COMMAND_BASE + DRM_I830_FLUSH) -#define DRM_IOCTL_I830_GETAGE		DRM_IO ( DRM_COMMAND_BASE + DRM_I830_GETAGE) -#define DRM_IOCTL_I830_GETBUF		DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_GETBUF, drm_i830_dma_t) -#define DRM_IOCTL_I830_SWAP		DRM_IO ( DRM_COMMAND_BASE + DRM_I830_SWAP) -#define DRM_IOCTL_I830_COPY		DRM_IOW( DRM_COMMAND_BASE + DRM_I830_COPY, drm_i830_copy_t) -#define DRM_IOCTL_I830_DOCOPY		DRM_IO ( DRM_COMMAND_BASE + DRM_I830_DOCOPY) -#define DRM_IOCTL_I830_FLIP		DRM_IO ( DRM_COMMAND_BASE + DRM_I830_FLIP) -#define DRM_IOCTL_I830_IRQ_EMIT         DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_IRQ_EMIT, drm_i830_irq_emit_t) -#define DRM_IOCTL_I830_IRQ_WAIT         DRM_IOW( DRM_COMMAND_BASE + DRM_I830_IRQ_WAIT, drm_i830_irq_wait_t) -#define DRM_IOCTL_I830_GETPARAM         DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_GETPARAM, drm_i830_getparam_t) -#define DRM_IOCTL_I830_SETPARAM         DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_SETPARAM, drm_i830_setparam_t) - -typedef struct _drm_i830_clear { -	int clear_color; -	int clear_depth; -	int flags; -	unsigned int clear_colormask; -	unsigned int clear_depthmask; -} drm_i830_clear_t; - -/* These may be placeholders if we have more cliprects than - * I830_NR_SAREA_CLIPRECTS.  In that case, the client sets discard to - * false, indicating that the buffer will be dispatched again with a - * new set of cliprects. - */ -typedef struct _drm_i830_vertex { -	int idx;		/* buffer index */ -	int used;		/* nr bytes in use */ -	int discard;		/* client is finished with the buffer? */ -} drm_i830_vertex_t; - -typedef struct _drm_i830_copy_t { -	int idx;		/* buffer index */ -	int used;		/* nr bytes in use */ -	void __user *address;	/* Address to copy from */ -} drm_i830_copy_t; - -typedef struct drm_i830_dma { -	void __user *virtual; -	int request_idx; -	int request_size; -	int granted; -} drm_i830_dma_t; - -/* 1.3: Userspace can request & wait on irq's: - */ -typedef struct drm_i830_irq_emit { -	int __user *irq_seq; -} drm_i830_irq_emit_t; - -typedef struct drm_i830_irq_wait { -	int irq_seq; -} drm_i830_irq_wait_t; - -/* 1.3: New ioctl to query kernel params: - */ -#define I830_PARAM_IRQ_ACTIVE            1 - -typedef struct drm_i830_getparam { -	int param; -	int __user *value; -} drm_i830_getparam_t; - -/* 1.3: New ioctl to set kernel params: - */ -#define I830_SETPARAM_USE_MI_BATCHBUFFER_START            1 - -typedef struct drm_i830_setparam { -	int param; -	int value; -} drm_i830_setparam_t; - -#endif				/* _I830_DRM_H_ */ diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 8c641bed9bb..595f85c392a 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h @@ -23,810 +23,73 @@   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   *   */ -  #ifndef _I915_DRM_H_  #define _I915_DRM_H_ -#include "drm.h" - -/* Please note that modifications to all structs defined here are - * subject to backwards-compatibility constraints. - */ +#include <drm/i915_pciids.h> +#include <uapi/drm/i915_drm.h> -#ifdef __KERNEL__  /* For use by IPS driver */  extern unsigned long i915_read_mch_val(void);  extern bool i915_gpu_raise(void);  extern bool i915_gpu_lower(void);  extern bool i915_gpu_busy(void);  extern bool i915_gpu_turbo_disable(void); -#endif - -/* Each region is a minimum of 16k, and there are at most 255 of them. - */ -#define I915_NR_TEX_REGIONS 255	/* table size 2k - maximum due to use -				 * of chars for next/prev indices */ -#define I915_LOG_MIN_TEX_REGION_SIZE 14 - -typedef struct _drm_i915_init { -	enum { -		I915_INIT_DMA = 0x01, -		I915_CLEANUP_DMA = 0x02, -		I915_RESUME_DMA = 0x03 -	} func; -	unsigned int mmio_offset; -	int sarea_priv_offset; -	unsigned int ring_start; -	unsigned int ring_end; -	unsigned int ring_size; -	unsigned int front_offset; -	unsigned int back_offset; -	unsigned int depth_offset; -	unsigned int w; -	unsigned int h; -	unsigned int pitch; -	unsigned int pitch_bits; -	unsigned int back_pitch; -	unsigned int depth_pitch; -	unsigned int cpp; -	unsigned int chipset; -} drm_i915_init_t; - -typedef struct _drm_i915_sarea { -	struct drm_tex_region texList[I915_NR_TEX_REGIONS + 1]; -	int last_upload;	/* last time texture was uploaded */ -	int last_enqueue;	/* last time a buffer was enqueued */ -	int last_dispatch;	/* age of the most recently dispatched buffer */ -	int ctxOwner;		/* last context to upload state */ -	int texAge; -	int pf_enabled;		/* is pageflipping allowed? */ -	int pf_active; -	int pf_current_page;	/* which buffer is being displayed? */ -	int perf_boxes;		/* performance boxes to be displayed */ -	int width, height;      /* screen size in pixels */ - -	drm_handle_t front_handle; -	int front_offset; -	int front_size; - -	drm_handle_t back_handle; -	int back_offset; -	int back_size; - -	drm_handle_t depth_handle; -	int depth_offset; -	int depth_size; - -	drm_handle_t tex_handle; -	int tex_offset; -	int tex_size; -	int log_tex_granularity; -	int pitch; -	int rotation;           /* 0, 90, 180 or 270 */ -	int rotated_offset; -	int rotated_size; -	int rotated_pitch; -	int virtualX, virtualY; - -	unsigned int front_tiled; -	unsigned int back_tiled; -	unsigned int depth_tiled; -	unsigned int rotated_tiled; -	unsigned int rotated2_tiled; - -	int pipeA_x; -	int pipeA_y; -	int pipeA_w; -	int pipeA_h; -	int pipeB_x; -	int pipeB_y; -	int pipeB_w; -	int pipeB_h; - -	/* fill out some space for old userspace triple buffer */ -	drm_handle_t unused_handle; -	__u32 unused1, unused2, unused3; - -	/* buffer object handles for static buffers. May change -	 * over the lifetime of the client. -	 */ -	__u32 front_bo_handle; -	__u32 back_bo_handle; -	__u32 unused_bo_handle; -	__u32 depth_bo_handle; - -} drm_i915_sarea_t; - -/* due to userspace building against these headers we need some compat here */ -#define planeA_x pipeA_x -#define planeA_y pipeA_y -#define planeA_w pipeA_w -#define planeA_h pipeA_h -#define planeB_x pipeB_x -#define planeB_y pipeB_y -#define planeB_w pipeB_w -#define planeB_h pipeB_h - -/* Flags for perf_boxes - */ -#define I915_BOX_RING_EMPTY    0x1 -#define I915_BOX_FLIP          0x2 -#define I915_BOX_WAIT          0x4 -#define I915_BOX_TEXTURE_LOAD  0x8 -#define I915_BOX_LOST_CONTEXT  0x10 - -/* I915 specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_I915_INIT		0x00 -#define DRM_I915_FLUSH		0x01 -#define DRM_I915_FLIP		0x02 -#define DRM_I915_BATCHBUFFER	0x03 -#define DRM_I915_IRQ_EMIT	0x04 -#define DRM_I915_IRQ_WAIT	0x05 -#define DRM_I915_GETPARAM	0x06 -#define DRM_I915_SETPARAM	0x07 -#define DRM_I915_ALLOC		0x08 -#define DRM_I915_FREE		0x09 -#define DRM_I915_INIT_HEAP	0x0a -#define DRM_I915_CMDBUFFER	0x0b -#define DRM_I915_DESTROY_HEAP	0x0c -#define DRM_I915_SET_VBLANK_PIPE	0x0d -#define DRM_I915_GET_VBLANK_PIPE	0x0e -#define DRM_I915_VBLANK_SWAP	0x0f -#define DRM_I915_HWS_ADDR	0x11 -#define DRM_I915_GEM_INIT	0x13 -#define DRM_I915_GEM_EXECBUFFER	0x14 -#define DRM_I915_GEM_PIN	0x15 -#define DRM_I915_GEM_UNPIN	0x16 -#define DRM_I915_GEM_BUSY	0x17 -#define DRM_I915_GEM_THROTTLE	0x18 -#define DRM_I915_GEM_ENTERVT	0x19 -#define DRM_I915_GEM_LEAVEVT	0x1a -#define DRM_I915_GEM_CREATE	0x1b -#define DRM_I915_GEM_PREAD	0x1c -#define DRM_I915_GEM_PWRITE	0x1d -#define DRM_I915_GEM_MMAP	0x1e -#define DRM_I915_GEM_SET_DOMAIN	0x1f -#define DRM_I915_GEM_SW_FINISH	0x20 -#define DRM_I915_GEM_SET_TILING	0x21 -#define DRM_I915_GEM_GET_TILING	0x22 -#define DRM_I915_GEM_GET_APERTURE 0x23 -#define DRM_I915_GEM_MMAP_GTT	0x24 -#define DRM_I915_GET_PIPE_FROM_CRTC_ID	0x25 -#define DRM_I915_GEM_MADVISE	0x26 -#define DRM_I915_OVERLAY_PUT_IMAGE	0x27 -#define DRM_I915_OVERLAY_ATTRS	0x28 -#define DRM_I915_GEM_EXECBUFFER2	0x29 - -#define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) -#define DRM_IOCTL_I915_FLUSH		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) -#define DRM_IOCTL_I915_FLIP		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLIP) -#define DRM_IOCTL_I915_BATCHBUFFER	DRM_IOW( DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t) -#define DRM_IOCTL_I915_IRQ_EMIT         DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t) -#define DRM_IOCTL_I915_IRQ_WAIT         DRM_IOW( DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t) -#define DRM_IOCTL_I915_GETPARAM         DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, drm_i915_getparam_t) -#define DRM_IOCTL_I915_SETPARAM         DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SETPARAM, drm_i915_setparam_t) -#define DRM_IOCTL_I915_ALLOC            DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_ALLOC, drm_i915_mem_alloc_t) -#define DRM_IOCTL_I915_FREE             DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t) -#define DRM_IOCTL_I915_INIT_HEAP        DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t) -#define DRM_IOCTL_I915_CMDBUFFER	DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t) -#define DRM_IOCTL_I915_DESTROY_HEAP	DRM_IOW( DRM_COMMAND_BASE + DRM_I915_DESTROY_HEAP, drm_i915_mem_destroy_heap_t) -#define DRM_IOCTL_I915_SET_VBLANK_PIPE	DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) -#define DRM_IOCTL_I915_GET_VBLANK_PIPE	DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) -#define DRM_IOCTL_I915_VBLANK_SWAP	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) -#define DRM_IOCTL_I915_HWS_ADDR		DRM_IOW(DRM_COMMAND_BASE + DRM_I915_HWS_ADDR, struct drm_i915_gem_init) -#define DRM_IOCTL_I915_GEM_INIT		DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init) -#define DRM_IOCTL_I915_GEM_EXECBUFFER	DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer) -#define DRM_IOCTL_I915_GEM_EXECBUFFER2	DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2, struct drm_i915_gem_execbuffer2) -#define DRM_IOCTL_I915_GEM_PIN		DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) -#define DRM_IOCTL_I915_GEM_UNPIN	DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) -#define DRM_IOCTL_I915_GEM_BUSY		DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) -#define DRM_IOCTL_I915_GEM_THROTTLE	DRM_IO ( DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE) -#define DRM_IOCTL_I915_GEM_ENTERVT	DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT) -#define DRM_IOCTL_I915_GEM_LEAVEVT	DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT) -#define DRM_IOCTL_I915_GEM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create) -#define DRM_IOCTL_I915_GEM_PREAD	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) -#define DRM_IOCTL_I915_GEM_PWRITE	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) -#define DRM_IOCTL_I915_GEM_MMAP		DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) -#define DRM_IOCTL_I915_GEM_MMAP_GTT	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt) -#define DRM_IOCTL_I915_GEM_SET_DOMAIN	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) -#define DRM_IOCTL_I915_GEM_SW_FINISH	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) -#define DRM_IOCTL_I915_GEM_SET_TILING	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) -#define DRM_IOCTL_I915_GEM_GET_TILING	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling) -#define DRM_IOCTL_I915_GEM_GET_APERTURE	DRM_IOR  (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) -#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) -#define DRM_IOCTL_I915_GEM_MADVISE	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) -#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE	DRM_IOW(DRM_COMMAND_BASE + DRM_IOCTL_I915_OVERLAY_ATTRS, struct drm_intel_overlay_put_image) -#define DRM_IOCTL_I915_OVERLAY_ATTRS	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) - -/* Allow drivers to submit batchbuffers directly to hardware, relying - * on the security mechanisms provided by hardware. - */ -typedef struct drm_i915_batchbuffer { -	int start;		/* agp offset */ -	int used;		/* nr bytes in use */ -	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */ -	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */ -	int num_cliprects;	/* mulitpass with multiple cliprects? */ -	struct drm_clip_rect __user *cliprects;	/* pointer to userspace cliprects */ -} drm_i915_batchbuffer_t; - -/* As above, but pass a pointer to userspace buffer which can be - * validated by the kernel prior to sending to hardware. - */ -typedef struct _drm_i915_cmdbuffer { -	char __user *buf;	/* pointer to userspace command buffer */ -	int sz;			/* nr bytes in buf */ -	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */ -	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */ -	int num_cliprects;	/* mulitpass with multiple cliprects? */ -	struct drm_clip_rect __user *cliprects;	/* pointer to userspace cliprects */ -} drm_i915_cmdbuffer_t; - -/* Userspace can request & wait on irq's: - */ -typedef struct drm_i915_irq_emit { -	int __user *irq_seq; -} drm_i915_irq_emit_t; - -typedef struct drm_i915_irq_wait { -	int irq_seq; -} drm_i915_irq_wait_t; - -/* Ioctl to query kernel params: - */ -#define I915_PARAM_IRQ_ACTIVE            1 -#define I915_PARAM_ALLOW_BATCHBUFFER     2 -#define I915_PARAM_LAST_DISPATCH         3 -#define I915_PARAM_CHIPSET_ID            4 -#define I915_PARAM_HAS_GEM               5 -#define I915_PARAM_NUM_FENCES_AVAIL      6 -#define I915_PARAM_HAS_OVERLAY           7 -#define I915_PARAM_HAS_PAGEFLIPPING	 8 -#define I915_PARAM_HAS_EXECBUF2          9 -#define I915_PARAM_HAS_BSD		 10 -#define I915_PARAM_HAS_BLT		 11 - -typedef struct drm_i915_getparam { -	int param; -	int __user *value; -} drm_i915_getparam_t; - -/* Ioctl to set kernel params: - */ -#define I915_SETPARAM_USE_MI_BATCHBUFFER_START            1 -#define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY             2 -#define I915_SETPARAM_ALLOW_BATCHBUFFER                   3 -#define I915_SETPARAM_NUM_USED_FENCES                     4 - -typedef struct drm_i915_setparam { -	int param; -	int value; -} drm_i915_setparam_t; - -/* A memory manager for regions of shared memory: - */ -#define I915_MEM_REGION_AGP 1 - -typedef struct drm_i915_mem_alloc { -	int region; -	int alignment; -	int size; -	int __user *region_offset;	/* offset from start of fb or agp */ -} drm_i915_mem_alloc_t; - -typedef struct drm_i915_mem_free { -	int region; -	int region_offset; -} drm_i915_mem_free_t; - -typedef struct drm_i915_mem_init_heap { -	int region; -	int size; -	int start; -} drm_i915_mem_init_heap_t; - -/* Allow memory manager to be torn down and re-initialized (eg on - * rotate): - */ -typedef struct drm_i915_mem_destroy_heap { -	int region; -} drm_i915_mem_destroy_heap_t; - -/* Allow X server to configure which pipes to monitor for vblank signals - */ -#define	DRM_I915_VBLANK_PIPE_A	1 -#define	DRM_I915_VBLANK_PIPE_B	2 - -typedef struct drm_i915_vblank_pipe { -	int pipe; -} drm_i915_vblank_pipe_t; - -/* Schedule buffer swap at given vertical blank: - */ -typedef struct drm_i915_vblank_swap { -	drm_drawable_t drawable; -	enum drm_vblank_seq_type seqtype; -	unsigned int sequence; -} drm_i915_vblank_swap_t; - -typedef struct drm_i915_hws_addr { -	__u64 addr; -} drm_i915_hws_addr_t; - -struct drm_i915_gem_init { -	/** -	 * Beginning offset in the GTT to be managed by the DRM memory -	 * manager. -	 */ -	__u64 gtt_start; -	/** -	 * Ending offset in the GTT to be managed by the DRM memory -	 * manager. -	 */ -	__u64 gtt_end; -}; - -struct drm_i915_gem_create { -	/** -	 * Requested size for the object. -	 * -	 * The (page-aligned) allocated size for the object will be returned. -	 */ -	__u64 size; -	/** -	 * Returned handle for the object. -	 * -	 * Object handles are nonzero. -	 */ -	__u32 handle; -	__u32 pad; -}; - -struct drm_i915_gem_pread { -	/** Handle for the object being read. */ -	__u32 handle; -	__u32 pad; -	/** Offset into the object to read from */ -	__u64 offset; -	/** Length of data to read */ -	__u64 size; -	/** -	 * Pointer to write the data into. -	 * -	 * This is a fixed-size type for 32/64 compatibility. -	 */ -	__u64 data_ptr; -}; - -struct drm_i915_gem_pwrite { -	/** Handle for the object being written to. */ -	__u32 handle; -	__u32 pad; -	/** Offset into the object to write to */ -	__u64 offset; -	/** Length of data to write */ -	__u64 size; -	/** -	 * Pointer to read the data from. -	 * -	 * This is a fixed-size type for 32/64 compatibility. -	 */ -	__u64 data_ptr; -}; - -struct drm_i915_gem_mmap { -	/** Handle for the object being mapped. */ -	__u32 handle; -	__u32 pad; -	/** Offset in the object to map. */ -	__u64 offset; -	/** -	 * Length of data to map. -	 * -	 * The value will be page-aligned. -	 */ -	__u64 size; -	/** -	 * Returned pointer the data was mapped at. -	 * -	 * This is a fixed-size type for 32/64 compatibility. -	 */ -	__u64 addr_ptr; -}; - -struct drm_i915_gem_mmap_gtt { -	/** Handle for the object being mapped. */ -	__u32 handle; -	__u32 pad; -	/** -	 * Fake offset to use for subsequent mmap call -	 * -	 * This is a fixed-size type for 32/64 compatibility. -	 */ -	__u64 offset; -}; -struct drm_i915_gem_set_domain { -	/** Handle for the object */ -	__u32 handle; - -	/** New read domains */ -	__u32 read_domains; - -	/** New write domain */ -	__u32 write_domain; -}; - -struct drm_i915_gem_sw_finish { -	/** Handle for the object */ -	__u32 handle; -}; - -struct drm_i915_gem_relocation_entry { -	/** -	 * Handle of the buffer being pointed to by this relocation entry. -	 * -	 * It's appealing to make this be an index into the mm_validate_entry -	 * list to refer to the buffer, but this allows the driver to create -	 * a relocation list for state buffers and not re-write it per -	 * exec using the buffer. -	 */ -	__u32 target_handle; - -	/** -	 * Value to be added to the offset of the target buffer to make up -	 * the relocation entry. -	 */ -	__u32 delta; - -	/** Offset in the buffer the relocation entry will be written into */ -	__u64 offset; - -	/** -	 * Offset value of the target buffer that the relocation entry was last -	 * written as. -	 * -	 * If the buffer has the same offset as last time, we can skip syncing -	 * and writing the relocation.  This value is written back out by -	 * the execbuffer ioctl when the relocation is written. -	 */ -	__u64 presumed_offset; - -	/** -	 * Target memory domains read by this operation. -	 */ -	__u32 read_domains; - -	/** -	 * Target memory domains written by this operation. -	 * -	 * Note that only one domain may be written by the whole -	 * execbuffer operation, so that where there are conflicts, -	 * the application will get -EINVAL back. -	 */ -	__u32 write_domain; -}; - -/** @{ - * Intel memory domains - * - * Most of these just align with the various caches in - * the system and are used to flush and invalidate as - * objects end up cached in different domains. +/* + * The Bridge device's PCI config space has information about the + * fb aperture size and the amount of pre-reserved memory. + * This is all handled in the intel-gtt.ko module. i915.ko only + * cares about the vga bit for the vga rbiter.   */ -/** CPU cache */ -#define I915_GEM_DOMAIN_CPU		0x00000001 -/** Render cache, used by 2D and 3D drawing */ -#define I915_GEM_DOMAIN_RENDER		0x00000002 -/** Sampler cache, used by texture engine */ -#define I915_GEM_DOMAIN_SAMPLER		0x00000004 -/** Command queue, used to load batch buffers */ -#define I915_GEM_DOMAIN_COMMAND		0x00000008 -/** Instruction cache, used by shader programs */ -#define I915_GEM_DOMAIN_INSTRUCTION	0x00000010 -/** Vertex address cache */ -#define I915_GEM_DOMAIN_VERTEX		0x00000020 -/** GTT domain - aperture and scanout */ -#define I915_GEM_DOMAIN_GTT		0x00000040 -/** @} */ - -struct drm_i915_gem_exec_object { -	/** -	 * User's handle for a buffer to be bound into the GTT for this -	 * operation. -	 */ -	__u32 handle; - -	/** Number of relocations to be performed on this buffer */ -	__u32 relocation_count; -	/** -	 * Pointer to array of struct drm_i915_gem_relocation_entry containing -	 * the relocations to be performed in this buffer. -	 */ -	__u64 relocs_ptr; - -	/** Required alignment in graphics aperture */ -	__u64 alignment; - -	/** -	 * Returned value of the updated offset of the object, for future -	 * presumed_offset writes. -	 */ -	__u64 offset; -}; - -struct drm_i915_gem_execbuffer { -	/** -	 * List of buffers to be validated with their relocations to be -	 * performend on them. -	 * -	 * This is a pointer to an array of struct drm_i915_gem_validate_entry. -	 * -	 * These buffers must be listed in an order such that all relocations -	 * a buffer is performing refer to buffers that have already appeared -	 * in the validate list. -	 */ -	__u64 buffers_ptr; -	__u32 buffer_count; - -	/** Offset in the batchbuffer to start execution from. */ -	__u32 batch_start_offset; -	/** Bytes used in batchbuffer from batch_start_offset */ -	__u32 batch_len; -	__u32 DR1; -	__u32 DR4; -	__u32 num_cliprects; -	/** This is a struct drm_clip_rect *cliprects */ -	__u64 cliprects_ptr; -}; - -struct drm_i915_gem_exec_object2 { -	/** -	 * User's handle for a buffer to be bound into the GTT for this -	 * operation. -	 */ -	__u32 handle; - -	/** Number of relocations to be performed on this buffer */ -	__u32 relocation_count; -	/** -	 * Pointer to array of struct drm_i915_gem_relocation_entry containing -	 * the relocations to be performed in this buffer. -	 */ -	__u64 relocs_ptr; - -	/** Required alignment in graphics aperture */ -	__u64 alignment; - -	/** -	 * Returned value of the updated offset of the object, for future -	 * presumed_offset writes. -	 */ -	__u64 offset; - -#define EXEC_OBJECT_NEEDS_FENCE (1<<0) -	__u64 flags; -	__u64 rsvd1; -	__u64 rsvd2; -}; - -struct drm_i915_gem_execbuffer2 { -	/** -	 * List of gem_exec_object2 structs -	 */ -	__u64 buffers_ptr; -	__u32 buffer_count; - -	/** Offset in the batchbuffer to start execution from. */ -	__u32 batch_start_offset; -	/** Bytes used in batchbuffer from batch_start_offset */ -	__u32 batch_len; -	__u32 DR1; -	__u32 DR4; -	__u32 num_cliprects; -	/** This is a struct drm_clip_rect *cliprects */ -	__u64 cliprects_ptr; -#define I915_EXEC_RING_MASK              (7<<0) -#define I915_EXEC_DEFAULT                (0<<0) -#define I915_EXEC_RENDER                 (1<<0) -#define I915_EXEC_BSD                    (2<<0) -#define I915_EXEC_BLT                    (3<<0) -	__u64 flags; -	__u64 rsvd1; -	__u64 rsvd2; -}; - -struct drm_i915_gem_pin { -	/** Handle of the buffer to be pinned. */ -	__u32 handle; -	__u32 pad; - -	/** alignment required within the aperture */ -	__u64 alignment; - -	/** Returned GTT offset of the buffer. */ -	__u64 offset; -}; - -struct drm_i915_gem_unpin { -	/** Handle of the buffer to be unpinned. */ -	__u32 handle; -	__u32 pad; -}; - -struct drm_i915_gem_busy { -	/** Handle of the buffer to check for busy */ -	__u32 handle; - -	/** Return busy status (1 if busy, 0 if idle) */ -	__u32 busy; -}; - -#define I915_TILING_NONE	0 -#define I915_TILING_X		1 -#define I915_TILING_Y		2 - -#define I915_BIT_6_SWIZZLE_NONE		0 -#define I915_BIT_6_SWIZZLE_9		1 -#define I915_BIT_6_SWIZZLE_9_10		2 -#define I915_BIT_6_SWIZZLE_9_11		3 -#define I915_BIT_6_SWIZZLE_9_10_11	4 -/* Not seen by userland */ -#define I915_BIT_6_SWIZZLE_UNKNOWN	5 -/* Seen by userland. */ -#define I915_BIT_6_SWIZZLE_9_17		6 -#define I915_BIT_6_SWIZZLE_9_10_17	7 - -struct drm_i915_gem_set_tiling { -	/** Handle of the buffer to have its tiling state updated */ -	__u32 handle; - -	/** -	 * Tiling mode for the object (I915_TILING_NONE, I915_TILING_X, -	 * I915_TILING_Y). -	 * -	 * This value is to be set on request, and will be updated by the -	 * kernel on successful return with the actual chosen tiling layout. -	 * -	 * The tiling mode may be demoted to I915_TILING_NONE when the system -	 * has bit 6 swizzling that can't be managed correctly by GEM. -	 * -	 * Buffer contents become undefined when changing tiling_mode. -	 */ -	__u32 tiling_mode; - -	/** -	 * Stride in bytes for the object when in I915_TILING_X or -	 * I915_TILING_Y. -	 */ -	__u32 stride; - -	/** -	 * Returned address bit 6 swizzling required for CPU access through -	 * mmap mapping. -	 */ -	__u32 swizzle_mode; -}; - -struct drm_i915_gem_get_tiling { -	/** Handle of the buffer to get tiling state for. */ -	__u32 handle; - -	/** -	 * Current tiling mode for the object (I915_TILING_NONE, I915_TILING_X, -	 * I915_TILING_Y). -	 */ -	__u32 tiling_mode; - -	/** -	 * Returned address bit 6 swizzling required for CPU access through -	 * mmap mapping. -	 */ -	__u32 swizzle_mode; -}; - -struct drm_i915_gem_get_aperture { -	/** Total size of the aperture used by i915_gem_execbuffer, in bytes */ -	__u64 aper_size; - -	/** -	 * Available space in the aperture used by i915_gem_execbuffer, in -	 * bytes -	 */ -	__u64 aper_available_size; -}; - -struct drm_i915_get_pipe_from_crtc_id { -	/** ID of CRTC being requested **/ -	__u32 crtc_id; - -	/** pipe of requested CRTC **/ -	__u32 pipe; -}; - -#define I915_MADV_WILLNEED 0 -#define I915_MADV_DONTNEED 1 -#define __I915_MADV_PURGED 2 /* internal state */ - -struct drm_i915_gem_madvise { -	/** Handle of the buffer to change the backing store advice */ -	__u32 handle; - -	/* Advice: either the buffer will be needed again in the near future, -	 *         or wont be and could be discarded under memory pressure. -	 */ -	__u32 madv; - -	/** Whether the backing store still exists. */ -	__u32 retained; -}; - -/* flags */ -#define I915_OVERLAY_TYPE_MASK 		0xff -#define I915_OVERLAY_YUV_PLANAR 	0x01 -#define I915_OVERLAY_YUV_PACKED 	0x02 -#define I915_OVERLAY_RGB		0x03 - -#define I915_OVERLAY_DEPTH_MASK		0xff00 -#define I915_OVERLAY_RGB24		0x1000 -#define I915_OVERLAY_RGB16		0x2000 -#define I915_OVERLAY_RGB15		0x3000 -#define I915_OVERLAY_YUV422		0x0100 -#define I915_OVERLAY_YUV411		0x0200 -#define I915_OVERLAY_YUV420		0x0300 -#define I915_OVERLAY_YUV410		0x0400 - -#define I915_OVERLAY_SWAP_MASK		0xff0000 -#define I915_OVERLAY_NO_SWAP		0x000000 -#define I915_OVERLAY_UV_SWAP		0x010000 -#define I915_OVERLAY_Y_SWAP		0x020000 -#define I915_OVERLAY_Y_AND_UV_SWAP	0x030000 - -#define I915_OVERLAY_FLAGS_MASK		0xff000000 -#define I915_OVERLAY_ENABLE		0x01000000 - -struct drm_intel_overlay_put_image { -	/* various flags and src format description */ -	__u32 flags; -	/* source picture description */ -	__u32 bo_handle; -	/* stride values and offsets are in bytes, buffer relative */ -	__u16 stride_Y; /* stride for packed formats */ -	__u16 stride_UV; -	__u32 offset_Y; /* offset for packet formats */ -	__u32 offset_U; -	__u32 offset_V; -	/* in pixels */ -	__u16 src_width; -	__u16 src_height; -	/* to compensate the scaling factors for partially covered surfaces */ -	__u16 src_scan_width; -	__u16 src_scan_height; -	/* output crtc description */ -	__u32 crtc_id; -	__u16 dst_x; -	__u16 dst_y; -	__u16 dst_width; -	__u16 dst_height; -}; - -/* flags */ -#define I915_OVERLAY_UPDATE_ATTRS	(1<<0) -#define I915_OVERLAY_UPDATE_GAMMA	(1<<1) -struct drm_intel_overlay_attrs { -	__u32 flags; -	__u32 color_key; -	__s32 brightness; -	__u32 contrast; -	__u32 saturation; -	__u32 gamma0; -	__u32 gamma1; -	__u32 gamma2; -	__u32 gamma3; -	__u32 gamma4; -	__u32 gamma5; -}; +#define INTEL_GMCH_CTRL		0x52 +#define INTEL_GMCH_VGA_DISABLE  (1 << 1) +#define SNB_GMCH_CTRL		0x50 +#define    SNB_GMCH_GGMS_SHIFT	8 /* GTT Graphics Memory Size */ +#define    SNB_GMCH_GGMS_MASK	0x3 +#define    SNB_GMCH_GMS_SHIFT   3 /* Graphics Mode Select */ +#define    SNB_GMCH_GMS_MASK    0x1f +#define    BDW_GMCH_GGMS_SHIFT	6 +#define    BDW_GMCH_GGMS_MASK	0x3 +#define    BDW_GMCH_GMS_SHIFT   8 +#define    BDW_GMCH_GMS_MASK    0xff + +#define I830_GMCH_CTRL			0x52 + +#define I830_GMCH_GMS_MASK		0x70 +#define I830_GMCH_GMS_LOCAL		0x10 +#define I830_GMCH_GMS_STOLEN_512	0x20 +#define I830_GMCH_GMS_STOLEN_1024	0x30 +#define I830_GMCH_GMS_STOLEN_8192	0x40 + +#define I855_GMCH_GMS_MASK		0xF0 +#define I855_GMCH_GMS_STOLEN_0M		0x0 +#define I855_GMCH_GMS_STOLEN_1M		(0x1 << 4) +#define I855_GMCH_GMS_STOLEN_4M		(0x2 << 4) +#define I855_GMCH_GMS_STOLEN_8M		(0x3 << 4) +#define I855_GMCH_GMS_STOLEN_16M	(0x4 << 4) +#define I855_GMCH_GMS_STOLEN_32M	(0x5 << 4) +#define I915_GMCH_GMS_STOLEN_48M	(0x6 << 4) +#define I915_GMCH_GMS_STOLEN_64M	(0x7 << 4) +#define G33_GMCH_GMS_STOLEN_128M	(0x8 << 4) +#define G33_GMCH_GMS_STOLEN_256M	(0x9 << 4) +#define INTEL_GMCH_GMS_STOLEN_96M	(0xa << 4) +#define INTEL_GMCH_GMS_STOLEN_160M	(0xb << 4) +#define INTEL_GMCH_GMS_STOLEN_224M	(0xc << 4) +#define INTEL_GMCH_GMS_STOLEN_352M	(0xd << 4) + +#define I830_DRB3		0x63 +#define I85X_DRB3		0x43 +#define I865_TOUD		0xc4 + +#define I830_ESMRAMC		0x91 +#define I845_ESMRAMC		0x9e +#define I85X_ESMRAMC		0x61 +#define    TSEG_ENABLE		(1 << 0) +#define    I830_TSEG_SIZE_512K	(0 << 1) +#define    I830_TSEG_SIZE_1M	(1 << 1) +#define    I845_TSEG_SIZE_MASK	(3 << 1) +#define    I845_TSEG_SIZE_512K	(2 << 1) +#define    I845_TSEG_SIZE_1M	(3 << 1)  #endif				/* _I915_DRM_H_ */ diff --git a/include/drm/i915_pciids.h b/include/drm/i915_pciids.h new file mode 100644 index 00000000000..a70d4564789 --- /dev/null +++ b/include/drm/i915_pciids.h @@ -0,0 +1,262 @@ +/* + * Copyright 2013 Intel Corporation + * All Rights Reserved. + * + * 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, sub license, 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 + * THE AUTHORS OR COPYRIGHT HOLDERS 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 _I915_PCIIDS_H +#define _I915_PCIIDS_H + +/* + * A pci_device_id struct { + *	__u32 vendor, device; + *      __u32 subvendor, subdevice; + *	__u32 class, class_mask; + *	kernel_ulong_t driver_data; + * }; + * Don't use C99 here because "class" is reserved and we want to + * give userspace flexibility. + */ +#define INTEL_VGA_DEVICE(id, info) {		\ +	0x8086,	id,				\ +	~0, ~0,					\ +	0x030000, 0xff0000,			\ +	(unsigned long) info } + +#define INTEL_QUANTA_VGA_DEVICE(info) {		\ +	0x8086,	0x16a,				\ +	0x152d,	0x8990,				\ +	0x030000, 0xff0000,			\ +	(unsigned long) info } + +#define INTEL_I830_IDS(info)				\ +	INTEL_VGA_DEVICE(0x3577, info) + +#define INTEL_I845G_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2562, info) + +#define INTEL_I85X_IDS(info)				\ +	INTEL_VGA_DEVICE(0x3582, info), /* I855_GM */ \ +	INTEL_VGA_DEVICE(0x358e, info) + +#define INTEL_I865G_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2572, info) /* I865_G */ + +#define INTEL_I915G_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2582, info), /* I915_G */ \ +	INTEL_VGA_DEVICE(0x258a, info)  /* E7221_G */ + +#define INTEL_I915GM_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2592, info) /* I915_GM */ + +#define INTEL_I945G_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2772, info) /* I945_G */ + +#define INTEL_I945GM_IDS(info)				\ +	INTEL_VGA_DEVICE(0x27a2, info), /* I945_GM */ \ +	INTEL_VGA_DEVICE(0x27ae, info)  /* I945_GME */ + +#define INTEL_I965G_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2972, info), /* I946_GZ */	\ +	INTEL_VGA_DEVICE(0x2982, info),	/* G35_G */	\ +	INTEL_VGA_DEVICE(0x2992, info),	/* I965_Q */	\ +	INTEL_VGA_DEVICE(0x29a2, info)	/* I965_G */ + +#define INTEL_G33_IDS(info)				\ +	INTEL_VGA_DEVICE(0x29b2, info), /* Q35_G */ \ +	INTEL_VGA_DEVICE(0x29c2, info),	/* G33_G */ \ +	INTEL_VGA_DEVICE(0x29d2, info)	/* Q33_G */ + +#define INTEL_I965GM_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2a02, info),	/* I965_GM */ \ +	INTEL_VGA_DEVICE(0x2a12, info)  /* I965_GME */ + +#define INTEL_GM45_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2a42, info) /* GM45_G */ + +#define INTEL_G45_IDS(info)				\ +	INTEL_VGA_DEVICE(0x2e02, info), /* IGD_E_G */ \ +	INTEL_VGA_DEVICE(0x2e12, info), /* Q45_G */ \ +	INTEL_VGA_DEVICE(0x2e22, info), /* G45_G */ \ +	INTEL_VGA_DEVICE(0x2e32, info), /* G41_G */ \ +	INTEL_VGA_DEVICE(0x2e42, info), /* B43_G */ \ +	INTEL_VGA_DEVICE(0x2e92, info)	/* B43_G.1 */ + +#define INTEL_PINEVIEW_IDS(info)			\ +	INTEL_VGA_DEVICE(0xa001, info),			\ +	INTEL_VGA_DEVICE(0xa011, info) + +#define INTEL_IRONLAKE_D_IDS(info) \ +	INTEL_VGA_DEVICE(0x0042, info) + +#define INTEL_IRONLAKE_M_IDS(info) \ +	INTEL_VGA_DEVICE(0x0046, info) + +#define INTEL_SNB_D_IDS(info) \ +	INTEL_VGA_DEVICE(0x0102, info), \ +	INTEL_VGA_DEVICE(0x0112, info), \ +	INTEL_VGA_DEVICE(0x0122, info), \ +	INTEL_VGA_DEVICE(0x010A, info) + +#define INTEL_SNB_M_IDS(info) \ +	INTEL_VGA_DEVICE(0x0106, info), \ +	INTEL_VGA_DEVICE(0x0116, info), \ +	INTEL_VGA_DEVICE(0x0126, info) + +#define INTEL_IVB_M_IDS(info) \ +	INTEL_VGA_DEVICE(0x0156, info), /* GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0166, info)  /* GT2 mobile */ + +#define INTEL_IVB_D_IDS(info) \ +	INTEL_VGA_DEVICE(0x0152, info), /* GT1 desktop */ \ +	INTEL_VGA_DEVICE(0x0162, info), /* GT2 desktop */ \ +	INTEL_VGA_DEVICE(0x015a, info), /* GT1 server */ \ +	INTEL_VGA_DEVICE(0x016a, info)  /* GT2 server */ + +#define INTEL_IVB_Q_IDS(info) \ +	INTEL_QUANTA_VGA_DEVICE(info) /* Quanta transcode */ + +#define INTEL_HSW_D_IDS(info) \ +	INTEL_VGA_DEVICE(0x0402, info), /* GT1 desktop */ \ +	INTEL_VGA_DEVICE(0x0412, info), /* GT2 desktop */ \ +	INTEL_VGA_DEVICE(0x0422, info), /* GT3 desktop */ \ +	INTEL_VGA_DEVICE(0x040a, info), /* GT1 server */ \ +	INTEL_VGA_DEVICE(0x041a, info), /* GT2 server */ \ +	INTEL_VGA_DEVICE(0x042a, info), /* GT3 server */ \ +	INTEL_VGA_DEVICE(0x040B, info), /* GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x041B, info), /* GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x042B, info), /* GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x040E, info), /* GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x041E, info), /* GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x042E, info), /* GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0C02, info), /* SDV GT1 desktop */ \ +	INTEL_VGA_DEVICE(0x0C12, info), /* SDV GT2 desktop */ \ +	INTEL_VGA_DEVICE(0x0C22, info), /* SDV GT3 desktop */ \ +	INTEL_VGA_DEVICE(0x0C0A, info), /* SDV GT1 server */ \ +	INTEL_VGA_DEVICE(0x0C1A, info), /* SDV GT2 server */ \ +	INTEL_VGA_DEVICE(0x0C2A, info), /* SDV GT3 server */ \ +	INTEL_VGA_DEVICE(0x0C0B, info), /* SDV GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x0C1B, info), /* SDV GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x0C2B, info), /* SDV GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0C0E, info), /* SDV GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x0C1E, info), /* SDV GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x0C2E, info), /* SDV GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0A02, info), /* ULT GT1 desktop */ \ +	INTEL_VGA_DEVICE(0x0A12, info), /* ULT GT2 desktop */ \ +	INTEL_VGA_DEVICE(0x0A22, info), /* ULT GT3 desktop */ \ +	INTEL_VGA_DEVICE(0x0A0A, info), /* ULT GT1 server */ \ +	INTEL_VGA_DEVICE(0x0A1A, info), /* ULT GT2 server */ \ +	INTEL_VGA_DEVICE(0x0A2A, info), /* ULT GT3 server */ \ +	INTEL_VGA_DEVICE(0x0A0B, info), /* ULT GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x0A1B, info), /* ULT GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x0A2B, info), /* ULT GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0D02, info), /* CRW GT1 desktop */ \ +	INTEL_VGA_DEVICE(0x0D12, info), /* CRW GT2 desktop */ \ +	INTEL_VGA_DEVICE(0x0D22, info), /* CRW GT3 desktop */ \ +	INTEL_VGA_DEVICE(0x0D0A, info), /* CRW GT1 server */ \ +	INTEL_VGA_DEVICE(0x0D1A, info), /* CRW GT2 server */ \ +	INTEL_VGA_DEVICE(0x0D2A, info), /* CRW GT3 server */ \ +	INTEL_VGA_DEVICE(0x0D0B, info), /* CRW GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x0D1B, info), /* CRW GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x0D2B, info), /* CRW GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0D0E, info), /* CRW GT1 reserved */ \ +	INTEL_VGA_DEVICE(0x0D1E, info), /* CRW GT2 reserved */ \ +	INTEL_VGA_DEVICE(0x0D2E, info)  /* CRW GT3 reserved */ \ + +#define INTEL_HSW_M_IDS(info) \ +	INTEL_VGA_DEVICE(0x0406, info), /* GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0416, info), /* GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0426, info), /* GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0C06, info), /* SDV GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0C16, info), /* SDV GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0C26, info), /* SDV GT3 mobile */ \ +	INTEL_VGA_DEVICE(0x0A06, info), /* ULT GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0A16, info), /* ULT GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0A26, info), /* ULT GT3 mobile */ \ +	INTEL_VGA_DEVICE(0x0A0E, info), /* ULX GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0A1E, info), /* ULX GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0A2E, info), /* ULT GT3 reserved */ \ +	INTEL_VGA_DEVICE(0x0D06, info), /* CRW GT1 mobile */ \ +	INTEL_VGA_DEVICE(0x0D16, info), /* CRW GT2 mobile */ \ +	INTEL_VGA_DEVICE(0x0D26, info)  /* CRW GT3 mobile */ + +#define INTEL_VLV_M_IDS(info) \ +	INTEL_VGA_DEVICE(0x0f30, info), \ +	INTEL_VGA_DEVICE(0x0f31, info), \ +	INTEL_VGA_DEVICE(0x0f32, info), \ +	INTEL_VGA_DEVICE(0x0f33, info), \ +	INTEL_VGA_DEVICE(0x0157, info) + +#define INTEL_VLV_D_IDS(info) \ +	INTEL_VGA_DEVICE(0x0155, info) + +#define _INTEL_BDW_M(gt, id, info) \ +	INTEL_VGA_DEVICE((((gt) - 1) << 4) | (id), info) +#define _INTEL_BDW_D(gt, id, info) \ +	INTEL_VGA_DEVICE((((gt) - 1) << 4) | (id), info) + +#define _INTEL_BDW_M_IDS(gt, info) \ +	_INTEL_BDW_M(gt, 0x1602, info), /* ULT */ \ +	_INTEL_BDW_M(gt, 0x1606, info), /* ULT */ \ +	_INTEL_BDW_M(gt, 0x160B, info), /* Iris */ \ +	_INTEL_BDW_M(gt, 0x160E, info) /* ULX */ + +#define _INTEL_BDW_D_IDS(gt, info) \ +	_INTEL_BDW_D(gt, 0x160A, info), /* Server */ \ +	_INTEL_BDW_D(gt, 0x160D, info) /* Workstation */ + +#define INTEL_BDW_GT12M_IDS(info) \ +	_INTEL_BDW_M_IDS(1, info), \ +	_INTEL_BDW_M_IDS(2, info) + +#define INTEL_BDW_GT12D_IDS(info) \ +	_INTEL_BDW_D_IDS(1, info), \ +	_INTEL_BDW_D_IDS(2, info) + +#define INTEL_BDW_GT3M_IDS(info) \ +	_INTEL_BDW_M_IDS(3, info) + +#define INTEL_BDW_GT3D_IDS(info) \ +	_INTEL_BDW_D_IDS(3, info) + +#define INTEL_BDW_RSVDM_IDS(info) \ +	_INTEL_BDW_M_IDS(4, info) + +#define INTEL_BDW_RSVDD_IDS(info) \ +	_INTEL_BDW_D_IDS(4, info) + +#define INTEL_BDW_M_IDS(info) \ +	INTEL_BDW_GT12M_IDS(info), \ +	INTEL_BDW_GT3M_IDS(info), \ +	INTEL_BDW_RSVDM_IDS(info) + +#define INTEL_BDW_D_IDS(info) \ +	INTEL_BDW_GT12D_IDS(info), \ +	INTEL_BDW_GT3D_IDS(info), \ +	INTEL_BDW_RSVDD_IDS(info) + +#define INTEL_CHV_IDS(info) \ +	INTEL_VGA_DEVICE(0x22b0, info), \ +	INTEL_VGA_DEVICE(0x22b1, info), \ +	INTEL_VGA_DEVICE(0x22b2, info), \ +	INTEL_VGA_DEVICE(0x22b3, info) + +#endif /* _I915_PCIIDS_H */ diff --git a/include/drm/i915_powerwell.h b/include/drm/i915_powerwell.h new file mode 100644 index 00000000000..baa6f11b183 --- /dev/null +++ b/include/drm/i915_powerwell.h @@ -0,0 +1,37 @@ +/************************************************************************** + * + * Copyright 2013 Intel Inc. + * All Rights Reserved. + * + * 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, sub license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS 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 _I915_POWERWELL_H_ +#define _I915_POWERWELL_H_ + +/* For use by hda_i915 driver */ +extern int i915_request_power_well(void); +extern int i915_release_power_well(void); +extern int i915_get_cdclk_freq(void); + +#endif				/* _I915_POWERWELL_H_ */ diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h index d3c81946f61..b08bdade600 100644 --- a/include/drm/intel-gtt.h +++ b/include/drm/intel-gtt.h @@ -2,17 +2,31 @@  #ifndef _DRM_INTEL_GTT_H  #define	_DRM_INTEL_GTT_H -struct intel_gtt { -	/* Number of stolen gtt entries at the beginning. */ -	unsigned int gtt_stolen_entries; -	/* Total number of gtt entries. */ -	unsigned int gtt_total_entries; -	/* Part of the gtt that is mappable by the cpu, for those chips where -	 * this is not the full gtt. */ -	unsigned int gtt_mappable_entries; -}; - -struct intel_gtt *intel_gtt_get(void); +void intel_gtt_get(size_t *gtt_total, size_t *stolen_size, +		   phys_addr_t *mappable_base, unsigned long *mappable_end); + +int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, +		     struct agp_bridge_data *bridge); +void intel_gmch_remove(void); + +bool intel_enable_gtt(void); + +void intel_gtt_chipset_flush(void); +void intel_gtt_insert_sg_entries(struct sg_table *st, +				 unsigned int pg_start, +				 unsigned int flags); +void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries); + +/* Special gtt memory types */ +#define AGP_DCACHE_MEMORY	1 +#define AGP_PHYS_MEMORY		2 + +/* flag for GFDT type */ +#define AGP_USER_CACHED_MEMORY_GFDT (1 << 3) + +#ifdef CONFIG_INTEL_IOMMU +extern int intel_iommu_gfx_mapped;  #endif +#endif diff --git a/include/drm/mga_drm.h b/include/drm/mga_drm.h deleted file mode 100644 index c16097f99be..00000000000 --- a/include/drm/mga_drm.h +++ /dev/null @@ -1,419 +0,0 @@ -/* mga_drm.h -- Public header for the Matrox g200/g400 driver -*- linux-c -*- - * Created: Tue Jan 25 01:50:01 1999 by jhartmann@precisioninsight.com - * - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. - * All rights reserved. - * - * 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. - * - * Authors: - *    Jeff Hartmann <jhartmann@valinux.com> - *    Keith Whitwell <keith@tungstengraphics.com> - * - * Rewritten by: - *    Gareth Hughes <gareth@valinux.com> - */ - -#ifndef __MGA_DRM_H__ -#define __MGA_DRM_H__ - -#include "drm.h" - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the Xserver file (mga_sarea.h) - */ - -#ifndef __MGA_SAREA_DEFINES__ -#define __MGA_SAREA_DEFINES__ - -/* WARP pipe flags - */ -#define MGA_F			0x1	/* fog */ -#define MGA_A			0x2	/* alpha */ -#define MGA_S			0x4	/* specular */ -#define MGA_T2			0x8	/* multitexture */ - -#define MGA_WARP_TGZ		0 -#define MGA_WARP_TGZF		(MGA_F) -#define MGA_WARP_TGZA		(MGA_A) -#define MGA_WARP_TGZAF		(MGA_F|MGA_A) -#define MGA_WARP_TGZS		(MGA_S) -#define MGA_WARP_TGZSF		(MGA_S|MGA_F) -#define MGA_WARP_TGZSA		(MGA_S|MGA_A) -#define MGA_WARP_TGZSAF		(MGA_S|MGA_F|MGA_A) -#define MGA_WARP_T2GZ		(MGA_T2) -#define MGA_WARP_T2GZF		(MGA_T2|MGA_F) -#define MGA_WARP_T2GZA		(MGA_T2|MGA_A) -#define MGA_WARP_T2GZAF		(MGA_T2|MGA_A|MGA_F) -#define MGA_WARP_T2GZS		(MGA_T2|MGA_S) -#define MGA_WARP_T2GZSF		(MGA_T2|MGA_S|MGA_F) -#define MGA_WARP_T2GZSA		(MGA_T2|MGA_S|MGA_A) -#define MGA_WARP_T2GZSAF	(MGA_T2|MGA_S|MGA_F|MGA_A) - -#define MGA_MAX_G200_PIPES	8	/* no multitex */ -#define MGA_MAX_G400_PIPES	16 -#define MGA_MAX_WARP_PIPES	MGA_MAX_G400_PIPES -#define MGA_WARP_UCODE_SIZE	32768	/* in bytes */ - -#define MGA_CARD_TYPE_G200	1 -#define MGA_CARD_TYPE_G400	2 -#define MGA_CARD_TYPE_G450	3	/* not currently used */ -#define MGA_CARD_TYPE_G550	4 - -#define MGA_FRONT		0x1 -#define MGA_BACK		0x2 -#define MGA_DEPTH		0x4 - -/* What needs to be changed for the current vertex dma buffer? - */ -#define MGA_UPLOAD_CONTEXT	0x1 -#define MGA_UPLOAD_TEX0		0x2 -#define MGA_UPLOAD_TEX1		0x4 -#define MGA_UPLOAD_PIPE		0x8 -#define MGA_UPLOAD_TEX0IMAGE	0x10	/* handled client-side */ -#define MGA_UPLOAD_TEX1IMAGE	0x20	/* handled client-side */ -#define MGA_UPLOAD_2D		0x40 -#define MGA_WAIT_AGE		0x80	/* handled client-side */ -#define MGA_UPLOAD_CLIPRECTS	0x100	/* handled client-side */ -#if 0 -#define MGA_DMA_FLUSH		0x200	/* set when someone gets the lock -					   quiescent */ -#endif - -/* 32 buffers of 64k each, total 2 meg. - */ -#define MGA_BUFFER_SIZE		(1 << 16) -#define MGA_NUM_BUFFERS		128 - -/* Keep these small for testing. - */ -#define MGA_NR_SAREA_CLIPRECTS	8 - -/* 2 heaps (1 for card, 1 for agp), each divided into upto 128 - * regions, subject to a minimum region size of (1<<16) == 64k. - * - * Clients may subdivide regions internally, but when sharing between - * clients, the region size is the minimum granularity. - */ - -#define MGA_CARD_HEAP			0 -#define MGA_AGP_HEAP			1 -#define MGA_NR_TEX_HEAPS		2 -#define MGA_NR_TEX_REGIONS		16 -#define MGA_LOG_MIN_TEX_REGION_SIZE	16 - -#define  DRM_MGA_IDLE_RETRY          2048 - -#endif				/* __MGA_SAREA_DEFINES__ */ - -/* Setup registers for 3D context - */ -typedef struct { -	unsigned int dstorg; -	unsigned int maccess; -	unsigned int plnwt; -	unsigned int dwgctl; -	unsigned int alphactrl; -	unsigned int fogcolor; -	unsigned int wflag; -	unsigned int tdualstage0; -	unsigned int tdualstage1; -	unsigned int fcol; -	unsigned int stencil; -	unsigned int stencilctl; -} drm_mga_context_regs_t; - -/* Setup registers for 2D, X server - */ -typedef struct { -	unsigned int pitch; -} drm_mga_server_regs_t; - -/* Setup registers for each texture unit - */ -typedef struct { -	unsigned int texctl; -	unsigned int texctl2; -	unsigned int texfilter; -	unsigned int texbordercol; -	unsigned int texorg; -	unsigned int texwidth; -	unsigned int texheight; -	unsigned int texorg1; -	unsigned int texorg2; -	unsigned int texorg3; -	unsigned int texorg4; -} drm_mga_texture_regs_t; - -/* General aging mechanism - */ -typedef struct { -	unsigned int head;	/* Position of head pointer          */ -	unsigned int wrap;	/* Primary DMA wrap count            */ -} drm_mga_age_t; - -typedef struct _drm_mga_sarea { -	/* The channel for communication of state information to the kernel -	 * on firing a vertex dma buffer. -	 */ -	drm_mga_context_regs_t context_state; -	drm_mga_server_regs_t server_state; -	drm_mga_texture_regs_t tex_state[2]; -	unsigned int warp_pipe; -	unsigned int dirty; -	unsigned int vertsize; - -	/* The current cliprects, or a subset thereof. -	 */ -	struct drm_clip_rect boxes[MGA_NR_SAREA_CLIPRECTS]; -	unsigned int nbox; - -	/* Information about the most recently used 3d drawable.  The -	 * client fills in the req_* fields, the server fills in the -	 * exported_ fields and puts the cliprects into boxes, above. -	 * -	 * The client clears the exported_drawable field before -	 * clobbering the boxes data. -	 */ -	unsigned int req_drawable;	/* the X drawable id */ -	unsigned int req_draw_buffer;	/* MGA_FRONT or MGA_BACK */ - -	unsigned int exported_drawable; -	unsigned int exported_index; -	unsigned int exported_stamp; -	unsigned int exported_buffers; -	unsigned int exported_nfront; -	unsigned int exported_nback; -	int exported_back_x, exported_front_x, exported_w; -	int exported_back_y, exported_front_y, exported_h; -	struct drm_clip_rect exported_boxes[MGA_NR_SAREA_CLIPRECTS]; - -	/* Counters for aging textures and for client-side throttling. -	 */ -	unsigned int status[4]; -	unsigned int last_wrap; - -	drm_mga_age_t last_frame; -	unsigned int last_enqueue;	/* last time a buffer was enqueued */ -	unsigned int last_dispatch;	/* age of the most recently dispatched buffer */ -	unsigned int last_quiescent;	/*  */ - -	/* LRU lists for texture memory in agp space and on the card. -	 */ -	struct drm_tex_region texList[MGA_NR_TEX_HEAPS][MGA_NR_TEX_REGIONS + 1]; -	unsigned int texAge[MGA_NR_TEX_HEAPS]; - -	/* Mechanism to validate card state. -	 */ -	int ctxOwner; -} drm_mga_sarea_t; - -/* MGA specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_MGA_INIT     0x00 -#define DRM_MGA_FLUSH    0x01 -#define DRM_MGA_RESET    0x02 -#define DRM_MGA_SWAP     0x03 -#define DRM_MGA_CLEAR    0x04 -#define DRM_MGA_VERTEX   0x05 -#define DRM_MGA_INDICES  0x06 -#define DRM_MGA_ILOAD    0x07 -#define DRM_MGA_BLIT     0x08 -#define DRM_MGA_GETPARAM 0x09 - -/* 3.2: - * ioctls for operating on fences. - */ -#define DRM_MGA_SET_FENCE      0x0a -#define DRM_MGA_WAIT_FENCE     0x0b -#define DRM_MGA_DMA_BOOTSTRAP  0x0c - -#define DRM_IOCTL_MGA_INIT     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_INIT, drm_mga_init_t) -#define DRM_IOCTL_MGA_FLUSH    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_FLUSH, struct drm_lock) -#define DRM_IOCTL_MGA_RESET    DRM_IO(  DRM_COMMAND_BASE + DRM_MGA_RESET) -#define DRM_IOCTL_MGA_SWAP     DRM_IO(  DRM_COMMAND_BASE + DRM_MGA_SWAP) -#define DRM_IOCTL_MGA_CLEAR    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_CLEAR, drm_mga_clear_t) -#define DRM_IOCTL_MGA_VERTEX   DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_VERTEX, drm_mga_vertex_t) -#define DRM_IOCTL_MGA_INDICES  DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_INDICES, drm_mga_indices_t) -#define DRM_IOCTL_MGA_ILOAD    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_ILOAD, drm_mga_iload_t) -#define DRM_IOCTL_MGA_BLIT     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_BLIT, drm_mga_blit_t) -#define DRM_IOCTL_MGA_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_GETPARAM, drm_mga_getparam_t) -#define DRM_IOCTL_MGA_SET_FENCE     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_SET_FENCE, __u32) -#define DRM_IOCTL_MGA_WAIT_FENCE    DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_WAIT_FENCE, __u32) -#define DRM_IOCTL_MGA_DMA_BOOTSTRAP DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_DMA_BOOTSTRAP, drm_mga_dma_bootstrap_t) - -typedef struct _drm_mga_warp_index { -	int installed; -	unsigned long phys_addr; -	int size; -} drm_mga_warp_index_t; - -typedef struct drm_mga_init { -	enum { -		MGA_INIT_DMA = 0x01, -		MGA_CLEANUP_DMA = 0x02 -	} func; - -	unsigned long sarea_priv_offset; - -	int chipset; -	int sgram; - -	unsigned int maccess; - -	unsigned int fb_cpp; -	unsigned int front_offset, front_pitch; -	unsigned int back_offset, back_pitch; - -	unsigned int depth_cpp; -	unsigned int depth_offset, depth_pitch; - -	unsigned int texture_offset[MGA_NR_TEX_HEAPS]; -	unsigned int texture_size[MGA_NR_TEX_HEAPS]; - -	unsigned long fb_offset; -	unsigned long mmio_offset; -	unsigned long status_offset; -	unsigned long warp_offset; -	unsigned long primary_offset; -	unsigned long buffers_offset; -} drm_mga_init_t; - -typedef struct drm_mga_dma_bootstrap { -	/** -	 * \name AGP texture region -	 * -	 * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, these fields will -	 * be filled in with the actual AGP texture settings. -	 * -	 * \warning -	 * If these fields are non-zero, but dma_mga_dma_bootstrap::agp_mode -	 * is zero, it means that PCI memory (most likely through the use of -	 * an IOMMU) is being used for "AGP" textures. -	 */ -	/*@{ */ -	unsigned long texture_handle; /**< Handle used to map AGP textures. */ -	__u32 texture_size;	      /**< Size of the AGP texture region. */ -	/*@} */ - -	/** -	 * Requested size of the primary DMA region. -	 * -	 * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be -	 * filled in with the actual AGP mode.  If AGP was not available -	 */ -	__u32 primary_size; - -	/** -	 * Requested number of secondary DMA buffers. -	 * -	 * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be -	 * filled in with the actual number of secondary DMA buffers -	 * allocated.  Particularly when PCI DMA is used, this may be -	 * (subtantially) less than the number requested. -	 */ -	__u32 secondary_bin_count; - -	/** -	 * Requested size of each secondary DMA buffer. -	 * -	 * While the kernel \b is free to reduce -	 * dma_mga_dma_bootstrap::secondary_bin_count, it is \b not allowed -	 * to reduce dma_mga_dma_bootstrap::secondary_bin_size. -	 */ -	__u32 secondary_bin_size; - -	/** -	 * Bit-wise mask of AGPSTAT2_* values.  Currently only \c AGPSTAT2_1X, -	 * \c AGPSTAT2_2X, and \c AGPSTAT2_4X are supported.  If this value is -	 * zero, it means that PCI DMA should be used, even if AGP is -	 * possible. -	 * -	 * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be -	 * filled in with the actual AGP mode.  If AGP was not available -	 * (i.e., PCI DMA was used), this value will be zero. -	 */ -	__u32 agp_mode; - -	/** -	 * Desired AGP GART size, measured in megabytes. -	 */ -	__u8 agp_size; -} drm_mga_dma_bootstrap_t; - -typedef struct drm_mga_clear { -	unsigned int flags; -	unsigned int clear_color; -	unsigned int clear_depth; -	unsigned int color_mask; -	unsigned int depth_mask; -} drm_mga_clear_t; - -typedef struct drm_mga_vertex { -	int idx;		/* buffer to queue */ -	int used;		/* bytes in use */ -	int discard;		/* client finished with buffer?  */ -} drm_mga_vertex_t; - -typedef struct drm_mga_indices { -	int idx;		/* buffer to queue */ -	unsigned int start; -	unsigned int end; -	int discard;		/* client finished with buffer?  */ -} drm_mga_indices_t; - -typedef struct drm_mga_iload { -	int idx; -	unsigned int dstorg; -	unsigned int length; -} drm_mga_iload_t; - -typedef struct _drm_mga_blit { -	unsigned int planemask; -	unsigned int srcorg; -	unsigned int dstorg; -	int src_pitch, dst_pitch; -	int delta_sx, delta_sy; -	int delta_dx, delta_dy; -	int height, ydir;	/* flip image vertically */ -	int source_pitch, dest_pitch; -} drm_mga_blit_t; - -/* 3.1: An ioctl to get parameters that aren't available to the 3d - * client any other way. - */ -#define MGA_PARAM_IRQ_NR            1 - -/* 3.2: Query the actual card type.  The DDX only distinguishes between - * G200 chips and non-G200 chips, which it calls G400.  It turns out that - * there are some very sublte differences between the G4x0 chips and the G550 - * chips.  Using this parameter query, a client-side driver can detect the - * difference between a G4x0 and a G550. - */ -#define MGA_PARAM_CARD_TYPE         2 - -typedef struct drm_mga_getparam { -	int param; -	void __user *value; -} drm_mga_getparam_t; - -#endif diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h deleted file mode 100644 index 01a71411950..00000000000 --- a/include/drm/nouveau_drm.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2005 Stephane Marchesin. - * All Rights Reserved. - * - * 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 __NOUVEAU_DRM_H__ -#define __NOUVEAU_DRM_H__ - -#define NOUVEAU_DRM_HEADER_PATCHLEVEL 16 - -struct drm_nouveau_channel_alloc { -	uint32_t     fb_ctxdma_handle; -	uint32_t     tt_ctxdma_handle; - -	int          channel; -	uint32_t     pushbuf_domains; - -	/* Notifier memory */ -	uint32_t     notifier_handle; - -	/* DRM-enforced subchannel assignments */ -	struct { -		uint32_t handle; -		uint32_t grclass; -	} subchan[8]; -	uint32_t nr_subchan; -}; - -struct drm_nouveau_channel_free { -	int channel; -}; - -struct drm_nouveau_grobj_alloc { -	int      channel; -	uint32_t handle; -	int      class; -}; - -struct drm_nouveau_notifierobj_alloc { -	uint32_t channel; -	uint32_t handle; -	uint32_t size; -	uint32_t offset; -}; - -struct drm_nouveau_gpuobj_free { -	int      channel; -	uint32_t handle; -}; - -/* FIXME : maybe unify {GET,SET}PARAMs */ -#define NOUVEAU_GETPARAM_PCI_VENDOR      3 -#define NOUVEAU_GETPARAM_PCI_DEVICE      4 -#define NOUVEAU_GETPARAM_BUS_TYPE        5 -#define NOUVEAU_GETPARAM_FB_PHYSICAL     6 -#define NOUVEAU_GETPARAM_AGP_PHYSICAL    7 -#define NOUVEAU_GETPARAM_FB_SIZE         8 -#define NOUVEAU_GETPARAM_AGP_SIZE        9 -#define NOUVEAU_GETPARAM_PCI_PHYSICAL    10 -#define NOUVEAU_GETPARAM_CHIPSET_ID      11 -#define NOUVEAU_GETPARAM_VM_VRAM_BASE    12 -#define NOUVEAU_GETPARAM_GRAPH_UNITS     13 -#define NOUVEAU_GETPARAM_PTIMER_TIME     14 -struct drm_nouveau_getparam { -	uint64_t param; -	uint64_t value; -}; - -struct drm_nouveau_setparam { -	uint64_t param; -	uint64_t value; -}; - -#define NOUVEAU_GEM_DOMAIN_CPU       (1 << 0) -#define NOUVEAU_GEM_DOMAIN_VRAM      (1 << 1) -#define NOUVEAU_GEM_DOMAIN_GART      (1 << 2) -#define NOUVEAU_GEM_DOMAIN_MAPPABLE  (1 << 3) - -struct drm_nouveau_gem_info { -	uint32_t handle; -	uint32_t domain; -	uint64_t size; -	uint64_t offset; -	uint64_t map_handle; -	uint32_t tile_mode; -	uint32_t tile_flags; -}; - -struct drm_nouveau_gem_new { -	struct drm_nouveau_gem_info info; -	uint32_t channel_hint; -	uint32_t align; -}; - -#define NOUVEAU_GEM_MAX_BUFFERS 1024 -struct drm_nouveau_gem_pushbuf_bo_presumed { -	uint32_t valid; -	uint32_t domain; -	uint64_t offset; -}; - -struct drm_nouveau_gem_pushbuf_bo { -	uint64_t user_priv; -	uint32_t handle; -	uint32_t read_domains; -	uint32_t write_domains; -	uint32_t valid_domains; -	struct drm_nouveau_gem_pushbuf_bo_presumed presumed; -}; - -#define NOUVEAU_GEM_RELOC_LOW  (1 << 0) -#define NOUVEAU_GEM_RELOC_HIGH (1 << 1) -#define NOUVEAU_GEM_RELOC_OR   (1 << 2) -#define NOUVEAU_GEM_MAX_RELOCS 1024 -struct drm_nouveau_gem_pushbuf_reloc { -	uint32_t reloc_bo_index; -	uint32_t reloc_bo_offset; -	uint32_t bo_index; -	uint32_t flags; -	uint32_t data; -	uint32_t vor; -	uint32_t tor; -}; - -#define NOUVEAU_GEM_MAX_PUSH 512 -struct drm_nouveau_gem_pushbuf_push { -	uint32_t bo_index; -	uint32_t pad; -	uint64_t offset; -	uint64_t length; -}; - -struct drm_nouveau_gem_pushbuf { -	uint32_t channel; -	uint32_t nr_buffers; -	uint64_t buffers; -	uint32_t nr_relocs; -	uint32_t nr_push; -	uint64_t relocs; -	uint64_t push; -	uint32_t suffix0; -	uint32_t suffix1; -	uint64_t vram_available; -	uint64_t gart_available; -}; - -#define NOUVEAU_GEM_CPU_PREP_NOWAIT                                  0x00000001 -#define NOUVEAU_GEM_CPU_PREP_NOBLOCK                                 0x00000002 -#define NOUVEAU_GEM_CPU_PREP_WRITE                                   0x00000004 -struct drm_nouveau_gem_cpu_prep { -	uint32_t handle; -	uint32_t flags; -}; - -struct drm_nouveau_gem_cpu_fini { -	uint32_t handle; -}; - -enum nouveau_bus_type { -	NV_AGP     = 0, -	NV_PCI     = 1, -	NV_PCIE    = 2, -}; - -struct drm_nouveau_sarea { -}; - -#define DRM_NOUVEAU_GETPARAM           0x00 -#define DRM_NOUVEAU_SETPARAM           0x01 -#define DRM_NOUVEAU_CHANNEL_ALLOC      0x02 -#define DRM_NOUVEAU_CHANNEL_FREE       0x03 -#define DRM_NOUVEAU_GROBJ_ALLOC        0x04 -#define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC  0x05 -#define DRM_NOUVEAU_GPUOBJ_FREE        0x06 -#define DRM_NOUVEAU_GEM_NEW            0x40 -#define DRM_NOUVEAU_GEM_PUSHBUF        0x41 -#define DRM_NOUVEAU_GEM_CPU_PREP       0x42 -#define DRM_NOUVEAU_GEM_CPU_FINI       0x43 -#define DRM_NOUVEAU_GEM_INFO           0x44 - -#define DRM_IOCTL_NOUVEAU_GETPARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GETPARAM, struct drm_nouveau_getparam) -#define DRM_IOCTL_NOUVEAU_SETPARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SETPARAM, struct drm_nouveau_setparam) -#define DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC      DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_ALLOC, struct drm_nouveau_channel_alloc) -#define DRM_IOCTL_NOUVEAU_CHANNEL_FREE       DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_CHANNEL_FREE, struct drm_nouveau_channel_free) -#define DRM_IOCTL_NOUVEAU_GROBJ_ALLOC        DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GROBJ_ALLOC, struct drm_nouveau_grobj_alloc) -#define DRM_IOCTL_NOUVEAU_NOTIFIEROBJ_ALLOC  DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_NOTIFIEROBJ_ALLOC, struct drm_nouveau_notifierobj_alloc) -#define DRM_IOCTL_NOUVEAU_GPUOBJ_FREE        DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GPUOBJ_FREE, struct drm_nouveau_gpuobj_free) -#define DRM_IOCTL_NOUVEAU_GEM_NEW            DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new) -#define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF        DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf) -#define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP       DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep) -#define DRM_IOCTL_NOUVEAU_GEM_CPU_FINI       DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_FINI, struct drm_nouveau_gem_cpu_fini) -#define DRM_IOCTL_NOUVEAU_GEM_INFO           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_INFO, struct drm_nouveau_gem_info) - -#endif /* __NOUVEAU_DRM_H__ */ diff --git a/include/drm/r128_drm.h b/include/drm/r128_drm.h deleted file mode 100644 index 8d8878b55f5..00000000000 --- a/include/drm/r128_drm.h +++ /dev/null @@ -1,326 +0,0 @@ -/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*- - * Created: Wed Apr  5 19:24:19 2000 by kevin@precisioninsight.com - */ -/* - * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. - * All rights reserved. - * - * 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 - * PRECISION INSIGHT 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. - * - * Authors: - *    Gareth Hughes <gareth@valinux.com> - *    Kevin E. Martin <martin@valinux.com> - */ - -#ifndef __R128_DRM_H__ -#define __R128_DRM_H__ - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the X server file (r128_sarea.h) - */ -#ifndef __R128_SAREA_DEFINES__ -#define __R128_SAREA_DEFINES__ - -/* What needs to be changed for the current vertex buffer? - */ -#define R128_UPLOAD_CONTEXT		0x001 -#define R128_UPLOAD_SETUP		0x002 -#define R128_UPLOAD_TEX0		0x004 -#define R128_UPLOAD_TEX1		0x008 -#define R128_UPLOAD_TEX0IMAGES		0x010 -#define R128_UPLOAD_TEX1IMAGES		0x020 -#define R128_UPLOAD_CORE		0x040 -#define R128_UPLOAD_MASKS		0x080 -#define R128_UPLOAD_WINDOW		0x100 -#define R128_UPLOAD_CLIPRECTS		0x200	/* handled client-side */ -#define R128_REQUIRE_QUIESCENCE		0x400 -#define R128_UPLOAD_ALL			0x7ff - -#define R128_FRONT			0x1 -#define R128_BACK			0x2 -#define R128_DEPTH			0x4 - -/* Primitive types - */ -#define R128_POINTS			0x1 -#define R128_LINES			0x2 -#define R128_LINE_STRIP			0x3 -#define R128_TRIANGLES			0x4 -#define R128_TRIANGLE_FAN		0x5 -#define R128_TRIANGLE_STRIP		0x6 - -/* Vertex/indirect buffer size - */ -#define R128_BUFFER_SIZE		16384 - -/* Byte offsets for indirect buffer data - */ -#define R128_INDEX_PRIM_OFFSET		20 -#define R128_HOSTDATA_BLIT_OFFSET	32 - -/* Keep these small for testing. - */ -#define R128_NR_SAREA_CLIPRECTS		12 - -/* There are 2 heaps (local/AGP).  Each region within a heap is a - *  minimum of 64k, and there are at most 64 of them per heap. - */ -#define R128_LOCAL_TEX_HEAP		0 -#define R128_AGP_TEX_HEAP		1 -#define R128_NR_TEX_HEAPS		2 -#define R128_NR_TEX_REGIONS		64 -#define R128_LOG_TEX_GRANULARITY	16 - -#define R128_NR_CONTEXT_REGS		12 - -#define R128_MAX_TEXTURE_LEVELS		11 -#define R128_MAX_TEXTURE_UNITS		2 - -#endif				/* __R128_SAREA_DEFINES__ */ - -typedef struct { -	/* Context state - can be written in one large chunk */ -	unsigned int dst_pitch_offset_c; -	unsigned int dp_gui_master_cntl_c; -	unsigned int sc_top_left_c; -	unsigned int sc_bottom_right_c; -	unsigned int z_offset_c; -	unsigned int z_pitch_c; -	unsigned int z_sten_cntl_c; -	unsigned int tex_cntl_c; -	unsigned int misc_3d_state_cntl_reg; -	unsigned int texture_clr_cmp_clr_c; -	unsigned int texture_clr_cmp_msk_c; -	unsigned int fog_color_c; - -	/* Texture state */ -	unsigned int tex_size_pitch_c; -	unsigned int constant_color_c; - -	/* Setup state */ -	unsigned int pm4_vc_fpu_setup; -	unsigned int setup_cntl; - -	/* Mask state */ -	unsigned int dp_write_mask; -	unsigned int sten_ref_mask_c; -	unsigned int plane_3d_mask_c; - -	/* Window state */ -	unsigned int window_xy_offset; - -	/* Core state */ -	unsigned int scale_3d_cntl; -} drm_r128_context_regs_t; - -/* Setup registers for each texture unit - */ -typedef struct { -	unsigned int tex_cntl; -	unsigned int tex_combine_cntl; -	unsigned int tex_size_pitch; -	unsigned int tex_offset[R128_MAX_TEXTURE_LEVELS]; -	unsigned int tex_border_color; -} drm_r128_texture_regs_t; - -typedef struct drm_r128_sarea { -	/* The channel for communication of state information to the kernel -	 * on firing a vertex buffer. -	 */ -	drm_r128_context_regs_t context_state; -	drm_r128_texture_regs_t tex_state[R128_MAX_TEXTURE_UNITS]; -	unsigned int dirty; -	unsigned int vertsize; -	unsigned int vc_format; - -	/* The current cliprects, or a subset thereof. -	 */ -	struct drm_clip_rect boxes[R128_NR_SAREA_CLIPRECTS]; -	unsigned int nbox; - -	/* Counters for client-side throttling of rendering clients. -	 */ -	unsigned int last_frame; -	unsigned int last_dispatch; - -	struct drm_tex_region tex_list[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS + 1]; -	unsigned int tex_age[R128_NR_TEX_HEAPS]; -	int ctx_owner; -	int pfAllowPageFlip;	/* number of 3d windows (0,1,2 or more) */ -	int pfCurrentPage;	/* which buffer is being displayed? */ -} drm_r128_sarea_t; - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the Xserver file (xf86drmR128.h) - */ - -/* Rage 128 specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_R128_INIT       0x00 -#define DRM_R128_CCE_START  0x01 -#define DRM_R128_CCE_STOP   0x02 -#define DRM_R128_CCE_RESET  0x03 -#define DRM_R128_CCE_IDLE   0x04 -/* 0x05 not used */ -#define DRM_R128_RESET      0x06 -#define DRM_R128_SWAP       0x07 -#define DRM_R128_CLEAR      0x08 -#define DRM_R128_VERTEX     0x09 -#define DRM_R128_INDICES    0x0a -#define DRM_R128_BLIT       0x0b -#define DRM_R128_DEPTH      0x0c -#define DRM_R128_STIPPLE    0x0d -/* 0x0e not used */ -#define DRM_R128_INDIRECT   0x0f -#define DRM_R128_FULLSCREEN 0x10 -#define DRM_R128_CLEAR2     0x11 -#define DRM_R128_GETPARAM   0x12 -#define DRM_R128_FLIP       0x13 - -#define DRM_IOCTL_R128_INIT       DRM_IOW( DRM_COMMAND_BASE + DRM_R128_INIT, drm_r128_init_t) -#define DRM_IOCTL_R128_CCE_START  DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_START) -#define DRM_IOCTL_R128_CCE_STOP   DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CCE_STOP, drm_r128_cce_stop_t) -#define DRM_IOCTL_R128_CCE_RESET  DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_RESET) -#define DRM_IOCTL_R128_CCE_IDLE   DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_IDLE) -/* 0x05 not used */ -#define DRM_IOCTL_R128_RESET      DRM_IO(  DRM_COMMAND_BASE + DRM_R128_RESET) -#define DRM_IOCTL_R128_SWAP       DRM_IO(  DRM_COMMAND_BASE + DRM_R128_SWAP) -#define DRM_IOCTL_R128_CLEAR      DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CLEAR, drm_r128_clear_t) -#define DRM_IOCTL_R128_VERTEX     DRM_IOW( DRM_COMMAND_BASE + DRM_R128_VERTEX, drm_r128_vertex_t) -#define DRM_IOCTL_R128_INDICES    DRM_IOW( DRM_COMMAND_BASE + DRM_R128_INDICES, drm_r128_indices_t) -#define DRM_IOCTL_R128_BLIT       DRM_IOW( DRM_COMMAND_BASE + DRM_R128_BLIT, drm_r128_blit_t) -#define DRM_IOCTL_R128_DEPTH      DRM_IOW( DRM_COMMAND_BASE + DRM_R128_DEPTH, drm_r128_depth_t) -#define DRM_IOCTL_R128_STIPPLE    DRM_IOW( DRM_COMMAND_BASE + DRM_R128_STIPPLE, drm_r128_stipple_t) -/* 0x0e not used */ -#define DRM_IOCTL_R128_INDIRECT   DRM_IOWR(DRM_COMMAND_BASE + DRM_R128_INDIRECT, drm_r128_indirect_t) -#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW( DRM_COMMAND_BASE + DRM_R128_FULLSCREEN, drm_r128_fullscreen_t) -#define DRM_IOCTL_R128_CLEAR2     DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CLEAR2, drm_r128_clear2_t) -#define DRM_IOCTL_R128_GETPARAM   DRM_IOWR( DRM_COMMAND_BASE + DRM_R128_GETPARAM, drm_r128_getparam_t) -#define DRM_IOCTL_R128_FLIP       DRM_IO(  DRM_COMMAND_BASE + DRM_R128_FLIP) - -typedef struct drm_r128_init { -	enum { -		R128_INIT_CCE = 0x01, -		R128_CLEANUP_CCE = 0x02 -	} func; -	unsigned long sarea_priv_offset; -	int is_pci; -	int cce_mode; -	int cce_secure; -	int ring_size; -	int usec_timeout; - -	unsigned int fb_bpp; -	unsigned int front_offset, front_pitch; -	unsigned int back_offset, back_pitch; -	unsigned int depth_bpp; -	unsigned int depth_offset, depth_pitch; -	unsigned int span_offset; - -	unsigned long fb_offset; -	unsigned long mmio_offset; -	unsigned long ring_offset; -	unsigned long ring_rptr_offset; -	unsigned long buffers_offset; -	unsigned long agp_textures_offset; -} drm_r128_init_t; - -typedef struct drm_r128_cce_stop { -	int flush; -	int idle; -} drm_r128_cce_stop_t; - -typedef struct drm_r128_clear { -	unsigned int flags; -	unsigned int clear_color; -	unsigned int clear_depth; -	unsigned int color_mask; -	unsigned int depth_mask; -} drm_r128_clear_t; - -typedef struct drm_r128_vertex { -	int prim; -	int idx;		/* Index of vertex buffer */ -	int count;		/* Number of vertices in buffer */ -	int discard;		/* Client finished with buffer? */ -} drm_r128_vertex_t; - -typedef struct drm_r128_indices { -	int prim; -	int idx; -	int start; -	int end; -	int discard;		/* Client finished with buffer? */ -} drm_r128_indices_t; - -typedef struct drm_r128_blit { -	int idx; -	int pitch; -	int offset; -	int format; -	unsigned short x, y; -	unsigned short width, height; -} drm_r128_blit_t; - -typedef struct drm_r128_depth { -	enum { -		R128_WRITE_SPAN = 0x01, -		R128_WRITE_PIXELS = 0x02, -		R128_READ_SPAN = 0x03, -		R128_READ_PIXELS = 0x04 -	} func; -	int n; -	int __user *x; -	int __user *y; -	unsigned int __user *buffer; -	unsigned char __user *mask; -} drm_r128_depth_t; - -typedef struct drm_r128_stipple { -	unsigned int __user *mask; -} drm_r128_stipple_t; - -typedef struct drm_r128_indirect { -	int idx; -	int start; -	int end; -	int discard; -} drm_r128_indirect_t; - -typedef struct drm_r128_fullscreen { -	enum { -		R128_INIT_FULLSCREEN = 0x01, -		R128_CLEANUP_FULLSCREEN = 0x02 -	} func; -} drm_r128_fullscreen_t; - -/* 2.3: An ioctl to get parameters that aren't available to the 3d - * client any other way. - */ -#define R128_PARAM_IRQ_NR            1 - -typedef struct drm_r128_getparam { -	int param; -	void __user *value; -} drm_r128_getparam_t; - -#endif diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h deleted file mode 100644 index 10f8b53bdd4..00000000000 --- a/include/drm/radeon_drm.h +++ /dev/null @@ -1,916 +0,0 @@ -/* radeon_drm.h -- Public header for the radeon driver -*- linux-c -*- - * - * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. - * Copyright 2000 VA Linux Systems, Inc., Fremont, California. - * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. - * All rights reserved. - * - * 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 - * PRECISION INSIGHT 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. - * - * Authors: - *    Kevin E. Martin <martin@valinux.com> - *    Gareth Hughes <gareth@valinux.com> - *    Keith Whitwell <keith@tungstengraphics.com> - */ - -#ifndef __RADEON_DRM_H__ -#define __RADEON_DRM_H__ - -#include "drm.h" - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the X server file (radeon_sarea.h) - */ -#ifndef __RADEON_SAREA_DEFINES__ -#define __RADEON_SAREA_DEFINES__ - -/* Old style state flags, required for sarea interface (1.1 and 1.2 - * clears) and 1.2 drm_vertex2 ioctl. - */ -#define RADEON_UPLOAD_CONTEXT		0x00000001 -#define RADEON_UPLOAD_VERTFMT		0x00000002 -#define RADEON_UPLOAD_LINE		0x00000004 -#define RADEON_UPLOAD_BUMPMAP		0x00000008 -#define RADEON_UPLOAD_MASKS		0x00000010 -#define RADEON_UPLOAD_VIEWPORT		0x00000020 -#define RADEON_UPLOAD_SETUP		0x00000040 -#define RADEON_UPLOAD_TCL		0x00000080 -#define RADEON_UPLOAD_MISC		0x00000100 -#define RADEON_UPLOAD_TEX0		0x00000200 -#define RADEON_UPLOAD_TEX1		0x00000400 -#define RADEON_UPLOAD_TEX2		0x00000800 -#define RADEON_UPLOAD_TEX0IMAGES	0x00001000 -#define RADEON_UPLOAD_TEX1IMAGES	0x00002000 -#define RADEON_UPLOAD_TEX2IMAGES	0x00004000 -#define RADEON_UPLOAD_CLIPRECTS		0x00008000	/* handled client-side */ -#define RADEON_REQUIRE_QUIESCENCE	0x00010000 -#define RADEON_UPLOAD_ZBIAS		0x00020000	/* version 1.2 and newer */ -#define RADEON_UPLOAD_ALL		0x003effff -#define RADEON_UPLOAD_CONTEXT_ALL       0x003e01ff - -/* New style per-packet identifiers for use in cmd_buffer ioctl with - * the RADEON_EMIT_PACKET command.  Comments relate new packets to old - * state bits and the packet size: - */ -#define RADEON_EMIT_PP_MISC                         0	/* context/7 */ -#define RADEON_EMIT_PP_CNTL                         1	/* context/3 */ -#define RADEON_EMIT_RB3D_COLORPITCH                 2	/* context/1 */ -#define RADEON_EMIT_RE_LINE_PATTERN                 3	/* line/2 */ -#define RADEON_EMIT_SE_LINE_WIDTH                   4	/* line/1 */ -#define RADEON_EMIT_PP_LUM_MATRIX                   5	/* bumpmap/1 */ -#define RADEON_EMIT_PP_ROT_MATRIX_0                 6	/* bumpmap/2 */ -#define RADEON_EMIT_RB3D_STENCILREFMASK             7	/* masks/3 */ -#define RADEON_EMIT_SE_VPORT_XSCALE                 8	/* viewport/6 */ -#define RADEON_EMIT_SE_CNTL                         9	/* setup/2 */ -#define RADEON_EMIT_SE_CNTL_STATUS                  10	/* setup/1 */ -#define RADEON_EMIT_RE_MISC                         11	/* misc/1 */ -#define RADEON_EMIT_PP_TXFILTER_0                   12	/* tex0/6 */ -#define RADEON_EMIT_PP_BORDER_COLOR_0               13	/* tex0/1 */ -#define RADEON_EMIT_PP_TXFILTER_1                   14	/* tex1/6 */ -#define RADEON_EMIT_PP_BORDER_COLOR_1               15	/* tex1/1 */ -#define RADEON_EMIT_PP_TXFILTER_2                   16	/* tex2/6 */ -#define RADEON_EMIT_PP_BORDER_COLOR_2               17	/* tex2/1 */ -#define RADEON_EMIT_SE_ZBIAS_FACTOR                 18	/* zbias/2 */ -#define RADEON_EMIT_SE_TCL_OUTPUT_VTX_FMT           19	/* tcl/11 */ -#define RADEON_EMIT_SE_TCL_MATERIAL_EMMISSIVE_RED   20	/* material/17 */ -#define R200_EMIT_PP_TXCBLEND_0                     21	/* tex0/4 */ -#define R200_EMIT_PP_TXCBLEND_1                     22	/* tex1/4 */ -#define R200_EMIT_PP_TXCBLEND_2                     23	/* tex2/4 */ -#define R200_EMIT_PP_TXCBLEND_3                     24	/* tex3/4 */ -#define R200_EMIT_PP_TXCBLEND_4                     25	/* tex4/4 */ -#define R200_EMIT_PP_TXCBLEND_5                     26	/* tex5/4 */ -#define R200_EMIT_PP_TXCBLEND_6                     27	/* /4 */ -#define R200_EMIT_PP_TXCBLEND_7                     28	/* /4 */ -#define R200_EMIT_TCL_LIGHT_MODEL_CTL_0             29	/* tcl/7 */ -#define R200_EMIT_TFACTOR_0                         30	/* tf/7 */ -#define R200_EMIT_VTX_FMT_0                         31	/* vtx/5 */ -#define R200_EMIT_VAP_CTL                           32	/* vap/1 */ -#define R200_EMIT_MATRIX_SELECT_0                   33	/* msl/5 */ -#define R200_EMIT_TEX_PROC_CTL_2                    34	/* tcg/5 */ -#define R200_EMIT_TCL_UCP_VERT_BLEND_CTL            35	/* tcl/1 */ -#define R200_EMIT_PP_TXFILTER_0                     36	/* tex0/6 */ -#define R200_EMIT_PP_TXFILTER_1                     37	/* tex1/6 */ -#define R200_EMIT_PP_TXFILTER_2                     38	/* tex2/6 */ -#define R200_EMIT_PP_TXFILTER_3                     39	/* tex3/6 */ -#define R200_EMIT_PP_TXFILTER_4                     40	/* tex4/6 */ -#define R200_EMIT_PP_TXFILTER_5                     41	/* tex5/6 */ -#define R200_EMIT_PP_TXOFFSET_0                     42	/* tex0/1 */ -#define R200_EMIT_PP_TXOFFSET_1                     43	/* tex1/1 */ -#define R200_EMIT_PP_TXOFFSET_2                     44	/* tex2/1 */ -#define R200_EMIT_PP_TXOFFSET_3                     45	/* tex3/1 */ -#define R200_EMIT_PP_TXOFFSET_4                     46	/* tex4/1 */ -#define R200_EMIT_PP_TXOFFSET_5                     47	/* tex5/1 */ -#define R200_EMIT_VTE_CNTL                          48	/* vte/1 */ -#define R200_EMIT_OUTPUT_VTX_COMP_SEL               49	/* vtx/1 */ -#define R200_EMIT_PP_TAM_DEBUG3                     50	/* tam/1 */ -#define R200_EMIT_PP_CNTL_X                         51	/* cst/1 */ -#define R200_EMIT_RB3D_DEPTHXY_OFFSET               52	/* cst/1 */ -#define R200_EMIT_RE_AUX_SCISSOR_CNTL               53	/* cst/1 */ -#define R200_EMIT_RE_SCISSOR_TL_0                   54	/* cst/2 */ -#define R200_EMIT_RE_SCISSOR_TL_1                   55	/* cst/2 */ -#define R200_EMIT_RE_SCISSOR_TL_2                   56	/* cst/2 */ -#define R200_EMIT_SE_VAP_CNTL_STATUS                57	/* cst/1 */ -#define R200_EMIT_SE_VTX_STATE_CNTL                 58	/* cst/1 */ -#define R200_EMIT_RE_POINTSIZE                      59	/* cst/1 */ -#define R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0       60	/* cst/4 */ -#define R200_EMIT_PP_CUBIC_FACES_0                  61 -#define R200_EMIT_PP_CUBIC_OFFSETS_0                62 -#define R200_EMIT_PP_CUBIC_FACES_1                  63 -#define R200_EMIT_PP_CUBIC_OFFSETS_1                64 -#define R200_EMIT_PP_CUBIC_FACES_2                  65 -#define R200_EMIT_PP_CUBIC_OFFSETS_2                66 -#define R200_EMIT_PP_CUBIC_FACES_3                  67 -#define R200_EMIT_PP_CUBIC_OFFSETS_3                68 -#define R200_EMIT_PP_CUBIC_FACES_4                  69 -#define R200_EMIT_PP_CUBIC_OFFSETS_4                70 -#define R200_EMIT_PP_CUBIC_FACES_5                  71 -#define R200_EMIT_PP_CUBIC_OFFSETS_5                72 -#define RADEON_EMIT_PP_TEX_SIZE_0                   73 -#define RADEON_EMIT_PP_TEX_SIZE_1                   74 -#define RADEON_EMIT_PP_TEX_SIZE_2                   75 -#define R200_EMIT_RB3D_BLENDCOLOR                   76 -#define R200_EMIT_TCL_POINT_SPRITE_CNTL             77 -#define RADEON_EMIT_PP_CUBIC_FACES_0                78 -#define RADEON_EMIT_PP_CUBIC_OFFSETS_T0             79 -#define RADEON_EMIT_PP_CUBIC_FACES_1                80 -#define RADEON_EMIT_PP_CUBIC_OFFSETS_T1             81 -#define RADEON_EMIT_PP_CUBIC_FACES_2                82 -#define RADEON_EMIT_PP_CUBIC_OFFSETS_T2             83 -#define R200_EMIT_PP_TRI_PERF_CNTL                  84 -#define R200_EMIT_PP_AFS_0                          85 -#define R200_EMIT_PP_AFS_1                          86 -#define R200_EMIT_ATF_TFACTOR                       87 -#define R200_EMIT_PP_TXCTLALL_0                     88 -#define R200_EMIT_PP_TXCTLALL_1                     89 -#define R200_EMIT_PP_TXCTLALL_2                     90 -#define R200_EMIT_PP_TXCTLALL_3                     91 -#define R200_EMIT_PP_TXCTLALL_4                     92 -#define R200_EMIT_PP_TXCTLALL_5                     93 -#define R200_EMIT_VAP_PVS_CNTL                      94 -#define RADEON_MAX_STATE_PACKETS                    95 - -/* Commands understood by cmd_buffer ioctl.  More can be added but - * obviously these can't be removed or changed: - */ -#define RADEON_CMD_PACKET      1	/* emit one of the register packets above */ -#define RADEON_CMD_SCALARS     2	/* emit scalar data */ -#define RADEON_CMD_VECTORS     3	/* emit vector data */ -#define RADEON_CMD_DMA_DISCARD 4	/* discard current dma buf */ -#define RADEON_CMD_PACKET3     5	/* emit hw packet */ -#define RADEON_CMD_PACKET3_CLIP 6	/* emit hw packet wrapped in cliprects */ -#define RADEON_CMD_SCALARS2     7	/* r200 stopgap */ -#define RADEON_CMD_WAIT         8	/* emit hw wait commands -- note: -					 *  doesn't make the cpu wait, just -					 *  the graphics hardware */ -#define RADEON_CMD_VECLINEAR	9       /* another r200 stopgap */ - -typedef union { -	int i; -	struct { -		unsigned char cmd_type, pad0, pad1, pad2; -	} header; -	struct { -		unsigned char cmd_type, packet_id, pad0, pad1; -	} packet; -	struct { -		unsigned char cmd_type, offset, stride, count; -	} scalars; -	struct { -		unsigned char cmd_type, offset, stride, count; -	} vectors; -	struct { -		unsigned char cmd_type, addr_lo, addr_hi, count; -	} veclinear; -	struct { -		unsigned char cmd_type, buf_idx, pad0, pad1; -	} dma; -	struct { -		unsigned char cmd_type, flags, pad0, pad1; -	} wait; -} drm_radeon_cmd_header_t; - -#define RADEON_WAIT_2D  0x1 -#define RADEON_WAIT_3D  0x2 - -/* Allowed parameters for R300_CMD_PACKET3 - */ -#define R300_CMD_PACKET3_CLEAR		0 -#define R300_CMD_PACKET3_RAW		1 - -/* Commands understood by cmd_buffer ioctl for R300. - * The interface has not been stabilized, so some of these may be removed - * and eventually reordered before stabilization. - */ -#define R300_CMD_PACKET0		1 -#define R300_CMD_VPU			2	/* emit vertex program upload */ -#define R300_CMD_PACKET3		3	/* emit a packet3 */ -#define R300_CMD_END3D			4	/* emit sequence ending 3d rendering */ -#define R300_CMD_CP_DELAY		5 -#define R300_CMD_DMA_DISCARD		6 -#define R300_CMD_WAIT			7 -#	define R300_WAIT_2D		0x1 -#	define R300_WAIT_3D		0x2 -/* these two defines are DOING IT WRONG - however - * we have userspace which relies on using these. - * The wait interface is backwards compat new  - * code should use the NEW_WAIT defines below - * THESE ARE NOT BIT FIELDS - */ -#	define R300_WAIT_2D_CLEAN	0x3 -#	define R300_WAIT_3D_CLEAN	0x4 - -#	define R300_NEW_WAIT_2D_3D	0x3 -#	define R300_NEW_WAIT_2D_2D_CLEAN	0x4 -#	define R300_NEW_WAIT_3D_3D_CLEAN	0x6 -#	define R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN	0x8 - -#define R300_CMD_SCRATCH		8 -#define R300_CMD_R500FP                 9 - -typedef union { -	unsigned int u; -	struct { -		unsigned char cmd_type, pad0, pad1, pad2; -	} header; -	struct { -		unsigned char cmd_type, count, reglo, reghi; -	} packet0; -	struct { -		unsigned char cmd_type, count, adrlo, adrhi; -	} vpu; -	struct { -		unsigned char cmd_type, packet, pad0, pad1; -	} packet3; -	struct { -		unsigned char cmd_type, packet; -		unsigned short count;	/* amount of packet2 to emit */ -	} delay; -	struct { -		unsigned char cmd_type, buf_idx, pad0, pad1; -	} dma; -	struct { -		unsigned char cmd_type, flags, pad0, pad1; -	} wait; -	struct { -		unsigned char cmd_type, reg, n_bufs, flags; -	} scratch; -	struct { -		unsigned char cmd_type, count, adrlo, adrhi_flags; -	} r500fp; -} drm_r300_cmd_header_t; - -#define RADEON_FRONT			0x1 -#define RADEON_BACK			0x2 -#define RADEON_DEPTH			0x4 -#define RADEON_STENCIL			0x8 -#define RADEON_CLEAR_FASTZ		0x80000000 -#define RADEON_USE_HIERZ		0x40000000 -#define RADEON_USE_COMP_ZBUF		0x20000000 - -#define R500FP_CONSTANT_TYPE  (1 << 1) -#define R500FP_CONSTANT_CLAMP (1 << 2) - -/* Primitive types - */ -#define RADEON_POINTS			0x1 -#define RADEON_LINES			0x2 -#define RADEON_LINE_STRIP		0x3 -#define RADEON_TRIANGLES		0x4 -#define RADEON_TRIANGLE_FAN		0x5 -#define RADEON_TRIANGLE_STRIP		0x6 - -/* Vertex/indirect buffer size - */ -#define RADEON_BUFFER_SIZE		65536 - -/* Byte offsets for indirect buffer data - */ -#define RADEON_INDEX_PRIM_OFFSET	20 - -#define RADEON_SCRATCH_REG_OFFSET	32 - -#define R600_SCRATCH_REG_OFFSET         256 - -#define RADEON_NR_SAREA_CLIPRECTS	12 - -/* There are 2 heaps (local/GART).  Each region within a heap is a - * minimum of 64k, and there are at most 64 of them per heap. - */ -#define RADEON_LOCAL_TEX_HEAP		0 -#define RADEON_GART_TEX_HEAP		1 -#define RADEON_NR_TEX_HEAPS		2 -#define RADEON_NR_TEX_REGIONS		64 -#define RADEON_LOG_TEX_GRANULARITY	16 - -#define RADEON_MAX_TEXTURE_LEVELS	12 -#define RADEON_MAX_TEXTURE_UNITS	3 - -#define RADEON_MAX_SURFACES		8 - -/* Blits have strict offset rules.  All blit offset must be aligned on - * a 1K-byte boundary. - */ -#define RADEON_OFFSET_SHIFT             10 -#define RADEON_OFFSET_ALIGN             (1 << RADEON_OFFSET_SHIFT) -#define RADEON_OFFSET_MASK              (RADEON_OFFSET_ALIGN - 1) - -#endif				/* __RADEON_SAREA_DEFINES__ */ - -typedef struct { -	unsigned int red; -	unsigned int green; -	unsigned int blue; -	unsigned int alpha; -} radeon_color_regs_t; - -typedef struct { -	/* Context state */ -	unsigned int pp_misc;	/* 0x1c14 */ -	unsigned int pp_fog_color; -	unsigned int re_solid_color; -	unsigned int rb3d_blendcntl; -	unsigned int rb3d_depthoffset; -	unsigned int rb3d_depthpitch; -	unsigned int rb3d_zstencilcntl; - -	unsigned int pp_cntl;	/* 0x1c38 */ -	unsigned int rb3d_cntl; -	unsigned int rb3d_coloroffset; -	unsigned int re_width_height; -	unsigned int rb3d_colorpitch; -	unsigned int se_cntl; - -	/* Vertex format state */ -	unsigned int se_coord_fmt;	/* 0x1c50 */ - -	/* Line state */ -	unsigned int re_line_pattern;	/* 0x1cd0 */ -	unsigned int re_line_state; - -	unsigned int se_line_width;	/* 0x1db8 */ - -	/* Bumpmap state */ -	unsigned int pp_lum_matrix;	/* 0x1d00 */ - -	unsigned int pp_rot_matrix_0;	/* 0x1d58 */ -	unsigned int pp_rot_matrix_1; - -	/* Mask state */ -	unsigned int rb3d_stencilrefmask;	/* 0x1d7c */ -	unsigned int rb3d_ropcntl; -	unsigned int rb3d_planemask; - -	/* Viewport state */ -	unsigned int se_vport_xscale;	/* 0x1d98 */ -	unsigned int se_vport_xoffset; -	unsigned int se_vport_yscale; -	unsigned int se_vport_yoffset; -	unsigned int se_vport_zscale; -	unsigned int se_vport_zoffset; - -	/* Setup state */ -	unsigned int se_cntl_status;	/* 0x2140 */ - -	/* Misc state */ -	unsigned int re_top_left;	/* 0x26c0 */ -	unsigned int re_misc; -} drm_radeon_context_regs_t; - -typedef struct { -	/* Zbias state */ -	unsigned int se_zbias_factor;	/* 0x1dac */ -	unsigned int se_zbias_constant; -} drm_radeon_context2_regs_t; - -/* Setup registers for each texture unit - */ -typedef struct { -	unsigned int pp_txfilter; -	unsigned int pp_txformat; -	unsigned int pp_txoffset; -	unsigned int pp_txcblend; -	unsigned int pp_txablend; -	unsigned int pp_tfactor; -	unsigned int pp_border_color; -} drm_radeon_texture_regs_t; - -typedef struct { -	unsigned int start; -	unsigned int finish; -	unsigned int prim:8; -	unsigned int stateidx:8; -	unsigned int numverts:16;	/* overloaded as offset/64 for elt prims */ -	unsigned int vc_format;	/* vertex format */ -} drm_radeon_prim_t; - -typedef struct { -	drm_radeon_context_regs_t context; -	drm_radeon_texture_regs_t tex[RADEON_MAX_TEXTURE_UNITS]; -	drm_radeon_context2_regs_t context2; -	unsigned int dirty; -} drm_radeon_state_t; - -typedef struct { -	/* The channel for communication of state information to the -	 * kernel on firing a vertex buffer with either of the -	 * obsoleted vertex/index ioctls. -	 */ -	drm_radeon_context_regs_t context_state; -	drm_radeon_texture_regs_t tex_state[RADEON_MAX_TEXTURE_UNITS]; -	unsigned int dirty; -	unsigned int vertsize; -	unsigned int vc_format; - -	/* The current cliprects, or a subset thereof. -	 */ -	struct drm_clip_rect boxes[RADEON_NR_SAREA_CLIPRECTS]; -	unsigned int nbox; - -	/* Counters for client-side throttling of rendering clients. -	 */ -	unsigned int last_frame; -	unsigned int last_dispatch; -	unsigned int last_clear; - -	struct drm_tex_region tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS + -						       1]; -	unsigned int tex_age[RADEON_NR_TEX_HEAPS]; -	int ctx_owner; -	int pfState;		/* number of 3d windows (0,1,2ormore) */ -	int pfCurrentPage;	/* which buffer is being displayed? */ -	int crtc2_base;		/* CRTC2 frame offset */ -	int tiling_enabled;	/* set by drm, read by 2d + 3d clients */ -} drm_radeon_sarea_t; - -/* WARNING: If you change any of these defines, make sure to change the - * defines in the Xserver file (xf86drmRadeon.h) - * - * KW: actually it's illegal to change any of this (backwards compatibility). - */ - -/* Radeon specific ioctls - * The device specific ioctl range is 0x40 to 0x79. - */ -#define DRM_RADEON_CP_INIT    0x00 -#define DRM_RADEON_CP_START   0x01 -#define DRM_RADEON_CP_STOP    0x02 -#define DRM_RADEON_CP_RESET   0x03 -#define DRM_RADEON_CP_IDLE    0x04 -#define DRM_RADEON_RESET      0x05 -#define DRM_RADEON_FULLSCREEN 0x06 -#define DRM_RADEON_SWAP       0x07 -#define DRM_RADEON_CLEAR      0x08 -#define DRM_RADEON_VERTEX     0x09 -#define DRM_RADEON_INDICES    0x0A -#define DRM_RADEON_NOT_USED -#define DRM_RADEON_STIPPLE    0x0C -#define DRM_RADEON_INDIRECT   0x0D -#define DRM_RADEON_TEXTURE    0x0E -#define DRM_RADEON_VERTEX2    0x0F -#define DRM_RADEON_CMDBUF     0x10 -#define DRM_RADEON_GETPARAM   0x11 -#define DRM_RADEON_FLIP       0x12 -#define DRM_RADEON_ALLOC      0x13 -#define DRM_RADEON_FREE       0x14 -#define DRM_RADEON_INIT_HEAP  0x15 -#define DRM_RADEON_IRQ_EMIT   0x16 -#define DRM_RADEON_IRQ_WAIT   0x17 -#define DRM_RADEON_CP_RESUME  0x18 -#define DRM_RADEON_SETPARAM   0x19 -#define DRM_RADEON_SURF_ALLOC 0x1a -#define DRM_RADEON_SURF_FREE  0x1b -/* KMS ioctl */ -#define DRM_RADEON_GEM_INFO		0x1c -#define DRM_RADEON_GEM_CREATE		0x1d -#define DRM_RADEON_GEM_MMAP		0x1e -#define DRM_RADEON_GEM_PREAD		0x21 -#define DRM_RADEON_GEM_PWRITE		0x22 -#define DRM_RADEON_GEM_SET_DOMAIN	0x23 -#define DRM_RADEON_GEM_WAIT_IDLE	0x24 -#define DRM_RADEON_CS			0x26 -#define DRM_RADEON_INFO			0x27 -#define DRM_RADEON_GEM_SET_TILING	0x28 -#define DRM_RADEON_GEM_GET_TILING	0x29 -#define DRM_RADEON_GEM_BUSY		0x2a - -#define DRM_IOCTL_RADEON_CP_INIT    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) -#define DRM_IOCTL_RADEON_CP_START   DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_START) -#define DRM_IOCTL_RADEON_CP_STOP    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t) -#define DRM_IOCTL_RADEON_CP_RESET   DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_RESET) -#define DRM_IOCTL_RADEON_CP_IDLE    DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_IDLE) -#define DRM_IOCTL_RADEON_RESET      DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_RESET) -#define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FULLSCREEN, drm_radeon_fullscreen_t) -#define DRM_IOCTL_RADEON_SWAP       DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_SWAP) -#define DRM_IOCTL_RADEON_CLEAR      DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CLEAR, drm_radeon_clear_t) -#define DRM_IOCTL_RADEON_VERTEX     DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX, drm_radeon_vertex_t) -#define DRM_IOCTL_RADEON_INDICES    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INDICES, drm_radeon_indices_t) -#define DRM_IOCTL_RADEON_STIPPLE    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_STIPPLE, drm_radeon_stipple_t) -#define DRM_IOCTL_RADEON_INDIRECT   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INDIRECT, drm_radeon_indirect_t) -#define DRM_IOCTL_RADEON_TEXTURE    DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_TEXTURE, drm_radeon_texture_t) -#define DRM_IOCTL_RADEON_VERTEX2    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX2, drm_radeon_vertex2_t) -#define DRM_IOCTL_RADEON_CMDBUF     DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CMDBUF, drm_radeon_cmd_buffer_t) -#define DRM_IOCTL_RADEON_GETPARAM   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GETPARAM, drm_radeon_getparam_t) -#define DRM_IOCTL_RADEON_FLIP       DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_FLIP) -#define DRM_IOCTL_RADEON_ALLOC      DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_ALLOC, drm_radeon_mem_alloc_t) -#define DRM_IOCTL_RADEON_FREE       DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FREE, drm_radeon_mem_free_t) -#define DRM_IOCTL_RADEON_INIT_HEAP  DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INIT_HEAP, drm_radeon_mem_init_heap_t) -#define DRM_IOCTL_RADEON_IRQ_EMIT   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_IRQ_EMIT, drm_radeon_irq_emit_t) -#define DRM_IOCTL_RADEON_IRQ_WAIT   DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_IRQ_WAIT, drm_radeon_irq_wait_t) -#define DRM_IOCTL_RADEON_CP_RESUME  DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_RESUME) -#define DRM_IOCTL_RADEON_SETPARAM   DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, drm_radeon_setparam_t) -#define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t) -#define DRM_IOCTL_RADEON_SURF_FREE  DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t) -/* KMS */ -#define DRM_IOCTL_RADEON_GEM_INFO	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info) -#define DRM_IOCTL_RADEON_GEM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create) -#define DRM_IOCTL_RADEON_GEM_MMAP	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap) -#define DRM_IOCTL_RADEON_GEM_PREAD	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread) -#define DRM_IOCTL_RADEON_GEM_PWRITE	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite) -#define DRM_IOCTL_RADEON_GEM_SET_DOMAIN	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain) -#define DRM_IOCTL_RADEON_GEM_WAIT_IDLE	DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_IDLE, struct drm_radeon_gem_wait_idle) -#define DRM_IOCTL_RADEON_CS		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs) -#define DRM_IOCTL_RADEON_INFO		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info) -#define DRM_IOCTL_RADEON_GEM_SET_TILING	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling) -#define DRM_IOCTL_RADEON_GEM_GET_TILING	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) -#define DRM_IOCTL_RADEON_GEM_BUSY	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy) - -typedef struct drm_radeon_init { -	enum { -		RADEON_INIT_CP = 0x01, -		RADEON_CLEANUP_CP = 0x02, -		RADEON_INIT_R200_CP = 0x03, -		RADEON_INIT_R300_CP = 0x04, -		RADEON_INIT_R600_CP = 0x05 -	} func; -	unsigned long sarea_priv_offset; -	int is_pci; -	int cp_mode; -	int gart_size; -	int ring_size; -	int usec_timeout; - -	unsigned int fb_bpp; -	unsigned int front_offset, front_pitch; -	unsigned int back_offset, back_pitch; -	unsigned int depth_bpp; -	unsigned int depth_offset, depth_pitch; - -	unsigned long fb_offset; -	unsigned long mmio_offset; -	unsigned long ring_offset; -	unsigned long ring_rptr_offset; -	unsigned long buffers_offset; -	unsigned long gart_textures_offset; -} drm_radeon_init_t; - -typedef struct drm_radeon_cp_stop { -	int flush; -	int idle; -} drm_radeon_cp_stop_t; - -typedef struct drm_radeon_fullscreen { -	enum { -		RADEON_INIT_FULLSCREEN = 0x01, -		RADEON_CLEANUP_FULLSCREEN = 0x02 -	} func; -} drm_radeon_fullscreen_t; - -#define CLEAR_X1	0 -#define CLEAR_Y1	1 -#define CLEAR_X2	2 -#define CLEAR_Y2	3 -#define CLEAR_DEPTH	4 - -typedef union drm_radeon_clear_rect { -	float f[5]; -	unsigned int ui[5]; -} drm_radeon_clear_rect_t; - -typedef struct drm_radeon_clear { -	unsigned int flags; -	unsigned int clear_color; -	unsigned int clear_depth; -	unsigned int color_mask; -	unsigned int depth_mask;	/* misnamed field:  should be stencil */ -	drm_radeon_clear_rect_t __user *depth_boxes; -} drm_radeon_clear_t; - -typedef struct drm_radeon_vertex { -	int prim; -	int idx;		/* Index of vertex buffer */ -	int count;		/* Number of vertices in buffer */ -	int discard;		/* Client finished with buffer? */ -} drm_radeon_vertex_t; - -typedef struct drm_radeon_indices { -	int prim; -	int idx; -	int start; -	int end; -	int discard;		/* Client finished with buffer? */ -} drm_radeon_indices_t; - -/* v1.2 - obsoletes drm_radeon_vertex and drm_radeon_indices - *      - allows multiple primitives and state changes in a single ioctl - *      - supports driver change to emit native primitives - */ -typedef struct drm_radeon_vertex2 { -	int idx;		/* Index of vertex buffer */ -	int discard;		/* Client finished with buffer? */ -	int nr_states; -	drm_radeon_state_t __user *state; -	int nr_prims; -	drm_radeon_prim_t __user *prim; -} drm_radeon_vertex2_t; - -/* v1.3 - obsoletes drm_radeon_vertex2 - *      - allows arbitarily large cliprect list - *      - allows updating of tcl packet, vector and scalar state - *      - allows memory-efficient description of state updates - *      - allows state to be emitted without a primitive - *           (for clears, ctx switches) - *      - allows more than one dma buffer to be referenced per ioctl - *      - supports tcl driver - *      - may be extended in future versions with new cmd types, packets - */ -typedef struct drm_radeon_cmd_buffer { -	int bufsz; -	char __user *buf; -	int nbox; -	struct drm_clip_rect __user *boxes; -} drm_radeon_cmd_buffer_t; - -typedef struct drm_radeon_tex_image { -	unsigned int x, y;	/* Blit coordinates */ -	unsigned int width, height; -	const void __user *data; -} drm_radeon_tex_image_t; - -typedef struct drm_radeon_texture { -	unsigned int offset; -	int pitch; -	int format; -	int width;		/* Texture image coordinates */ -	int height; -	drm_radeon_tex_image_t __user *image; -} drm_radeon_texture_t; - -typedef struct drm_radeon_stipple { -	unsigned int __user *mask; -} drm_radeon_stipple_t; - -typedef struct drm_radeon_indirect { -	int idx; -	int start; -	int end; -	int discard; -} drm_radeon_indirect_t; - -/* enum for card type parameters */ -#define RADEON_CARD_PCI 0 -#define RADEON_CARD_AGP 1 -#define RADEON_CARD_PCIE 2 - -/* 1.3: An ioctl to get parameters that aren't available to the 3d - * client any other way. - */ -#define RADEON_PARAM_GART_BUFFER_OFFSET    1	/* card offset of 1st GART buffer */ -#define RADEON_PARAM_LAST_FRAME            2 -#define RADEON_PARAM_LAST_DISPATCH         3 -#define RADEON_PARAM_LAST_CLEAR            4 -/* Added with DRM version 1.6. */ -#define RADEON_PARAM_IRQ_NR                5 -#define RADEON_PARAM_GART_BASE             6	/* card offset of GART base */ -/* Added with DRM version 1.8. */ -#define RADEON_PARAM_REGISTER_HANDLE       7	/* for drmMap() */ -#define RADEON_PARAM_STATUS_HANDLE         8 -#define RADEON_PARAM_SAREA_HANDLE          9 -#define RADEON_PARAM_GART_TEX_HANDLE       10 -#define RADEON_PARAM_SCRATCH_OFFSET        11 -#define RADEON_PARAM_CARD_TYPE             12 -#define RADEON_PARAM_VBLANK_CRTC           13   /* VBLANK CRTC */ -#define RADEON_PARAM_FB_LOCATION           14   /* FB location */ -#define RADEON_PARAM_NUM_GB_PIPES          15   /* num GB pipes */ -#define RADEON_PARAM_DEVICE_ID             16 -#define RADEON_PARAM_NUM_Z_PIPES           17   /* num Z pipes */ - -typedef struct drm_radeon_getparam { -	int param; -	void __user *value; -} drm_radeon_getparam_t; - -/* 1.6: Set up a memory manager for regions of shared memory: - */ -#define RADEON_MEM_REGION_GART 1 -#define RADEON_MEM_REGION_FB   2 - -typedef struct drm_radeon_mem_alloc { -	int region; -	int alignment; -	int size; -	int __user *region_offset;	/* offset from start of fb or GART */ -} drm_radeon_mem_alloc_t; - -typedef struct drm_radeon_mem_free { -	int region; -	int region_offset; -} drm_radeon_mem_free_t; - -typedef struct drm_radeon_mem_init_heap { -	int region; -	int size; -	int start; -} drm_radeon_mem_init_heap_t; - -/* 1.6: Userspace can request & wait on irq's: - */ -typedef struct drm_radeon_irq_emit { -	int __user *irq_seq; -} drm_radeon_irq_emit_t; - -typedef struct drm_radeon_irq_wait { -	int irq_seq; -} drm_radeon_irq_wait_t; - -/* 1.10: Clients tell the DRM where they think the framebuffer is located in - * the card's address space, via a new generic ioctl to set parameters - */ - -typedef struct drm_radeon_setparam { -	unsigned int param; -	__s64 value; -} drm_radeon_setparam_t; - -#define RADEON_SETPARAM_FB_LOCATION    1	/* determined framebuffer location */ -#define RADEON_SETPARAM_SWITCH_TILING  2	/* enable/disable color tiling */ -#define RADEON_SETPARAM_PCIGART_LOCATION 3	/* PCI Gart Location */ -#define RADEON_SETPARAM_NEW_MEMMAP 4		/* Use new memory map */ -#define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5    /* PCI GART Table Size */ -#define RADEON_SETPARAM_VBLANK_CRTC 6           /* VBLANK CRTC */ -/* 1.14: Clients can allocate/free a surface - */ -typedef struct drm_radeon_surface_alloc { -	unsigned int address; -	unsigned int size; -	unsigned int flags; -} drm_radeon_surface_alloc_t; - -typedef struct drm_radeon_surface_free { -	unsigned int address; -} drm_radeon_surface_free_t; - -#define	DRM_RADEON_VBLANK_CRTC1		1 -#define	DRM_RADEON_VBLANK_CRTC2		2 - -/* - * Kernel modesetting world below. - */ -#define RADEON_GEM_DOMAIN_CPU		0x1 -#define RADEON_GEM_DOMAIN_GTT		0x2 -#define RADEON_GEM_DOMAIN_VRAM		0x4 - -struct drm_radeon_gem_info { -	uint64_t	gart_size; -	uint64_t	vram_size; -	uint64_t	vram_visible; -}; - -#define RADEON_GEM_NO_BACKING_STORE 1 - -struct drm_radeon_gem_create { -	uint64_t	size; -	uint64_t	alignment; -	uint32_t	handle; -	uint32_t	initial_domain; -	uint32_t	flags; -}; - -#define RADEON_TILING_MACRO       0x1 -#define RADEON_TILING_MICRO       0x2 -#define RADEON_TILING_SWAP_16BIT  0x4 -#define RADEON_TILING_SWAP_32BIT  0x8 -#define RADEON_TILING_SURFACE     0x10 /* this object requires a surface -					* when mapped - i.e. front buffer */ -#define RADEON_TILING_MICRO_SQUARE 0x20 - -struct drm_radeon_gem_set_tiling { -	uint32_t	handle; -	uint32_t	tiling_flags; -	uint32_t	pitch; -}; - -struct drm_radeon_gem_get_tiling { -	uint32_t	handle; -	uint32_t	tiling_flags; -	uint32_t	pitch; -}; - -struct drm_radeon_gem_mmap { -	uint32_t	handle; -	uint32_t	pad; -	uint64_t	offset; -	uint64_t	size; -	uint64_t	addr_ptr; -}; - -struct drm_radeon_gem_set_domain { -	uint32_t	handle; -	uint32_t	read_domains; -	uint32_t	write_domain; -}; - -struct drm_radeon_gem_wait_idle { -	uint32_t	handle; -	uint32_t	pad; -}; - -struct drm_radeon_gem_busy { -	uint32_t	handle; -	uint32_t        domain; -}; - -struct drm_radeon_gem_pread { -	/** Handle for the object being read. */ -	uint32_t handle; -	uint32_t pad; -	/** Offset into the object to read from */ -	uint64_t offset; -	/** Length of data to read */ -	uint64_t size; -	/** Pointer to write the data into. */ -	/* void *, but pointers are not 32/64 compatible */ -	uint64_t data_ptr; -}; - -struct drm_radeon_gem_pwrite { -	/** Handle for the object being written to. */ -	uint32_t handle; -	uint32_t pad; -	/** Offset into the object to write to */ -	uint64_t offset; -	/** Length of data to write */ -	uint64_t size; -	/** Pointer to read the data from. */ -	/* void *, but pointers are not 32/64 compatible */ -	uint64_t data_ptr; -}; - -#define RADEON_CHUNK_ID_RELOCS	0x01 -#define RADEON_CHUNK_ID_IB	0x02 - -struct drm_radeon_cs_chunk { -	uint32_t		chunk_id; -	uint32_t		length_dw; -	uint64_t		chunk_data; -}; - -struct drm_radeon_cs_reloc { -	uint32_t		handle; -	uint32_t		read_domains; -	uint32_t		write_domain; -	uint32_t		flags; -}; - -struct drm_radeon_cs { -	uint32_t		num_chunks; -	uint32_t		cs_id; -	/* this points to uint64_t * which point to cs chunks */ -	uint64_t		chunks; -	/* updates to the limits after this CS ioctl */ -	uint64_t		gart_limit; -	uint64_t		vram_limit; -}; - -#define RADEON_INFO_DEVICE_ID		0x00 -#define RADEON_INFO_NUM_GB_PIPES	0x01 -#define RADEON_INFO_NUM_Z_PIPES 	0x02 -#define RADEON_INFO_ACCEL_WORKING	0x03 -#define RADEON_INFO_CRTC_FROM_ID	0x04 -#define RADEON_INFO_ACCEL_WORKING2	0x05 -#define RADEON_INFO_TILING_CONFIG	0x06 -#define RADEON_INFO_WANT_HYPERZ		0x07 - -struct drm_radeon_info { -	uint32_t		request; -	uint32_t		pad; -	uint64_t		value; -}; - -#endif diff --git a/include/drm/savage_drm.h b/include/drm/savage_drm.h deleted file mode 100644 index 4863cf6bf96..00000000000 --- a/include/drm/savage_drm.h +++ /dev/null @@ -1,210 +0,0 @@ -/* savage_drm.h -- Public header for the savage driver - * - * Copyright 2004  Felix Kuehling - * All Rights Reserved. - * - * 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, sub license, - * 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 - * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING 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 __SAVAGE_DRM_H__ -#define __SAVAGE_DRM_H__ - -#ifndef __SAVAGE_SAREA_DEFINES__ -#define __SAVAGE_SAREA_DEFINES__ - -/* 2 heaps (1 for card, 1 for agp), each divided into upto 128 - * regions, subject to a minimum region size of (1<<16) == 64k. - * - * Clients may subdivide regions internally, but when sharing between - * clients, the region size is the minimum granularity. - */ - -#define SAVAGE_CARD_HEAP		0 -#define SAVAGE_AGP_HEAP			1 -#define SAVAGE_NR_TEX_HEAPS		2 -#define SAVAGE_NR_TEX_REGIONS		16 -#define SAVAGE_LOG_MIN_TEX_REGION_SIZE	16 - -#endif				/* __SAVAGE_SAREA_DEFINES__ */ - -typedef struct _drm_savage_sarea { -	/* LRU lists for texture memory in agp space and on the card. -	 */ -	struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS + -						      1]; -	unsigned int texAge[SAVAGE_NR_TEX_HEAPS]; - -	/* Mechanism to validate card state. -	 */ -	int ctxOwner; -} drm_savage_sarea_t, *drm_savage_sarea_ptr; - -/* Savage-specific ioctls - */ -#define DRM_SAVAGE_BCI_INIT		0x00 -#define DRM_SAVAGE_BCI_CMDBUF           0x01 -#define DRM_SAVAGE_BCI_EVENT_EMIT	0x02 -#define DRM_SAVAGE_BCI_EVENT_WAIT	0x03 - -#define DRM_IOCTL_SAVAGE_BCI_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t) -#define DRM_IOCTL_SAVAGE_BCI_CMDBUF		DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_CMDBUF, drm_savage_cmdbuf_t) -#define DRM_IOCTL_SAVAGE_BCI_EVENT_EMIT	DRM_IOWR(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_EMIT, drm_savage_event_emit_t) -#define DRM_IOCTL_SAVAGE_BCI_EVENT_WAIT	DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_WAIT, drm_savage_event_wait_t) - -#define SAVAGE_DMA_PCI	1 -#define SAVAGE_DMA_AGP	3 -typedef struct drm_savage_init { -	enum { -		SAVAGE_INIT_BCI = 1, -		SAVAGE_CLEANUP_BCI = 2 -	} func; -	unsigned int sarea_priv_offset; - -	/* some parameters */ -	unsigned int cob_size; -	unsigned int bci_threshold_lo, bci_threshold_hi; -	unsigned int dma_type; - -	/* frame buffer layout */ -	unsigned int fb_bpp; -	unsigned int front_offset, front_pitch; -	unsigned int back_offset, back_pitch; -	unsigned int depth_bpp; -	unsigned int depth_offset, depth_pitch; - -	/* local textures */ -	unsigned int texture_offset; -	unsigned int texture_size; - -	/* physical locations of non-permanent maps */ -	unsigned long status_offset; -	unsigned long buffers_offset; -	unsigned long agp_textures_offset; -	unsigned long cmd_dma_offset; -} drm_savage_init_t; - -typedef union drm_savage_cmd_header drm_savage_cmd_header_t; -typedef struct drm_savage_cmdbuf { -	/* command buffer in client's address space */ -	drm_savage_cmd_header_t __user *cmd_addr; -	unsigned int size;	/* size of the command buffer in 64bit units */ - -	unsigned int dma_idx;	/* DMA buffer index to use */ -	int discard;		/* discard DMA buffer when done */ -	/* vertex buffer in client's address space */ -	unsigned int __user *vb_addr; -	unsigned int vb_size;	/* size of client vertex buffer in bytes */ -	unsigned int vb_stride;	/* stride of vertices in 32bit words */ -	/* boxes in client's address space */ -	struct drm_clip_rect __user *box_addr; -	unsigned int nbox;	/* number of clipping boxes */ -} drm_savage_cmdbuf_t; - -#define SAVAGE_WAIT_2D  0x1	/* wait for 2D idle before updating event tag */ -#define SAVAGE_WAIT_3D  0x2	/* wait for 3D idle before updating event tag */ -#define SAVAGE_WAIT_IRQ 0x4	/* emit or wait for IRQ, not implemented yet */ -typedef struct drm_savage_event { -	unsigned int count; -	unsigned int flags; -} drm_savage_event_emit_t, drm_savage_event_wait_t; - -/* Commands for the cmdbuf ioctl - */ -#define SAVAGE_CMD_STATE	0	/* a range of state registers */ -#define SAVAGE_CMD_DMA_PRIM	1	/* vertices from DMA buffer */ -#define SAVAGE_CMD_VB_PRIM	2	/* vertices from client vertex buffer */ -#define SAVAGE_CMD_DMA_IDX	3	/* indexed vertices from DMA buffer */ -#define SAVAGE_CMD_VB_IDX	4	/* indexed vertices client vertex buffer */ -#define SAVAGE_CMD_CLEAR	5	/* clear buffers */ -#define SAVAGE_CMD_SWAP		6	/* swap buffers */ - -/* Primitive types -*/ -#define SAVAGE_PRIM_TRILIST	0	/* triangle list */ -#define SAVAGE_PRIM_TRISTRIP	1	/* triangle strip */ -#define SAVAGE_PRIM_TRIFAN	2	/* triangle fan */ -#define SAVAGE_PRIM_TRILIST_201	3	/* reorder verts for correct flat -					 * shading on s3d */ - -/* Skip flags (vertex format) - */ -#define SAVAGE_SKIP_Z		0x01 -#define SAVAGE_SKIP_W		0x02 -#define SAVAGE_SKIP_C0		0x04 -#define SAVAGE_SKIP_C1		0x08 -#define SAVAGE_SKIP_S0		0x10 -#define SAVAGE_SKIP_T0		0x20 -#define SAVAGE_SKIP_ST0		0x30 -#define SAVAGE_SKIP_S1		0x40 -#define SAVAGE_SKIP_T1		0x80 -#define SAVAGE_SKIP_ST1		0xc0 -#define SAVAGE_SKIP_ALL_S3D	0x3f -#define SAVAGE_SKIP_ALL_S4	0xff - -/* Buffer names for clear command - */ -#define SAVAGE_FRONT		0x1 -#define SAVAGE_BACK		0x2 -#define SAVAGE_DEPTH		0x4 - -/* 64-bit command header - */ -union drm_savage_cmd_header { -	struct { -		unsigned char cmd;	/* command */ -		unsigned char pad0; -		unsigned short pad1; -		unsigned short pad2; -		unsigned short pad3; -	} cmd;			/* generic */ -	struct { -		unsigned char cmd; -		unsigned char global;	/* need idle engine? */ -		unsigned short count;	/* number of consecutive registers */ -		unsigned short start;	/* first register */ -		unsigned short pad3; -	} state;		/* SAVAGE_CMD_STATE */ -	struct { -		unsigned char cmd; -		unsigned char prim;	/* primitive type */ -		unsigned short skip;	/* vertex format (skip flags) */ -		unsigned short count;	/* number of vertices */ -		unsigned short start;	/* first vertex in DMA/vertex buffer */ -	} prim;			/* SAVAGE_CMD_DMA_PRIM, SAVAGE_CMD_VB_PRIM */ -	struct { -		unsigned char cmd; -		unsigned char prim; -		unsigned short skip; -		unsigned short count;	/* number of indices that follow */ -		unsigned short pad3; -	} idx;			/* SAVAGE_CMD_DMA_IDX, SAVAGE_CMD_VB_IDX */ -	struct { -		unsigned char cmd; -		unsigned char pad0; -		unsigned short pad1; -		unsigned int flags; -	} clear0;		/* SAVAGE_CMD_CLEAR */ -	struct { -		unsigned int mask; -		unsigned int value; -	} clear1;		/* SAVAGE_CMD_CLEAR data */ -}; - -#endif diff --git a/include/drm/sis_drm.h b/include/drm/sis_drm.h deleted file mode 100644 index 30f7b382746..00000000000 --- a/include/drm/sis_drm.h +++ /dev/null @@ -1,67 +0,0 @@ -/* sis_drv.h -- Private header for sis driver -*- linux-c -*- */ -/* - * Copyright 2005 Eric Anholt - * All Rights Reserved. - * - * 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 - * THE AUTHORS OR COPYRIGHT HOLDERS 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 __SIS_DRM_H__ -#define __SIS_DRM_H__ - -/* SiS specific ioctls */ -#define NOT_USED_0_3 -#define DRM_SIS_FB_ALLOC	0x04 -#define DRM_SIS_FB_FREE	        0x05 -#define NOT_USED_6_12 -#define DRM_SIS_AGP_INIT	0x13 -#define DRM_SIS_AGP_ALLOC	0x14 -#define DRM_SIS_AGP_FREE	0x15 -#define DRM_SIS_FB_INIT	        0x16 - -#define DRM_IOCTL_SIS_FB_ALLOC		DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_FB_ALLOC, drm_sis_mem_t) -#define DRM_IOCTL_SIS_FB_FREE		DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_FB_FREE, drm_sis_mem_t) -#define DRM_IOCTL_SIS_AGP_INIT		DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_AGP_INIT, drm_sis_agp_t) -#define DRM_IOCTL_SIS_AGP_ALLOC		DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_AGP_ALLOC, drm_sis_mem_t) -#define DRM_IOCTL_SIS_AGP_FREE		DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_AGP_FREE, drm_sis_mem_t) -#define DRM_IOCTL_SIS_FB_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_FB_INIT, drm_sis_fb_t) -/* -#define DRM_IOCTL_SIS_FLIP		DRM_IOW( 0x48, drm_sis_flip_t) -#define DRM_IOCTL_SIS_FLIP_INIT		DRM_IO(  0x49) -#define DRM_IOCTL_SIS_FLIP_FINAL	DRM_IO(  0x50) -*/ - -typedef struct { -	int context; -	unsigned int offset; -	unsigned int size; -	unsigned long free; -} drm_sis_mem_t; - -typedef struct { -	unsigned int offset, size; -} drm_sis_agp_t; - -typedef struct { -	unsigned int offset, size; -} drm_sis_fb_t; - -#endif				/* __SIS_DRM_H__ */ diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index beafc156a53..7526c5bf561 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -31,14 +31,15 @@  #ifndef _TTM_BO_API_H_  #define _TTM_BO_API_H_ -#include "drm_hashtab.h" +#include <drm/drm_hashtab.h> +#include <drm/drm_vma_manager.h>  #include <linux/kref.h>  #include <linux/list.h>  #include <linux/wait.h>  #include <linux/mutex.h>  #include <linux/mm.h> -#include <linux/rbtree.h>  #include <linux/bitmap.h> +#include <linux/reservation.h>  struct ttm_bo_device; @@ -50,10 +51,10 @@ struct drm_mm_node;   *   * @fpfn:		first valid page frame number to put the object   * @lpfn:		last valid page frame number to put the object - * @num_placement:	number of prefered placements - * @placement:		prefered placements - * @num_busy_placement:	number of prefered placements when need to evict buffer - * @busy_placement:	prefered placements when need to evict buffer + * @num_placement:	number of preferred placements + * @placement:		preferred placements + * @num_busy_placement:	number of preferred placements when need to evict buffer + * @busy_placement:	preferred placements when need to evict buffer   *   * Structure indicating the placement you request for an object.   */ @@ -74,6 +75,8 @@ struct ttm_placement {   * @is_iomem:		is this io memory ?   * @size:		size in byte   * @offset:		offset from the base address + * @io_reserved_vm:     The VM system has a refcount in @io_reserved_count + * @io_reserved_count:  Refcounting the numbers of callers to ttm_mem_io_reserve   *   * Structure indicating the bus placement of an object.   */ @@ -83,7 +86,8 @@ struct ttm_bus_placement {  	unsigned long	size;  	unsigned long	offset;  	bool		is_iomem; -	bool		io_reserved; +	bool		io_reserved_vm; +	uint64_t        io_reserved_count;  }; @@ -119,18 +123,17 @@ struct ttm_mem_reg {   * be mmapped by user space. Each of these bos occupy a slot in the   * device address space, that can be used for normal vm operations.   * - * @ttm_bo_type_user: These are user-space memory areas that are made - * available to the GPU by mapping the buffer pages into the GPU aperture - * space. These buffers cannot be mmaped from the device address space. - *   * @ttm_bo_type_kernel: These buffers are like ttm_bo_type_device buffers,   * but they cannot be accessed from user-space. For kernel-only use. + * + * @ttm_bo_type_sg: Buffer made from dmabuf sg table shared with another + * driver.   */  enum ttm_bo_type {  	ttm_bo_type_device, -	ttm_bo_type_user, -	ttm_bo_type_kernel +	ttm_bo_type_kernel, +	ttm_bo_type_sg  };  struct ttm_tt; @@ -139,12 +142,9 @@ struct ttm_tt;   * struct ttm_buffer_object   *   * @bdev: Pointer to the buffer object device structure. - * @buffer_start: The virtual user-space start address of ttm_bo_type_user - * buffers.   * @type: The bo type.   * @destroy: Destruction function. If NULL, kfree is used.   * @num_pages: Actual number of pages. - * @addr_space_offset: Address space offset.   * @acc_size: Accounted size for this object.   * @kref: Reference count of this buffer object. When this refcount reaches   * zero, the object is put on the delayed delete list. @@ -153,32 +153,23 @@ struct ttm_tt;   * Lru lists may keep one refcount, the delayed delete list, and kref != 0   * keeps one refcount. When this refcount reaches zero,   * the object is destroyed. - * @event_queue: Queue for processes waiting on buffer object status change. - * @lock: spinlock protecting mostly synchronization members.   * @mem: structure describing current placement. - * @persistant_swap_storage: Usually the swap storage is deleted for buffers + * @persistent_swap_storage: Usually the swap storage is deleted for buffers   * pinned in physical memory. If this behaviour is not desired, this member - * holds a pointer to a persistant shmem object. + * holds a pointer to a persistent shmem object.   * @ttm: TTM structure holding system pages.   * @evicted: Whether the object was evicted without user-space knowing.   * @cpu_writes: For synchronization. Number of cpu writers.   * @lru: List head for the lru list.   * @ddestroy: List head for the delayed destroy list.   * @swap: List head for swap LRU list. - * @val_seq: Sequence of the validation holding the @reserved lock. - * Used to avoid starvation when many processes compete to validate the - * buffer. This member is protected by the bo_device::lru_lock. - * @seq_valid: The value of @val_seq is valid. This value is protected by - * the bo_device::lru_lock. - * @reserved: Deadlock-free lock used for synchronization state transitions. - * @sync_obj_arg: Opaque argument to synchronization object function.   * @sync_obj: Pointer to a synchronization object.   * @priv_flags: Flags describing buffer object internal state. - * @vm_rb: Rb node for the vm rb tree. - * @vm_node: Address space manager node. + * @vma_node: Address space manager node.   * @offset: The current GPU offset, which can have different meanings   * depending on the memory type. For SYSTEM type memory, it should be 0.   * @cur_placement: Hint of current placement. + * @wu_mutex: Wait unreserved mutex.   *   * Base class for TTM buffer object, that deals with data placement and CPU   * mappings. GPU mappings are really up to the driver, but for simpler GPUs @@ -199,11 +190,9 @@ struct ttm_buffer_object {  	struct ttm_bo_global *glob;  	struct ttm_bo_device *bdev; -	unsigned long buffer_start;  	enum ttm_bo_type type;  	void (*destroy) (struct ttm_buffer_object *);  	unsigned long num_pages; -	uint64_t addr_space_offset;  	size_t acc_size;  	/** @@ -212,15 +201,13 @@ struct ttm_buffer_object {  	struct kref kref;  	struct kref list_kref; -	wait_queue_head_t event_queue; -	spinlock_t lock;  	/** -	 * Members protected by the bo::reserved lock. +	 * Members protected by the bo::resv::reserved lock.  	 */  	struct ttm_mem_reg mem; -	struct file *persistant_swap_storage; +	struct file *persistent_swap_storage;  	struct ttm_tt *ttm;  	bool evicted; @@ -237,34 +224,19 @@ struct ttm_buffer_object {  	struct list_head lru;  	struct list_head ddestroy;  	struct list_head swap; -	uint32_t val_seq; -	bool seq_valid; - -	/** -	 * Members protected by the bdev::lru_lock -	 * only when written to. -	 */ - -	atomic_t reserved; +	struct list_head io_reserve_lru;  	/** -	 * Members protected by the bo::lock +	 * Members protected by struct buffer_object_device::fence_lock  	 * In addition, setting sync_obj to anything else  	 * than NULL requires bo::reserved to be held. This allows for -	 * checking NULL while reserved but not holding bo::lock. +	 * checking NULL while reserved but not holding the mentioned lock.  	 */ -	void *sync_obj_arg;  	void *sync_obj;  	unsigned long priv_flags; -	/** -	 * Members protected by the bdev::vm_lock -	 */ - -	struct rb_node vm_rb; -	struct drm_mm_node *vm_node; - +	struct drm_vma_offset_node vma_node;  	/**  	 * Special members that are protected by the reserve lock @@ -274,6 +246,12 @@ struct ttm_buffer_object {  	unsigned long offset;  	uint32_t cur_placement; + +	struct sg_table *sg; + +	struct reservation_object *resv; +	struct reservation_object ttm_resv; +	struct mutex wu_mutex;  };  /** @@ -339,7 +317,6 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,   * @bo: The buffer object.   * @placement: Proposed placement for the buffer object.   * @interruptible: Sleep interruptible if sleeping. - * @no_wait_reserve: Return immediately if other buffers are busy.   * @no_wait_gpu: Return immediately if the GPU is busy.   *   * Changes placement and caching policy of the buffer object @@ -352,7 +329,7 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,   */  extern int ttm_bo_validate(struct ttm_buffer_object *bo,  				struct ttm_placement *placement, -				bool interruptible, bool no_wait_reserve, +				bool interruptible,  				bool no_wait_gpu);  /** @@ -364,6 +341,44 @@ extern int ttm_bo_validate(struct ttm_buffer_object *bo,   */  extern void ttm_bo_unref(struct ttm_buffer_object **bo); + +/** + * ttm_bo_list_ref_sub + * + * @bo: The buffer object. + * @count: The number of references with which to decrease @bo::list_kref; + * @never_free: The refcount should not reach zero with this operation. + * + * Release @count lru list references to this buffer object. + */ +extern void ttm_bo_list_ref_sub(struct ttm_buffer_object *bo, int count, +				bool never_free); + +/** + * ttm_bo_add_to_lru + * + * @bo: The buffer object. + * + * Add this bo to the relevant mem type lru and, if it's backed by + * system pages (ttms) to the swap list. + * This function must be called with struct ttm_bo_global::lru_lock held, and + * is typically called immediately prior to unreserving a bo. + */ +extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo); + +/** + * ttm_bo_del_from_lru + * + * @bo: The buffer object. + * + * Remove this bo from all lru lists used to lookup and reserve an object. + * This function must be called with struct ttm_bo_global::lru_lock held, + * and is usually called just immediately after the bo has been reserved to + * avoid recursive reservation from lru lists. + */ +extern int ttm_bo_del_from_lru(struct ttm_buffer_object *bo); + +  /**   * ttm_bo_lock_delayed_workqueue   * @@ -388,15 +403,16 @@ extern void ttm_bo_unlock_delayed_workqueue(struct ttm_bo_device *bdev,   * @no_wait: Return immediately if buffer is busy.   *   * Synchronizes a buffer object for CPU RW access. This means - * blocking command submission that affects the buffer and - * waiting for buffer idle. This lock is recursive. + * command submission that affects the buffer will return -EBUSY + * until ttm_bo_synccpu_write_release is called. + *   * Returns   * -EBUSY if the buffer is busy and no_wait is true.   * -ERESTARTSYS if interrupted by a signal.   */ -  extern int  ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait); +  /**   * ttm_bo_synccpu_write_release:   * @@ -407,6 +423,22 @@ ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait);  extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);  /** + * ttm_bo_acc_size + * + * @bdev: Pointer to a ttm_bo_device struct. + * @bo_size: size of the buffer object in byte. + * @struct_size: size of the structure holding buffer object datas + * + * Returns size to account for a buffer object + */ +size_t ttm_bo_acc_size(struct ttm_bo_device *bdev, +		       unsigned long bo_size, +		       unsigned struct_size); +size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev, +			   unsigned long bo_size, +			   unsigned struct_size); + +/**   * ttm_bo_init   *   * @bdev: Pointer to a ttm_bo_device struct. @@ -415,13 +447,11 @@ extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);   * @type: Requested type of buffer object.   * @flags: Initial placement flags.   * @page_alignment: Data alignment in pages. - * @buffer_start: Virtual address of user space data backing a - * user buffer object.   * @interruptible: If needing to sleep to wait for GPU resources,   * sleep interruptible. - * @persistant_swap_storage: Usually the swap storage is deleted for buffers + * @persistent_swap_storage: Usually the swap storage is deleted for buffers   * pinned in physical memory. If this behaviour is not desired, this member - * holds a pointer to a persistant shmem object. Typically, this would + * holds a pointer to a persistent shmem object. Typically, this would   * point to the shmem object backing a GEM object if TTM is used to back a   * GEM user interface.   * @acc_size: Accounted size for this object. @@ -448,27 +478,25 @@ extern int ttm_bo_init(struct ttm_bo_device *bdev,  			enum ttm_bo_type type,  			struct ttm_placement *placement,  			uint32_t page_alignment, -			unsigned long buffer_start,  			bool interrubtible, -			struct file *persistant_swap_storage, +			struct file *persistent_swap_storage,  			size_t acc_size, +			struct sg_table *sg,  			void (*destroy) (struct ttm_buffer_object *)); +  /** - * ttm_bo_synccpu_object_init + * ttm_bo_create   *   * @bdev: Pointer to a ttm_bo_device struct. - * @bo: Pointer to a ttm_buffer_object to be initialized.   * @size: Requested size of buffer object.   * @type: Requested type of buffer object. - * @flags: Initial placement flags. + * @placement: Initial placement.   * @page_alignment: Data alignment in pages. - * @buffer_start: Virtual address of user space data backing a - * user buffer object.   * @interruptible: If needing to sleep while waiting for GPU resources,   * sleep interruptible. - * @persistant_swap_storage: Usually the swap storage is deleted for buffers + * @persistent_swap_storage: Usually the swap storage is deleted for buffers   * pinned in physical memory. If this behaviour is not desired, this member - * holds a pointer to a persistant shmem object. Typically, this would + * holds a pointer to a persistent shmem object. Typically, this would   * point to the shmem object backing a GEM object if TTM is used to back a   * GEM user interface.   * @p_bo: On successful completion *p_bo points to the created object. @@ -486,9 +514,8 @@ extern int ttm_bo_create(struct ttm_bo_device *bdev,  				enum ttm_bo_type type,  				struct ttm_placement *placement,  				uint32_t page_alignment, -				unsigned long buffer_start,  				bool interruptible, -				struct file *persistant_swap_storage, +				struct file *persistent_swap_storage,  				struct ttm_buffer_object **p_bo);  /** @@ -622,9 +649,6 @@ extern int ttm_bo_kmap(struct ttm_buffer_object *bo, unsigned long start_page,  extern void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map); -#if 0 -#endif -  /**   * ttm_fbdev_mmap - mmap fbdev memory backed by a ttm buffer object.   * @@ -679,5 +703,5 @@ extern ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp,  			 size_t count, loff_t *f_pos, bool write);  extern void ttm_bo_swapout_all(struct ttm_bo_device *bdev); - +extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo);  #endif diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 8e0c848326b..a5183da3ef9 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -30,99 +30,59 @@  #ifndef _TTM_BO_DRIVER_H_  #define _TTM_BO_DRIVER_H_ -#include "ttm/ttm_bo_api.h" -#include "ttm/ttm_memory.h" -#include "ttm/ttm_module.h" -#include "drm_mm.h" -#include "drm_global.h" -#include "linux/workqueue.h" -#include "linux/fs.h" -#include "linux/spinlock.h" - -struct ttm_backend; +#include <ttm/ttm_bo_api.h> +#include <ttm/ttm_memory.h> +#include <ttm/ttm_module.h> +#include <ttm/ttm_placement.h> +#include <drm/drm_mm.h> +#include <drm/drm_global.h> +#include <drm/drm_vma_manager.h> +#include <linux/workqueue.h> +#include <linux/fs.h> +#include <linux/spinlock.h> +#include <linux/reservation.h>  struct ttm_backend_func {  	/** -	 * struct ttm_backend_func member populate -	 * -	 * @backend: Pointer to a struct ttm_backend. -	 * @num_pages: Number of pages to populate. -	 * @pages: Array of pointers to ttm pages. -	 * @dummy_read_page: Page to be used instead of NULL pages in the -	 * array @pages. -	 * -	 * Populate the backend with ttm pages. Depending on the backend, -	 * it may or may not copy the @pages array. -	 */ -	int (*populate) (struct ttm_backend *backend, -			 unsigned long num_pages, struct page **pages, -			 struct page *dummy_read_page); -	/** -	 * struct ttm_backend_func member clear -	 * -	 * @backend: Pointer to a struct ttm_backend. -	 * -	 * This is an "unpopulate" function. Release all resources -	 * allocated with populate. -	 */ -	void (*clear) (struct ttm_backend *backend); - -	/**  	 * struct ttm_backend_func member bind  	 * -	 * @backend: Pointer to a struct ttm_backend. +	 * @ttm: Pointer to a struct ttm_tt.  	 * @bo_mem: Pointer to a struct ttm_mem_reg describing the  	 * memory type and location for binding.  	 *  	 * Bind the backend pages into the aperture in the location  	 * indicated by @bo_mem. This function should be able to handle -	 * differences between aperture- and system page sizes. +	 * differences between aperture and system page sizes.  	 */ -	int (*bind) (struct ttm_backend *backend, struct ttm_mem_reg *bo_mem); +	int (*bind) (struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem);  	/**  	 * struct ttm_backend_func member unbind  	 * -	 * @backend: Pointer to a struct ttm_backend. +	 * @ttm: Pointer to a struct ttm_tt.  	 *  	 * Unbind previously bound backend pages. This function should be -	 * able to handle differences between aperture- and system page sizes. +	 * able to handle differences between aperture and system page sizes.  	 */ -	int (*unbind) (struct ttm_backend *backend); +	int (*unbind) (struct ttm_tt *ttm);  	/**  	 * struct ttm_backend_func member destroy  	 * -	 * @backend: Pointer to a struct ttm_backend. +	 * @ttm: Pointer to a struct ttm_tt.  	 * -	 * Destroy the backend. +	 * Destroy the backend. This will be call back from ttm_tt_destroy so +	 * don't call ttm_tt_destroy from the callback or infinite loop.  	 */ -	void (*destroy) (struct ttm_backend *backend); -}; - -/** - * struct ttm_backend - * - * @bdev: Pointer to a struct ttm_bo_device. - * @flags: For driver use. - * @func: Pointer to a struct ttm_backend_func that describes - * the backend methods. - * - */ - -struct ttm_backend { -	struct ttm_bo_device *bdev; -	uint32_t flags; -	struct ttm_backend_func *func; +	void (*destroy) (struct ttm_tt *ttm);  }; -#define TTM_PAGE_FLAG_USER            (1 << 1) -#define TTM_PAGE_FLAG_USER_DIRTY      (1 << 2)  #define TTM_PAGE_FLAG_WRITE           (1 << 3)  #define TTM_PAGE_FLAG_SWAPPED         (1 << 4) -#define TTM_PAGE_FLAG_PERSISTANT_SWAP (1 << 5) +#define TTM_PAGE_FLAG_PERSISTENT_SWAP (1 << 5)  #define TTM_PAGE_FLAG_ZERO_ALLOC      (1 << 6)  #define TTM_PAGE_FLAG_DMA32           (1 << 7) +#define TTM_PAGE_FLAG_SG              (1 << 8)  enum ttm_caching_state {  	tt_uncached, @@ -133,19 +93,15 @@ enum ttm_caching_state {  /**   * struct ttm_tt   * + * @bdev: Pointer to a struct ttm_bo_device. + * @func: Pointer to a struct ttm_backend_func that describes + * the backend methods.   * @dummy_read_page: Page to map where the ttm_tt page array contains a NULL   * pointer.   * @pages: Array of pages backing the data. - * @first_himem_page: Himem pages are put last in the page array, which - * enables us to run caching attribute changes on only the first part - * of the page array containing lomem pages. This is the index of the - * first himem page. - * @last_lomem_page: Index of the last lomem page in the page array.   * @num_pages: Number of pages in the page array.   * @bdev: Pointer to the current struct ttm_bo_device.   * @be: Pointer to the ttm backend. - * @tsk: The task for user ttm. - * @start: virtual address for user ttm.   * @swap_storage: Pointer to shmem struct file for swap storage.   * @caching_state: The current caching state of the pages.   * @state: The current binding state of the pages. @@ -156,16 +112,14 @@ enum ttm_caching_state {   */  struct ttm_tt { +	struct ttm_bo_device *bdev; +	struct ttm_backend_func *func;  	struct page *dummy_read_page;  	struct page **pages; -	long first_himem_page; -	long last_lomem_page;  	uint32_t page_flags;  	unsigned long num_pages; +	struct sg_table *sg; /* for SG objects via dma-buf */  	struct ttm_bo_global *glob; -	struct ttm_backend *be; -	struct task_struct *tsk; -	unsigned long start;  	struct file *swap_storage;  	enum ttm_caching_state caching_state;  	enum { @@ -175,33 +129,26 @@ struct ttm_tt {  	} state;  }; -#define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)	/* Fixed (on-card) PCI memory */ -#define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)	/* Memory mappable */ -#define TTM_MEMTYPE_FLAG_CMA           (1 << 3)	/* Can't map aperture */ -  /** - * struct ttm_mem_type_manager + * struct ttm_dma_tt   * - * @has_type: The memory type has been initialized. - * @use_type: The memory type is enabled. - * @flags: TTM_MEMTYPE_XX flags identifying the traits of the memory - * managed by this memory type. - * @gpu_offset: If used, the GPU offset of the first managed page of - * fixed memory or the first managed location in an aperture. - * @size: Size of the managed region. - * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, - * as defined in ttm_placement_common.h - * @default_caching: The default caching policy used for a buffer object - * placed in this memory type if the user doesn't provide one. - * @manager: The range manager used for this memory type. FIXME: If the aperture - * has a page size different from the underlying system, the granularity - * of this manager should take care of this. But the range allocating code - * in ttm_bo.c needs to be modified for this. - * @lru: The lru list for this memory type. + * @ttm: Base ttm_tt struct. + * @dma_address: The DMA (bus) addresses of the pages + * @pages_list: used by some page allocation backend   * - * This structure is used to identify and manage memory types for a device. - * It's set up by the ttm_bo_driver::init_mem_type method. + * This is a structure holding the pages, caching- and aperture binding + * status for a buffer object that isn't backed by fixed (VRAM / AGP) + * memory.   */ +struct ttm_dma_tt { +	struct ttm_tt ttm; +	dma_addr_t *dma_address; +	struct list_head pages_list; +}; + +#define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)	/* Fixed (on-card) PCI memory */ +#define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)	/* Memory mappable */ +#define TTM_MEMTYPE_FLAG_CMA           (1 << 3)	/* Can't map aperture */  struct ttm_mem_type_manager; @@ -243,9 +190,9 @@ struct ttm_mem_type_manager_func {  	 * @mem::mm_node should be set to a non-null value, and  	 * @mem::start should be set to a value identifying the beginning  	 * of the range allocated, and the function should return zero. -	 * If the memory region accomodate the buffer object, @mem::mm_node +	 * If the memory region accommodate the buffer object, @mem::mm_node  	 * should be set to NULL, and the function should return 0. -	 * If a system error occured, preventing the request to be fulfilled, +	 * If a system error occurred, preventing the request to be fulfilled,  	 * the function should return a negative error code.  	 *  	 * Note that @mem::mm_node will only be dereferenced by @@ -287,6 +234,36 @@ struct ttm_mem_type_manager_func {  	void (*debug)(struct ttm_mem_type_manager *man, const char *prefix);  }; +/** + * struct ttm_mem_type_manager + * + * @has_type: The memory type has been initialized. + * @use_type: The memory type is enabled. + * @flags: TTM_MEMTYPE_XX flags identifying the traits of the memory + * managed by this memory type. + * @gpu_offset: If used, the GPU offset of the first managed page of + * fixed memory or the first managed location in an aperture. + * @size: Size of the managed region. + * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, + * as defined in ttm_placement_common.h + * @default_caching: The default caching policy used for a buffer object + * placed in this memory type if the user doesn't provide one. + * @func: structure pointer implementing the range manager. See above + * @priv: Driver private closure for @func. + * @io_reserve_mutex: Mutex optionally protecting shared io_reserve structures + * @use_io_reserve_lru: Use an lru list to try to unreserve io_mem_regions + * reserved by the TTM vm system. + * @io_reserve_lru: Optional lru list for unreserving io mem regions. + * @io_reserve_fastpath: Only use bdev::driver::io_mem_reserve to obtain + * static information. bdev::driver::io_mem_free is never used. + * @lru: The lru list for this memory type. + * + * This structure is used to identify and manage memory types for a device. + * It's set up by the ttm_bo_driver::init_mem_type method. + */ + + +  struct ttm_mem_type_manager {  	struct ttm_bo_device *bdev; @@ -303,6 +280,15 @@ struct ttm_mem_type_manager {  	uint32_t default_caching;  	const struct ttm_mem_type_manager_func *func;  	void *priv; +	struct mutex io_reserve_mutex; +	bool use_io_reserve_lru; +	bool io_reserve_fastpath; + +	/* +	 * Protected by @io_reserve_mutex: +	 */ + +	struct list_head io_reserve_lru;  	/*  	 * Protected by the global->lru_lock. @@ -332,15 +318,42 @@ struct ttm_mem_type_manager {  struct ttm_bo_driver {  	/** -	 * struct ttm_bo_driver member create_ttm_backend_entry +	 * ttm_tt_create  	 * -	 * @bdev: The buffer object device. +	 * @bdev: pointer to a struct ttm_bo_device: +	 * @size: Size of the data needed backing. +	 * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. +	 * @dummy_read_page: See struct ttm_bo_device.  	 * -	 * Create a driver specific struct ttm_backend. +	 * Create a struct ttm_tt to back data with system memory pages. +	 * No pages are actually allocated. +	 * Returns: +	 * NULL: Out of memory.  	 */ +	struct ttm_tt *(*ttm_tt_create)(struct ttm_bo_device *bdev, +					unsigned long size, +					uint32_t page_flags, +					struct page *dummy_read_page); -	struct ttm_backend *(*create_ttm_backend_entry) -	 (struct ttm_bo_device *bdev); +	/** +	 * ttm_tt_populate +	 * +	 * @ttm: The struct ttm_tt to contain the backing pages. +	 * +	 * Allocate all backing pages +	 * Returns: +	 * -ENOMEM: Out of memory. +	 */ +	int (*ttm_tt_populate)(struct ttm_tt *ttm); + +	/** +	 * ttm_tt_unpopulate +	 * +	 * @ttm: The struct ttm_tt to contain the backing pages. +	 * +	 * Free all backing page +	 */ +	void (*ttm_tt_unpopulate)(struct ttm_tt *ttm);  	/**  	 * struct ttm_bo_driver member invalidate_caches @@ -384,7 +397,7 @@ struct ttm_bo_driver {  	 */  	int (*move) (struct ttm_buffer_object *bo,  		     bool evict, bool interruptible, -		     bool no_wait_reserve, bool no_wait_gpu, +		     bool no_wait_gpu,  		     struct ttm_mem_reg *new_mem);  	/** @@ -412,10 +425,10 @@ struct ttm_bo_driver {  	 * documentation.  	 */ -	bool (*sync_obj_signaled) (void *sync_obj, void *sync_arg); -	int (*sync_obj_wait) (void *sync_obj, void *sync_arg, +	bool (*sync_obj_signaled) (void *sync_obj); +	int (*sync_obj_wait) (void *sync_obj,  			      bool lazy, bool interruptible); -	int (*sync_obj_flush) (void *sync_obj, void *sync_arg); +	int (*sync_obj_flush) (void *sync_obj);  	void (*sync_obj_unref) (void **sync_obj);  	void *(*sync_obj_ref) (void *sync_obj); @@ -458,9 +471,6 @@ struct ttm_bo_global_ref {   * @dummy_read_page: Pointer to a dummy page used for mapping requests   * of unpopulated pages.   * @shrink: A shrink callback object used for buffer object swap. - * @ttm_bo_extra_size: Extra size (sizeof(struct ttm_buffer_object) excluded) - * used by a buffer object. This is excluding page arrays and backing pages. - * @ttm_bo_size: This is @ttm_bo_extra_size + sizeof(struct ttm_buffer_object).   * @device_list_mutex: Mutex protecting the device list.   * This mutex is held while traversing the device list for pm options.   * @lru_lock: Spinlock protecting the bo subsystem lru lists. @@ -478,8 +488,6 @@ struct ttm_bo_global {  	struct ttm_mem_global *mem_glob;  	struct page *dummy_read_page;  	struct ttm_mem_shrink shrink; -	size_t ttm_bo_extra_size; -	size_t ttm_bo_size;  	struct mutex device_list_mutex;  	spinlock_t lru_lock; @@ -510,11 +518,12 @@ struct ttm_bo_global {   *   * @driver: Pointer to a struct ttm_bo_driver struct setup by the driver.   * @man: An array of mem_type_managers. - * @addr_space_mm: Range manager for the device address space. + * @fence_lock: Protects the synchronizing members on *all* bos belonging + * to this device. + * @vma_manager: Address space manager   * lru_lock: Spinlock that protects the buffer+device lru lists and   * ddestroy lists. - * @nice_mode: Try nicely to wait for buffer idle when cleaning a manager. - * If a GPU lockup has been detected, this is forced to 0. + * @val_seq: Current validation sequence.   * @dev_mapping: A pointer to the struct address_space representing the   * device address space.   * @wq: Work queue structure for the delayed delete workqueue. @@ -529,24 +538,24 @@ struct ttm_bo_device {  	struct list_head device_list;  	struct ttm_bo_global *glob;  	struct ttm_bo_driver *driver; -	rwlock_t vm_lock;  	struct ttm_mem_type_manager man[TTM_NUM_MEM_TYPES]; +	spinlock_t fence_lock; +  	/* -	 * Protected by the vm lock. +	 * Protected by internal locks.  	 */ -	struct rb_root addr_space_rb; -	struct drm_mm addr_space_mm; +	struct drm_vma_offset_manager vma_manager;  	/*  	 * Protected by the global:lru lock.  	 */  	struct list_head ddestroy; +	uint32_t val_seq;  	/*  	 * Protected by load / firstopen / lastclose /unload sync.  	 */ -	bool nice_mode;  	struct address_space *dev_mapping;  	/* @@ -576,8 +585,9 @@ ttm_flag_masked(uint32_t *old, uint32_t new, uint32_t mask)  }  /** - * ttm_tt_create + * ttm_tt_init   * + * @ttm: The struct ttm_tt.   * @bdev: pointer to a struct ttm_bo_device:   * @size: Size of the data needed backing.   * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. @@ -588,28 +598,22 @@ ttm_flag_masked(uint32_t *old, uint32_t new, uint32_t mask)   * Returns:   * NULL: Out of memory.   */ -extern struct ttm_tt *ttm_tt_create(struct ttm_bo_device *bdev, -				    unsigned long size, -				    uint32_t page_flags, -				    struct page *dummy_read_page); +extern int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev, +			unsigned long size, uint32_t page_flags, +			struct page *dummy_read_page); +extern int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_bo_device *bdev, +			   unsigned long size, uint32_t page_flags, +			   struct page *dummy_read_page);  /** - * ttm_tt_set_user: + * ttm_tt_fini   * - * @ttm: The struct ttm_tt to populate. - * @tsk: A struct task_struct for which @start is a valid user-space address. - * @start: A valid user-space address. - * @num_pages: Size in pages of the user memory area. + * @ttm: the ttm_tt structure.   * - * Populate a struct ttm_tt with a user-space memory area after first pinning - * the pages backing it. - * Returns: - * !0: Error. + * Free memory of ttm_tt structure   */ - -extern int ttm_tt_set_user(struct ttm_tt *ttm, -			   struct task_struct *tsk, -			   unsigned long start, unsigned long num_pages); +extern void ttm_tt_fini(struct ttm_tt *ttm); +extern void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma);  /**   * ttm_ttm_bind: @@ -622,20 +626,11 @@ extern int ttm_tt_set_user(struct ttm_tt *ttm,  extern int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem);  /** - * ttm_tt_populate: - * - * @ttm: The struct ttm_tt to contain the backing pages. - * - * Add backing pages to all of @ttm - */ -extern int ttm_tt_populate(struct ttm_tt *ttm); - -/**   * ttm_ttm_destroy:   *   * @ttm: The struct ttm_tt.   * - * Unbind, unpopulate and destroy a struct ttm_tt. + * Unbind, unpopulate and destroy common struct ttm_tt.   */  extern void ttm_tt_destroy(struct ttm_tt *ttm); @@ -649,19 +644,13 @@ extern void ttm_tt_destroy(struct ttm_tt *ttm);  extern void ttm_tt_unbind(struct ttm_tt *ttm);  /** - * ttm_ttm_destroy: + * ttm_tt_swapin:   *   * @ttm: The struct ttm_tt. - * @index: Index of the desired page.   * - * Return a pointer to the struct page backing @ttm at page - * index @index. If the page is unpopulated, one will be allocated to - * populate that index. - * - * Returns: - * NULL on OOM. + * Swap in a previously swap out ttm_tt.   */ -extern struct page *ttm_tt_get_page(struct ttm_tt *ttm, int index); +extern int ttm_tt_swapin(struct ttm_tt *ttm);  /**   * ttm_tt_cache_flush: @@ -690,7 +679,16 @@ extern void ttm_tt_cache_flush(struct page *pages[], unsigned long num_pages);   */  extern int ttm_tt_set_placement_caching(struct ttm_tt *ttm, uint32_t placement);  extern int ttm_tt_swapout(struct ttm_tt *ttm, -			  struct file *persistant_swap_storage); +			  struct file *persistent_swap_storage); + +/** + * ttm_tt_unpopulate - free pages from a ttm + * + * @ttm: Pointer to the ttm_tt structure + * + * Calls the driver method to free all pages from a ttm + */ +extern void ttm_tt_unpopulate(struct ttm_tt *ttm);  /*   * ttm_bo.c @@ -716,7 +714,6 @@ extern bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev,   * @proposed_placement: Proposed new placement for the buffer object.   * @mem: A struct ttm_mem_reg.   * @interruptible: Sleep interruptible when sliping. - * @no_wait_reserve: Return immediately if other buffers are busy.   * @no_wait_gpu: Return immediately if the GPU is busy.   *   * Allocate memory space for the buffer object pointed to by @bo, using @@ -732,52 +729,13 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,  				struct ttm_placement *placement,  				struct ttm_mem_reg *mem,  				bool interruptible, -				bool no_wait_reserve, bool no_wait_gpu); +				bool no_wait_gpu);  extern void ttm_bo_mem_put(struct ttm_buffer_object *bo,  			   struct ttm_mem_reg *mem);  extern void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,  				  struct ttm_mem_reg *mem); -/** - * ttm_bo_wait_for_cpu - * - * @bo: Pointer to a struct ttm_buffer_object. - * @no_wait: Don't sleep while waiting. - * - * Wait until a buffer object is no longer sync'ed for CPU access. - * Returns: - * -EBUSY: Buffer object was sync'ed for CPU access. (only if no_wait == 1). - * -ERESTARTSYS: An interruptible sleep was interrupted by a signal. - */ - -extern int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait); - -/** - * ttm_bo_pci_offset - Get the PCI offset for the buffer object memory. - * - * @bo Pointer to a struct ttm_buffer_object. - * @bus_base On return the base of the PCI region - * @bus_offset On return the byte offset into the PCI region - * @bus_size On return the byte size of the buffer object or zero if - * the buffer object memory is not accessible through a PCI region. - * - * Returns: - * -EINVAL if the buffer object is currently not mappable. - * 0 otherwise. - */ - -extern int ttm_bo_pci_offset(struct ttm_bo_device *bdev, -			     struct ttm_mem_reg *mem, -			     unsigned long *bus_base, -			     unsigned long *bus_offset, -			     unsigned long *bus_size); - -extern int ttm_mem_io_reserve(struct ttm_bo_device *bdev, -				struct ttm_mem_reg *mem); -extern void ttm_mem_io_free(struct ttm_bo_device *bdev, -				struct ttm_mem_reg *mem); -  extern void ttm_bo_global_release(struct drm_global_reference *ref);  extern int ttm_bo_global_init(struct drm_global_reference *ref); @@ -787,8 +745,9 @@ extern int ttm_bo_device_release(struct ttm_bo_device *bdev);   * ttm_bo_device_init   *   * @bdev: A pointer to a struct ttm_bo_device to initialize. - * @mem_global: A pointer to an initialized struct ttm_mem_global. + * @glob: A pointer to an initialized struct ttm_bo_global.   * @driver: A pointer to a struct ttm_bo_driver set up by the caller. + * @mapping: The address space to use for this bo.   * @file_page_offset: Offset into the device address space that is available   * for buffer data. This ensures compatibility with other users of the   * address space. @@ -800,6 +759,7 @@ extern int ttm_bo_device_release(struct ttm_bo_device *bdev);  extern int ttm_bo_device_init(struct ttm_bo_device *bdev,  			      struct ttm_bo_global *glob,  			      struct ttm_bo_driver *driver, +			      struct address_space *mapping,  			      uint64_t file_page_offset, bool need_dma32);  /** @@ -810,13 +770,78 @@ extern int ttm_bo_device_init(struct ttm_bo_device *bdev,  extern void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo);  /** + * ttm_bo_unmap_virtual + * + * @bo: tear down the virtual mappings for this BO + * + * The caller must take ttm_mem_io_lock before calling this function. + */ +extern void ttm_bo_unmap_virtual_locked(struct ttm_buffer_object *bo); + +extern int ttm_mem_io_reserve_vm(struct ttm_buffer_object *bo); +extern void ttm_mem_io_free_vm(struct ttm_buffer_object *bo); +extern int ttm_mem_io_lock(struct ttm_mem_type_manager *man, +			   bool interruptible); +extern void ttm_mem_io_unlock(struct ttm_mem_type_manager *man); + +extern void ttm_bo_del_sub_from_lru(struct ttm_buffer_object *bo); +extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo); + +/** + * __ttm_bo_reserve: + * + * @bo: A pointer to a struct ttm_buffer_object. + * @interruptible: Sleep interruptible if waiting. + * @no_wait: Don't sleep while trying to reserve, rather return -EBUSY. + * @use_ticket: If @bo is already reserved, Only sleep waiting for + * it to become unreserved if @ticket->stamp is older. + * + * Will not remove reserved buffers from the lru lists. + * Otherwise identical to ttm_bo_reserve. + * + * Returns: + * -EDEADLK: The reservation may cause a deadlock. + * Release all buffer reservations, wait for @bo to become unreserved and + * try again. (only if use_sequence == 1). + * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by + * a signal. Release all buffer reservations and return to user-space. + * -EBUSY: The function needed to sleep, but @no_wait was true + * -EALREADY: Bo already reserved using @ticket. This error code will only + * be returned if @use_ticket is set to true. + */ +static inline int __ttm_bo_reserve(struct ttm_buffer_object *bo, +				   bool interruptible, +				   bool no_wait, bool use_ticket, +				   struct ww_acquire_ctx *ticket) +{ +	int ret = 0; + +	if (no_wait) { +		bool success; +		if (WARN_ON(ticket)) +			return -EBUSY; + +		success = ww_mutex_trylock(&bo->resv->lock); +		return success ? 0 : -EBUSY; +	} + +	if (interruptible) +		ret = ww_mutex_lock_interruptible(&bo->resv->lock, ticket); +	else +		ret = ww_mutex_lock(&bo->resv->lock, ticket); +	if (ret == -EINTR) +		return -ERESTARTSYS; +	return ret; +} + +/**   * ttm_bo_reserve:   *   * @bo: A pointer to a struct ttm_buffer_object.   * @interruptible: Sleep interruptible if waiting.   * @no_wait: Don't sleep while trying to reserve, rather return -EBUSY. - * @use_sequence: If @bo is already reserved, Only sleep waiting for - * it to become unreserved if @sequence < (@bo)->sequence. + * @use_ticket: If @bo is already reserved, Only sleep waiting for + * it to become unreserved if @ticket->stamp is older.   *   * Locks a buffer object for validation. (Or prevents other processes from   * locking it for validation) and removes it from lru lists, while taking @@ -826,20 +851,11 @@ extern void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo);   * different order, either by will or as a result of a buffer being evicted   * to make room for a buffer already reserved. (Buffers are reserved before   * they are evicted). The following algorithm prevents such deadlocks from - * occuring: - * 1) Buffers are reserved with the lru spinlock held. Upon successful - * reservation they are removed from the lru list. This stops a reserved buffer - * from being evicted. However the lru spinlock is released between the time - * a buffer is selected for eviction and the time it is reserved. - * Therefore a check is made when a buffer is reserved for eviction, that it - * is still the first buffer in the lru list, before it is removed from the - * list. @check_lru == 1 forces this check. If it fails, the function returns - * -EINVAL, and the caller should then choose a new buffer to evict and repeat - * the procedure. - * 2) Processes attempting to reserve multiple buffers other than for eviction, + * occurring: + * Processes attempting to reserve multiple buffers other than for eviction,   * (typically execbuf), should first obtain a unique 32-bit   * validation sequence number, - * and call this function with @use_sequence == 1 and @sequence == the unique + * and call this function with @use_ticket == 1 and @ticket->stamp == the unique   * sequence number. If upon call of this function, the buffer object is already   * reserved, the validation sequence is checked against the validation   * sequence of the process currently reserving the buffer, @@ -854,15 +870,74 @@ extern void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo);   * will eventually succeed, preventing both deadlocks and starvation.   *   * Returns: - * -EAGAIN: The reservation may cause a deadlock. + * -EDEADLK: The reservation may cause a deadlock.   * Release all buffer reservations, wait for @bo to become unreserved and   * try again. (only if use_sequence == 1).   * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by   * a signal. Release all buffer reservations and return to user-space. + * -EBUSY: The function needed to sleep, but @no_wait was true + * -EALREADY: Bo already reserved using @ticket. This error code will only + * be returned if @use_ticket is set to true.   */ -extern int ttm_bo_reserve(struct ttm_buffer_object *bo, -			  bool interruptible, -			  bool no_wait, bool use_sequence, uint32_t sequence); +static inline int ttm_bo_reserve(struct ttm_buffer_object *bo, +				 bool interruptible, +				 bool no_wait, bool use_ticket, +				 struct ww_acquire_ctx *ticket) +{ +	int ret; + +	WARN_ON(!atomic_read(&bo->kref.refcount)); + +	ret = __ttm_bo_reserve(bo, interruptible, no_wait, use_ticket, ticket); +	if (likely(ret == 0)) +		ttm_bo_del_sub_from_lru(bo); + +	return ret; +} + +/** + * ttm_bo_reserve_slowpath: + * @bo: A pointer to a struct ttm_buffer_object. + * @interruptible: Sleep interruptible if waiting. + * @sequence: Set (@bo)->sequence to this value after lock + * + * This is called after ttm_bo_reserve returns -EAGAIN and we backed off + * from all our other reservations. Because there are no other reservations + * held by us, this function cannot deadlock any more. + */ +static inline int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo, +					  bool interruptible, +					  struct ww_acquire_ctx *ticket) +{ +	int ret = 0; + +	WARN_ON(!atomic_read(&bo->kref.refcount)); + +	if (interruptible) +		ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock, +						       ticket); +	else +		ww_mutex_lock_slow(&bo->resv->lock, ticket); + +	if (likely(ret == 0)) +		ttm_bo_del_sub_from_lru(bo); +	else if (ret == -EINTR) +		ret = -ERESTARTSYS; + +	return ret; +} + +/** + * __ttm_bo_unreserve + * @bo: A pointer to a struct ttm_buffer_object. + * + * Unreserve a previous reservation of @bo where the buffer object is + * already on lru lists. + */ +static inline void __ttm_bo_unreserve(struct ttm_buffer_object *bo) +{ +	ww_mutex_unlock(&bo->resv->lock); +}  /**   * ttm_bo_unreserve @@ -871,30 +946,42 @@ extern int ttm_bo_reserve(struct ttm_buffer_object *bo,   *   * Unreserve a previous reservation of @bo.   */ -extern void ttm_bo_unreserve(struct ttm_buffer_object *bo); +static inline void ttm_bo_unreserve(struct ttm_buffer_object *bo) +{ +	if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { +		spin_lock(&bo->glob->lru_lock); +		ttm_bo_add_to_lru(bo); +		spin_unlock(&bo->glob->lru_lock); +	} +	__ttm_bo_unreserve(bo); +}  /** - * ttm_bo_wait_unreserved - * + * ttm_bo_unreserve_ticket   * @bo: A pointer to a struct ttm_buffer_object. + * @ticket: ww_acquire_ctx used for reserving   * - * Wait for a struct ttm_buffer_object to become unreserved. - * This is typically used in the execbuf code to relax cpu-usage when - * a potential deadlock condition backoff. + * Unreserve a previous reservation of @bo made with @ticket.   */ -extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, -				  bool interruptible); +static inline void ttm_bo_unreserve_ticket(struct ttm_buffer_object *bo, +					   struct ww_acquire_ctx *t) +{ +	ttm_bo_unreserve(bo); +}  /*   * ttm_bo_util.c   */ +int ttm_mem_io_reserve(struct ttm_bo_device *bdev, +		       struct ttm_mem_reg *mem); +void ttm_mem_io_free(struct ttm_bo_device *bdev, +		     struct ttm_mem_reg *mem);  /**   * ttm_bo_move_ttm   *   * @bo: A pointer to a struct ttm_buffer_object.   * @evict: 1: This is an eviction. Don't try to pipeline. - * @no_wait_reserve: Return immediately if other buffers are busy.   * @no_wait_gpu: Return immediately if the GPU is busy.   * @new_mem: struct ttm_mem_reg indicating where to move.   * @@ -909,15 +996,14 @@ extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo,   */  extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo, -			   bool evict, bool no_wait_reserve, -			   bool no_wait_gpu, struct ttm_mem_reg *new_mem); +			   bool evict, bool no_wait_gpu, +			   struct ttm_mem_reg *new_mem);  /**   * ttm_bo_move_memcpy   *   * @bo: A pointer to a struct ttm_buffer_object.   * @evict: 1: This is an eviction. Don't try to pipeline. - * @no_wait_reserve: Return immediately if other buffers are busy.   * @no_wait_gpu: Return immediately if the GPU is busy.   * @new_mem: struct ttm_mem_reg indicating where to move.   * @@ -932,8 +1018,8 @@ extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo,   */  extern int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, -			      bool evict, bool no_wait_reserve, -			      bool no_wait_gpu, struct ttm_mem_reg *new_mem); +			      bool evict, bool no_wait_gpu, +			      struct ttm_mem_reg *new_mem);  /**   * ttm_bo_free_old_node @@ -949,10 +1035,7 @@ extern void ttm_bo_free_old_node(struct ttm_buffer_object *bo);   *   * @bo: A pointer to a struct ttm_buffer_object.   * @sync_obj: A sync object that signals when moving is complete. - * @sync_obj_arg: An argument to pass to the sync object idle / wait - * functions.   * @evict: This is an evict move. Don't return until the buffer is idle. - * @no_wait_reserve: Return immediately if other buffers are busy.   * @no_wait_gpu: Return immediately if the GPU is busy.   * @new_mem: struct ttm_mem_reg indicating where to move.   * @@ -966,9 +1049,7 @@ extern void ttm_bo_free_old_node(struct ttm_buffer_object *bo);  extern int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,  				     void *sync_obj, -				     void *sync_obj_arg, -				     bool evict, bool no_wait_reserve, -				     bool no_wait_gpu, +				     bool evict, bool no_wait_gpu,  				     struct ttm_mem_reg *new_mem);  /**   * ttm_io_prot @@ -988,17 +1069,25 @@ extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;  #include <linux/agp_backend.h>  /** - * ttm_agp_backend_init + * ttm_agp_tt_create   *   * @bdev: Pointer to a struct ttm_bo_device.   * @bridge: The agp bridge this device is sitting on. + * @size: Size of the data needed backing. + * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. + * @dummy_read_page: See struct ttm_bo_device. + *   *   * Create a TTM backend that uses the indicated AGP bridge as an aperture   * for TT memory. This function uses the linux agpgart interface to   * bind and unbind memory backing a ttm_tt.   */ -extern struct ttm_backend *ttm_agp_backend_init(struct ttm_bo_device *bdev, -						struct agp_bridge_data *bridge); +extern struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev, +					struct agp_bridge_data *bridge, +					unsigned long size, uint32_t page_flags, +					struct page *dummy_read_page); +int ttm_agp_tt_populate(struct ttm_tt *ttm); +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm);  #endif  #endif diff --git a/include/drm/ttm/ttm_execbuf_util.h b/include/drm/ttm/ttm_execbuf_util.h index cd2c475da9e..16db7d01a33 100644 --- a/include/drm/ttm/ttm_execbuf_util.h +++ b/include/drm/ttm/ttm_execbuf_util.h @@ -31,7 +31,7 @@  #ifndef _TTM_EXECBUF_UTIL_H_  #define _TTM_EXECBUF_UTIL_H_ -#include "ttm/ttm_bo_api.h" +#include <ttm/ttm_bo_api.h>  #include <linux/list.h>  /** @@ -39,34 +39,40 @@   *   * @head:           list head for thread-private list.   * @bo:             refcounted buffer object pointer. - * @new_sync_obj_arg: New sync_obj_arg for @bo, to be used once - * adding a new sync object. - * @reservied:      Indicates whether @bo has been reserved for validation. + * @reserved:       Indicates whether @bo has been reserved for validation. + * @removed:        Indicates whether @bo has been removed from lru lists. + * @put_count:      Number of outstanding references on bo::list_kref. + * @old_sync_obj:   Pointer to a sync object about to be unreferenced   */  struct ttm_validate_buffer {  	struct list_head head;  	struct ttm_buffer_object *bo; -	void *new_sync_obj_arg;  	bool reserved; +	bool removed; +	int put_count; +	void *old_sync_obj;  };  /**   * function ttm_eu_backoff_reservation   * + * @ticket:   ww_acquire_ctx from reserve call   * @list:     thread private list of ttm_validate_buffer structs.   *   * Undoes all buffer validation reservations for bos pointed to by   * the list entries.   */ -extern void ttm_eu_backoff_reservation(struct list_head *list); +extern void ttm_eu_backoff_reservation(struct ww_acquire_ctx *ticket, +				       struct list_head *list);  /**   * function ttm_eu_reserve_buffers   * + * @ticket:  [out] ww_acquire_ctx filled in by call, or NULL if only + *           non-blocking reserves should be tried.   * @list:    thread private list of ttm_validate_buffer structs. - * @val_seq: A unique sequence number.   *   * Tries to reserve bos pointed to by the list entries for validation.   * If the function returns 0, all buffers are marked as "unfenced", @@ -88,11 +94,13 @@ extern void ttm_eu_backoff_reservation(struct list_head *list);   * has failed.   */ -extern int ttm_eu_reserve_buffers(struct list_head *list, uint32_t val_seq); +extern int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket, +				  struct list_head *list);  /**   * function ttm_eu_fence_buffer_objects.   * + * @ticket:      ww_acquire_ctx from reserve call   * @list:        thread private list of ttm_validate_buffer structs.   * @sync_obj:    The new sync object for the buffers.   * @@ -102,6 +110,7 @@ extern int ttm_eu_reserve_buffers(struct list_head *list, uint32_t val_seq);   *   */ -extern void ttm_eu_fence_buffer_objects(struct list_head *list, void *sync_obj); +extern void ttm_eu_fence_buffer_objects(struct ww_acquire_ctx *ticket, +					struct list_head *list, void *sync_obj);  #endif diff --git a/include/drm/ttm/ttm_lock.h b/include/drm/ttm/ttm_lock.h index 81ba0b0b891..2902beb5f68 100644 --- a/include/drm/ttm/ttm_lock.h +++ b/include/drm/ttm/ttm_lock.h @@ -49,9 +49,9 @@  #ifndef _TTM_LOCK_H_  #define _TTM_LOCK_H_ -#include "ttm/ttm_object.h" +#include <ttm/ttm_object.h>  #include <linux/wait.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  /**   * struct ttm_lock diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h index b199170b3c2..72dcbe81dd0 100644 --- a/include/drm/ttm/ttm_memory.h +++ b/include/drm/ttm/ttm_memory.h @@ -30,6 +30,7 @@  #include <linux/workqueue.h>  #include <linux/spinlock.h> +#include <linux/bug.h>  #include <linux/wait.h>  #include <linux/errno.h>  #include <linux/kobject.h> @@ -41,7 +42,7 @@   * @do_shrink: The callback function.   *   * Arguments to the do_shrink functions are intended to be passed using - * inheritance. That is, the argument class derives from struct ttm_mem_srink, + * inheritance. That is, the argument class derives from struct ttm_mem_shrink,   * and can be accessed using container_of().   */ @@ -59,7 +60,6 @@ struct ttm_mem_shrink {   * for the GPU, and this will otherwise block other workqueue tasks(?)   * At this point we use only a single-threaded workqueue.   * @work: The workqueue callback for the shrink queue. - * @queue: Wait queue for processes suspended waiting for memory.   * @lock: Lock to protect the @shrink - and the memory accounting members,   * that is, essentially the whole structure with some exceptions.   * @zones: Array of pointers to accounting zones. @@ -79,7 +79,6 @@ struct ttm_mem_global {  	struct ttm_mem_shrink *shrink;  	struct workqueue_struct *swap_queue;  	struct work_struct work; -	wait_queue_head_t queue;  	spinlock_t lock;  	struct ttm_mem_zone *zones[TTM_MEM_MAX_ZONES];  	unsigned int num_zones; diff --git a/include/drm/ttm/ttm_object.h b/include/drm/ttm/ttm_object.h index 0d9db099978..ed953f98f0e 100644 --- a/include/drm/ttm/ttm_object.h +++ b/include/drm/ttm/ttm_object.h @@ -38,8 +38,10 @@  #define _TTM_OBJECT_H_  #include <linux/list.h> -#include "drm_hashtab.h" +#include <drm/drm_hashtab.h>  #include <linux/kref.h> +#include <linux/rcupdate.h> +#include <linux/dma-buf.h>  #include <ttm/ttm_memory.h>  /** @@ -76,6 +78,7 @@ enum ttm_object_type {  	ttm_fence_type,  	ttm_buffer_type,  	ttm_lock_type, +	ttm_prime_type,  	ttm_driver_type0 = 256,  	ttm_driver_type1,  	ttm_driver_type2, @@ -111,7 +114,7 @@ struct ttm_object_device;   *   * @ref_obj_release: A function to be called when a reference object   * with another ttm_ref_type than TTM_REF_USAGE is deleted. - * this function may, for example, release a lock held by a user-space + * This function may, for example, release a lock held by a user-space   * process.   *   * This struct is intended to be used as a base struct for objects that @@ -120,6 +123,7 @@ struct ttm_object_device;   */  struct ttm_base_object { +	struct rcu_head rhead;  	struct drm_hash_item hash;  	enum ttm_object_type object_type;  	bool shareable; @@ -130,6 +134,30 @@ struct ttm_base_object {  				 enum ttm_ref_type ref_type);  }; + +/** + * struct ttm_prime_object - Modified base object that is prime-aware + * + * @base: struct ttm_base_object that we derive from + * @mutex: Mutex protecting the @dma_buf member. + * @size: Size of the dma_buf associated with this object + * @real_type: Type of the underlying object. Needed since we're setting + * the value of @base::object_type to ttm_prime_type + * @dma_buf: Non ref-coutned pointer to a struct dma_buf created from this + * object. + * @refcount_release: The underlying object's release method. Needed since + * we set @base::refcount_release to our own release method. + */ + +struct ttm_prime_object { +	struct ttm_base_object base; +	struct mutex mutex; +	size_t size; +	enum ttm_object_type real_type; +	struct dma_buf *dma_buf; +	void (*refcount_release) (struct ttm_base_object **); +}; +  /**   * ttm_base_object_init   * @@ -162,17 +190,29 @@ extern int ttm_base_object_init(struct ttm_object_file *tfile,   * @key: Hash key   *   * Looks up a struct ttm_base_object with the key @key. - * Also verifies that the object is visible to the application, by - * comparing the @tfile argument and checking the object shareable flag.   */  extern struct ttm_base_object *ttm_base_object_lookup(struct ttm_object_file  						      *tfile, uint32_t key);  /** + * ttm_base_object_lookup_for_ref + * + * @tdev: Pointer to a struct ttm_object_device. + * @key: Hash key + * + * Looks up a struct ttm_base_object with the key @key. + * This function should only be used when the struct tfile associated with the + * caller doesn't yet have a reference to the base object. + */ + +extern struct ttm_base_object * +ttm_base_object_lookup_for_ref(struct ttm_object_device *tdev, uint32_t key); + +/**   * ttm_base_object_unref   * - * @p_base: Pointer to a pointer referncing a struct ttm_base_object. + * @p_base: Pointer to a pointer referencing a struct ttm_base_object.   *   * Decrements the base object refcount and clears the pointer pointed to by   * p_base. @@ -190,6 +230,8 @@ extern void ttm_base_object_unref(struct ttm_base_object **p_base);   * @existed: Upon completion, indicates that an identical reference object   * already existed, and the refcount was upped on that object instead.   * + * Checks that the base object is shareable and adds a ref object to it. + *   * Adding a ref object to a base object is basically like referencing the   * base object, but a user-space application holds the reference. When the   * file corresponding to @tfile is closed, all its reference objects are @@ -202,6 +244,10 @@ extern void ttm_base_object_unref(struct ttm_base_object **p_base);  extern int ttm_ref_object_add(struct ttm_object_file *tfile,  			      struct ttm_base_object *base,  			      enum ttm_ref_type ref_type, bool *existed); + +extern bool ttm_ref_object_exists(struct ttm_object_file *tfile, +				  struct ttm_base_object *base); +  /**   * ttm_ref_object_base_unref   * @@ -246,14 +292,18 @@ extern void ttm_object_file_release(struct ttm_object_file **p_tfile);  /**   * ttm_object device init - initialize a struct ttm_object_device   * + * @mem_glob: struct ttm_mem_global for memory accounting.   * @hash_order: Order of hash table used to hash the base objects. + * @ops: DMA buf ops for prime objects of this device.   *   * This function is typically called on device initialization to prepare   * data structures needed for ttm base and ref objects.   */ -extern struct ttm_object_device *ttm_object_device_init -    (struct ttm_mem_global *mem_glob, unsigned int hash_order); +extern struct ttm_object_device * +ttm_object_device_init(struct ttm_mem_global *mem_glob, +		       unsigned int hash_order, +		       const struct dma_buf_ops *ops);  /**   * ttm_object_device_release - release data held by a ttm_object_device @@ -268,4 +318,33 @@ extern struct ttm_object_device *ttm_object_device_init  extern void ttm_object_device_release(struct ttm_object_device **p_tdev); +#define ttm_base_object_kfree(__object, __base)\ +	kfree_rcu(__object, __base.rhead) + +extern int ttm_prime_object_init(struct ttm_object_file *tfile, +				 size_t size, +				 struct ttm_prime_object *prime, +				 bool shareable, +				 enum ttm_object_type type, +				 void (*refcount_release) +				 (struct ttm_base_object **), +				 void (*ref_obj_release) +				 (struct ttm_base_object *, +				  enum ttm_ref_type ref_type)); + +static inline enum ttm_object_type +ttm_base_object_type(struct ttm_base_object *base) +{ +	return (base->object_type == ttm_prime_type) ? +		container_of(base, struct ttm_prime_object, base)->real_type : +		base->object_type; +} +extern int ttm_prime_fd_to_handle(struct ttm_object_file *tfile, +				  int fd, u32 *handle); +extern int ttm_prime_handle_to_fd(struct ttm_object_file *tfile, +				  uint32_t handle, uint32_t flags, +				  int *prime_fd); + +#define ttm_prime_object_kfree(__obj, __prime)		\ +	kfree_rcu(__obj, __prime.base.rhead)  #endif diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h index 116821448c3..49a828425fa 100644 --- a/include/drm/ttm/ttm_page_alloc.h +++ b/include/drm/ttm/ttm_page_alloc.h @@ -26,45 +26,85 @@  #ifndef TTM_PAGE_ALLOC  #define TTM_PAGE_ALLOC -#include "ttm_bo_driver.h" -#include "ttm_memory.h" +#include <drm/ttm/ttm_bo_driver.h> +#include <drm/ttm/ttm_memory.h> +struct device; + +/** + * Initialize pool allocator. + */ +int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages);  /** - * Get count number of pages from pool to pages list. + * Free pool allocator. + */ +void ttm_page_alloc_fini(void); + +/** + * ttm_pool_populate:   * - * @pages: heado of empty linked list where pages are filled. - * @flags: ttm flags for page allocation. - * @cstate: ttm caching state for the page. - * @count: number of pages to allocate. + * @ttm: The struct ttm_tt to contain the backing pages. + * + * Add backing pages to all of @ttm   */ -int ttm_get_pages(struct list_head *pages, -		  int flags, -		  enum ttm_caching_state cstate, -		  unsigned count); +extern int ttm_pool_populate(struct ttm_tt *ttm); +  /** - * Put linked list of pages to pool. + * ttm_pool_unpopulate:   * - * @pages: list of pages to free. - * @page_count: number of pages in the list. Zero can be passed for unknown - * count. - * @flags: ttm flags for page allocation. - * @cstate: ttm caching state. + * @ttm: The struct ttm_tt which to free backing pages. + * + * Free all pages of @ttm + */ +extern void ttm_pool_unpopulate(struct ttm_tt *ttm); + +/** + * Output the state of pools to debugfs file   */ -void ttm_put_pages(struct list_head *pages, -		   unsigned page_count, -		   int flags, -		   enum ttm_caching_state cstate); +extern int ttm_page_alloc_debugfs(struct seq_file *m, void *data); + + +#if defined(CONFIG_SWIOTLB) || defined(CONFIG_INTEL_IOMMU)  /**   * Initialize pool allocator.   */ -int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages); +int ttm_dma_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages); +  /**   * Free pool allocator.   */ -void ttm_page_alloc_fini(void); +void ttm_dma_page_alloc_fini(void);  /**   * Output the state of pools to debugfs file   */ -extern int ttm_page_alloc_debugfs(struct seq_file *m, void *data); +extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data); + +extern int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev); +extern void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev); + +#else +static inline int ttm_dma_page_alloc_init(struct ttm_mem_global *glob, +					  unsigned max_pages) +{ +	return -ENODEV; +} + +static inline void ttm_dma_page_alloc_fini(void) { return; } + +static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data) +{ +	return 0; +} +static inline int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, +				   struct device *dev) +{ +	return -ENOMEM; +} +static inline void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, +				      struct device *dev) +{ +} +#endif +  #endif diff --git a/include/drm/ttm/ttm_placement.h b/include/drm/ttm/ttm_placement.h index c84ff153a56..8ed44f9bbdf 100644 --- a/include/drm/ttm/ttm_placement.h +++ b/include/drm/ttm/ttm_placement.h @@ -65,6 +65,8 @@   * reference the buffer.   * TTM_PL_FLAG_NO_EVICT means that the buffer may never   * be evicted to make room for other buffers. + * TTM_PL_FLAG_TOPDOWN requests to be placed from the + * top of the memory area, instead of the bottom.   */  #define TTM_PL_FLAG_CACHED      (1 << 16) @@ -72,6 +74,7 @@  #define TTM_PL_FLAG_WC          (1 << 18)  #define TTM_PL_FLAG_SHARED      (1 << 20)  #define TTM_PL_FLAG_NO_EVICT    (1 << 21) +#define TTM_PL_FLAG_TOPDOWN     (1 << 22)  #define TTM_PL_MASK_CACHING     (TTM_PL_FLAG_CACHED | \  				 TTM_PL_FLAG_UNCACHED | \ diff --git a/include/drm/via_drm.h b/include/drm/via_drm.h deleted file mode 100644 index fd11a5bd892..00000000000 --- a/include/drm/via_drm.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. - * - * 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, sub license, - * 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 NON-INFRINGEMENT. IN NO EVENT SHALL - * VIA, S3 GRAPHICS, 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 _VIA_DRM_H_ -#define _VIA_DRM_H_ - -#include "drm.h" - -/* WARNING: These defines must be the same as what the Xserver uses. - * if you change them, you must change the defines in the Xserver. - */ - -#ifndef _VIA_DEFINES_ -#define _VIA_DEFINES_ - -#ifndef __KERNEL__ -#include "via_drmclient.h" -#endif - -#define VIA_NR_SAREA_CLIPRECTS		8 -#define VIA_NR_XVMC_PORTS               10 -#define VIA_NR_XVMC_LOCKS               5 -#define VIA_MAX_CACHELINE_SIZE          64 -#define XVMCLOCKPTR(saPriv,lockNo)					\ -	((volatile struct drm_hw_lock *)(((((unsigned long) (saPriv)->XvMCLockArea) + \ -				      (VIA_MAX_CACHELINE_SIZE - 1)) &	\ -				     ~(VIA_MAX_CACHELINE_SIZE - 1)) +	\ -				    VIA_MAX_CACHELINE_SIZE*(lockNo))) - -/* Each region is a minimum of 64k, and there are at most 64 of them. - */ -#define VIA_NR_TEX_REGIONS 64 -#define VIA_LOG_MIN_TEX_REGION_SIZE 16 -#endif - -#define VIA_UPLOAD_TEX0IMAGE  0x1	/* handled clientside */ -#define VIA_UPLOAD_TEX1IMAGE  0x2	/* handled clientside */ -#define VIA_UPLOAD_CTX        0x4 -#define VIA_UPLOAD_BUFFERS    0x8 -#define VIA_UPLOAD_TEX0       0x10 -#define VIA_UPLOAD_TEX1       0x20 -#define VIA_UPLOAD_CLIPRECTS  0x40 -#define VIA_UPLOAD_ALL        0xff - -/* VIA specific ioctls */ -#define DRM_VIA_ALLOCMEM	0x00 -#define DRM_VIA_FREEMEM	        0x01 -#define DRM_VIA_AGP_INIT	0x02 -#define DRM_VIA_FB_INIT	        0x03 -#define DRM_VIA_MAP_INIT	0x04 -#define DRM_VIA_DEC_FUTEX       0x05 -#define NOT_USED -#define DRM_VIA_DMA_INIT	0x07 -#define DRM_VIA_CMDBUFFER	0x08 -#define DRM_VIA_FLUSH	        0x09 -#define DRM_VIA_PCICMD	        0x0a -#define DRM_VIA_CMDBUF_SIZE	0x0b -#define NOT_USED -#define DRM_VIA_WAIT_IRQ        0x0d -#define DRM_VIA_DMA_BLIT        0x0e -#define DRM_VIA_BLIT_SYNC       0x0f - -#define DRM_IOCTL_VIA_ALLOCMEM	  DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_ALLOCMEM, drm_via_mem_t) -#define DRM_IOCTL_VIA_FREEMEM	  DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_FREEMEM, drm_via_mem_t) -#define DRM_IOCTL_VIA_AGP_INIT	  DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_AGP_INIT, drm_via_agp_t) -#define DRM_IOCTL_VIA_FB_INIT	  DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_FB_INIT, drm_via_fb_t) -#define DRM_IOCTL_VIA_MAP_INIT	  DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_MAP_INIT, drm_via_init_t) -#define DRM_IOCTL_VIA_DEC_FUTEX   DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_DEC_FUTEX, drm_via_futex_t) -#define DRM_IOCTL_VIA_DMA_INIT	  DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_DMA_INIT, drm_via_dma_init_t) -#define DRM_IOCTL_VIA_CMDBUFFER	  DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_CMDBUFFER, drm_via_cmdbuffer_t) -#define DRM_IOCTL_VIA_FLUSH	  DRM_IO(  DRM_COMMAND_BASE + DRM_VIA_FLUSH) -#define DRM_IOCTL_VIA_PCICMD	  DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_PCICMD, drm_via_cmdbuffer_t) -#define DRM_IOCTL_VIA_CMDBUF_SIZE DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_CMDBUF_SIZE, \ -					    drm_via_cmdbuf_size_t) -#define DRM_IOCTL_VIA_WAIT_IRQ    DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_WAIT_IRQ, drm_via_irqwait_t) -#define DRM_IOCTL_VIA_DMA_BLIT    DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_DMA_BLIT, drm_via_dmablit_t) -#define DRM_IOCTL_VIA_BLIT_SYNC   DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_BLIT_SYNC, drm_via_blitsync_t) - -/* Indices into buf.Setup where various bits of state are mirrored per - * context and per buffer.  These can be fired at the card as a unit, - * or in a piecewise fashion as required. - */ - -#define VIA_TEX_SETUP_SIZE 8 - -/* Flags for clear ioctl - */ -#define VIA_FRONT   0x1 -#define VIA_BACK    0x2 -#define VIA_DEPTH   0x4 -#define VIA_STENCIL 0x8 -#define VIA_MEM_VIDEO   0	/* matches drm constant */ -#define VIA_MEM_AGP     1	/* matches drm constant */ -#define VIA_MEM_SYSTEM  2 -#define VIA_MEM_MIXED   3 -#define VIA_MEM_UNKNOWN 4 - -typedef struct { -	__u32 offset; -	__u32 size; -} drm_via_agp_t; - -typedef struct { -	__u32 offset; -	__u32 size; -} drm_via_fb_t; - -typedef struct { -	__u32 context; -	__u32 type; -	__u32 size; -	unsigned long index; -	unsigned long offset; -} drm_via_mem_t; - -typedef struct _drm_via_init { -	enum { -		VIA_INIT_MAP = 0x01, -		VIA_CLEANUP_MAP = 0x02 -	} func; - -	unsigned long sarea_priv_offset; -	unsigned long fb_offset; -	unsigned long mmio_offset; -	unsigned long agpAddr; -} drm_via_init_t; - -typedef struct _drm_via_futex { -	enum { -		VIA_FUTEX_WAIT = 0x00, -		VIA_FUTEX_WAKE = 0X01 -	} func; -	__u32 ms; -	__u32 lock; -	__u32 val; -} drm_via_futex_t; - -typedef struct _drm_via_dma_init { -	enum { -		VIA_INIT_DMA = 0x01, -		VIA_CLEANUP_DMA = 0x02, -		VIA_DMA_INITIALIZED = 0x03 -	} func; - -	unsigned long offset; -	unsigned long size; -	unsigned long reg_pause_addr; -} drm_via_dma_init_t; - -typedef struct _drm_via_cmdbuffer { -	char __user *buf; -	unsigned long size; -} drm_via_cmdbuffer_t; - -/* Warning: If you change the SAREA structure you must change the Xserver - * structure as well */ - -typedef struct _drm_via_tex_region { -	unsigned char next, prev;	/* indices to form a circular LRU  */ -	unsigned char inUse;	/* owned by a client, or free? */ -	int age;		/* tracked by clients to update local LRU's */ -} drm_via_tex_region_t; - -typedef struct _drm_via_sarea { -	unsigned int dirty; -	unsigned int nbox; -	struct drm_clip_rect boxes[VIA_NR_SAREA_CLIPRECTS]; -	drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1]; -	int texAge;		/* last time texture was uploaded */ -	int ctxOwner;		/* last context to upload state */ -	int vertexPrim; - -	/* -	 * Below is for XvMC. -	 * We want the lock integers alone on, and aligned to, a cache line. -	 * Therefore this somewhat strange construct. -	 */ - -	char XvMCLockArea[VIA_MAX_CACHELINE_SIZE * (VIA_NR_XVMC_LOCKS + 1)]; - -	unsigned int XvMCDisplaying[VIA_NR_XVMC_PORTS]; -	unsigned int XvMCSubPicOn[VIA_NR_XVMC_PORTS]; -	unsigned int XvMCCtxNoGrabbed;	/* Last context to hold decoder */ - -	/* Used by the 3d driver only at this point, for pageflipping: -	 */ -	unsigned int pfCurrentOffset; -} drm_via_sarea_t; - -typedef struct _drm_via_cmdbuf_size { -	enum { -		VIA_CMDBUF_SPACE = 0x01, -		VIA_CMDBUF_LAG = 0x02 -	} func; -	int wait; -	__u32 size; -} drm_via_cmdbuf_size_t; - -typedef enum { -	VIA_IRQ_ABSOLUTE = 0x0, -	VIA_IRQ_RELATIVE = 0x1, -	VIA_IRQ_SIGNAL = 0x10000000, -	VIA_IRQ_FORCE_SEQUENCE = 0x20000000 -} via_irq_seq_type_t; - -#define VIA_IRQ_FLAGS_MASK 0xF0000000 - -enum drm_via_irqs { -	drm_via_irq_hqv0 = 0, -	drm_via_irq_hqv1, -	drm_via_irq_dma0_dd, -	drm_via_irq_dma0_td, -	drm_via_irq_dma1_dd, -	drm_via_irq_dma1_td, -	drm_via_irq_num -}; - -struct drm_via_wait_irq_request { -	unsigned irq; -	via_irq_seq_type_t type; -	__u32 sequence; -	__u32 signal; -}; - -typedef union drm_via_irqwait { -	struct drm_via_wait_irq_request request; -	struct drm_wait_vblank_reply reply; -} drm_via_irqwait_t; - -typedef struct drm_via_blitsync { -	__u32 sync_handle; -	unsigned engine; -} drm_via_blitsync_t; - -/* - * Below,"flags" is currently unused but will be used for possible future - * extensions like kernel space bounce buffers for bad alignments and - * blit engine busy-wait polling for better latency in the absence of - * interrupts. - */ - -typedef struct drm_via_dmablit { -	__u32 num_lines; -	__u32 line_length; - -	__u32 fb_addr; -	__u32 fb_stride; - -	unsigned char *mem_addr; -	__u32 mem_stride; - -	__u32 flags; -	int to_fb; - -	drm_via_blitsync_t sync; -} drm_via_dmablit_t; - -#endif				/* _VIA_DRM_H_ */ diff --git a/include/drm/vmwgfx_drm.h b/include/drm/vmwgfx_drm.h deleted file mode 100644 index 650e6bf6f69..00000000000 --- a/include/drm/vmwgfx_drm.h +++ /dev/null @@ -1,615 +0,0 @@ -/************************************************************************** - * - * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA - * All Rights Reserved. - * - * 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, sub license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS, AUTHORS 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 __VMWGFX_DRM_H__ -#define __VMWGFX_DRM_H__ - -#define DRM_VMW_MAX_SURFACE_FACES 6 -#define DRM_VMW_MAX_MIP_LEVELS 24 - -#define DRM_VMW_EXT_NAME_LEN 128 - -#define DRM_VMW_GET_PARAM            0 -#define DRM_VMW_ALLOC_DMABUF         1 -#define DRM_VMW_UNREF_DMABUF         2 -#define DRM_VMW_CURSOR_BYPASS        3 -/* guarded by DRM_VMW_PARAM_NUM_STREAMS != 0*/ -#define DRM_VMW_CONTROL_STREAM       4 -#define DRM_VMW_CLAIM_STREAM         5 -#define DRM_VMW_UNREF_STREAM         6 -/* guarded by DRM_VMW_PARAM_3D == 1 */ -#define DRM_VMW_CREATE_CONTEXT       7 -#define DRM_VMW_UNREF_CONTEXT        8 -#define DRM_VMW_CREATE_SURFACE       9 -#define DRM_VMW_UNREF_SURFACE        10 -#define DRM_VMW_REF_SURFACE          11 -#define DRM_VMW_EXECBUF              12 -#define DRM_VMW_FIFO_DEBUG           13 -#define DRM_VMW_FENCE_WAIT           14 -/* guarded by minor version >= 2 */ -#define DRM_VMW_UPDATE_LAYOUT        15 - - -/*************************************************************************/ -/** - * DRM_VMW_GET_PARAM - get device information. - * - * DRM_VMW_PARAM_FIFO_OFFSET: - * Offset to use to map the first page of the FIFO read-only. - * The fifo is mapped using the mmap() system call on the drm device. - * - * DRM_VMW_PARAM_OVERLAY_IOCTL: - * Does the driver support the overlay ioctl. - */ - -#define DRM_VMW_PARAM_NUM_STREAMS      0 -#define DRM_VMW_PARAM_NUM_FREE_STREAMS 1 -#define DRM_VMW_PARAM_3D               2 -#define DRM_VMW_PARAM_FIFO_OFFSET      3 -#define DRM_VMW_PARAM_HW_CAPS          4 -#define DRM_VMW_PARAM_FIFO_CAPS        5 -#define DRM_VMW_PARAM_MAX_FB_SIZE      6 - -/** - * struct drm_vmw_getparam_arg - * - * @value: Returned value. //Out - * @param: Parameter to query. //In. - * - * Argument to the DRM_VMW_GET_PARAM Ioctl. - */ - -struct drm_vmw_getparam_arg { -	uint64_t value; -	uint32_t param; -	uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_EXTENSION - Query device extensions. - */ - -/** - * struct drm_vmw_extension_rep - * - * @exists: The queried extension exists. - * @driver_ioctl_offset: Ioctl number of the first ioctl in the extension. - * @driver_sarea_offset: Offset to any space in the DRI SAREA - * used by the extension. - * @major: Major version number of the extension. - * @minor: Minor version number of the extension. - * @pl: Patch level version number of the extension. - * - * Output argument to the DRM_VMW_EXTENSION Ioctl. - */ - -struct drm_vmw_extension_rep { -	int32_t exists; -	uint32_t driver_ioctl_offset; -	uint32_t driver_sarea_offset; -	uint32_t major; -	uint32_t minor; -	uint32_t pl; -	uint32_t pad64; -}; - -/** - * union drm_vmw_extension_arg - * - * @extension - Ascii name of the extension to be queried. //In - * @rep - Reply as defined above. //Out - * - * Argument to the DRM_VMW_EXTENSION Ioctl. - */ - -union drm_vmw_extension_arg { -	char extension[DRM_VMW_EXT_NAME_LEN]; -	struct drm_vmw_extension_rep rep; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CREATE_CONTEXT - Create a host context. - * - * Allocates a device unique context id, and queues a create context command - * for the host. Does not wait for host completion. - */ - -/** - * struct drm_vmw_context_arg - * - * @cid: Device unique context ID. - * - * Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl. - * Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl. - */ - -struct drm_vmw_context_arg { -	int32_t cid; -	uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_CONTEXT - Create a host context. - * - * Frees a global context id, and queues a destroy host command for the host. - * Does not wait for host completion. The context ID can be used directly - * in the command stream and shows up as the same context ID on the host. - */ - -/*************************************************************************/ -/** - * DRM_VMW_CREATE_SURFACE - Create a host suface. - * - * Allocates a device unique surface id, and queues a create surface command - * for the host. Does not wait for host completion. The surface ID can be - * used directly in the command stream and shows up as the same surface - * ID on the host. - */ - -/** - * struct drm_wmv_surface_create_req - * - * @flags: Surface flags as understood by the host. - * @format: Surface format as understood by the host. - * @mip_levels: Number of mip levels for each face. - * An unused face should have 0 encoded. - * @size_addr: Address of a user-space array of sruct drm_vmw_size - * cast to an uint64_t for 32-64 bit compatibility. - * The size of the array should equal the total number of mipmap levels. - * @shareable: Boolean whether other clients (as identified by file descriptors) - * may reference this surface. - * @scanout: Boolean whether the surface is intended to be used as a - * scanout. - * - * Input data to the DRM_VMW_CREATE_SURFACE Ioctl. - * Output data from the DRM_VMW_REF_SURFACE Ioctl. - */ - -struct drm_vmw_surface_create_req { -	uint32_t flags; -	uint32_t format; -	uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; -	uint64_t size_addr; -	int32_t shareable; -	int32_t scanout; -}; - -/** - * struct drm_wmv_surface_arg - * - * @sid: Surface id of created surface or surface to destroy or reference. - * - * Output data from the DRM_VMW_CREATE_SURFACE Ioctl. - * Input argument to the DRM_VMW_UNREF_SURFACE Ioctl. - * Input argument to the DRM_VMW_REF_SURFACE Ioctl. - */ - -struct drm_vmw_surface_arg { -	int32_t sid; -	uint32_t pad64; -}; - -/** - * struct drm_vmw_size ioctl. - * - * @width - mip level width - * @height - mip level height - * @depth - mip level depth - * - * Description of a mip level. - * Input data to the DRM_WMW_CREATE_SURFACE Ioctl. - */ - -struct drm_vmw_size { -	uint32_t width; -	uint32_t height; -	uint32_t depth; -	uint32_t pad64; -}; - -/** - * union drm_vmw_surface_create_arg - * - * @rep: Output data as described above. - * @req: Input data as described above. - * - * Argument to the DRM_VMW_CREATE_SURFACE Ioctl. - */ - -union drm_vmw_surface_create_arg { -	struct drm_vmw_surface_arg rep; -	struct drm_vmw_surface_create_req req; -}; - -/*************************************************************************/ -/** - * DRM_VMW_REF_SURFACE - Reference a host surface. - * - * Puts a reference on a host surface with a give sid, as previously - * returned by the DRM_VMW_CREATE_SURFACE ioctl. - * A reference will make sure the surface isn't destroyed while we hold - * it and will allow the calling client to use the surface ID in the command - * stream. - * - * On successful return, the Ioctl returns the surface information given - * in the DRM_VMW_CREATE_SURFACE ioctl. - */ - -/** - * union drm_vmw_surface_reference_arg - * - * @rep: Output data as described above. - * @req: Input data as described above. - * - * Argument to the DRM_VMW_REF_SURFACE Ioctl. - */ - -union drm_vmw_surface_reference_arg { -	struct drm_vmw_surface_create_req rep; -	struct drm_vmw_surface_arg req; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_SURFACE - Unreference a host surface. - * - * Clear a reference previously put on a host surface. - * When all references are gone, including the one implicitly placed - * on creation, - * a destroy surface command will be queued for the host. - * Does not wait for completion. - */ - -/*************************************************************************/ -/** - * DRM_VMW_EXECBUF - * - * Submit a command buffer for execution on the host, and return a - * fence sequence that when signaled, indicates that the command buffer has - * executed. - */ - -/** - * struct drm_vmw_execbuf_arg - * - * @commands: User-space address of a command buffer cast to an uint64_t. - * @command-size: Size in bytes of the command buffer. - * @throttle-us: Sleep until software is less than @throttle_us - * microseconds ahead of hardware. The driver may round this value - * to the nearest kernel tick. - * @fence_rep: User-space address of a struct drm_vmw_fence_rep cast to an - * uint64_t. - * @version: Allows expanding the execbuf ioctl parameters without breaking - * backwards compatibility, since user-space will always tell the kernel - * which version it uses. - * @flags: Execbuf flags. None currently. - * - * Argument to the DRM_VMW_EXECBUF Ioctl. - */ - -#define DRM_VMW_EXECBUF_VERSION 0 - -struct drm_vmw_execbuf_arg { -	uint64_t commands; -	uint32_t command_size; -	uint32_t throttle_us; -	uint64_t fence_rep; -	 uint32_t version; -	 uint32_t flags; -}; - -/** - * struct drm_vmw_fence_rep - * - * @fence_seq: Fence sequence associated with a command submission. - * @error: This member should've been set to -EFAULT on submission. - * The following actions should be take on completion: - * error == -EFAULT: Fence communication failed. The host is synchronized. - * Use the last fence id read from the FIFO fence register. - * error != 0 && error != -EFAULT: - * Fence submission failed. The host is synchronized. Use the fence_seq member. - * error == 0: All is OK, The host may not be synchronized. - * Use the fence_seq member. - * - * Input / Output data to the DRM_VMW_EXECBUF Ioctl. - */ - -struct drm_vmw_fence_rep { -	uint64_t fence_seq; -	int32_t error; -	uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_ALLOC_DMABUF - * - * Allocate a DMA buffer that is visible also to the host. - * NOTE: The buffer is - * identified by a handle and an offset, which are private to the guest, but - * useable in the command stream. The guest kernel may translate these - * and patch up the command stream accordingly. In the future, the offset may - * be zero at all times, or it may disappear from the interface before it is - * fixed. - * - * The DMA buffer may stay user-space mapped in the guest at all times, - * and is thus suitable for sub-allocation. - * - * DMA buffers are mapped using the mmap() syscall on the drm device. - */ - -/** - * struct drm_vmw_alloc_dmabuf_req - * - * @size: Required minimum size of the buffer. - * - * Input data to the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -struct drm_vmw_alloc_dmabuf_req { -	uint32_t size; -	uint32_t pad64; -}; - -/** - * struct drm_vmw_dmabuf_rep - * - * @map_handle: Offset to use in the mmap() call used to map the buffer. - * @handle: Handle unique to this buffer. Used for unreferencing. - * @cur_gmr_id: GMR id to use in the command stream when this buffer is - * referenced. See not above. - * @cur_gmr_offset: Offset to use in the command stream when this buffer is - * referenced. See note above. - * - * Output data from the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -struct drm_vmw_dmabuf_rep { -	uint64_t map_handle; -	uint32_t handle; -	uint32_t cur_gmr_id; -	uint32_t cur_gmr_offset; -	uint32_t pad64; -}; - -/** - * union drm_vmw_dmabuf_arg - * - * @req: Input data as described above. - * @rep: Output data as described above. - * - * Argument to the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -union drm_vmw_alloc_dmabuf_arg { -	struct drm_vmw_alloc_dmabuf_req req; -	struct drm_vmw_dmabuf_rep rep; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_DMABUF - Free a DMA buffer. - * - */ - -/** - * struct drm_vmw_unref_dmabuf_arg - * - * @handle: Handle indicating what buffer to free. Obtained from the - * DRM_VMW_ALLOC_DMABUF Ioctl. - * - * Argument to the DRM_VMW_UNREF_DMABUF Ioctl. - */ - -struct drm_vmw_unref_dmabuf_arg { -	uint32_t handle; -	uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_FIFO_DEBUG - Get last FIFO submission. - * - * This IOCTL copies the last FIFO submission directly out of the FIFO buffer. - */ - -/** - * struct drm_vmw_fifo_debug_arg - * - * @debug_buffer: User space address of a debug_buffer cast to an uint64_t //In - * @debug_buffer_size: Size in bytes of debug buffer //In - * @used_size: Number of bytes copied to the buffer // Out - * @did_not_fit: Boolean indicating that the fifo contents did not fit. //Out - * - * Argument to the DRM_VMW_FIFO_DEBUG Ioctl. - */ - -struct drm_vmw_fifo_debug_arg { -	uint64_t debug_buffer; -	uint32_t debug_buffer_size; -	uint32_t used_size; -	int32_t did_not_fit; -	uint32_t pad64; -}; - -struct drm_vmw_fence_wait_arg { -	uint64_t sequence; -	uint64_t kernel_cookie; -	int32_t cookie_valid; -	int32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CONTROL_STREAM - Control overlays, aka streams. - * - * This IOCTL controls the overlay units of the svga device. - * The SVGA overlay units does not work like regular hardware units in - * that they do not automaticaly read back the contents of the given dma - * buffer. But instead only read back for each call to this ioctl, and - * at any point between this call being made and a following call that - * either changes the buffer or disables the stream. - */ - -/** - * struct drm_vmw_rect - * - * Defines a rectangle. Used in the overlay ioctl to define - * source and destination rectangle. - */ - -struct drm_vmw_rect { -	int32_t x; -	int32_t y; -	uint32_t w; -	uint32_t h; -}; - -/** - * struct drm_vmw_control_stream_arg - * - * @stream_id: Stearm to control - * @enabled: If false all following arguments are ignored. - * @handle: Handle to buffer for getting data from. - * @format: Format of the overlay as understood by the host. - * @width: Width of the overlay. - * @height: Height of the overlay. - * @size: Size of the overlay in bytes. - * @pitch: Array of pitches, the two last are only used for YUV12 formats. - * @offset: Offset from start of dma buffer to overlay. - * @src: Source rect, must be within the defined area above. - * @dst: Destination rect, x and y may be negative. - * - * Argument to the DRM_VMW_CONTROL_STREAM Ioctl. - */ - -struct drm_vmw_control_stream_arg { -	uint32_t stream_id; -	uint32_t enabled; - -	uint32_t flags; -	uint32_t color_key; - -	uint32_t handle; -	uint32_t offset; -	int32_t format; -	uint32_t size; -	uint32_t width; -	uint32_t height; -	uint32_t pitch[3]; - -	uint32_t pad64; -	struct drm_vmw_rect src; -	struct drm_vmw_rect dst; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CURSOR_BYPASS - Give extra information about cursor bypass. - * - */ - -#define DRM_VMW_CURSOR_BYPASS_ALL    (1 << 0) -#define DRM_VMW_CURSOR_BYPASS_FLAGS       (1) - -/** - * struct drm_vmw_cursor_bypass_arg - * - * @flags: Flags. - * @crtc_id: Crtc id, only used if DMR_CURSOR_BYPASS_ALL isn't passed. - * @xpos: X position of cursor. - * @ypos: Y position of cursor. - * @xhot: X hotspot. - * @yhot: Y hotspot. - * - * Argument to the DRM_VMW_CURSOR_BYPASS Ioctl. - */ - -struct drm_vmw_cursor_bypass_arg { -	uint32_t flags; -	uint32_t crtc_id; -	int32_t xpos; -	int32_t ypos; -	int32_t xhot; -	int32_t yhot; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CLAIM_STREAM - Claim a single stream. - */ - -/** - * struct drm_vmw_context_arg - * - * @stream_id: Device unique context ID. - * - * Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl. - * Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl. - */ - -struct drm_vmw_stream_arg { -	uint32_t stream_id; -	uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_STREAM - Unclaim a stream. - * - * Return a single stream that was claimed by this process. Also makes - * sure that the stream has been stopped. - */ - -/*************************************************************************/ -/** - * DRM_VMW_UPDATE_LAYOUT - Update layout - * - * Updates the prefered modes and connection status for connectors. The - * command conisits of one drm_vmw_update_layout_arg pointing out a array - * of num_outputs drm_vmw_rect's. - */ - -/** - * struct drm_vmw_update_layout_arg - * - * @num_outputs: number of active - * @rects: pointer to array of drm_vmw_rect - * - * Input argument to the DRM_VMW_UPDATE_LAYOUT Ioctl. - */ - -struct drm_vmw_update_layout_arg { -	uint32_t num_outputs; -	uint32_t pad64; -	uint64_t rects; -}; - -#endif  | 
