Subversion Repositories Kolibri OS

Rev

Rev 4111 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4075 Serge 1
/**************************************************************************
2
 *
6296 serge 3
 * Copyright © 2009-2015 VMware, Inc., Palo Alto, CA., USA
4075 Serge 4
 * All Rights Reserved.
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the
8
 * "Software"), to deal in the Software without restriction, including
9
 * without limitation the rights to use, copy, modify, merge, publish,
10
 * distribute, sub license, and/or sell copies of the Software, and to
11
 * permit persons to whom the Software is furnished to do so, subject to
12
 * the following conditions:
13
 *
14
 * The above copyright notice and this permission notice (including the
15
 * next paragraph) shall be included in all copies or substantial portions
16
 * of the Software.
17
 *
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 *
26
 **************************************************************************/
27
 
28
#ifndef VMWGFX_KMS_H_
29
#define VMWGFX_KMS_H_
30
 
31
#include 
32
#include 
33
#include "vmwgfx_drv.h"
34
 
6296 serge 35
/**
36
 * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty
37
 * function.
38
 *
39
 * @fifo_commit: Callback that is called once for each display unit after
40
 * all clip rects. This function must commit the fifo space reserved by the
41
 * helper. Set up by the caller.
42
 * @clip: Callback that is called for each cliprect on each display unit.
43
 * Set up by the caller.
44
 * @fifo_reserve_size: Fifo size that the helper should try to allocat for
45
 * each display unit. Set up by the caller.
46
 * @dev_priv: Pointer to the device private. Set up by the helper.
47
 * @unit: The current display unit. Set up by the helper before a call to @clip.
48
 * @cmd: The allocated fifo space. Set up by the helper before the first @clip
49
 * call.
50
 * @num_hits: Number of clip rect commands for this display unit.
51
 * Cleared by the helper before the first @clip call. Updated by the @clip
52
 * callback.
53
 * @fb_x: Clip rect left side in framebuffer coordinates.
54
 * @fb_y: Clip rect right side in framebuffer coordinates.
55
 * @unit_x1: Clip rect left side in crtc coordinates.
56
 * @unit_y1: Clip rect top side in crtc coordinates.
57
 * @unit_x2: Clip rect right side in crtc coordinates.
58
 * @unit_y2: Clip rect bottom side in crtc coordinates.
59
 *
60
 * The clip rect coordinates are updated by the helper for each @clip call.
61
 * Note that this may be derived from if more info needs to be passed between
62
 * helper caller and helper callbacks.
63
 */
64
struct vmw_kms_dirty {
65
	void (*fifo_commit)(struct vmw_kms_dirty *);
66
	void (*clip)(struct vmw_kms_dirty *);
67
	size_t fifo_reserve_size;
68
	struct vmw_private *dev_priv;
69
	struct vmw_display_unit *unit;
70
	void *cmd;
71
	u32 num_hits;
72
	s32 fb_x;
73
	s32 fb_y;
74
	s32 unit_x1;
75
	s32 unit_y1;
76
	s32 unit_x2;
77
	s32 unit_y2;
78
};
79
 
4080 Serge 80
#define VMWGFX_NUM_DISPLAY_UNITS 1
4075 Serge 81
 
82
 
83
#define vmw_framebuffer_to_vfb(x) \
84
	container_of(x, struct vmw_framebuffer, base)
6296 serge 85
#define vmw_framebuffer_to_vfbs(x) \
86
	container_of(x, struct vmw_framebuffer_surface, base.base)
87
#define vmw_framebuffer_to_vfbd(x) \
88
	container_of(x, struct vmw_framebuffer_dmabuf, base.base)
4075 Serge 89
 
90
/**
91
 * Base class for framebuffers
92
 *
93
 * @pin is called the when ever a crtc uses this framebuffer
94
 * @unpin is called
95
 */
96
struct vmw_framebuffer {
97
	struct drm_framebuffer base;
98
	int (*pin)(struct vmw_framebuffer *fb);
99
	int (*unpin)(struct vmw_framebuffer *fb);
100
	bool dmabuf;
101
	struct ttm_base_object *user_obj;
102
	uint32_t user_handle;
103
};
104
 
6296 serge 105
/*
106
 * Clip rectangle
107
 */
108
struct vmw_clip_rect {
109
	int x1, x2, y1, y2;
110
};
4075 Serge 111
 
