18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR MIT */ 28c2ecf20Sopenharmony_ci/************************************************************************** 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright 2009-2015 VMware, Inc., Palo Alto, CA., USA 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 78c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the 88c2ecf20Sopenharmony_ci * "Software"), to deal in the Software without restriction, including 98c2ecf20Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 108c2ecf20Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to 118c2ecf20Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 128c2ecf20Sopenharmony_ci * the following conditions: 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the 158c2ecf20Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions 168c2ecf20Sopenharmony_ci * of the Software. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 198c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 208c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 218c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 228c2ecf20Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 238c2ecf20Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 248c2ecf20Sopenharmony_ci * USE OR OTHER DEALINGS IN THE SOFTWARE. 258c2ecf20Sopenharmony_ci * 268c2ecf20Sopenharmony_ci **************************************************************************/ 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#ifndef VMWGFX_KMS_H_ 298c2ecf20Sopenharmony_ci#define VMWGFX_KMS_H_ 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h> 328c2ecf20Sopenharmony_ci#include <drm/drm_probe_helper.h> 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#include "vmwgfx_drv.h" 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/** 378c2ecf20Sopenharmony_ci * struct vmw_du_update_plane - Closure structure for vmw_du_helper_plane_update 388c2ecf20Sopenharmony_ci * @plane: Plane which is being updated. 398c2ecf20Sopenharmony_ci * @old_state: Old state of plane. 408c2ecf20Sopenharmony_ci * @dev_priv: Device private. 418c2ecf20Sopenharmony_ci * @du: Display unit on which to update the plane. 428c2ecf20Sopenharmony_ci * @vfb: Framebuffer which is blitted to display unit. 438c2ecf20Sopenharmony_ci * @out_fence: Out fence for resource finish. 448c2ecf20Sopenharmony_ci * @mutex: The mutex used to protect resource reservation. 458c2ecf20Sopenharmony_ci * @cpu_blit: True if need cpu blit. 468c2ecf20Sopenharmony_ci * @intr: Whether to perform waits interruptible if possible. 478c2ecf20Sopenharmony_ci * 488c2ecf20Sopenharmony_ci * This structure loosely represent the set of operations needed to perform a 498c2ecf20Sopenharmony_ci * plane update on a display unit. Implementer will define that functionality 508c2ecf20Sopenharmony_ci * according to the function callbacks for this structure. In brief it involves 518c2ecf20Sopenharmony_ci * surface/buffer object validation, populate FIFO commands and command 528c2ecf20Sopenharmony_ci * submission to the device. 538c2ecf20Sopenharmony_ci */ 548c2ecf20Sopenharmony_cistruct vmw_du_update_plane { 558c2ecf20Sopenharmony_ci /** 568c2ecf20Sopenharmony_ci * @calc_fifo_size: Calculate fifo size. 578c2ecf20Sopenharmony_ci * 588c2ecf20Sopenharmony_ci * Determine fifo size for the commands needed for update. The number of 598c2ecf20Sopenharmony_ci * damage clips on display unit @num_hits will be passed to allocate 608c2ecf20Sopenharmony_ci * sufficient fifo space. 618c2ecf20Sopenharmony_ci * 628c2ecf20Sopenharmony_ci * Return: Fifo size needed 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_ci uint32_t (*calc_fifo_size)(struct vmw_du_update_plane *update, 658c2ecf20Sopenharmony_ci uint32_t num_hits); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci /** 688c2ecf20Sopenharmony_ci * @post_prepare: Populate fifo for resource preparation. 698c2ecf20Sopenharmony_ci * 708c2ecf20Sopenharmony_ci * Some surface resource or buffer object need some extra cmd submission 718c2ecf20Sopenharmony_ci * like update GB image for proxy surface and define a GMRFB for screen 728c2ecf20Sopenharmony_ci * object. That should should be done here as this callback will be 738c2ecf20Sopenharmony_ci * called after FIFO allocation with the address of command buufer. 748c2ecf20Sopenharmony_ci * 758c2ecf20Sopenharmony_ci * This callback is optional. 768c2ecf20Sopenharmony_ci * 778c2ecf20Sopenharmony_ci * Return: Size of commands populated to command buffer. 788c2ecf20Sopenharmony_ci */ 798c2ecf20Sopenharmony_ci uint32_t (*post_prepare)(struct vmw_du_update_plane *update, void *cmd); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci /** 828c2ecf20Sopenharmony_ci * @pre_clip: Populate fifo before clip. 838c2ecf20Sopenharmony_ci * 848c2ecf20Sopenharmony_ci * This is where pre clip related command should be populated like 858c2ecf20Sopenharmony_ci * surface copy/DMA, etc. 868c2ecf20Sopenharmony_ci * 878c2ecf20Sopenharmony_ci * This callback is optional. 888c2ecf20Sopenharmony_ci * 898c2ecf20Sopenharmony_ci * Return: Size of commands populated to command buffer. 908c2ecf20Sopenharmony_ci */ 918c2ecf20Sopenharmony_ci uint32_t (*pre_clip)(struct vmw_du_update_plane *update, void *cmd, 928c2ecf20Sopenharmony_ci uint32_t num_hits); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci /** 958c2ecf20Sopenharmony_ci * @clip: Populate fifo for clip. 968c2ecf20Sopenharmony_ci * 978c2ecf20Sopenharmony_ci * This is where to populate clips for surface copy/dma or blit commands 988c2ecf20Sopenharmony_ci * if needed. This will be called times have damage in display unit, 998c2ecf20Sopenharmony_ci * which is one if doing full update. @clip is the damage in destination 1008c2ecf20Sopenharmony_ci * coordinates which is crtc/DU and @src_x, @src_y is damage clip src in 1018c2ecf20Sopenharmony_ci * framebuffer coordinate. 1028c2ecf20Sopenharmony_ci * 1038c2ecf20Sopenharmony_ci * This callback is optional. 1048c2ecf20Sopenharmony_ci * 1058c2ecf20Sopenharmony_ci * Return: Size of commands populated to command buffer. 1068c2ecf20Sopenharmony_ci */ 1078c2ecf20Sopenharmony_ci uint32_t (*clip)(struct vmw_du_update_plane *update, void *cmd, 1088c2ecf20Sopenharmony_ci struct drm_rect *clip, uint32_t src_x, uint32_t src_y); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci /** 1118c2ecf20Sopenharmony_ci * @post_clip: Populate fifo after clip. 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * This is where to populate display unit update commands or blit 1148c2ecf20Sopenharmony_ci * commands. 1158c2ecf20Sopenharmony_ci * 1168c2ecf20Sopenharmony_ci * Return: Size of commands populated to command buffer. 1178c2ecf20Sopenharmony_ci */ 1188c2ecf20Sopenharmony_ci uint32_t (*post_clip)(struct vmw_du_update_plane *update, void *cmd, 1198c2ecf20Sopenharmony_ci struct drm_rect *bb); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci struct drm_plane *plane; 1228c2ecf20Sopenharmony_ci struct drm_plane_state *old_state; 1238c2ecf20Sopenharmony_ci struct vmw_private *dev_priv; 1248c2ecf20Sopenharmony_ci struct vmw_display_unit *du; 1258c2ecf20Sopenharmony_ci struct vmw_framebuffer *vfb; 1268c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence; 1278c2ecf20Sopenharmony_ci struct mutex *mutex; 1288c2ecf20Sopenharmony_ci bool cpu_blit; 1298c2ecf20Sopenharmony_ci bool intr; 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/** 1338c2ecf20Sopenharmony_ci * struct vmw_du_update_plane_surface - closure structure for surface 1348c2ecf20Sopenharmony_ci * @base: base closure structure. 1358c2ecf20Sopenharmony_ci * @cmd_start: FIFO command start address (used by SOU only). 1368c2ecf20Sopenharmony_ci */ 1378c2ecf20Sopenharmony_cistruct vmw_du_update_plane_surface { 1388c2ecf20Sopenharmony_ci struct vmw_du_update_plane base; 1398c2ecf20Sopenharmony_ci /* This member is to handle special case SOU surface update */ 1408c2ecf20Sopenharmony_ci void *cmd_start; 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci/** 1448c2ecf20Sopenharmony_ci * struct vmw_du_update_plane_buffer - Closure structure for buffer object 1458c2ecf20Sopenharmony_ci * @base: Base closure structure. 1468c2ecf20Sopenharmony_ci * @fb_left: x1 for fb damage bounding box. 1478c2ecf20Sopenharmony_ci * @fb_top: y1 for fb damage bounding box. 1488c2ecf20Sopenharmony_ci */ 1498c2ecf20Sopenharmony_cistruct vmw_du_update_plane_buffer { 1508c2ecf20Sopenharmony_ci struct vmw_du_update_plane base; 1518c2ecf20Sopenharmony_ci int fb_left, fb_top; 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/** 1558c2ecf20Sopenharmony_ci * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty 1568c2ecf20Sopenharmony_ci * function. 1578c2ecf20Sopenharmony_ci * 1588c2ecf20Sopenharmony_ci * @fifo_commit: Callback that is called once for each display unit after 1598c2ecf20Sopenharmony_ci * all clip rects. This function must commit the fifo space reserved by the 1608c2ecf20Sopenharmony_ci * helper. Set up by the caller. 1618c2ecf20Sopenharmony_ci * @clip: Callback that is called for each cliprect on each display unit. 1628c2ecf20Sopenharmony_ci * Set up by the caller. 1638c2ecf20Sopenharmony_ci * @fifo_reserve_size: Fifo size that the helper should try to allocat for 1648c2ecf20Sopenharmony_ci * each display unit. Set up by the caller. 1658c2ecf20Sopenharmony_ci * @dev_priv: Pointer to the device private. Set up by the helper. 1668c2ecf20Sopenharmony_ci * @unit: The current display unit. Set up by the helper before a call to @clip. 1678c2ecf20Sopenharmony_ci * @cmd: The allocated fifo space. Set up by the helper before the first @clip 1688c2ecf20Sopenharmony_ci * call. 1698c2ecf20Sopenharmony_ci * @crtc: The crtc for which to build dirty commands. 1708c2ecf20Sopenharmony_ci * @num_hits: Number of clip rect commands for this display unit. 1718c2ecf20Sopenharmony_ci * Cleared by the helper before the first @clip call. Updated by the @clip 1728c2ecf20Sopenharmony_ci * callback. 1738c2ecf20Sopenharmony_ci * @fb_x: Clip rect left side in framebuffer coordinates. 1748c2ecf20Sopenharmony_ci * @fb_y: Clip rect right side in framebuffer coordinates. 1758c2ecf20Sopenharmony_ci * @unit_x1: Clip rect left side in crtc coordinates. 1768c2ecf20Sopenharmony_ci * @unit_y1: Clip rect top side in crtc coordinates. 1778c2ecf20Sopenharmony_ci * @unit_x2: Clip rect right side in crtc coordinates. 1788c2ecf20Sopenharmony_ci * @unit_y2: Clip rect bottom side in crtc coordinates. 1798c2ecf20Sopenharmony_ci * 1808c2ecf20Sopenharmony_ci * The clip rect coordinates are updated by the helper for each @clip call. 1818c2ecf20Sopenharmony_ci * Note that this may be derived from if more info needs to be passed between 1828c2ecf20Sopenharmony_ci * helper caller and helper callbacks. 1838c2ecf20Sopenharmony_ci */ 1848c2ecf20Sopenharmony_cistruct vmw_kms_dirty { 1858c2ecf20Sopenharmony_ci void (*fifo_commit)(struct vmw_kms_dirty *); 1868c2ecf20Sopenharmony_ci void (*clip)(struct vmw_kms_dirty *); 1878c2ecf20Sopenharmony_ci size_t fifo_reserve_size; 1888c2ecf20Sopenharmony_ci struct vmw_private *dev_priv; 1898c2ecf20Sopenharmony_ci struct vmw_display_unit *unit; 1908c2ecf20Sopenharmony_ci void *cmd; 1918c2ecf20Sopenharmony_ci struct drm_crtc *crtc; 1928c2ecf20Sopenharmony_ci u32 num_hits; 1938c2ecf20Sopenharmony_ci s32 fb_x; 1948c2ecf20Sopenharmony_ci s32 fb_y; 1958c2ecf20Sopenharmony_ci s32 unit_x1; 1968c2ecf20Sopenharmony_ci s32 unit_y1; 1978c2ecf20Sopenharmony_ci s32 unit_x2; 1988c2ecf20Sopenharmony_ci s32 unit_y2; 1998c2ecf20Sopenharmony_ci}; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci#define VMWGFX_NUM_DISPLAY_UNITS 8 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci#define vmw_framebuffer_to_vfb(x) \ 2058c2ecf20Sopenharmony_ci container_of(x, struct vmw_framebuffer, base) 2068c2ecf20Sopenharmony_ci#define vmw_framebuffer_to_vfbs(x) \ 2078c2ecf20Sopenharmony_ci container_of(x, struct vmw_framebuffer_surface, base.base) 2088c2ecf20Sopenharmony_ci#define vmw_framebuffer_to_vfbd(x) \ 2098c2ecf20Sopenharmony_ci container_of(x, struct vmw_framebuffer_bo, base.base) 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci/** 2128c2ecf20Sopenharmony_ci * Base class for framebuffers 2138c2ecf20Sopenharmony_ci * 2148c2ecf20Sopenharmony_ci * @pin is called the when ever a crtc uses this framebuffer 2158c2ecf20Sopenharmony_ci * @unpin is called 2168c2ecf20Sopenharmony_ci */ 2178c2ecf20Sopenharmony_cistruct vmw_framebuffer { 2188c2ecf20Sopenharmony_ci struct drm_framebuffer base; 2198c2ecf20Sopenharmony_ci int (*pin)(struct vmw_framebuffer *fb); 2208c2ecf20Sopenharmony_ci int (*unpin)(struct vmw_framebuffer *fb); 2218c2ecf20Sopenharmony_ci bool bo; 2228c2ecf20Sopenharmony_ci struct ttm_base_object *user_obj; 2238c2ecf20Sopenharmony_ci uint32_t user_handle; 2248c2ecf20Sopenharmony_ci}; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci/* 2278c2ecf20Sopenharmony_ci * Clip rectangle 2288c2ecf20Sopenharmony_ci */ 2298c2ecf20Sopenharmony_cistruct vmw_clip_rect { 2308c2ecf20Sopenharmony_ci int x1, x2, y1, y2; 2318c2ecf20Sopenharmony_ci}; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cistruct vmw_framebuffer_surface { 2348c2ecf20Sopenharmony_ci struct vmw_framebuffer base; 2358c2ecf20Sopenharmony_ci struct vmw_surface *surface; 2368c2ecf20Sopenharmony_ci struct vmw_buffer_object *buffer; 2378c2ecf20Sopenharmony_ci struct list_head head; 2388c2ecf20Sopenharmony_ci bool is_bo_proxy; /* true if this is proxy surface for DMA buf */ 2398c2ecf20Sopenharmony_ci}; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistruct vmw_framebuffer_bo { 2438c2ecf20Sopenharmony_ci struct vmw_framebuffer base; 2448c2ecf20Sopenharmony_ci struct vmw_buffer_object *buffer; 2458c2ecf20Sopenharmony_ci}; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistatic const uint32_t vmw_primary_plane_formats[] = { 2498c2ecf20Sopenharmony_ci DRM_FORMAT_XRGB1555, 2508c2ecf20Sopenharmony_ci DRM_FORMAT_RGB565, 2518c2ecf20Sopenharmony_ci DRM_FORMAT_RGB888, 2528c2ecf20Sopenharmony_ci DRM_FORMAT_XRGB8888, 2538c2ecf20Sopenharmony_ci DRM_FORMAT_ARGB8888, 2548c2ecf20Sopenharmony_ci}; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_cistatic const uint32_t vmw_cursor_plane_formats[] = { 2578c2ecf20Sopenharmony_ci DRM_FORMAT_ARGB8888, 2588c2ecf20Sopenharmony_ci}; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci#define vmw_crtc_state_to_vcs(x) container_of(x, struct vmw_crtc_state, base) 2628c2ecf20Sopenharmony_ci#define vmw_plane_state_to_vps(x) container_of(x, struct vmw_plane_state, base) 2638c2ecf20Sopenharmony_ci#define vmw_connector_state_to_vcs(x) \ 2648c2ecf20Sopenharmony_ci container_of(x, struct vmw_connector_state, base) 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci/** 2678c2ecf20Sopenharmony_ci * Derived class for crtc state object 2688c2ecf20Sopenharmony_ci * 2698c2ecf20Sopenharmony_ci * @base DRM crtc object 2708c2ecf20Sopenharmony_ci */ 2718c2ecf20Sopenharmony_cistruct vmw_crtc_state { 2728c2ecf20Sopenharmony_ci struct drm_crtc_state base; 2738c2ecf20Sopenharmony_ci}; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci/** 2768c2ecf20Sopenharmony_ci * Derived class for plane state object 2778c2ecf20Sopenharmony_ci * 2788c2ecf20Sopenharmony_ci * @base DRM plane object 2798c2ecf20Sopenharmony_ci * @surf Display surface for STDU 2808c2ecf20Sopenharmony_ci * @bo display bo for SOU 2818c2ecf20Sopenharmony_ci * @content_fb_type Used by STDU. 2828c2ecf20Sopenharmony_ci * @bo_size Size of the bo, used by Screen Object Display Unit 2838c2ecf20Sopenharmony_ci * @pinned pin count for STDU display surface 2848c2ecf20Sopenharmony_ci */ 2858c2ecf20Sopenharmony_cistruct vmw_plane_state { 2868c2ecf20Sopenharmony_ci struct drm_plane_state base; 2878c2ecf20Sopenharmony_ci struct vmw_surface *surf; 2888c2ecf20Sopenharmony_ci struct vmw_buffer_object *bo; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci int content_fb_type; 2918c2ecf20Sopenharmony_ci unsigned long bo_size; 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci int pinned; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci /* For CPU Blit */ 2968c2ecf20Sopenharmony_ci unsigned int cpp; 2978c2ecf20Sopenharmony_ci}; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci/** 3018c2ecf20Sopenharmony_ci * Derived class for connector state object 3028c2ecf20Sopenharmony_ci * 3038c2ecf20Sopenharmony_ci * @base DRM connector object 3048c2ecf20Sopenharmony_ci * @is_implicit connector property 3058c2ecf20Sopenharmony_ci * 3068c2ecf20Sopenharmony_ci */ 3078c2ecf20Sopenharmony_cistruct vmw_connector_state { 3088c2ecf20Sopenharmony_ci struct drm_connector_state base; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci /** 3118c2ecf20Sopenharmony_ci * @gui_x: 3128c2ecf20Sopenharmony_ci * 3138c2ecf20Sopenharmony_ci * vmwgfx connector property representing the x position of this display 3148c2ecf20Sopenharmony_ci * unit (connector is synonymous to display unit) in overall topology. 3158c2ecf20Sopenharmony_ci * This is what the device expect as xRoot while creating screen. 3168c2ecf20Sopenharmony_ci */ 3178c2ecf20Sopenharmony_ci int gui_x; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci /** 3208c2ecf20Sopenharmony_ci * @gui_y: 3218c2ecf20Sopenharmony_ci * 3228c2ecf20Sopenharmony_ci * vmwgfx connector property representing the y position of this display 3238c2ecf20Sopenharmony_ci * unit (connector is synonymous to display unit) in overall topology. 3248c2ecf20Sopenharmony_ci * This is what the device expect as yRoot while creating screen. 3258c2ecf20Sopenharmony_ci */ 3268c2ecf20Sopenharmony_ci int gui_y; 3278c2ecf20Sopenharmony_ci}; 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci/** 3308c2ecf20Sopenharmony_ci * Base class display unit. 3318c2ecf20Sopenharmony_ci * 3328c2ecf20Sopenharmony_ci * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector 3338c2ecf20Sopenharmony_ci * so the display unit is all of them at the same time. This is true for both 3348c2ecf20Sopenharmony_ci * legacy multimon and screen objects. 3358c2ecf20Sopenharmony_ci */ 3368c2ecf20Sopenharmony_cistruct vmw_display_unit { 3378c2ecf20Sopenharmony_ci struct drm_crtc crtc; 3388c2ecf20Sopenharmony_ci struct drm_encoder encoder; 3398c2ecf20Sopenharmony_ci struct drm_connector connector; 3408c2ecf20Sopenharmony_ci struct drm_plane primary; 3418c2ecf20Sopenharmony_ci struct drm_plane cursor; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci struct vmw_surface *cursor_surface; 3448c2ecf20Sopenharmony_ci struct vmw_buffer_object *cursor_bo; 3458c2ecf20Sopenharmony_ci size_t cursor_age; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci int cursor_x; 3488c2ecf20Sopenharmony_ci int cursor_y; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci int hotspot_x; 3518c2ecf20Sopenharmony_ci int hotspot_y; 3528c2ecf20Sopenharmony_ci s32 core_hotspot_x; 3538c2ecf20Sopenharmony_ci s32 core_hotspot_y; 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci unsigned unit; 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ci /* 3588c2ecf20Sopenharmony_ci * Prefered mode tracking. 3598c2ecf20Sopenharmony_ci */ 3608c2ecf20Sopenharmony_ci unsigned pref_width; 3618c2ecf20Sopenharmony_ci unsigned pref_height; 3628c2ecf20Sopenharmony_ci bool pref_active; 3638c2ecf20Sopenharmony_ci struct drm_display_mode *pref_mode; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci /* 3668c2ecf20Sopenharmony_ci * Gui positioning 3678c2ecf20Sopenharmony_ci */ 3688c2ecf20Sopenharmony_ci int gui_x; 3698c2ecf20Sopenharmony_ci int gui_y; 3708c2ecf20Sopenharmony_ci bool is_implicit; 3718c2ecf20Sopenharmony_ci int set_gui_x; 3728c2ecf20Sopenharmony_ci int set_gui_y; 3738c2ecf20Sopenharmony_ci}; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_cistruct vmw_validation_ctx { 3768c2ecf20Sopenharmony_ci struct vmw_resource *res; 3778c2ecf20Sopenharmony_ci struct vmw_buffer_object *buf; 3788c2ecf20Sopenharmony_ci}; 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_ci#define vmw_crtc_to_du(x) \ 3818c2ecf20Sopenharmony_ci container_of(x, struct vmw_display_unit, crtc) 3828c2ecf20Sopenharmony_ci#define vmw_connector_to_du(x) \ 3838c2ecf20Sopenharmony_ci container_of(x, struct vmw_display_unit, connector) 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci/* 3878c2ecf20Sopenharmony_ci * Shared display unit functions - vmwgfx_kms.c 3888c2ecf20Sopenharmony_ci */ 3898c2ecf20Sopenharmony_civoid vmw_du_cleanup(struct vmw_display_unit *du); 3908c2ecf20Sopenharmony_civoid vmw_du_crtc_save(struct drm_crtc *crtc); 3918c2ecf20Sopenharmony_civoid vmw_du_crtc_restore(struct drm_crtc *crtc); 3928c2ecf20Sopenharmony_ciint vmw_du_crtc_gamma_set(struct drm_crtc *crtc, 3938c2ecf20Sopenharmony_ci u16 *r, u16 *g, u16 *b, 3948c2ecf20Sopenharmony_ci uint32_t size, 3958c2ecf20Sopenharmony_ci struct drm_modeset_acquire_ctx *ctx); 3968c2ecf20Sopenharmony_ciint vmw_du_connector_set_property(struct drm_connector *connector, 3978c2ecf20Sopenharmony_ci struct drm_property *property, 3988c2ecf20Sopenharmony_ci uint64_t val); 3998c2ecf20Sopenharmony_ciint vmw_du_connector_atomic_set_property(struct drm_connector *connector, 4008c2ecf20Sopenharmony_ci struct drm_connector_state *state, 4018c2ecf20Sopenharmony_ci struct drm_property *property, 4028c2ecf20Sopenharmony_ci uint64_t val); 4038c2ecf20Sopenharmony_ciint 4048c2ecf20Sopenharmony_civmw_du_connector_atomic_get_property(struct drm_connector *connector, 4058c2ecf20Sopenharmony_ci const struct drm_connector_state *state, 4068c2ecf20Sopenharmony_ci struct drm_property *property, 4078c2ecf20Sopenharmony_ci uint64_t *val); 4088c2ecf20Sopenharmony_ciint vmw_du_connector_dpms(struct drm_connector *connector, int mode); 4098c2ecf20Sopenharmony_civoid vmw_du_connector_save(struct drm_connector *connector); 4108c2ecf20Sopenharmony_civoid vmw_du_connector_restore(struct drm_connector *connector); 4118c2ecf20Sopenharmony_cienum drm_connector_status 4128c2ecf20Sopenharmony_civmw_du_connector_detect(struct drm_connector *connector, bool force); 4138c2ecf20Sopenharmony_ciint vmw_du_connector_fill_modes(struct drm_connector *connector, 4148c2ecf20Sopenharmony_ci uint32_t max_width, uint32_t max_height); 4158c2ecf20Sopenharmony_ciint vmw_kms_helper_dirty(struct vmw_private *dev_priv, 4168c2ecf20Sopenharmony_ci struct vmw_framebuffer *framebuffer, 4178c2ecf20Sopenharmony_ci const struct drm_clip_rect *clips, 4188c2ecf20Sopenharmony_ci const struct drm_vmw_rect *vclips, 4198c2ecf20Sopenharmony_ci s32 dest_x, s32 dest_y, 4208c2ecf20Sopenharmony_ci int num_clips, 4218c2ecf20Sopenharmony_ci int increment, 4228c2ecf20Sopenharmony_ci struct vmw_kms_dirty *dirty); 4238c2ecf20Sopenharmony_ci 4248c2ecf20Sopenharmony_civoid vmw_kms_helper_validation_finish(struct vmw_private *dev_priv, 4258c2ecf20Sopenharmony_ci struct drm_file *file_priv, 4268c2ecf20Sopenharmony_ci struct vmw_validation_context *ctx, 4278c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence, 4288c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user * 4298c2ecf20Sopenharmony_ci user_fence_rep); 4308c2ecf20Sopenharmony_ciint vmw_kms_readback(struct vmw_private *dev_priv, 4318c2ecf20Sopenharmony_ci struct drm_file *file_priv, 4328c2ecf20Sopenharmony_ci struct vmw_framebuffer *vfb, 4338c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user *user_fence_rep, 4348c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 4358c2ecf20Sopenharmony_ci uint32_t num_clips); 4368c2ecf20Sopenharmony_cistruct vmw_framebuffer * 4378c2ecf20Sopenharmony_civmw_kms_new_framebuffer(struct vmw_private *dev_priv, 4388c2ecf20Sopenharmony_ci struct vmw_buffer_object *bo, 4398c2ecf20Sopenharmony_ci struct vmw_surface *surface, 4408c2ecf20Sopenharmony_ci bool only_2d, 4418c2ecf20Sopenharmony_ci const struct drm_mode_fb_cmd2 *mode_cmd); 4428c2ecf20Sopenharmony_ciint vmw_kms_fbdev_init_data(struct vmw_private *dev_priv, 4438c2ecf20Sopenharmony_ci unsigned unit, 4448c2ecf20Sopenharmony_ci u32 max_width, 4458c2ecf20Sopenharmony_ci u32 max_height, 4468c2ecf20Sopenharmony_ci struct drm_connector **p_con, 4478c2ecf20Sopenharmony_ci struct drm_crtc **p_crtc, 4488c2ecf20Sopenharmony_ci struct drm_display_mode **p_mode); 4498c2ecf20Sopenharmony_civoid vmw_guess_mode_timing(struct drm_display_mode *mode); 4508c2ecf20Sopenharmony_civoid vmw_kms_update_implicit_fb(struct vmw_private *dev_priv); 4518c2ecf20Sopenharmony_civoid vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv); 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci/* Universal Plane Helpers */ 4548c2ecf20Sopenharmony_civoid vmw_du_primary_plane_destroy(struct drm_plane *plane); 4558c2ecf20Sopenharmony_civoid vmw_du_cursor_plane_destroy(struct drm_plane *plane); 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_ci/* Atomic Helpers */ 4588c2ecf20Sopenharmony_ciint vmw_du_primary_plane_atomic_check(struct drm_plane *plane, 4598c2ecf20Sopenharmony_ci struct drm_plane_state *state); 4608c2ecf20Sopenharmony_ciint vmw_du_cursor_plane_atomic_check(struct drm_plane *plane, 4618c2ecf20Sopenharmony_ci struct drm_plane_state *state); 4628c2ecf20Sopenharmony_civoid vmw_du_cursor_plane_atomic_update(struct drm_plane *plane, 4638c2ecf20Sopenharmony_ci struct drm_plane_state *old_state); 4648c2ecf20Sopenharmony_ciint vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane, 4658c2ecf20Sopenharmony_ci struct drm_plane_state *new_state); 4668c2ecf20Sopenharmony_civoid vmw_du_plane_cleanup_fb(struct drm_plane *plane, 4678c2ecf20Sopenharmony_ci struct drm_plane_state *old_state); 4688c2ecf20Sopenharmony_civoid vmw_du_plane_reset(struct drm_plane *plane); 4698c2ecf20Sopenharmony_cistruct drm_plane_state *vmw_du_plane_duplicate_state(struct drm_plane *plane); 4708c2ecf20Sopenharmony_civoid vmw_du_plane_destroy_state(struct drm_plane *plane, 4718c2ecf20Sopenharmony_ci struct drm_plane_state *state); 4728c2ecf20Sopenharmony_civoid vmw_du_plane_unpin_surf(struct vmw_plane_state *vps, 4738c2ecf20Sopenharmony_ci bool unreference); 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ciint vmw_du_crtc_atomic_check(struct drm_crtc *crtc, 4768c2ecf20Sopenharmony_ci struct drm_crtc_state *state); 4778c2ecf20Sopenharmony_civoid vmw_du_crtc_atomic_begin(struct drm_crtc *crtc, 4788c2ecf20Sopenharmony_ci struct drm_crtc_state *old_crtc_state); 4798c2ecf20Sopenharmony_civoid vmw_du_crtc_atomic_flush(struct drm_crtc *crtc, 4808c2ecf20Sopenharmony_ci struct drm_crtc_state *old_crtc_state); 4818c2ecf20Sopenharmony_civoid vmw_du_crtc_reset(struct drm_crtc *crtc); 4828c2ecf20Sopenharmony_cistruct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc); 4838c2ecf20Sopenharmony_civoid vmw_du_crtc_destroy_state(struct drm_crtc *crtc, 4848c2ecf20Sopenharmony_ci struct drm_crtc_state *state); 4858c2ecf20Sopenharmony_civoid vmw_du_connector_reset(struct drm_connector *connector); 4868c2ecf20Sopenharmony_cistruct drm_connector_state * 4878c2ecf20Sopenharmony_civmw_du_connector_duplicate_state(struct drm_connector *connector); 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_civoid vmw_du_connector_destroy_state(struct drm_connector *connector, 4908c2ecf20Sopenharmony_ci struct drm_connector_state *state); 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ci/* 4938c2ecf20Sopenharmony_ci * Legacy display unit functions - vmwgfx_ldu.c 4948c2ecf20Sopenharmony_ci */ 4958c2ecf20Sopenharmony_ciint vmw_kms_ldu_init_display(struct vmw_private *dev_priv); 4968c2ecf20Sopenharmony_ciint vmw_kms_ldu_close_display(struct vmw_private *dev_priv); 4978c2ecf20Sopenharmony_ciint vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv, 4988c2ecf20Sopenharmony_ci struct vmw_framebuffer *framebuffer, 4998c2ecf20Sopenharmony_ci unsigned int flags, unsigned int color, 5008c2ecf20Sopenharmony_ci struct drm_clip_rect *clips, 5018c2ecf20Sopenharmony_ci unsigned int num_clips, int increment); 5028c2ecf20Sopenharmony_ciint vmw_kms_update_proxy(struct vmw_resource *res, 5038c2ecf20Sopenharmony_ci const struct drm_clip_rect *clips, 5048c2ecf20Sopenharmony_ci unsigned num_clips, 5058c2ecf20Sopenharmony_ci int increment); 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_ci/* 5088c2ecf20Sopenharmony_ci * Screen Objects display functions - vmwgfx_scrn.c 5098c2ecf20Sopenharmony_ci */ 5108c2ecf20Sopenharmony_ciint vmw_kms_sou_init_display(struct vmw_private *dev_priv); 5118c2ecf20Sopenharmony_ciint vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv, 5128c2ecf20Sopenharmony_ci struct vmw_framebuffer *framebuffer, 5138c2ecf20Sopenharmony_ci struct drm_clip_rect *clips, 5148c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 5158c2ecf20Sopenharmony_ci struct vmw_resource *srf, 5168c2ecf20Sopenharmony_ci s32 dest_x, 5178c2ecf20Sopenharmony_ci s32 dest_y, 5188c2ecf20Sopenharmony_ci unsigned num_clips, int inc, 5198c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence, 5208c2ecf20Sopenharmony_ci struct drm_crtc *crtc); 5218c2ecf20Sopenharmony_ciint vmw_kms_sou_do_bo_dirty(struct vmw_private *dev_priv, 5228c2ecf20Sopenharmony_ci struct vmw_framebuffer *framebuffer, 5238c2ecf20Sopenharmony_ci struct drm_clip_rect *clips, 5248c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 5258c2ecf20Sopenharmony_ci unsigned int num_clips, int increment, 5268c2ecf20Sopenharmony_ci bool interruptible, 5278c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence, 5288c2ecf20Sopenharmony_ci struct drm_crtc *crtc); 5298c2ecf20Sopenharmony_ciint vmw_kms_sou_readback(struct vmw_private *dev_priv, 5308c2ecf20Sopenharmony_ci struct drm_file *file_priv, 5318c2ecf20Sopenharmony_ci struct vmw_framebuffer *vfb, 5328c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user *user_fence_rep, 5338c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 5348c2ecf20Sopenharmony_ci uint32_t num_clips, 5358c2ecf20Sopenharmony_ci struct drm_crtc *crtc); 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_ci/* 5388c2ecf20Sopenharmony_ci * Screen Target Display Unit functions - vmwgfx_stdu.c 5398c2ecf20Sopenharmony_ci */ 5408c2ecf20Sopenharmony_ciint vmw_kms_stdu_init_display(struct vmw_private *dev_priv); 5418c2ecf20Sopenharmony_ciint vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv, 5428c2ecf20Sopenharmony_ci struct vmw_framebuffer *framebuffer, 5438c2ecf20Sopenharmony_ci struct drm_clip_rect *clips, 5448c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 5458c2ecf20Sopenharmony_ci struct vmw_resource *srf, 5468c2ecf20Sopenharmony_ci s32 dest_x, 5478c2ecf20Sopenharmony_ci s32 dest_y, 5488c2ecf20Sopenharmony_ci unsigned num_clips, int inc, 5498c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence, 5508c2ecf20Sopenharmony_ci struct drm_crtc *crtc); 5518c2ecf20Sopenharmony_ciint vmw_kms_stdu_dma(struct vmw_private *dev_priv, 5528c2ecf20Sopenharmony_ci struct drm_file *file_priv, 5538c2ecf20Sopenharmony_ci struct vmw_framebuffer *vfb, 5548c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user *user_fence_rep, 5558c2ecf20Sopenharmony_ci struct drm_clip_rect *clips, 5568c2ecf20Sopenharmony_ci struct drm_vmw_rect *vclips, 5578c2ecf20Sopenharmony_ci uint32_t num_clips, 5588c2ecf20Sopenharmony_ci int increment, 5598c2ecf20Sopenharmony_ci bool to_surface, 5608c2ecf20Sopenharmony_ci bool interruptible, 5618c2ecf20Sopenharmony_ci struct drm_crtc *crtc); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ciint vmw_du_helper_plane_update(struct vmw_du_update_plane *update); 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_ci/** 5668c2ecf20Sopenharmony_ci * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc 5678c2ecf20Sopenharmony_ci * @state: Plane state. 5688c2ecf20Sopenharmony_ci * @r: Rectangle to translate. 5698c2ecf20Sopenharmony_ci */ 5708c2ecf20Sopenharmony_cistatic inline void vmw_du_translate_to_crtc(struct drm_plane_state *state, 5718c2ecf20Sopenharmony_ci struct drm_rect *r) 5728c2ecf20Sopenharmony_ci{ 5738c2ecf20Sopenharmony_ci int translate_crtc_x = -((state->src_x >> 16) - state->crtc_x); 5748c2ecf20Sopenharmony_ci int translate_crtc_y = -((state->src_y >> 16) - state->crtc_y); 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_ci drm_rect_translate(r, translate_crtc_x, translate_crtc_y); 5778c2ecf20Sopenharmony_ci} 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci#endif 580