1*677dec6eSriastradh /*	$NetBSD: vmwgfx_kms.h,v 1.3 2021/12/18 23:45:45 riastradh Exp $	*/
2d350ecf5Sriastradh 
3*677dec6eSriastradh /* SPDX-License-Identifier: GPL-2.0 OR MIT */
456053ce7Sriastradh /**************************************************************************
556053ce7Sriastradh  *
6*677dec6eSriastradh  * Copyright 2009-2015 VMware, Inc., Palo Alto, CA., USA
756053ce7Sriastradh  *
856053ce7Sriastradh  * Permission is hereby granted, free of charge, to any person obtaining a
956053ce7Sriastradh  * copy of this software and associated documentation files (the
1056053ce7Sriastradh  * "Software"), to deal in the Software without restriction, including
1156053ce7Sriastradh  * without limitation the rights to use, copy, modify, merge, publish,
1256053ce7Sriastradh  * distribute, sub license, and/or sell copies of the Software, and to
1356053ce7Sriastradh  * permit persons to whom the Software is furnished to do so, subject to
1456053ce7Sriastradh  * the following conditions:
1556053ce7Sriastradh  *
1656053ce7Sriastradh  * The above copyright notice and this permission notice (including the
1756053ce7Sriastradh  * next paragraph) shall be included in all copies or substantial portions
1856053ce7Sriastradh  * of the Software.
1956053ce7Sriastradh  *
2056053ce7Sriastradh  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2156053ce7Sriastradh  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2256053ce7Sriastradh  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
2356053ce7Sriastradh  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
2456053ce7Sriastradh  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2556053ce7Sriastradh  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2656053ce7Sriastradh  * USE OR OTHER DEALINGS IN THE SOFTWARE.
2756053ce7Sriastradh  *
2856053ce7Sriastradh  **************************************************************************/
2956053ce7Sriastradh 
3056053ce7Sriastradh #ifndef VMWGFX_KMS_H_
3156053ce7Sriastradh #define VMWGFX_KMS_H_
3256053ce7Sriastradh 
33*677dec6eSriastradh #include <drm/drm_encoder.h>
34*677dec6eSriastradh #include <drm/drm_probe_helper.h>
35*677dec6eSriastradh 
3656053ce7Sriastradh #include "vmwgfx_drv.h"
3756053ce7Sriastradh 
38d350ecf5Sriastradh /**
39*677dec6eSriastradh  * struct vmw_du_update_plane - Closure structure for vmw_du_helper_plane_update
40*677dec6eSriastradh  * @plane: Plane which is being updated.
41*677dec6eSriastradh  * @old_state: Old state of plane.
42*677dec6eSriastradh  * @dev_priv: Device private.
43*677dec6eSriastradh  * @du: Display unit on which to update the plane.
44*677dec6eSriastradh  * @vfb: Framebuffer which is blitted to display unit.
45*677dec6eSriastradh  * @out_fence: Out fence for resource finish.
46*677dec6eSriastradh  * @mutex: The mutex used to protect resource reservation.
47*677dec6eSriastradh  * @cpu_blit: True if need cpu blit.
48*677dec6eSriastradh  * @intr: Whether to perform waits interruptible if possible.
49*677dec6eSriastradh  *
50*677dec6eSriastradh  * This structure loosely represent the set of operations needed to perform a
51*677dec6eSriastradh  * plane update on a display unit. Implementer will define that functionality
52*677dec6eSriastradh  * according to the function callbacks for this structure. In brief it involves
53*677dec6eSriastradh  * surface/buffer object validation, populate FIFO commands and command
54*677dec6eSriastradh  * submission to the device.
55*677dec6eSriastradh  */
56*677dec6eSriastradh struct vmw_du_update_plane {
57*677dec6eSriastradh 	/**
58*677dec6eSriastradh 	 * @calc_fifo_size: Calculate fifo size.
59*677dec6eSriastradh 	 *
60*677dec6eSriastradh 	 * Determine fifo size for the commands needed for update. The number of
61*677dec6eSriastradh 	 * damage clips on display unit @num_hits will be passed to allocate
62*677dec6eSriastradh 	 * sufficient fifo space.
63*677dec6eSriastradh 	 *
64*677dec6eSriastradh 	 * Return: Fifo size needed
65*677dec6eSriastradh 	 */
66*677dec6eSriastradh 	uint32_t (*calc_fifo_size)(struct vmw_du_update_plane *update,
67*677dec6eSriastradh 				   uint32_t num_hits);
68*677dec6eSriastradh 
69*677dec6eSriastradh 	/**
70*677dec6eSriastradh 	 * @post_prepare: Populate fifo for resource preparation.
71*677dec6eSriastradh 	 *
72*677dec6eSriastradh 	 * Some surface resource or buffer object need some extra cmd submission
73*677dec6eSriastradh 	 * like update GB image for proxy surface and define a GMRFB for screen
74*677dec6eSriastradh 	 * object. That should should be done here as this callback will be
75*677dec6eSriastradh 	 * called after FIFO allocation with the address of command buufer.
76*677dec6eSriastradh 	 *
77*677dec6eSriastradh 	 * This callback is optional.
78*677dec6eSriastradh 	 *
79*677dec6eSriastradh 	 * Return: Size of commands populated to command buffer.
80*677dec6eSriastradh 	 */
81*677dec6eSriastradh 	uint32_t (*post_prepare)(struct vmw_du_update_plane *update, void *cmd);
82*677dec6eSriastradh 
83*677dec6eSriastradh 	/**
84*677dec6eSriastradh 	 * @pre_clip: Populate fifo before clip.
85*677dec6eSriastradh 	 *
86*677dec6eSriastradh 	 * This is where pre clip related command should be populated like
87*677dec6eSriastradh 	 * surface copy/DMA, etc.
88*677dec6eSriastradh 	 *
89*677dec6eSriastradh 	 * This callback is optional.
90*677dec6eSriastradh 	 *
91*677dec6eSriastradh 	 * Return: Size of commands populated to command buffer.
92*677dec6eSriastradh 	 */
93*677dec6eSriastradh 	uint32_t (*pre_clip)(struct vmw_du_update_plane *update, void *cmd,
94*677dec6eSriastradh 			     uint32_t num_hits);
95*677dec6eSriastradh 
96*677dec6eSriastradh 	/**
97*677dec6eSriastradh 	 * @clip: Populate fifo for clip.
98*677dec6eSriastradh 	 *
99*677dec6eSriastradh 	 * This is where to populate clips for surface copy/dma or blit commands
100*677dec6eSriastradh 	 * if needed. This will be called times have damage in display unit,
101*677dec6eSriastradh 	 * which is one if doing full update. @clip is the damage in destination
102*677dec6eSriastradh 	 * coordinates which is crtc/DU and @src_x, @src_y is damage clip src in
103*677dec6eSriastradh 	 * framebuffer coordinate.
104*677dec6eSriastradh 	 *
105*677dec6eSriastradh 	 * This callback is optional.
106*677dec6eSriastradh 	 *
107*677dec6eSriastradh 	 * Return: Size of commands populated to command buffer.
108*677dec6eSriastradh 	 */
109*677dec6eSriastradh 	uint32_t (*clip)(struct vmw_du_update_plane *update, void *cmd,
110*677dec6eSriastradh 			 struct drm_rect *clip, uint32_t src_x, uint32_t src_y);
111*677dec6eSriastradh 
112*677dec6eSriastradh 	/**
113*677dec6eSriastradh 	 * @post_clip: Populate fifo after clip.
114*677dec6eSriastradh 	 *
115*677dec6eSriastradh 	 * This is where to populate display unit update commands or blit
116*677dec6eSriastradh 	 * commands.
117*677dec6eSriastradh 	 *
118*677dec6eSriastradh 	 * Return: Size of commands populated to command buffer.
119*677dec6eSriastradh 	 */
120*677dec6eSriastradh 	uint32_t (*post_clip)(struct vmw_du_update_plane *update, void *cmd,
121*677dec6eSriastradh 				    struct drm_rect *bb);
122*677dec6eSriastradh 
123*677dec6eSriastradh 	struct drm_plane *plane;
124*677dec6eSriastradh 	struct drm_plane_state *old_state;
125*677dec6eSriastradh 	struct vmw_private *dev_priv;
126*677dec6eSriastradh 	struct vmw_display_unit *du;
127*677dec6eSriastradh 	struct vmw_framebuffer *vfb;
128*677dec6eSriastradh 	struct vmw_fence_obj **out_fence;
129*677dec6eSriastradh 	struct mutex *mutex;
130*677dec6eSriastradh 	bool cpu_blit;
131*677dec6eSriastradh 	bool intr;
132*677dec6eSriastradh };
133*677dec6eSriastradh 
134*677dec6eSriastradh /**
135*677dec6eSriastradh  * struct vmw_du_update_plane_surface - closure structure for surface
136*677dec6eSriastradh  * @base: base closure structure.
137*677dec6eSriastradh  * @cmd_start: FIFO command start address (used by SOU only).
138*677dec6eSriastradh  */
139*677dec6eSriastradh struct vmw_du_update_plane_surface {
140*677dec6eSriastradh 	struct vmw_du_update_plane base;
141*677dec6eSriastradh 	/* This member is to handle special case SOU surface update */
142*677dec6eSriastradh 	void *cmd_start;
143*677dec6eSriastradh };
144*677dec6eSriastradh 
145*677dec6eSriastradh /**
146*677dec6eSriastradh  * struct vmw_du_update_plane_buffer - Closure structure for buffer object
147*677dec6eSriastradh  * @base: Base closure structure.
148*677dec6eSriastradh  * @fb_left: x1 for fb damage bounding box.
149*677dec6eSriastradh  * @fb_top: y1 for fb damage bounding box.
150*677dec6eSriastradh  */
151*677dec6eSriastradh struct vmw_du_update_plane_buffer {
152*677dec6eSriastradh 	struct vmw_du_update_plane base;
153*677dec6eSriastradh 	int fb_left, fb_top;
154*677dec6eSriastradh };
155*677dec6eSriastradh 
156*677dec6eSriastradh /**
157d350ecf5Sriastradh  * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty
158d350ecf5Sriastradh  * function.
159d350ecf5Sriastradh  *
160d350ecf5Sriastradh  * @fifo_commit: Callback that is called once for each display unit after
161d350ecf5Sriastradh  * all clip rects. This function must commit the fifo space reserved by the
162d350ecf5Sriastradh  * helper. Set up by the caller.
163d350ecf5Sriastradh  * @clip: Callback that is called for each cliprect on each display unit.
164d350ecf5Sriastradh  * Set up by the caller.
165d350ecf5Sriastradh  * @fifo_reserve_size: Fifo size that the helper should try to allocat for
166d350ecf5Sriastradh  * each display unit. Set up by the caller.
167d350ecf5Sriastradh  * @dev_priv: Pointer to the device private. Set up by the helper.
168d350ecf5Sriastradh  * @unit: The current display unit. Set up by the helper before a call to @clip.
169d350ecf5Sriastradh  * @cmd: The allocated fifo space. Set up by the helper before the first @clip
170d350ecf5Sriastradh  * call.
171*677dec6eSriastradh  * @crtc: The crtc for which to build dirty commands.
172d350ecf5Sriastradh  * @num_hits: Number of clip rect commands for this display unit.
173d350ecf5Sriastradh  * Cleared by the helper before the first @clip call. Updated by the @clip
174d350ecf5Sriastradh  * callback.
175d350ecf5Sriastradh  * @fb_x: Clip rect left side in framebuffer coordinates.
176d350ecf5Sriastradh  * @fb_y: Clip rect right side in framebuffer coordinates.
177d350ecf5Sriastradh  * @unit_x1: Clip rect left side in crtc coordinates.
178d350ecf5Sriastradh  * @unit_y1: Clip rect top side in crtc coordinates.
179d350ecf5Sriastradh  * @unit_x2: Clip rect right side in crtc coordinates.
180d350ecf5Sriastradh  * @unit_y2: Clip rect bottom side in crtc coordinates.
181d350ecf5Sriastradh  *
182d350ecf5Sriastradh  * The clip rect coordinates are updated by the helper for each @clip call.
183d350ecf5Sriastradh  * Note that this may be derived from if more info needs to be passed between
184d350ecf5Sriastradh  * helper caller and helper callbacks.
185d350ecf5Sriastradh  */
186d350ecf5Sriastradh struct vmw_kms_dirty {
187d350ecf5Sriastradh 	void (*fifo_commit)(struct vmw_kms_dirty *);
188d350ecf5Sriastradh 	void (*clip)(struct vmw_kms_dirty *);
189d350ecf5Sriastradh 	size_t fifo_reserve_size;
190d350ecf5Sriastradh 	struct vmw_private *dev_priv;
191d350ecf5Sriastradh 	struct vmw_display_unit *unit;
192d350ecf5Sriastradh 	void *cmd;
193*677dec6eSriastradh 	struct drm_crtc *crtc;
194d350ecf5Sriastradh 	u32 num_hits;
195d350ecf5Sriastradh 	s32 fb_x;
196d350ecf5Sriastradh 	s32 fb_y;
197d350ecf5Sriastradh 	s32 unit_x1;
198d350ecf5Sriastradh 	s32 unit_y1;
199d350ecf5Sriastradh 	s32 unit_x2;
200d350ecf5Sriastradh 	s32 unit_y2;
201d350ecf5Sriastradh };
202d350ecf5Sriastradh 
20356053ce7Sriastradh #define VMWGFX_NUM_DISPLAY_UNITS 8
20456053ce7Sriastradh 
20556053ce7Sriastradh 
20656053ce7Sriastradh #define vmw_framebuffer_to_vfb(x) \
20756053ce7Sriastradh 	container_of(x, struct vmw_framebuffer, base)
208d350ecf5Sriastradh #define vmw_framebuffer_to_vfbs(x) \
209d350ecf5Sriastradh 	container_of(x, struct vmw_framebuffer_surface, base.base)
210d350ecf5Sriastradh #define vmw_framebuffer_to_vfbd(x) \
211*677dec6eSriastradh 	container_of(x, struct vmw_framebuffer_bo, base.base)
21256053ce7Sriastradh 
21356053ce7Sriastradh /**
21456053ce7Sriastradh  * Base class for framebuffers
21556053ce7Sriastradh  *
21656053ce7Sriastradh  * @pin is called the when ever a crtc uses this framebuffer
21756053ce7Sriastradh  * @unpin is called
21856053ce7Sriastradh  */
21956053ce7Sriastradh struct vmw_framebuffer {
22056053ce7Sriastradh 	struct drm_framebuffer base;
22156053ce7Sriastradh 	int (*pin)(struct vmw_framebuffer *fb);
22256053ce7Sriastradh 	int (*unpin)(struct vmw_framebuffer *fb);
223*677dec6eSriastradh 	bool bo;
22456053ce7Sriastradh 	struct ttm_base_object *user_obj;
22556053ce7Sriastradh 	uint32_t user_handle;
22656053ce7Sriastradh };
22756053ce7Sriastradh 
228d350ecf5Sriastradh /*
229d350ecf5Sriastradh  * Clip rectangle
230d350ecf5Sriastradh  */
231d350ecf5Sriastradh struct vmw_clip_rect {
232d350ecf5Sriastradh 	int x1, x2, y1, y2;
233d350ecf5Sriastradh };
23456053ce7Sriastradh 
235d350ecf5Sriastradh struct vmw_framebuffer_surface {
236d350ecf5Sriastradh 	struct vmw_framebuffer base;
237d350ecf5Sriastradh 	struct vmw_surface *surface;
238*677dec6eSriastradh 	struct vmw_buffer_object *buffer;
239d350ecf5Sriastradh 	struct list_head head;
240*677dec6eSriastradh 	bool is_bo_proxy;  /* true if this is proxy surface for DMA buf */
241d350ecf5Sriastradh };
242d350ecf5Sriastradh 
243d350ecf5Sriastradh 
244*677dec6eSriastradh struct vmw_framebuffer_bo {
245d350ecf5Sriastradh 	struct vmw_framebuffer base;
246*677dec6eSriastradh 	struct vmw_buffer_object *buffer;
247d350ecf5Sriastradh };
248d350ecf5Sriastradh 
24956053ce7Sriastradh 
250*677dec6eSriastradh static const uint32_t vmw_primary_plane_formats[] = {
251*677dec6eSriastradh 	DRM_FORMAT_XRGB1555,
252*677dec6eSriastradh 	DRM_FORMAT_RGB565,
253*677dec6eSriastradh 	DRM_FORMAT_RGB888,
254*677dec6eSriastradh 	DRM_FORMAT_XRGB8888,
255*677dec6eSriastradh 	DRM_FORMAT_ARGB8888,
256*677dec6eSriastradh };
25756053ce7Sriastradh 
258*677dec6eSriastradh static const uint32_t vmw_cursor_plane_formats[] = {
259*677dec6eSriastradh 	DRM_FORMAT_ARGB8888,
260*677dec6eSriastradh };
261*677dec6eSriastradh 
262*677dec6eSriastradh 
263*677dec6eSriastradh #define vmw_crtc_state_to_vcs(x) container_of(x, struct vmw_crtc_state, base)
264*677dec6eSriastradh #define vmw_plane_state_to_vps(x) container_of(x, struct vmw_plane_state, base)
265*677dec6eSriastradh #define vmw_connector_state_to_vcs(x) \
266*677dec6eSriastradh 		container_of(x, struct vmw_connector_state, base)
267*677dec6eSriastradh 
268*677dec6eSriastradh /**
269*677dec6eSriastradh  * Derived class for crtc state object
270*677dec6eSriastradh  *
271*677dec6eSriastradh  * @base DRM crtc object
272*677dec6eSriastradh  */
273*677dec6eSriastradh struct vmw_crtc_state {
274*677dec6eSriastradh 	struct drm_crtc_state base;
275*677dec6eSriastradh };
276*677dec6eSriastradh 
277*677dec6eSriastradh /**
278*677dec6eSriastradh  * Derived class for plane state object
279*677dec6eSriastradh  *
280*677dec6eSriastradh  * @base DRM plane object
281*677dec6eSriastradh  * @surf Display surface for STDU
282*677dec6eSriastradh  * @bo display bo for SOU
283*677dec6eSriastradh  * @content_fb_type Used by STDU.
284*677dec6eSriastradh  * @bo_size Size of the bo, used by Screen Object Display Unit
285*677dec6eSriastradh  * @pinned pin count for STDU display surface
286*677dec6eSriastradh  */
287*677dec6eSriastradh struct vmw_plane_state {
288*677dec6eSriastradh 	struct drm_plane_state base;
289*677dec6eSriastradh 	struct vmw_surface *surf;
290*677dec6eSriastradh 	struct vmw_buffer_object *bo;
291*677dec6eSriastradh 
292*677dec6eSriastradh 	int content_fb_type;
293*677dec6eSriastradh 	unsigned long bo_size;
294*677dec6eSriastradh 
295*677dec6eSriastradh 	int pinned;
296*677dec6eSriastradh 
297*677dec6eSriastradh 	/* For CPU Blit */
298*677dec6eSriastradh 	unsigned int cpp;
299*677dec6eSriastradh };
300*677dec6eSriastradh 
301*677dec6eSriastradh 
302*677dec6eSriastradh /**
303*677dec6eSriastradh  * Derived class for connector state object
304*677dec6eSriastradh  *
305*677dec6eSriastradh  * @base DRM connector object
306*677dec6eSriastradh  * @is_implicit connector property
307*677dec6eSriastradh  *
308*677dec6eSriastradh  */
309*677dec6eSriastradh struct vmw_connector_state {
310*677dec6eSriastradh 	struct drm_connector_state base;
311*677dec6eSriastradh 
312*677dec6eSriastradh 	/**
313*677dec6eSriastradh 	 * @gui_x:
314*677dec6eSriastradh 	 *
315*677dec6eSriastradh 	 * vmwgfx connector property representing the x position of this display
316*677dec6eSriastradh 	 * unit (connector is synonymous to display unit) in overall topology.
317*677dec6eSriastradh 	 * This is what the device expect as xRoot while creating screen.
318*677dec6eSriastradh 	 */
319*677dec6eSriastradh 	int gui_x;
320*677dec6eSriastradh 
321*677dec6eSriastradh 	/**
322*677dec6eSriastradh 	 * @gui_y:
323*677dec6eSriastradh 	 *
324*677dec6eSriastradh 	 * vmwgfx connector property representing the y position of this display
325*677dec6eSriastradh 	 * unit (connector is synonymous to display unit) in overall topology.
326*677dec6eSriastradh 	 * This is what the device expect as yRoot while creating screen.
327*677dec6eSriastradh 	 */
328*677dec6eSriastradh 	int gui_y;
329*677dec6eSriastradh };
33056053ce7Sriastradh 
33156053ce7Sriastradh /**
33256053ce7Sriastradh  * Base class display unit.
33356053ce7Sriastradh  *
33456053ce7Sriastradh  * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector
33556053ce7Sriastradh  * so the display unit is all of them at the same time. This is true for both
33656053ce7Sriastradh  * legacy multimon and screen objects.
33756053ce7Sriastradh  */
33856053ce7Sriastradh struct vmw_display_unit {
33956053ce7Sriastradh 	struct drm_crtc crtc;
34056053ce7Sriastradh 	struct drm_encoder encoder;
34156053ce7Sriastradh 	struct drm_connector connector;
342*677dec6eSriastradh 	struct drm_plane primary;
343*677dec6eSriastradh 	struct drm_plane cursor;
34456053ce7Sriastradh 
34556053ce7Sriastradh 	struct vmw_surface *cursor_surface;
346*677dec6eSriastradh 	struct vmw_buffer_object *cursor_bo;
34756053ce7Sriastradh 	size_t cursor_age;
34856053ce7Sriastradh 
34956053ce7Sriastradh 	int cursor_x;
35056053ce7Sriastradh 	int cursor_y;
35156053ce7Sriastradh 
35256053ce7Sriastradh 	int hotspot_x;
35356053ce7Sriastradh 	int hotspot_y;
354d350ecf5Sriastradh 	s32 core_hotspot_x;
355d350ecf5Sriastradh 	s32 core_hotspot_y;
35656053ce7Sriastradh 
35756053ce7Sriastradh 	unsigned unit;
35856053ce7Sriastradh 
35956053ce7Sriastradh 	/*
36056053ce7Sriastradh 	 * Prefered mode tracking.
36156053ce7Sriastradh 	 */
36256053ce7Sriastradh 	unsigned pref_width;
36356053ce7Sriastradh 	unsigned pref_height;
36456053ce7Sriastradh 	bool pref_active;
36556053ce7Sriastradh 	struct drm_display_mode *pref_mode;
36656053ce7Sriastradh 
36756053ce7Sriastradh 	/*
36856053ce7Sriastradh 	 * Gui positioning
36956053ce7Sriastradh 	 */
37056053ce7Sriastradh 	int gui_x;
37156053ce7Sriastradh 	int gui_y;
37256053ce7Sriastradh 	bool is_implicit;
373*677dec6eSriastradh 	int set_gui_x;
374*677dec6eSriastradh 	int set_gui_y;
37556053ce7Sriastradh };
37656053ce7Sriastradh 
377d350ecf5Sriastradh struct vmw_validation_ctx {
378d350ecf5Sriastradh 	struct vmw_resource *res;
379*677dec6eSriastradh 	struct vmw_buffer_object *buf;
380d350ecf5Sriastradh };
381d350ecf5Sriastradh 
38256053ce7Sriastradh #define vmw_crtc_to_du(x) \
38356053ce7Sriastradh 	container_of(x, struct vmw_display_unit, crtc)
38456053ce7Sriastradh #define vmw_connector_to_du(x) \
38556053ce7Sriastradh 	container_of(x, struct vmw_display_unit, connector)
38656053ce7Sriastradh 
38756053ce7Sriastradh 
38856053ce7Sriastradh /*
38956053ce7Sriastradh  * Shared display unit functions - vmwgfx_kms.c
39056053ce7Sriastradh  */
391d350ecf5Sriastradh void vmw_du_cleanup(struct vmw_display_unit *du);
39256053ce7Sriastradh void vmw_du_crtc_save(struct drm_crtc *crtc);
39356053ce7Sriastradh void vmw_du_crtc_restore(struct drm_crtc *crtc);
394*677dec6eSriastradh int vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
39556053ce7Sriastradh 			   u16 *r, u16 *g, u16 *b,
396*677dec6eSriastradh 			   uint32_t size,
397*677dec6eSriastradh 			   struct drm_modeset_acquire_ctx *ctx);
398*677dec6eSriastradh int vmw_du_connector_set_property(struct drm_connector *connector,
399*677dec6eSriastradh 				  struct drm_property *property,
400*677dec6eSriastradh 				  uint64_t val);
401*677dec6eSriastradh int vmw_du_connector_atomic_set_property(struct drm_connector *connector,
402*677dec6eSriastradh 					 struct drm_connector_state *state,
403*677dec6eSriastradh 					 struct drm_property *property,
404*677dec6eSriastradh 					 uint64_t val);
405*677dec6eSriastradh int
406*677dec6eSriastradh vmw_du_connector_atomic_get_property(struct drm_connector *connector,
407*677dec6eSriastradh 				     const struct drm_connector_state *state,
408*677dec6eSriastradh 				     struct drm_property *property,
409*677dec6eSriastradh 				     uint64_t *val);
410d350ecf5Sriastradh int vmw_du_connector_dpms(struct drm_connector *connector, int mode);
41156053ce7Sriastradh void vmw_du_connector_save(struct drm_connector *connector);
41256053ce7Sriastradh void vmw_du_connector_restore(struct drm_connector *connector);
41356053ce7Sriastradh enum drm_connector_status
41456053ce7Sriastradh vmw_du_connector_detect(struct drm_connector *connector, bool force);
41556053ce7Sriastradh int vmw_du_connector_fill_modes(struct drm_connector *connector,
41656053ce7Sriastradh 				uint32_t max_width, uint32_t max_height);
417d350ecf5Sriastradh int vmw_kms_helper_dirty(struct vmw_private *dev_priv,
418d350ecf5Sriastradh 			 struct vmw_framebuffer *framebuffer,
419d350ecf5Sriastradh 			 const struct drm_clip_rect *clips,
420d350ecf5Sriastradh 			 const struct drm_vmw_rect *vclips,
421d350ecf5Sriastradh 			 s32 dest_x, s32 dest_y,
422d350ecf5Sriastradh 			 int num_clips,
423d350ecf5Sriastradh 			 int increment,
424d350ecf5Sriastradh 			 struct vmw_kms_dirty *dirty);
42556053ce7Sriastradh 
426*677dec6eSriastradh void vmw_kms_helper_validation_finish(struct vmw_private *dev_priv,
427d350ecf5Sriastradh 				      struct drm_file *file_priv,
428*677dec6eSriastradh 				      struct vmw_validation_context *ctx,
429d350ecf5Sriastradh 				      struct vmw_fence_obj **out_fence,
430d350ecf5Sriastradh 				      struct drm_vmw_fence_rep __user *
431d350ecf5Sriastradh 				      user_fence_rep);
432d350ecf5Sriastradh int vmw_kms_readback(struct vmw_private *dev_priv,
433d350ecf5Sriastradh 		     struct drm_file *file_priv,
434d350ecf5Sriastradh 		     struct vmw_framebuffer *vfb,
435d350ecf5Sriastradh 		     struct drm_vmw_fence_rep __user *user_fence_rep,
436d350ecf5Sriastradh 		     struct drm_vmw_rect *vclips,
437d350ecf5Sriastradh 		     uint32_t num_clips);
438d350ecf5Sriastradh struct vmw_framebuffer *
439d350ecf5Sriastradh vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
440*677dec6eSriastradh 			struct vmw_buffer_object *bo,
441d350ecf5Sriastradh 			struct vmw_surface *surface,
442d350ecf5Sriastradh 			bool only_2d,
443*677dec6eSriastradh 			const struct drm_mode_fb_cmd2 *mode_cmd);
444d350ecf5Sriastradh int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
445d350ecf5Sriastradh 			    unsigned unit,
446d350ecf5Sriastradh 			    u32 max_width,
447d350ecf5Sriastradh 			    u32 max_height,
448d350ecf5Sriastradh 			    struct drm_connector **p_con,
449d350ecf5Sriastradh 			    struct drm_crtc **p_crtc,
450d350ecf5Sriastradh 			    struct drm_display_mode **p_mode);
451d350ecf5Sriastradh void vmw_guess_mode_timing(struct drm_display_mode *mode);
452*677dec6eSriastradh void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv);
453*677dec6eSriastradh void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv);
454*677dec6eSriastradh 
455*677dec6eSriastradh /* Universal Plane Helpers */
456*677dec6eSriastradh void vmw_du_primary_plane_destroy(struct drm_plane *plane);
457*677dec6eSriastradh void vmw_du_cursor_plane_destroy(struct drm_plane *plane);
458*677dec6eSriastradh 
459*677dec6eSriastradh /* Atomic Helpers */
460*677dec6eSriastradh int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
461*677dec6eSriastradh 				      struct drm_plane_state *state);
462*677dec6eSriastradh int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
463*677dec6eSriastradh 				     struct drm_plane_state *state);
464*677dec6eSriastradh void vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
465*677dec6eSriastradh 				       struct drm_plane_state *old_state);
466*677dec6eSriastradh int vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane,
467*677dec6eSriastradh 				   struct drm_plane_state *new_state);
468*677dec6eSriastradh void vmw_du_plane_cleanup_fb(struct drm_plane *plane,
469*677dec6eSriastradh 			     struct drm_plane_state *old_state);
470*677dec6eSriastradh void vmw_du_plane_reset(struct drm_plane *plane);
471*677dec6eSriastradh struct drm_plane_state *vmw_du_plane_duplicate_state(struct drm_plane *plane);
472*677dec6eSriastradh void vmw_du_plane_destroy_state(struct drm_plane *plane,
473*677dec6eSriastradh 				struct drm_plane_state *state);
474*677dec6eSriastradh void vmw_du_plane_unpin_surf(struct vmw_plane_state *vps,
475*677dec6eSriastradh 			     bool unreference);
476*677dec6eSriastradh 
477*677dec6eSriastradh int vmw_du_crtc_atomic_check(struct drm_crtc *crtc,
478*677dec6eSriastradh 			     struct drm_crtc_state *state);
479*677dec6eSriastradh void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
480*677dec6eSriastradh 			      struct drm_crtc_state *old_crtc_state);
481*677dec6eSriastradh void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
482*677dec6eSriastradh 			      struct drm_crtc_state *old_crtc_state);
483*677dec6eSriastradh void vmw_du_crtc_reset(struct drm_crtc *crtc);
484*677dec6eSriastradh struct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc);
485*677dec6eSriastradh void vmw_du_crtc_destroy_state(struct drm_crtc *crtc,
486*677dec6eSriastradh 				struct drm_crtc_state *state);
487*677dec6eSriastradh void vmw_du_connector_reset(struct drm_connector *connector);
488*677dec6eSriastradh struct drm_connector_state *
489*677dec6eSriastradh vmw_du_connector_duplicate_state(struct drm_connector *connector);
490*677dec6eSriastradh 
491*677dec6eSriastradh void vmw_du_connector_destroy_state(struct drm_connector *connector,
492*677dec6eSriastradh 				    struct drm_connector_state *state);
49356053ce7Sriastradh 
49456053ce7Sriastradh /*
49556053ce7Sriastradh  * Legacy display unit functions - vmwgfx_ldu.c
49656053ce7Sriastradh  */
497d350ecf5Sriastradh int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
498d350ecf5Sriastradh int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
499*677dec6eSriastradh int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
500d350ecf5Sriastradh 			    struct vmw_framebuffer *framebuffer,
501*677dec6eSriastradh 			    unsigned int flags, unsigned int color,
502d350ecf5Sriastradh 			    struct drm_clip_rect *clips,
503*677dec6eSriastradh 			    unsigned int num_clips, int increment);
504d350ecf5Sriastradh int vmw_kms_update_proxy(struct vmw_resource *res,
505d350ecf5Sriastradh 			 const struct drm_clip_rect *clips,
506d350ecf5Sriastradh 			 unsigned num_clips,
507d350ecf5Sriastradh 			 int increment);
50856053ce7Sriastradh 
50956053ce7Sriastradh /*
51056053ce7Sriastradh  * Screen Objects display functions - vmwgfx_scrn.c
51156053ce7Sriastradh  */
512d350ecf5Sriastradh int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
513d350ecf5Sriastradh int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
514d350ecf5Sriastradh 				 struct vmw_framebuffer *framebuffer,
515d350ecf5Sriastradh 				 struct drm_clip_rect *clips,
516d350ecf5Sriastradh 				 struct drm_vmw_rect *vclips,
517d350ecf5Sriastradh 				 struct vmw_resource *srf,
518d350ecf5Sriastradh 				 s32 dest_x,
519d350ecf5Sriastradh 				 s32 dest_y,
520d350ecf5Sriastradh 				 unsigned num_clips, int inc,
521*677dec6eSriastradh 				 struct vmw_fence_obj **out_fence,
522*677dec6eSriastradh 				 struct drm_crtc *crtc);
523*677dec6eSriastradh int vmw_kms_sou_do_bo_dirty(struct vmw_private *dev_priv,
524d350ecf5Sriastradh 			    struct vmw_framebuffer *framebuffer,
525d350ecf5Sriastradh 			    struct drm_clip_rect *clips,
526*677dec6eSriastradh 			    struct drm_vmw_rect *vclips,
527*677dec6eSriastradh 			    unsigned int num_clips, int increment,
528d350ecf5Sriastradh 			    bool interruptible,
529*677dec6eSriastradh 			    struct vmw_fence_obj **out_fence,
530*677dec6eSriastradh 			    struct drm_crtc *crtc);
531d350ecf5Sriastradh int vmw_kms_sou_readback(struct vmw_private *dev_priv,
532d350ecf5Sriastradh 			 struct drm_file *file_priv,
533d350ecf5Sriastradh 			 struct vmw_framebuffer *vfb,
534d350ecf5Sriastradh 			 struct drm_vmw_fence_rep __user *user_fence_rep,
535d350ecf5Sriastradh 			 struct drm_vmw_rect *vclips,
536*677dec6eSriastradh 			 uint32_t num_clips,
537*677dec6eSriastradh 			 struct drm_crtc *crtc);
538d350ecf5Sriastradh 
539d350ecf5Sriastradh /*
540d350ecf5Sriastradh  * Screen Target Display Unit functions - vmwgfx_stdu.c
541d350ecf5Sriastradh  */
542d350ecf5Sriastradh int vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
543d350ecf5Sriastradh int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv,
544d350ecf5Sriastradh 			       struct vmw_framebuffer *framebuffer,
545d350ecf5Sriastradh 			       struct drm_clip_rect *clips,
546d350ecf5Sriastradh 			       struct drm_vmw_rect *vclips,
547d350ecf5Sriastradh 			       struct vmw_resource *srf,
548d350ecf5Sriastradh 			       s32 dest_x,
549d350ecf5Sriastradh 			       s32 dest_y,
550d350ecf5Sriastradh 			       unsigned num_clips, int inc,
551*677dec6eSriastradh 			       struct vmw_fence_obj **out_fence,
552*677dec6eSriastradh 			       struct drm_crtc *crtc);
553d350ecf5Sriastradh int vmw_kms_stdu_dma(struct vmw_private *dev_priv,
554d350ecf5Sriastradh 		     struct drm_file *file_priv,
555d350ecf5Sriastradh 		     struct vmw_framebuffer *vfb,
556d350ecf5Sriastradh 		     struct drm_vmw_fence_rep __user *user_fence_rep,
557d350ecf5Sriastradh 		     struct drm_clip_rect *clips,
558d350ecf5Sriastradh 		     struct drm_vmw_rect *vclips,
559d350ecf5Sriastradh 		     uint32_t num_clips,
560d350ecf5Sriastradh 		     int increment,
561d350ecf5Sriastradh 		     bool to_surface,
562*677dec6eSriastradh 		     bool interruptible,
563*677dec6eSriastradh 		     struct drm_crtc *crtc);
56456053ce7Sriastradh 
565*677dec6eSriastradh int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
566*677dec6eSriastradh 
567*677dec6eSriastradh /**
568*677dec6eSriastradh  * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
569*677dec6eSriastradh  * @state: Plane state.
570*677dec6eSriastradh  * @r: Rectangle to translate.
571*677dec6eSriastradh  */
vmw_du_translate_to_crtc(struct drm_plane_state * state,struct drm_rect * r)572*677dec6eSriastradh static inline void vmw_du_translate_to_crtc(struct drm_plane_state *state,
573*677dec6eSriastradh 					    struct drm_rect *r)
574*677dec6eSriastradh {
575*677dec6eSriastradh 	int translate_crtc_x = -((state->src_x >> 16) - state->crtc_x);
576*677dec6eSriastradh 	int translate_crtc_y = -((state->src_y >> 16) - state->crtc_y);
577*677dec6eSriastradh 
578*677dec6eSriastradh 	drm_rect_translate(r, translate_crtc_x, translate_crtc_y);
579*677dec6eSriastradh }
58056053ce7Sriastradh 
58156053ce7Sriastradh #endif
582