6296 serge 112
struct vmw_framebuffer_surface {
113
	struct vmw_framebuffer base;
114
	struct vmw_surface *surface;
115
	struct vmw_dma_buffer *buffer;
116
	struct list_head head;
117
	bool is_dmabuf_proxy;  /* true if this is proxy surface for DMA buf */
118
};
4075 Serge 119
 
6296 serge 120
 
121
struct vmw_framebuffer_dmabuf {
122
	struct vmw_framebuffer base;
123
	struct vmw_dma_buffer *buffer;
124
};
125
 
126
 
4075 Serge 127
/*
128
 * Basic cursor manipulation
129
 */
130
int vmw_cursor_update_image(struct vmw_private *dev_priv,
131
			    u32 *image, u32 width, u32 height,
132
			    u32 hotspotX, u32 hotspotY);
133
int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
134
			     struct vmw_dma_buffer *dmabuf,
135
			     u32 width, u32 height,
136
			     u32 hotspotX, u32 hotspotY);
137
void vmw_cursor_update_position(struct vmw_private *dev_priv,
138
				bool show, int x, int y);
139
 
140
 
141
/**
142
 * Base class display unit.
143
 *
144
 * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector
145
 * so the display unit is all of them at the same time. This is true for both
146
 * legacy multimon and screen objects.
147
 */
148
struct vmw_display_unit {
149
	struct drm_crtc crtc;
150
	struct drm_encoder encoder;
151
	struct drm_connector connector;
152
 
153
	struct vmw_surface *cursor_surface;
154
	struct vmw_dma_buffer *cursor_dmabuf;
155
	size_t cursor_age;
156
 
157
	int cursor_x;
158
	int cursor_y;
159
 
160
	int hotspot_x;
161
	int hotspot_y;
6296 serge 162
	s32 core_hotspot_x;
163
	s32 core_hotspot_y;
4075 Serge 164
 
165
	unsigned unit;
166
 
167
	/*
168
	 * Prefered mode tracking.
169
	 */
170
	unsigned pref_width;
171
	unsigned pref_height;
172
	bool pref_active;
173
	struct drm_display_mode *pref_mode;
174
 
175
	/*
176
	 * Gui positioning
177
	 */
178
	int gui_x;
179
	int gui_y;
180
	bool is_implicit;
181
};
182
 
183
#define vmw_crtc_to_du(x) \
184
	container_of(x, struct vmw_display_unit, crtc)
185
#define vmw_connector_to_du(x) \
186
	container_of(x, struct vmw_display_unit, connector)
187
 
188
 
189
/*
190
 * Shared display unit functions - vmwgfx_kms.c
191
 */
6296 serge 192
void vmw_du_cleanup(struct vmw_display_unit *du);
4075 Serge 193
void vmw_du_crtc_save(struct drm_crtc *crtc);
194
void vmw_du_crtc_restore(struct drm_crtc *crtc);
195
void vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
196
			   u16 *r, u16 *g, u16 *b,
197
			   uint32_t start, uint32_t size);
6296 serge 198
int vmw_du_crtc_cursor_set2(struct drm_crtc *crtc, struct drm_file *file_priv,
199
			    uint32_t handle, uint32_t width, uint32_t height,
200
			    int32_t hot_x, int32_t hot_y);
4075 Serge 201
int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y);
6296 serge 202
int vmw_du_connector_dpms(struct drm_connector *connector, int mode);
4075 Serge 203
void vmw_du_connector_save(struct drm_connector *connector);
204
void vmw_du_connector_restore(struct drm_connector *connector);
205
enum drm_connector_status
206
vmw_du_connector_detect(struct drm_connector *connector, bool force);
207
int vmw_du_connector_fill_modes(struct drm_connector *connector,
208
				uint32_t max_width, uint32_t max_height);
209
int vmw_du_connector_set_property(struct drm_connector *connector,
210
				  struct drm_property *property,
211
				  uint64_t val);
6296 serge 212
int vmw_kms_helper_dirty(struct vmw_private *dev_priv,
213
			 struct vmw_framebuffer *framebuffer,
214
			 const struct drm_clip_rect *clips,
215
			 const struct drm_vmw_rect *vclips,
216
			 s32 dest_x, s32 dest_y,
217
			 int num_clips,
218
			 int increment,
219
			 struct vmw_kms_dirty *dirty);
4075 Serge 220
 
6296 serge 221
int vmw_kms_helper_buffer_prepare(struct vmw_private *dev_priv,
222
				  struct vmw_dma_buffer *buf,
223
				  bool interruptible,
224
				  bool validate_as_mob);
