diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/drm/drmP.h | 27 | ||||
| -rw-r--r-- | include/drm/drm_atomic.h | 9 | ||||
| -rw-r--r-- | include/drm/drm_connector.h | 13 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 13 | ||||
| -rw-r--r-- | include/drm/drm_mm.h | 6 | ||||
| -rw-r--r-- | include/drm/drm_modeset_helper_vtables.h | 16 | ||||
| -rw-r--r-- | include/drm/drm_plane.h | 93 | ||||
| -rw-r--r-- | include/drm/drm_print.h | 117 | ||||
| -rw-r--r-- | include/linux/dma-fence.h | 3 | ||||
| -rw-r--r-- | include/uapi/drm/amdgpu_drm.h | 28 | ||||
| -rw-r--r-- | include/uapi/drm/drm_mode.h | 10 | 
11 files changed, 312 insertions, 23 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index e336e3901876..4e58137c1882 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -135,6 +135,7 @@ struct dma_buf_attachment;  #define DRM_UT_PRIME		0x08  #define DRM_UT_ATOMIC		0x10  #define DRM_UT_VBL		0x20 +#define DRM_UT_STATE		0x40  extern __printf(6, 7)  void drm_dev_printk(const struct device *dev, const char *level, @@ -306,6 +307,27 @@ void drm_printk(const char *level, unsigned int category,  #define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)			\  	DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args) +/* Format strings and argument splitters to simplify printing + * various "complex" objects + */ +#define DRM_MODE_FMT    "%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x" +#define DRM_MODE_ARG(m) \ +	(m)->base.id, (m)->name, (m)->vrefresh, (m)->clock, \ +	(m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \ +	(m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \ +	(m)->type, (m)->flags + +#define DRM_RECT_FMT    "%dx%d%+d%+d" +#define DRM_RECT_ARG(r) drm_rect_width(r), drm_rect_height(r), (r)->x1, (r)->y1 + +/* for rect's in fixed-point format: */ +#define DRM_RECT_FP_FMT "%d.%06ux%d.%06u%+d.%06u%+d.%06u" +#define DRM_RECT_FP_ARG(r) \ +		drm_rect_width(r) >> 16, ((drm_rect_width(r) & 0xffff) * 15625) >> 10, \ +		drm_rect_height(r) >> 16, ((drm_rect_height(r) & 0xffff) * 15625) >> 10, \ +		(r)->x1 >> 16, (((r)->x1 & 0xffff) * 15625) >> 10, \ +		(r)->y1 >> 16, (((r)->y1 & 0xffff) * 15625) >> 10 +  /*@}*/  /***********************************************************************/ @@ -941,8 +963,13 @@ static inline bool drm_is_primary_client(const struct drm_file *file_priv)  extern int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);  extern long drm_ioctl(struct file *filp,  		      unsigned int cmd, unsigned long arg); +#ifdef CONFIG_COMPAT  extern long drm_compat_ioctl(struct file *filp,  			     unsigned int cmd, unsigned long arg); +#else +/* Let drm_compat_ioctl be assigned to .compat_ioctl unconditionally */ +#define drm_compat_ioctl NULL +#endif  extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);  /* File Operations (drm_fops.c) */ diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index fc8af53b18aa..331bb100b718 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -345,6 +345,8 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,  			      struct drm_crtc *crtc);  void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,  				 struct drm_framebuffer *fb); +void drm_atomic_set_fence_for_plane(struct drm_plane_state *plane_state, +				    struct dma_fence *fence);  int __must_check  drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,  				  struct drm_crtc *crtc); @@ -364,6 +366,13 @@ int __must_check drm_atomic_check_only(struct drm_atomic_state *state);  int __must_check drm_atomic_commit(struct drm_atomic_state *state);  int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state); +void drm_state_dump(struct drm_device *dev, struct drm_printer *p); + +#ifdef CONFIG_DEBUG_FS +struct drm_minor; +int drm_atomic_debugfs_init(struct drm_minor *minor); +#endif +  #define for_each_connector_in_state(__state, connector, connector_state, __i) \  	for ((__i) = 0;							\  	     (__i) < (__state)->num_connector &&				\ diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index ac9d7d8e0e43..3e9727264b65 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -37,6 +37,7 @@ struct drm_crtc;  struct drm_encoder;  struct drm_property;  struct drm_property_blob; +struct drm_printer;  struct edid;  enum drm_connector_force { @@ -481,6 +482,18 @@ struct drm_connector_funcs {  				   const struct drm_connector_state *state,  				   struct drm_property *property,  				   uint64_t *val); + +	/** +	 * @atomic_print_state: +	 * +	 * If driver subclasses struct &drm_connector_state, it should implement +	 * this optional hook for printing additional driver specific state. +	 * +	 * Do not call this directly, use drm_atomic_connector_print_state() +	 * instead. +	 */ +	void (*atomic_print_state)(struct drm_printer *p, +				   const struct drm_connector_state *state);  };  /* mode specified on the command line */ diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index fa1aa214c8ea..8cca2a895981 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -53,6 +53,7 @@ struct drm_device;  struct drm_mode_set;  struct drm_file;  struct drm_clip_rect; +struct drm_printer;  struct device_node;  struct dma_fence;  struct edid; @@ -594,6 +595,18 @@ struct drm_crtc_funcs {  	 */  	int (*set_crc_source)(struct drm_crtc *crtc, const char *source,  			      size_t *values_cnt); + +	/** +	 * @atomic_print_state: +	 * +	 * If driver subclasses struct &drm_crtc_state, it should implement +	 * this optional hook for printing additional driver specific state. +	 * +	 * Do not call this directly, use drm_atomic_crtc_print_state() +	 * instead. +	 */ +	void (*atomic_print_state)(struct drm_printer *p, +				   const struct drm_crtc_state *state);  };  /** diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 205ddcf6d55d..41ddafe92b2f 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -44,6 +44,9 @@  #ifdef CONFIG_DEBUG_FS  #include <linux/seq_file.h>  #endif +#ifdef CONFIG_DRM_DEBUG_MM +#include <linux/stackdepot.h> +#endif  enum drm_mm_search_flags {  	DRM_MM_SEARCH_DEFAULT =		0, @@ -74,6 +77,9 @@ struct drm_mm_node {  	u64 size;  	u64 __subtree_last;  	struct drm_mm *mm; +#ifdef CONFIG_DRM_DEBUG_MM +	depot_stack_handle_t stack; +#endif  };  struct drm_mm { diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h index 10e449c86dbd..72478cf82147 100644 --- a/include/drm/drm_modeset_helper_vtables.h +++ b/include/drm/drm_modeset_helper_vtables.h @@ -361,8 +361,8 @@ struct drm_crtc_helper_funcs {  	 *  	 * Note that the power state of the display pipe when this function is  	 * called depends upon the exact helpers and calling sequence the driver -	 * has picked. See drm_atomic_commit_planes() for a discussion of the -	 * tradeoffs and variants of plane commit helpers. +	 * has picked. See drm_atomic_helper_commit_planes() for a discussion of +	 * the tradeoffs and variants of plane commit helpers.  	 *  	 * This callback is used by the atomic modeset helpers and by the  	 * transitional plane helpers, but it is optional. @@ -385,8 +385,8 @@ struct drm_crtc_helper_funcs {  	 *  	 * Note that the power state of the display pipe when this function is  	 * called depends upon the exact helpers and calling sequence the driver -	 * has picked. See drm_atomic_commit_planes() for a discussion of the -	 * tradeoffs and variants of plane commit helpers. +	 * has picked. See drm_atomic_helper_commit_planes() for a discussion of +	 * the tradeoffs and variants of plane commit helpers.  	 *  	 * This callback is used by the atomic modeset helpers and by the  	 * transitional plane helpers, but it is optional. @@ -940,8 +940,8 @@ struct drm_plane_helper_funcs {  	 *  	 * Note that the power state of the display pipe when this function is  	 * called depends upon the exact helpers and calling sequence the driver -	 * has picked. See drm_atomic_commit_planes() for a discussion of the -	 * tradeoffs and variants of plane commit helpers. +	 * has picked. See drm_atomic_helper_commit_planes() for a discussion of +	 * the tradeoffs and variants of plane commit helpers.  	 *  	 * This callback is used by the atomic modeset helpers and by the  	 * transitional plane helpers, but it is optional. @@ -963,8 +963,8 @@ struct drm_plane_helper_funcs {  	 *  	 * Note that the power state of the display pipe when this function is  	 * called depends upon the exact helpers and calling sequence the driver -	 * has picked. See drm_atomic_commit_planes() for a discussion of the -	 * tradeoffs and variants of plane commit helpers. +	 * has picked. See drm_atomic_helper_commit_planes() for a discussion of +	 * the tradeoffs and variants of plane commit helpers.  	 *  	 * This callback is used by the atomic modeset helpers and by the  	 * transitional plane helpers, but it is optional. diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 0bed92c5dbd8..5b38eb94783b 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -28,15 +28,11 @@  #include <drm/drm_mode_object.h>  struct drm_crtc; +struct drm_printer;  /**   * struct drm_plane_state - mutable plane state   * @plane: backpointer to the plane - * @crtc: currently bound CRTC, NULL if disabled - * @fb: currently bound framebuffer - * @fence: optional fence to wait for before scanning out @fb - * @crtc_x: left position of visible portion of plane on crtc - * @crtc_y: upper position of visible portion of plane on crtc   * @crtc_w: width of visible portion of plane on crtc   * @crtc_h: height of visible portion of plane on crtc   * @src_x: left position of visible portion of plane within @@ -57,18 +53,51 @@ struct drm_crtc;   *	it can be trusted.   * @src: clipped source coordinates of the plane (in 16.16)   * @dst: clipped destination coordinates of the plane - * @visible: visibility of the plane   * @state: backpointer to global drm_atomic_state   */  struct drm_plane_state {  	struct drm_plane *plane; -	struct drm_crtc *crtc;   /* do not write directly, use drm_atomic_set_crtc_for_plane() */ -	struct drm_framebuffer *fb;  /* do not write directly, use drm_atomic_set_fb_for_plane() */ +	/** +	 * @crtc: +	 * +	 * Currently bound CRTC, NULL if disabled. Do not this write directly, +	 * use drm_atomic_set_crtc_for_plane() +	 */ +	struct drm_crtc *crtc; + +	/** +	 * @fb: +	 * +	 * Currently bound framebuffer. Do not write this directly, use +	 * drm_atomic_set_fb_for_plane() +	 */ +	struct drm_framebuffer *fb; + +	/** +	 * @fence: +	 * +	 * Optional fence to wait for before scanning out @fb. Do not write this +	 * directly, use drm_atomic_set_fence_for_plane() +	 */  	struct dma_fence *fence; -	/* Signed dest location allows it to be partially off screen */ -	int32_t crtc_x, crtc_y; +	/** +	 * @crtc_x: +	 * +	 * Left position of visible portion of plane on crtc, signed dest +	 * location allows it to be partially off screen. +	 */ + +	int32_t crtc_x; +	/** +	 * @crtc_y: +	 * +	 * Upper position of visible portion of plane on crtc, signed dest +	 * location allows it to be partially off screen. +	 */ +	int32_t crtc_y; +  	uint32_t crtc_w, crtc_h;  	/* Source values are 16.16 fixed point */ @@ -85,15 +114,41 @@ struct drm_plane_state {  	/* Clipped coordinates */  	struct drm_rect src, dst; -	/* -	 * Is the plane actually visible? Can be false even -	 * if fb!=NULL and crtc!=NULL, due to clipping. +	/** +	 * @visible: +	 * +	 * Visibility of the plane. This can be false even if fb!=NULL and +	 * crtc!=NULL, due to clipping.  	 */  	bool visible;  	struct drm_atomic_state *state;  }; +static inline struct drm_rect +drm_plane_state_src(const struct drm_plane_state *state) +{ +	struct drm_rect src = { +		.x1 = state->src_x, +		.y1 = state->src_y, +		.x2 = state->src_x + state->src_w, +		.y2 = state->src_y + state->src_h, +	}; +	return src; +} + +static inline struct drm_rect +drm_plane_state_dest(const struct drm_plane_state *state) +{ +	struct drm_rect dest = { +		.x1 = state->crtc_x, +		.y1 = state->crtc_y, +		.x2 = state->crtc_x + state->crtc_w, +		.y2 = state->crtc_y + state->crtc_h, +	}; +	return dest; +} +  /**   * struct drm_plane_funcs - driver plane control functions   */ @@ -322,6 +377,18 @@ struct drm_plane_funcs {  	 * before data structures are torndown.  	 */  	void (*early_unregister)(struct drm_plane *plane); + +	/** +	 * @atomic_print_state: +	 * +	 * If driver subclasses struct &drm_plane_state, it should implement +	 * this optional hook for printing additional driver specific state. +	 * +	 * Do not call this directly, use drm_atomic_plane_print_state() +	 * instead. +	 */ +	void (*atomic_print_state)(struct drm_printer *p, +				   const struct drm_plane_state *state);  };  /** diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h new file mode 100644 index 000000000000..475ffe3730e9 --- /dev/null +++ b/include/drm/drm_print.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2016 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 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. + * + * Authors: + * Rob Clark <robdclark@gmail.com> + */ + +#ifndef DRM_PRINT_H_ +#define DRM_PRINT_H_ + +#include <linux/seq_file.h> +#include <linux/device.h> + +/** + * DOC: print + * + * A simple wrapper for dev_printk(), seq_printf(), etc.  Allows same + * debug code to be used for both debugfs and printk logging. + * + * For example:: + * + *     void log_some_info(struct drm_printer *p) + *     { + *             drm_printf(p, "foo=%d\n", foo); + *             drm_printf(p, "bar=%d\n", bar); + *     } + * + *     #ifdef CONFIG_DEBUG_FS + *     void debugfs_show(struct seq_file *f) + *     { + *             struct drm_printer p = drm_seq_file_printer(f); + *             log_some_info(&p); + *     } + *     #endif + * + *     void some_other_function(...) + *     { + *             struct drm_printer p = drm_info_printer(drm->dev); + *             log_some_info(&p); + *     } + */ + +/** + * struct drm_printer - drm output "stream" + * @printfn: actual output fxn + * @arg: output fxn specific data + * + * Do not use struct members directly.  Use drm_printer_seq_file(), + * drm_printer_info(), etc to initialize.  And drm_printf() for output. + */ +struct drm_printer { +	void (*printfn)(struct drm_printer *p, struct va_format *vaf); +	void *arg; +}; + +void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); +void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); + +/** + * drm_printf - print to a &drm_printer stream + * @p: the &drm_printer + * @f: format string + */ +void drm_printf(struct drm_printer *p, const char *f, ...); + + +/** + * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file + * @f:  the struct &seq_file to output to + * + * RETURNS: + * The &drm_printer object + */ +static inline struct drm_printer drm_seq_file_printer(struct seq_file *f) +{ +	struct drm_printer p = { +		.printfn = __drm_printfn_seq_file, +		.arg = f, +	}; +	return p; +} + +/** + * drm_info_printer - construct a &drm_printer that outputs to dev_printk() + * @dev: the struct &device pointer + * + * RETURNS: + * The &drm_printer object + */ +static inline struct drm_printer drm_info_printer(struct device *dev) +{ +	struct drm_printer p = { +		.printfn = __drm_printfn_info, +		.arg = dev, +	}; +	return p; +} + +#endif /* DRM_PRINT_H_ */ diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h index ba60c043a5d3..fcf4b1971eba 100644 --- a/include/linux/dma-fence.h +++ b/include/linux/dma-fence.h @@ -382,7 +382,8 @@ signed long dma_fence_wait_timeout(struct dma_fence *,  				   bool intr, signed long timeout);  signed long dma_fence_wait_any_timeout(struct dma_fence **fences,  				       uint32_t count, -				       bool intr, signed long timeout); +				       bool intr, signed long timeout, +				       uint32_t *idx);  /**   * dma_fence_wait - sleep until the fence gets signaled diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index 4684f378f046..2191a9e4f3db 100644 --- a/include/uapi/drm/amdgpu_drm.h +++ b/include/uapi/drm/amdgpu_drm.h @@ -50,6 +50,7 @@ extern "C" {  #define DRM_AMDGPU_WAIT_CS		0x09  #define DRM_AMDGPU_GEM_OP		0x10  #define DRM_AMDGPU_GEM_USERPTR		0x11 +#define DRM_AMDGPU_WAIT_FENCES		0x12  #define DRM_IOCTL_AMDGPU_GEM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_CREATE, union drm_amdgpu_gem_create)  #define DRM_IOCTL_AMDGPU_GEM_MMAP	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_MMAP, union drm_amdgpu_gem_mmap) @@ -63,6 +64,7 @@ extern "C" {  #define DRM_IOCTL_AMDGPU_WAIT_CS	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_CS, union drm_amdgpu_wait_cs)  #define DRM_IOCTL_AMDGPU_GEM_OP		DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_OP, struct drm_amdgpu_gem_op)  #define DRM_IOCTL_AMDGPU_GEM_USERPTR	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_USERPTR, struct drm_amdgpu_gem_userptr) +#define DRM_IOCTL_AMDGPU_WAIT_FENCES	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_FENCES, union drm_amdgpu_wait_fences)  #define AMDGPU_GEM_DOMAIN_CPU		0x1  #define AMDGPU_GEM_DOMAIN_GTT		0x2 @@ -307,6 +309,32 @@ union drm_amdgpu_wait_cs {  	struct drm_amdgpu_wait_cs_out out;  }; +struct drm_amdgpu_fence { +	__u32 ctx_id; +	__u32 ip_type; +	__u32 ip_instance; +	__u32 ring; +	__u64 seq_no; +}; + +struct drm_amdgpu_wait_fences_in { +	/** This points to uint64_t * which points to fences */ +	__u64 fences; +	__u32 fence_count; +	__u32 wait_all; +	__u64 timeout_ns; +}; + +struct drm_amdgpu_wait_fences_out { +	__u32 status; +	__u32 first_signaled; +}; + +union drm_amdgpu_wait_fences { +	struct drm_amdgpu_wait_fences_in in; +	struct drm_amdgpu_wait_fences_out out; +}; +  #define AMDGPU_GEM_OP_GET_GEM_CREATE_INFO	0  #define AMDGPU_GEM_OP_SET_PLACEMENT		1 diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 084b50a02dc5..01000c9f7c2c 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -47,7 +47,15 @@ extern "C" {  #define DRM_MODE_TYPE_DRIVER	(1<<6)  /* Video mode flags */ -/* bit compatible with the xorg definitions. */ +/* bit compatible with the xrandr RR_ definitions (bits 0-13) + * + * ABI warning: Existing userspace really expects + * the mode flags to match the xrandr definitions. Any + * changes that don't match the xrandr definitions will + * likely need a new client cap or some other mechanism + * to avoid breaking existing userspace. This includes + * allocating new flags in the previously unused bits! + */  #define DRM_MODE_FLAG_PHSYNC			(1<<0)  #define DRM_MODE_FLAG_NHSYNC			(1<<1)  #define DRM_MODE_FLAG_PVSYNC			(1<<2)  | 
