1fb1d9738SJakob Bornecrantz /**************************************************************************
2fb1d9738SJakob Bornecrantz  *
3c8261a96SSinclair Yeh  * Copyright © 2009-2014 VMware, Inc., Palo Alto, CA., USA
4fb1d9738SJakob Bornecrantz  * All Rights Reserved.
5fb1d9738SJakob Bornecrantz  *
6fb1d9738SJakob Bornecrantz  * Permission is hereby granted, free of charge, to any person obtaining a
7fb1d9738SJakob Bornecrantz  * copy of this software and associated documentation files (the
8fb1d9738SJakob Bornecrantz  * "Software"), to deal in the Software without restriction, including
9fb1d9738SJakob Bornecrantz  * without limitation the rights to use, copy, modify, merge, publish,
10fb1d9738SJakob Bornecrantz  * distribute, sub license, and/or sell copies of the Software, and to
11fb1d9738SJakob Bornecrantz  * permit persons to whom the Software is furnished to do so, subject to
12fb1d9738SJakob Bornecrantz  * the following conditions:
13fb1d9738SJakob Bornecrantz  *
14fb1d9738SJakob Bornecrantz  * The above copyright notice and this permission notice (including the
15fb1d9738SJakob Bornecrantz  * next paragraph) shall be included in all copies or substantial portions
16fb1d9738SJakob Bornecrantz  * of the Software.
17fb1d9738SJakob Bornecrantz  *
18fb1d9738SJakob Bornecrantz  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19fb1d9738SJakob Bornecrantz  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20fb1d9738SJakob Bornecrantz  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21fb1d9738SJakob Bornecrantz  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22fb1d9738SJakob Bornecrantz  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23fb1d9738SJakob Bornecrantz  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24fb1d9738SJakob Bornecrantz  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25fb1d9738SJakob Bornecrantz  *
26fb1d9738SJakob Bornecrantz  **************************************************************************/
27fb1d9738SJakob Bornecrantz 
28fb1d9738SJakob Bornecrantz #ifndef VMWGFX_KMS_H_
29fb1d9738SJakob Bornecrantz #define VMWGFX_KMS_H_
30fb1d9738SJakob Bornecrantz 
31760285e7SDavid Howells #include <drm/drmP.h>
32760285e7SDavid Howells #include <drm/drm_crtc_helper.h>
33fb1d9738SJakob Bornecrantz #include "vmwgfx_drv.h"
34fb1d9738SJakob Bornecrantz 
35c8261a96SSinclair Yeh 
36c8261a96SSinclair Yeh 
3756d1c78dSJakob Bornecrantz #define VMWGFX_NUM_DISPLAY_UNITS 8
3856d1c78dSJakob Bornecrantz 
39fb1d9738SJakob Bornecrantz 
40fb1d9738SJakob Bornecrantz #define vmw_framebuffer_to_vfb(x) \
41fb1d9738SJakob Bornecrantz 	container_of(x, struct vmw_framebuffer, base)
42c8261a96SSinclair Yeh #define vmw_framebuffer_to_vfbs(x) \
43c8261a96SSinclair Yeh 	container_of(x, struct vmw_framebuffer_surface, base.base)
44c8261a96SSinclair Yeh #define vmw_framebuffer_to_vfbd(x) \
45c8261a96SSinclair Yeh 	container_of(x, struct vmw_framebuffer_dmabuf, base.base)
46fb1d9738SJakob Bornecrantz 
47fb1d9738SJakob Bornecrantz /**
48fb1d9738SJakob Bornecrantz  * Base class for framebuffers
49fb1d9738SJakob Bornecrantz  *
50fb1d9738SJakob Bornecrantz  * @pin is called the when ever a crtc uses this framebuffer
51fb1d9738SJakob Bornecrantz  * @unpin is called
52fb1d9738SJakob Bornecrantz  */
53fb1d9738SJakob Bornecrantz struct vmw_framebuffer {
54fb1d9738SJakob Bornecrantz 	struct drm_framebuffer base;
55fb1d9738SJakob Bornecrantz 	int (*pin)(struct vmw_framebuffer *fb);
56fb1d9738SJakob Bornecrantz 	int (*unpin)(struct vmw_framebuffer *fb);
572fcd5a73SJakob Bornecrantz 	bool dmabuf;
5890ff18bcSThomas Hellstrom 	struct ttm_base_object *user_obj;
5990ff18bcSThomas Hellstrom 	uint32_t user_handle;
60fb1d9738SJakob Bornecrantz };
61fb1d9738SJakob Bornecrantz 
62c8261a96SSinclair Yeh /*
63c8261a96SSinclair Yeh  * Clip rectangle
64c8261a96SSinclair Yeh  */
65c8261a96SSinclair Yeh struct vmw_clip_rect {
66c8261a96SSinclair Yeh 	int x1, x2, y1, y2;
67c8261a96SSinclair Yeh };
68fb1d9738SJakob Bornecrantz 
69c8261a96SSinclair Yeh struct vmw_framebuffer_surface {
70c8261a96SSinclair Yeh 	struct vmw_framebuffer base;
71c8261a96SSinclair Yeh 	struct vmw_surface *surface;
72c8261a96SSinclair Yeh 	struct vmw_dma_buffer *buffer;
73c8261a96SSinclair Yeh 	struct list_head head;
74c8261a96SSinclair Yeh 	struct drm_master *master;
75f89c6c32SSinclair Yeh 	bool is_dmabuf_proxy;  /* true if this is proxy surface for DMA buf */
76c8261a96SSinclair Yeh };
77c8261a96SSinclair Yeh 
78c8261a96SSinclair Yeh 
79c8261a96SSinclair Yeh struct vmw_framebuffer_dmabuf {
80c8261a96SSinclair Yeh 	struct vmw_framebuffer base;
81c8261a96SSinclair Yeh 	struct vmw_dma_buffer *buffer;
82c8261a96SSinclair Yeh };
83c8261a96SSinclair Yeh 
84c8261a96SSinclair Yeh 
85c8261a96SSinclair Yeh /*
86c8261a96SSinclair Yeh  * Basic clip rect manipulation
87c8261a96SSinclair Yeh  */
88c8261a96SSinclair Yeh void vmw_clip_cliprects(struct drm_clip_rect *rects,
89c8261a96SSinclair Yeh 			int num_rects,
90c8261a96SSinclair Yeh 			struct vmw_clip_rect clip,
91c8261a96SSinclair Yeh 			SVGASignedRect *out_rects,
92c8261a96SSinclair Yeh 			int *out_num);
93fb1d9738SJakob Bornecrantz 
94fb1d9738SJakob Bornecrantz /*
95fb1d9738SJakob Bornecrantz  * Basic cursor manipulation
96fb1d9738SJakob Bornecrantz  */
97fb1d9738SJakob Bornecrantz int vmw_cursor_update_image(struct vmw_private *dev_priv,
98fb1d9738SJakob Bornecrantz 			    u32 *image, u32 width, u32 height,
99fb1d9738SJakob Bornecrantz 			    u32 hotspotX, u32 hotspotY);
100bfc2638dSJakob Bornecrantz int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
101bfc2638dSJakob Bornecrantz 			     struct vmw_dma_buffer *dmabuf,
102bfc2638dSJakob Bornecrantz 			     u32 width, u32 height,
103bfc2638dSJakob Bornecrantz 			     u32 hotspotX, u32 hotspotY);
104fb1d9738SJakob Bornecrantz void vmw_cursor_update_position(struct vmw_private *dev_priv,
105fb1d9738SJakob Bornecrantz 				bool show, int x, int y);
106fb1d9738SJakob Bornecrantz 
107bfc2638dSJakob Bornecrantz 
108fb1d9738SJakob Bornecrantz /**
109fb1d9738SJakob Bornecrantz  * Base class display unit.
110fb1d9738SJakob Bornecrantz  *
111fb1d9738SJakob Bornecrantz  * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector
112fb1d9738SJakob Bornecrantz  * so the display unit is all of them at the same time. This is true for both
113fb1d9738SJakob Bornecrantz  * legacy multimon and screen objects.
114fb1d9738SJakob Bornecrantz  */
115fb1d9738SJakob Bornecrantz struct vmw_display_unit {
116fb1d9738SJakob Bornecrantz 	struct drm_crtc crtc;
117fb1d9738SJakob Bornecrantz 	struct drm_encoder encoder;
118fb1d9738SJakob Bornecrantz 	struct drm_connector connector;
119fb1d9738SJakob Bornecrantz 
120fb1d9738SJakob Bornecrantz 	struct vmw_surface *cursor_surface;
121fb1d9738SJakob Bornecrantz 	struct vmw_dma_buffer *cursor_dmabuf;
122fb1d9738SJakob Bornecrantz 	size_t cursor_age;
123fb1d9738SJakob Bornecrantz 
124fb1d9738SJakob Bornecrantz 	int cursor_x;
125fb1d9738SJakob Bornecrantz 	int cursor_y;
126fb1d9738SJakob Bornecrantz 
127fb1d9738SJakob Bornecrantz 	int hotspot_x;
128fb1d9738SJakob Bornecrantz 	int hotspot_y;
129fb1d9738SJakob Bornecrantz 
130fb1d9738SJakob Bornecrantz 	unsigned unit;
131626ab771SJakob Bornecrantz 
132626ab771SJakob Bornecrantz 	/*
133626ab771SJakob Bornecrantz 	 * Prefered mode tracking.
134626ab771SJakob Bornecrantz 	 */
135626ab771SJakob Bornecrantz 	unsigned pref_width;
136626ab771SJakob Bornecrantz 	unsigned pref_height;
137626ab771SJakob Bornecrantz 	bool pref_active;
138626ab771SJakob Bornecrantz 	struct drm_display_mode *pref_mode;
139cd2b89e7SThomas Hellstrom 
140cd2b89e7SThomas Hellstrom 	/*
141cd2b89e7SThomas Hellstrom 	 * Gui positioning
142cd2b89e7SThomas Hellstrom 	 */
143cd2b89e7SThomas Hellstrom 	int gui_x;
144cd2b89e7SThomas Hellstrom 	int gui_y;
1456987427aSThomas Hellstrom 	bool is_implicit;
146fb1d9738SJakob Bornecrantz };
147fb1d9738SJakob Bornecrantz 
1482fcd5a73SJakob Bornecrantz #define vmw_crtc_to_du(x) \
1492fcd5a73SJakob Bornecrantz 	container_of(x, struct vmw_display_unit, crtc)
150626ab771SJakob Bornecrantz #define vmw_connector_to_du(x) \
151626ab771SJakob Bornecrantz 	container_of(x, struct vmw_display_unit, connector)
152626ab771SJakob Bornecrantz 
153626ab771SJakob Bornecrantz 
154fb1d9738SJakob Bornecrantz /*
155fb1d9738SJakob Bornecrantz  * Shared display unit functions - vmwgfx_kms.c
156fb1d9738SJakob Bornecrantz  */
157c8261a96SSinclair Yeh void vmw_du_cleanup(struct vmw_display_unit *du);
158626ab771SJakob Bornecrantz void vmw_du_crtc_save(struct drm_crtc *crtc);
159626ab771SJakob Bornecrantz void vmw_du_crtc_restore(struct drm_crtc *crtc);
160626ab771SJakob Bornecrantz void vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
161626ab771SJakob Bornecrantz 			   u16 *r, u16 *g, u16 *b,
162626ab771SJakob Bornecrantz 			   uint32_t start, uint32_t size);
163fb1d9738SJakob Bornecrantz int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
164fb1d9738SJakob Bornecrantz 			   uint32_t handle, uint32_t width, uint32_t height);
165fb1d9738SJakob Bornecrantz int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y);
166626ab771SJakob Bornecrantz void vmw_du_connector_dpms(struct drm_connector *connector, int mode);
167626ab771SJakob Bornecrantz void vmw_du_connector_save(struct drm_connector *connector);
168626ab771SJakob Bornecrantz void vmw_du_connector_restore(struct drm_connector *connector);
169626ab771SJakob Bornecrantz enum drm_connector_status
170626ab771SJakob Bornecrantz vmw_du_connector_detect(struct drm_connector *connector, bool force);
171626ab771SJakob Bornecrantz int vmw_du_connector_fill_modes(struct drm_connector *connector,
172626ab771SJakob Bornecrantz 				uint32_t max_width, uint32_t max_height);
173626ab771SJakob Bornecrantz int vmw_du_connector_set_property(struct drm_connector *connector,
174626ab771SJakob Bornecrantz 				  struct drm_property *property,
175626ab771SJakob Bornecrantz 				  uint64_t val);
176cd2b89e7SThomas Hellstrom 
177fb1d9738SJakob Bornecrantz 
178fb1d9738SJakob Bornecrantz /*
179d8bd19d2SJakob Bornecrantz  * Legacy display unit functions - vmwgfx_ldu.c
180fb1d9738SJakob Bornecrantz  */
181c8261a96SSinclair Yeh int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
182c8261a96SSinclair Yeh int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
183c8261a96SSinclair Yeh int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
184c8261a96SSinclair Yeh 				struct vmw_framebuffer *framebuffer,
185c8261a96SSinclair Yeh 				unsigned flags, unsigned color,
186c8261a96SSinclair Yeh 				struct drm_clip_rect *clips,
187c8261a96SSinclair Yeh 				unsigned num_clips, int increment);
188fb1d9738SJakob Bornecrantz 
18956d1c78dSJakob Bornecrantz /*
19056d1c78dSJakob Bornecrantz  * Screen Objects display functions - vmwgfx_scrn.c
19156d1c78dSJakob Bornecrantz  */
192c8261a96SSinclair Yeh int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
193c8261a96SSinclair Yeh int vmw_kms_sou_close_display(struct vmw_private *dev_priv);
194c8261a96SSinclair Yeh int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
195c8261a96SSinclair Yeh 				 struct drm_file *file_priv,
196c8261a96SSinclair Yeh 				 struct vmw_framebuffer *framebuffer,
197c8261a96SSinclair Yeh 				 unsigned flags, unsigned color,
198c8261a96SSinclair Yeh 				 struct drm_clip_rect *clips,
199c8261a96SSinclair Yeh 				 unsigned num_clips, int inc,
200c8261a96SSinclair Yeh 				 struct vmw_fence_obj **out_fence);
201c8261a96SSinclair Yeh int vmw_kms_sou_do_dmabuf_dirty(struct drm_file *file_priv,
202c8261a96SSinclair Yeh 				struct vmw_private *dev_priv,
203c8261a96SSinclair Yeh 				struct vmw_framebuffer *framebuffer,
204c8261a96SSinclair Yeh 				unsigned flags, unsigned color,
205c8261a96SSinclair Yeh 				struct drm_clip_rect *clips,
206c8261a96SSinclair Yeh 				unsigned num_clips, int increment,
207c8261a96SSinclair Yeh 				struct vmw_fence_obj **out_fence);
20835c05125SSinclair Yeh 
20935c05125SSinclair Yeh 
21035c05125SSinclair Yeh /*
21135c05125SSinclair Yeh  * Screen Target Display Unit functions - vmwgfx_stdu.c
21235c05125SSinclair Yeh  */
21335c05125SSinclair Yeh int vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
21435c05125SSinclair Yeh int vmw_kms_stdu_close_display(struct vmw_private *dev_priv);
21535c05125SSinclair Yeh int vmw_kms_stdu_do_surface_dirty(struct vmw_private *dev_priv,
21635c05125SSinclair Yeh 				  struct drm_file *file_priv,
21735c05125SSinclair Yeh 				  struct vmw_framebuffer *framebuffer,
21835c05125SSinclair Yeh 				  struct drm_clip_rect *clips,
21935c05125SSinclair Yeh 				  unsigned num_clips, int increment);
22035c05125SSinclair Yeh int vmw_kms_stdu_present(struct vmw_private *dev_priv,
22135c05125SSinclair Yeh 			 struct drm_file *file_priv,
22235c05125SSinclair Yeh 			 struct vmw_framebuffer *vfb,
22335c05125SSinclair Yeh 			 uint32_t user_handle,
22435c05125SSinclair Yeh 			 int32_t dest_x, int32_t dest_y,
22535c05125SSinclair Yeh 			 struct drm_vmw_rect *clips,
22635c05125SSinclair Yeh 			 uint32_t num_clips);
22735c05125SSinclair Yeh 
228fb1d9738SJakob Bornecrantz #endif
229