225
void vmw_kms_helper_buffer_revert(struct vmw_dma_buffer *buf);
226
void vmw_kms_helper_buffer_finish(struct vmw_private *dev_priv,
227
				  struct drm_file *file_priv,
228
				  struct vmw_dma_buffer *buf,
229
				  struct vmw_fence_obj **out_fence,
230
				  struct drm_vmw_fence_rep __user *
231
				  user_fence_rep);
232
int vmw_kms_helper_resource_prepare(struct vmw_resource *res,
233
				    bool interruptible);
234
void vmw_kms_helper_resource_revert(struct vmw_resource *res);
235
void vmw_kms_helper_resource_finish(struct vmw_resource *res,
236
				    struct vmw_fence_obj **out_fence);
237
int vmw_kms_readback(struct vmw_private *dev_priv,
238
		     struct drm_file *file_priv,
239
		     struct vmw_framebuffer *vfb,
240
		     struct drm_vmw_fence_rep __user *user_fence_rep,
241
		     struct drm_vmw_rect *vclips,
242
		     uint32_t num_clips);
243
struct vmw_framebuffer *
244
vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
245
			struct vmw_dma_buffer *dmabuf,
246
			struct vmw_surface *surface,
247
			bool only_2d,
248
			const struct drm_mode_fb_cmd *mode_cmd);
249
int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
250
			    unsigned unit,
251
			    u32 max_width,
252
			    u32 max_height,
253
			    struct drm_connector **p_con,
254
			    struct drm_crtc **p_crtc,
255
			    struct drm_display_mode **p_mode);
256
void vmw_guess_mode_timing(struct drm_display_mode *mode);
4075 Serge 257
 
258
/*
259
 * Legacy display unit functions - vmwgfx_ldu.c
260
 */
6296 serge 261
int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
262
int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
263
int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
264
				struct vmw_framebuffer *framebuffer,
265
				unsigned flags, unsigned color,
266
				struct drm_clip_rect *clips,
267
				unsigned num_clips, int increment);
268
int vmw_kms_update_proxy(struct vmw_resource *res,
269
			 const struct drm_clip_rect *clips,
270
			 unsigned num_clips,
271
			 int increment);
4075 Serge 272
 
273
/*
274
 * Screen Objects display functions - vmwgfx_scrn.c
275
 */
6296 serge 276
int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
277
int vmw_kms_sou_close_display(struct vmw_private *dev_priv);
278
int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
279
				 struct vmw_framebuffer *framebuffer,
280
				 struct drm_clip_rect *clips,
281
				 struct drm_vmw_rect *vclips,
282
				 struct vmw_resource *srf,
283
				 s32 dest_x,
284
				 s32 dest_y,
285
				 unsigned num_clips, int inc,
286
				 struct vmw_fence_obj **out_fence);
287
int vmw_kms_sou_do_dmabuf_dirty(struct vmw_private *dev_priv,
288
				struct vmw_framebuffer *framebuffer,
289
				struct drm_clip_rect *clips,
290
				unsigned num_clips, int increment,
291
				bool interruptible,
292
				struct vmw_fence_obj **out_fence);
293
int vmw_kms_sou_readback(struct vmw_private *dev_priv,
294
			 struct drm_file *file_priv,
295
			 struct vmw_framebuffer *vfb,
296
			 struct drm_vmw_fence_rep __user *user_fence_rep,
297
			 struct drm_vmw_rect *vclips,
298
			 uint32_t num_clips);
4075 Serge 299
 
6296 serge 300
/*
301
 * Screen Target Display Unit functions - vmwgfx_stdu.c
302
 */
303
int vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
304
int vmw_kms_stdu_close_display(struct vmw_private *dev_priv);
305
int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv,
306
			       struct vmw_framebuffer *framebuffer,
307
			       struct drm_clip_rect *clips,
308
			       struct drm_vmw_rect *vclips,
309
			       struct vmw_resource *srf,
310
			       s32 dest_x,
311
			       s32 dest_y,
312
			       unsigned num_clips, int inc,
313
			       struct vmw_fence_obj **out_fence);
314
int vmw_kms_stdu_dma(struct vmw_private *dev_priv,
315
		     struct drm_file *file_priv,
316
		     struct vmw_framebuffer *vfb,
317
		     struct drm_vmw_fence_rep __user *user_fence_rep,
318
		     struct drm_clip_rect *clips,
319
		     struct drm_vmw_rect *vclips,
320
		     uint32_t num_clips,
321
		     int increment,
322
		     bool to_surface,
323
		     bool interruptible);
4075 Serge 324
 
6296 serge 325
 
4075 Serge 326
#endif