1 | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
2 | /************************************************************************** |
3 | * |
4 | * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA |
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 <drm/drm_encoder.h> |
32 | #include <drm/drm_framebuffer.h> |
33 | #include <drm/drm_probe_helper.h> |
34 | |
35 | #include "vmwgfx_drv.h" |
36 | |
37 | /** |
38 | * struct vmw_du_update_plane - Closure structure for vmw_du_helper_plane_update |
39 | * @plane: Plane which is being updated. |
40 | * @old_state: Old state of plane. |
41 | * @dev_priv: Device private. |
42 | * @du: Display unit on which to update the plane. |
43 | * @vfb: Framebuffer which is blitted to display unit. |
44 | * @out_fence: Out fence for resource finish. |
45 | * @mutex: The mutex used to protect resource reservation. |
46 | * @cpu_blit: True if need cpu blit. |
47 | * @intr: Whether to perform waits interruptible if possible. |
48 | * |
49 | * This structure loosely represent the set of operations needed to perform a |
50 | * plane update on a display unit. Implementer will define that functionality |
51 | * according to the function callbacks for this structure. In brief it involves |
52 | * surface/buffer object validation, populate FIFO commands and command |
53 | * submission to the device. |
54 | */ |
55 | struct vmw_du_update_plane { |
56 | /** |
57 | * @calc_fifo_size: Calculate fifo size. |
58 | * |
59 | * Determine fifo size for the commands needed for update. The number of |
60 | * damage clips on display unit @num_hits will be passed to allocate |
61 | * sufficient fifo space. |
62 | * |
63 | * Return: Fifo size needed |
64 | */ |
65 | uint32_t (*calc_fifo_size)(struct vmw_du_update_plane *update, |
66 | uint32_t num_hits); |
67 | |
68 | /** |
69 | * @post_prepare: Populate fifo for resource preparation. |
70 | * |
71 | * Some surface resource or buffer object need some extra cmd submission |
72 | * like update GB image for proxy surface and define a GMRFB for screen |
73 | * object. That should be done here as this callback will be |
74 | * called after FIFO allocation with the address of command buufer. |
75 | * |
76 | * This callback is optional. |
77 | * |
78 | * Return: Size of commands populated to command buffer. |
79 | */ |
80 | uint32_t (*post_prepare)(struct vmw_du_update_plane *update, void *cmd); |
81 | |
82 | /** |
83 | * @pre_clip: Populate fifo before clip. |
84 | * |
85 | * This is where pre clip related command should be populated like |
86 | * surface copy/DMA, etc. |
87 | * |
88 | * This callback is optional. |
89 | * |
90 | * Return: Size of commands populated to command buffer. |
91 | */ |
92 | uint32_t (*pre_clip)(struct vmw_du_update_plane *update, void *cmd, |
93 | uint32_t num_hits); |
94 | |
95 | /** |
96 | * @clip: Populate fifo for clip. |
97 | * |
98 | * This is where to populate clips for surface copy/dma or blit commands |
99 | * if needed. This will be called times have damage in display unit, |
100 | * which is one if doing full update. @clip is the damage in destination |
101 | * coordinates which is crtc/DU and @src_x, @src_y is damage clip src in |
102 | * framebuffer coordinate. |
103 | * |
104 | * This callback is optional. |
105 | * |
106 | * Return: Size of commands populated to command buffer. |
107 | */ |
108 | uint32_t (*clip)(struct vmw_du_update_plane *update, void *cmd, |
109 | struct drm_rect *clip, uint32_t src_x, uint32_t src_y); |
110 | |
111 | /** |
112 | * @post_clip: Populate fifo after clip. |
113 | * |
114 | * This is where to populate display unit update commands or blit |
115 | * commands. |
116 | * |
117 | * Return: Size of commands populated to command buffer. |
118 | */ |
119 | uint32_t (*post_clip)(struct vmw_du_update_plane *update, void *cmd, |
120 | struct drm_rect *bb); |
121 | |
122 | struct drm_plane *plane; |
123 | struct drm_plane_state *old_state; |
124 | struct vmw_private *dev_priv; |
125 | struct vmw_display_unit *du; |
126 | struct vmw_framebuffer *vfb; |
127 | struct vmw_fence_obj **out_fence; |
128 | struct mutex *mutex; |
129 | bool intr; |
130 | }; |
131 | |
132 | /** |
133 | * struct vmw_du_update_plane_surface - closure structure for surface |
134 | * @base: base closure structure. |
135 | * @cmd_start: FIFO command start address (used by SOU only). |
136 | */ |
137 | struct vmw_du_update_plane_surface { |
138 | struct vmw_du_update_plane base; |
139 | /* This member is to handle special case SOU surface update */ |
140 | void *cmd_start; |
141 | }; |
142 | |
143 | /** |
144 | * struct vmw_du_update_plane_buffer - Closure structure for buffer object |
145 | * @base: Base closure structure. |
146 | * @fb_left: x1 for fb damage bounding box. |
147 | * @fb_top: y1 for fb damage bounding box. |
148 | */ |
149 | struct vmw_du_update_plane_buffer { |
150 | struct vmw_du_update_plane base; |
151 | int fb_left, fb_top; |
152 | }; |
153 | |
154 | /** |
155 | * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty |
156 | * function. |
157 | * |
158 | * @fifo_commit: Callback that is called once for each display unit after |
159 | * all clip rects. This function must commit the fifo space reserved by the |
160 | * helper. Set up by the caller. |
161 | * @clip: Callback that is called for each cliprect on each display unit. |
162 | * Set up by the caller. |
163 | * @fifo_reserve_size: Fifo size that the helper should try to allocat for |
164 | * each display unit. Set up by the caller. |
165 | * @dev_priv: Pointer to the device private. Set up by the helper. |
166 | * @unit: The current display unit. Set up by the helper before a call to @clip. |
167 | * @cmd: The allocated fifo space. Set up by the helper before the first @clip |
168 | * call. |
169 | * @crtc: The crtc for which to build dirty commands. |
170 | * @num_hits: Number of clip rect commands for this display unit. |
171 | * Cleared by the helper before the first @clip call. Updated by the @clip |
172 | * callback. |
173 | * @fb_x: Clip rect left side in framebuffer coordinates. |
174 | * @fb_y: Clip rect right side in framebuffer coordinates. |
175 | * @unit_x1: Clip rect left side in crtc coordinates. |
176 | * @unit_y1: Clip rect top side in crtc coordinates. |
177 | * @unit_x2: Clip rect right side in crtc coordinates. |
178 | * @unit_y2: Clip rect bottom side in crtc coordinates. |
179 | * |
180 | * The clip rect coordinates are updated by the helper for each @clip call. |
181 | * Note that this may be derived from if more info needs to be passed between |
182 | * helper caller and helper callbacks. |
183 | */ |
184 | struct vmw_kms_dirty { |
185 | void (*fifo_commit)(struct vmw_kms_dirty *); |
186 | void (*clip)(struct vmw_kms_dirty *); |
187 | size_t fifo_reserve_size; |
188 | struct vmw_private *dev_priv; |
189 | struct vmw_display_unit *unit; |
190 | void *cmd; |
191 | struct drm_crtc *crtc; |
192 | u32 num_hits; |
193 | s32 fb_x; |
194 | s32 fb_y; |
195 | s32 unit_x1; |
196 | s32 unit_y1; |
197 | s32 unit_x2; |
198 | s32 unit_y2; |
199 | }; |
200 | |
201 | #define VMWGFX_NUM_DISPLAY_UNITS 8 |
202 | |
203 | |
204 | #define vmw_framebuffer_to_vfb(x) \ |
205 | container_of(x, struct vmw_framebuffer, base) |
206 | #define vmw_framebuffer_to_vfbs(x) \ |
207 | container_of(x, struct vmw_framebuffer_surface, base.base) |
208 | #define vmw_framebuffer_to_vfbd(x) \ |
209 | container_of(x, struct vmw_framebuffer_bo, base.base) |
210 | |
211 | /** |
212 | * Base class for framebuffers |
213 | * |
214 | * @pin is called the when ever a crtc uses this framebuffer |
215 | * @unpin is called |
216 | */ |
217 | struct vmw_framebuffer { |
218 | struct drm_framebuffer base; |
219 | bool bo; |
220 | uint32_t user_handle; |
221 | }; |
222 | |
223 | /* |
224 | * Clip rectangle |
225 | */ |
226 | struct vmw_clip_rect { |
227 | int x1, x2, y1, y2; |
228 | }; |
229 | |
230 | struct vmw_framebuffer_surface { |
231 | struct vmw_framebuffer base; |
232 | struct vmw_surface *surface; |
233 | struct vmw_bo *buffer; |
234 | struct list_head head; |
235 | bool is_bo_proxy; /* true if this is proxy surface for DMA buf */ |
236 | }; |
237 | |
238 | |
239 | struct vmw_framebuffer_bo { |
240 | struct vmw_framebuffer base; |
241 | struct vmw_bo *buffer; |
242 | }; |
243 | |
244 | |
245 | static const uint32_t __maybe_unused vmw_primary_plane_formats[] = { |
246 | DRM_FORMAT_XRGB8888, |
247 | DRM_FORMAT_ARGB8888, |
248 | DRM_FORMAT_RGB565, |
249 | DRM_FORMAT_XRGB1555, |
250 | }; |
251 | |
252 | static const uint32_t __maybe_unused vmw_cursor_plane_formats[] = { |
253 | DRM_FORMAT_ARGB8888, |
254 | }; |
255 | |
256 | |
257 | #define vmw_crtc_state_to_vcs(x) container_of(x, struct vmw_crtc_state, base) |
258 | #define vmw_plane_state_to_vps(x) container_of(x, struct vmw_plane_state, base) |
259 | #define vmw_connector_state_to_vcs(x) \ |
260 | container_of(x, struct vmw_connector_state, base) |
261 | #define vmw_plane_to_vcp(x) container_of(x, struct vmw_cursor_plane, base) |
262 | |
263 | /** |
264 | * Derived class for crtc state object |
265 | * |
266 | * @base DRM crtc object |
267 | */ |
268 | struct vmw_crtc_state { |
269 | struct drm_crtc_state base; |
270 | }; |
271 | |
272 | struct vmw_cursor_plane_state { |
273 | struct vmw_bo *bo; |
274 | s32 hotspot_x; |
275 | s32 hotspot_y; |
276 | }; |
277 | |
278 | /** |
279 | * Derived class for plane state object |
280 | * |
281 | * @base DRM plane object |
282 | * @surf Display surface for STDU |
283 | * @bo display bo for SOU |
284 | * @content_fb_type Used by STDU. |
285 | * @bo_size Size of the bo, used by Screen Object Display Unit |
286 | * @pinned pin count for STDU display surface |
287 | */ |
288 | struct vmw_plane_state { |
289 | struct drm_plane_state base; |
290 | struct vmw_surface *surf; |
291 | struct vmw_bo *bo; |
292 | |
293 | int content_fb_type; |
294 | unsigned long bo_size; |
295 | |
296 | int pinned; |
297 | |
298 | /* For CPU Blit */ |
299 | unsigned int cpp; |
300 | |
301 | bool surf_mapped; |
302 | struct vmw_cursor_plane_state cursor; |
303 | }; |
304 | |
305 | |
306 | /** |
307 | * Derived class for connector state object |
308 | * |
309 | * @base DRM connector object |
310 | * @is_implicit connector property |
311 | * |
312 | */ |
313 | struct vmw_connector_state { |
314 | struct drm_connector_state base; |
315 | |
316 | /** |
317 | * @gui_x: |
318 | * |
319 | * vmwgfx connector property representing the x position of this display |
320 | * unit (connector is synonymous to display unit) in overall topology. |
321 | * This is what the device expect as xRoot while creating screen. |
322 | */ |
323 | int gui_x; |
324 | |
325 | /** |
326 | * @gui_y: |
327 | * |
328 | * vmwgfx connector property representing the y position of this display |
329 | * unit (connector is synonymous to display unit) in overall topology. |
330 | * This is what the device expect as yRoot while creating screen. |
331 | */ |
332 | int gui_y; |
333 | }; |
334 | |
335 | /** |
336 | * Derived class for cursor plane object |
337 | * |
338 | * @base DRM plane object |
339 | * @cursor.cursor_mobs Cursor mobs available for re-use |
340 | */ |
341 | struct vmw_cursor_plane { |
342 | struct drm_plane base; |
343 | |
344 | struct vmw_bo *cursor_mobs[3]; |
345 | }; |
346 | |
347 | /** |
348 | * Base class display unit. |
349 | * |
350 | * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector |
351 | * so the display unit is all of them at the same time. This is true for both |
352 | * legacy multimon and screen objects. |
353 | */ |
354 | struct vmw_display_unit { |
355 | struct drm_crtc crtc; |
356 | struct drm_encoder encoder; |
357 | struct drm_connector connector; |
358 | struct drm_plane primary; |
359 | struct vmw_cursor_plane cursor; |
360 | |
361 | struct vmw_surface *cursor_surface; |
362 | struct vmw_bo *cursor_bo; |
363 | size_t cursor_age; |
364 | |
365 | int cursor_x; |
366 | int cursor_y; |
367 | |
368 | int hotspot_x; |
369 | int hotspot_y; |
370 | s32 core_hotspot_x; |
371 | s32 core_hotspot_y; |
372 | |
373 | unsigned unit; |
374 | |
375 | /* |
376 | * Prefered mode tracking. |
377 | */ |
378 | unsigned pref_width; |
379 | unsigned pref_height; |
380 | bool pref_active; |
381 | |
382 | /* |
383 | * Gui positioning |
384 | */ |
385 | int gui_x; |
386 | int gui_y; |
387 | bool is_implicit; |
388 | int set_gui_x; |
389 | int set_gui_y; |
390 | }; |
391 | |
392 | struct vmw_validation_ctx { |
393 | struct vmw_resource *res; |
394 | struct vmw_bo *buf; |
395 | }; |
396 | |
397 | #define vmw_crtc_to_du(x) \ |
398 | container_of(x, struct vmw_display_unit, crtc) |
399 | #define vmw_connector_to_du(x) \ |
400 | container_of(x, struct vmw_display_unit, connector) |
401 | |
402 | |
403 | /* |
404 | * Shared display unit functions - vmwgfx_kms.c |
405 | */ |
406 | void vmw_du_cleanup(struct vmw_display_unit *du); |
407 | void vmw_du_crtc_save(struct drm_crtc *crtc); |
408 | void vmw_du_crtc_restore(struct drm_crtc *crtc); |
409 | int vmw_du_crtc_gamma_set(struct drm_crtc *crtc, |
410 | u16 *r, u16 *g, u16 *b, |
411 | uint32_t size, |
412 | struct drm_modeset_acquire_ctx *ctx); |
413 | int vmw_du_connector_set_property(struct drm_connector *connector, |
414 | struct drm_property *property, |
415 | uint64_t val); |
416 | int vmw_du_connector_atomic_set_property(struct drm_connector *connector, |
417 | struct drm_connector_state *state, |
418 | struct drm_property *property, |
419 | uint64_t val); |
420 | int |
421 | vmw_du_connector_atomic_get_property(struct drm_connector *connector, |
422 | const struct drm_connector_state *state, |
423 | struct drm_property *property, |
424 | uint64_t *val); |
425 | int vmw_du_connector_dpms(struct drm_connector *connector, int mode); |
426 | void vmw_du_connector_save(struct drm_connector *connector); |
427 | void vmw_du_connector_restore(struct drm_connector *connector); |
428 | enum drm_connector_status |
429 | vmw_du_connector_detect(struct drm_connector *connector, bool force); |
430 | int vmw_kms_helper_dirty(struct vmw_private *dev_priv, |
431 | struct vmw_framebuffer *framebuffer, |
432 | const struct drm_clip_rect *clips, |
433 | const struct drm_vmw_rect *vclips, |
434 | s32 dest_x, s32 dest_y, |
435 | int num_clips, |
436 | int increment, |
437 | struct vmw_kms_dirty *dirty); |
438 | enum drm_mode_status vmw_connector_mode_valid(struct drm_connector *connector, |
439 | struct drm_display_mode *mode); |
440 | int vmw_connector_get_modes(struct drm_connector *connector); |
441 | |
442 | void vmw_kms_helper_validation_finish(struct vmw_private *dev_priv, |
443 | struct drm_file *file_priv, |
444 | struct vmw_validation_context *ctx, |
445 | struct vmw_fence_obj **out_fence, |
446 | struct drm_vmw_fence_rep __user * |
447 | user_fence_rep); |
448 | int vmw_kms_readback(struct vmw_private *dev_priv, |
449 | struct drm_file *file_priv, |
450 | struct vmw_framebuffer *vfb, |
451 | struct drm_vmw_fence_rep __user *user_fence_rep, |
452 | struct drm_vmw_rect *vclips, |
453 | uint32_t num_clips); |
454 | struct vmw_framebuffer * |
455 | vmw_kms_new_framebuffer(struct vmw_private *dev_priv, |
456 | struct vmw_bo *bo, |
457 | struct vmw_surface *surface, |
458 | bool only_2d, |
459 | const struct drm_mode_fb_cmd2 *mode_cmd); |
460 | void vmw_guess_mode_timing(struct drm_display_mode *mode); |
461 | void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv); |
462 | void vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv); |
463 | |
464 | /* Universal Plane Helpers */ |
465 | void vmw_du_primary_plane_destroy(struct drm_plane *plane); |
466 | void vmw_du_cursor_plane_destroy(struct drm_plane *plane); |
467 | |
468 | /* Atomic Helpers */ |
469 | int vmw_du_primary_plane_atomic_check(struct drm_plane *plane, |
470 | struct drm_atomic_state *state); |
471 | int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane, |
472 | struct drm_atomic_state *state); |
473 | void vmw_du_cursor_plane_atomic_update(struct drm_plane *plane, |
474 | struct drm_atomic_state *state); |
475 | int vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane, |
476 | struct drm_plane_state *new_state); |
477 | void vmw_du_cursor_plane_cleanup_fb(struct drm_plane *plane, |
478 | struct drm_plane_state *old_state); |
479 | void vmw_du_plane_cleanup_fb(struct drm_plane *plane, |
480 | struct drm_plane_state *old_state); |
481 | void vmw_du_plane_reset(struct drm_plane *plane); |
482 | struct drm_plane_state *vmw_du_plane_duplicate_state(struct drm_plane *plane); |
483 | void vmw_du_plane_destroy_state(struct drm_plane *plane, |
484 | struct drm_plane_state *state); |
485 | void vmw_du_plane_unpin_surf(struct vmw_plane_state *vps, |
486 | bool unreference); |
487 | |
488 | int vmw_du_crtc_atomic_check(struct drm_crtc *crtc, |
489 | struct drm_atomic_state *state); |
490 | void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc, |
491 | struct drm_atomic_state *state); |
492 | void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc, |
493 | struct drm_atomic_state *state); |
494 | void vmw_du_crtc_reset(struct drm_crtc *crtc); |
495 | struct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc); |
496 | void vmw_du_crtc_destroy_state(struct drm_crtc *crtc, |
497 | struct drm_crtc_state *state); |
498 | void vmw_du_connector_reset(struct drm_connector *connector); |
499 | struct drm_connector_state * |
500 | vmw_du_connector_duplicate_state(struct drm_connector *connector); |
501 | |
502 | void vmw_du_connector_destroy_state(struct drm_connector *connector, |
503 | struct drm_connector_state *state); |
504 | |
505 | /* |
506 | * Legacy display unit functions - vmwgfx_ldu.c |
507 | */ |
508 | int vmw_kms_ldu_init_display(struct vmw_private *dev_priv); |
509 | int vmw_kms_ldu_close_display(struct vmw_private *dev_priv); |
510 | int vmw_kms_update_proxy(struct vmw_resource *res, |
511 | const struct drm_clip_rect *clips, |
512 | unsigned num_clips, |
513 | int increment); |
514 | |
515 | /* |
516 | * Screen Objects display functions - vmwgfx_scrn.c |
517 | */ |
518 | int vmw_kms_sou_init_display(struct vmw_private *dev_priv); |
519 | int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv, |
520 | struct vmw_framebuffer *framebuffer, |
521 | struct drm_clip_rect *clips, |
522 | struct drm_vmw_rect *vclips, |
523 | struct vmw_resource *srf, |
524 | s32 dest_x, |
525 | s32 dest_y, |
526 | unsigned num_clips, int inc, |
527 | struct vmw_fence_obj **out_fence, |
528 | struct drm_crtc *crtc); |
529 | int vmw_kms_sou_do_bo_dirty(struct vmw_private *dev_priv, |
530 | struct vmw_framebuffer *framebuffer, |
531 | struct drm_clip_rect *clips, |
532 | struct drm_vmw_rect *vclips, |
533 | unsigned int num_clips, int increment, |
534 | bool interruptible, |
535 | struct vmw_fence_obj **out_fence, |
536 | struct drm_crtc *crtc); |
537 | int vmw_kms_sou_readback(struct vmw_private *dev_priv, |
538 | struct drm_file *file_priv, |
539 | struct vmw_framebuffer *vfb, |
540 | struct drm_vmw_fence_rep __user *user_fence_rep, |
541 | struct drm_vmw_rect *vclips, |
542 | uint32_t num_clips, |
543 | struct drm_crtc *crtc); |
544 | |
545 | /* |
546 | * Screen Target Display Unit functions - vmwgfx_stdu.c |
547 | */ |
548 | int vmw_kms_stdu_init_display(struct vmw_private *dev_priv); |
549 | int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv, |
550 | struct vmw_framebuffer *framebuffer, |
551 | struct drm_clip_rect *clips, |
552 | struct drm_vmw_rect *vclips, |
553 | struct vmw_resource *srf, |
554 | s32 dest_x, |
555 | s32 dest_y, |
556 | unsigned num_clips, int inc, |
557 | struct vmw_fence_obj **out_fence, |
558 | struct drm_crtc *crtc); |
559 | int vmw_kms_stdu_readback(struct vmw_private *dev_priv, |
560 | struct drm_file *file_priv, |
561 | struct vmw_framebuffer *vfb, |
562 | struct drm_vmw_fence_rep __user *user_fence_rep, |
563 | struct drm_clip_rect *clips, |
564 | struct drm_vmw_rect *vclips, |
565 | uint32_t num_clips, |
566 | int increment, |
567 | struct drm_crtc *crtc); |
568 | |
569 | int vmw_du_helper_plane_update(struct vmw_du_update_plane *update); |
570 | |
571 | /** |
572 | * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc |
573 | * @state: Plane state. |
574 | * @r: Rectangle to translate. |
575 | */ |
576 | static inline void vmw_du_translate_to_crtc(struct drm_plane_state *state, |
577 | struct drm_rect *r) |
578 | { |
579 | int translate_crtc_x = -((state->src_x >> 16) - state->crtc_x); |
580 | int translate_crtc_y = -((state->src_y >> 16) - state->crtc_y); |
581 | |
582 | drm_rect_translate(r, dx: translate_crtc_x, dy: translate_crtc_y); |
583 | } |
584 | |
585 | #endif |
586 | |