162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR MIT */
262306a36Sopenharmony_ci/**************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
762306a36Sopenharmony_ci * copy of this software and associated documentation files (the
862306a36Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
962306a36Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
1062306a36Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
1162306a36Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
1262306a36Sopenharmony_ci * the following conditions:
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * The above copyright notice and this permission notice (including the
1562306a36Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
1662306a36Sopenharmony_ci * of the Software.
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1962306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2062306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
2162306a36Sopenharmony_ci * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
2262306a36Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2362306a36Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2462306a36Sopenharmony_ci * USE OR OTHER DEALINGS IN THE SOFTWARE.
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci **************************************************************************/
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#ifndef VMWGFX_KMS_H_
2962306a36Sopenharmony_ci#define VMWGFX_KMS_H_
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#include <drm/drm_encoder.h>
3262306a36Sopenharmony_ci#include <drm/drm_framebuffer.h>
3362306a36Sopenharmony_ci#include <drm/drm_probe_helper.h>
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#include "vmwgfx_drv.h"
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/**
3862306a36Sopenharmony_ci * struct vmw_du_update_plane - Closure structure for vmw_du_helper_plane_update
3962306a36Sopenharmony_ci * @plane: Plane which is being updated.
4062306a36Sopenharmony_ci * @old_state: Old state of plane.
4162306a36Sopenharmony_ci * @dev_priv: Device private.
4262306a36Sopenharmony_ci * @du: Display unit on which to update the plane.
4362306a36Sopenharmony_ci * @vfb: Framebuffer which is blitted to display unit.
4462306a36Sopenharmony_ci * @out_fence: Out fence for resource finish.
4562306a36Sopenharmony_ci * @mutex: The mutex used to protect resource reservation.
4662306a36Sopenharmony_ci * @cpu_blit: True if need cpu blit.
4762306a36Sopenharmony_ci * @intr: Whether to perform waits interruptible if possible.
4862306a36Sopenharmony_ci *
4962306a36Sopenharmony_ci * This structure loosely represent the set of operations needed to perform a
5062306a36Sopenharmony_ci * plane update on a display unit. Implementer will define that functionality
5162306a36Sopenharmony_ci * according to the function callbacks for this structure. In brief it involves
5262306a36Sopenharmony_ci * surface/buffer object validation, populate FIFO commands and command
5362306a36Sopenharmony_ci * submission to the device.
5462306a36Sopenharmony_ci */
5562306a36Sopenharmony_cistruct vmw_du_update_plane {
5662306a36Sopenharmony_ci	/**
5762306a36Sopenharmony_ci	 * @calc_fifo_size: Calculate fifo size.
5862306a36Sopenharmony_ci	 *
5962306a36Sopenharmony_ci	 * Determine fifo size for the commands needed for update. The number of
6062306a36Sopenharmony_ci	 * damage clips on display unit @num_hits will be passed to allocate
6162306a36Sopenharmony_ci	 * sufficient fifo space.
6262306a36Sopenharmony_ci	 *
6362306a36Sopenharmony_ci	 * Return: Fifo size needed
6462306a36Sopenharmony_ci	 */
6562306a36Sopenharmony_ci	uint32_t (*calc_fifo_size)(struct vmw_du_update_plane *update,
6662306a36Sopenharmony_ci				   uint32_t num_hits);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	/**
6962306a36Sopenharmony_ci	 * @post_prepare: Populate fifo for resource preparation.
7062306a36Sopenharmony_ci	 *
7162306a36Sopenharmony_ci	 * Some surface resource or buffer object need some extra cmd submission
7262306a36Sopenharmony_ci	 * like update GB image for proxy surface and define a GMRFB for screen
7362306a36Sopenharmony_ci	 * object. That should be done here as this callback will be
7462306a36Sopenharmony_ci	 * called after FIFO allocation with the address of command buufer.
7562306a36Sopenharmony_ci	 *
7662306a36Sopenharmony_ci	 * This callback is optional.
7762306a36Sopenharmony_ci	 *
7862306a36Sopenharmony_ci	 * Return: Size of commands populated to command buffer.
7962306a36Sopenharmony_ci	 */
8062306a36Sopenharmony_ci	uint32_t (*post_prepare)(struct vmw_du_update_plane *update, void *cmd);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/**
8362306a36Sopenharmony_ci	 * @pre_clip: Populate fifo before clip.
8462306a36Sopenharmony_ci	 *
8562306a36Sopenharmony_ci	 * This is where pre clip related command should be populated like
8662306a36Sopenharmony_ci	 * surface copy/DMA, etc.
8762306a36Sopenharmony_ci	 *
8862306a36Sopenharmony_ci	 * This callback is optional.
8962306a36Sopenharmony_ci	 *
9062306a36Sopenharmony_ci	 * Return: Size of commands populated to command buffer.
9162306a36Sopenharmony_ci	 */
9262306a36Sopenharmony_ci	uint32_t (*pre_clip)(struct vmw_du_update_plane *update, void *cmd,
9362306a36Sopenharmony_ci			     uint32_t num_hits);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	/**
9662306a36Sopenharmony_ci	 * @clip: Populate fifo for clip.
9762306a36Sopenharmony_ci	 *
9862306a36Sopenharmony_ci	 * This is where to populate clips for surface copy/dma or blit commands
9962306a36Sopenharmony_ci	 * if needed. This will be called times have damage in display unit,
10062306a36Sopenharmony_ci	 * which is one if doing full update. @clip is the damage in destination
10162306a36Sopenharmony_ci	 * coordinates which is crtc/DU and @src_x, @src_y is damage clip src in
10262306a36Sopenharmony_ci	 * framebuffer coordinate.
10362306a36Sopenharmony_ci	 *
10462306a36Sopenharmony_ci	 * This callback is optional.
10562306a36Sopenharmony_ci	 *
10662306a36Sopenharmony_ci	 * Return: Size of commands populated to command buffer.
10762306a36Sopenharmony_ci	 */
10862306a36Sopenharmony_ci	uint32_t (*clip)(struct vmw_du_update_plane *update, void *cmd,
10962306a36Sopenharmony_ci			 struct drm_rect *clip, uint32_t src_x, uint32_t src_y);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	/**
11262306a36Sopenharmony_ci	 * @post_clip: Populate fifo after clip.
11362306a36Sopenharmony_ci	 *
11462306a36Sopenharmony_ci	 * This is where to populate display unit update commands or blit
11562306a36Sopenharmony_ci	 * commands.
11662306a36Sopenharmony_ci	 *
11762306a36Sopenharmony_ci	 * Return: Size of commands populated to command buffer.
11862306a36Sopenharmony_ci	 */
11962306a36Sopenharmony_ci	uint32_t (*post_clip)(struct vmw_du_update_plane *update, void *cmd,
12062306a36Sopenharmony_ci				    struct drm_rect *bb);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	struct drm_plane *plane;
12362306a36Sopenharmony_ci	struct drm_plane_state *old_state;
12462306a36Sopenharmony_ci	struct vmw_private *dev_priv;
12562306a36Sopenharmony_ci	struct vmw_display_unit *du;
12662306a36Sopenharmony_ci	struct vmw_framebuffer *vfb;
12762306a36Sopenharmony_ci	struct vmw_fence_obj **out_fence;
12862306a36Sopenharmony_ci	struct mutex *mutex;
12962306a36Sopenharmony_ci	bool intr;
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/**
13362306a36Sopenharmony_ci * struct vmw_du_update_plane_surface - closure structure for surface
13462306a36Sopenharmony_ci * @base: base closure structure.
13562306a36Sopenharmony_ci * @cmd_start: FIFO command start address (used by SOU only).
13662306a36Sopenharmony_ci */
13762306a36Sopenharmony_cistruct vmw_du_update_plane_surface {
13862306a36Sopenharmony_ci	struct vmw_du_update_plane base;
13962306a36Sopenharmony_ci	/* This member is to handle special case SOU surface update */
14062306a36Sopenharmony_ci	void *cmd_start;
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/**
14462306a36Sopenharmony_ci * struct vmw_du_update_plane_buffer - Closure structure for buffer object
14562306a36Sopenharmony_ci * @base: Base closure structure.
14662306a36Sopenharmony_ci * @fb_left: x1 for fb damage bounding box.
14762306a36Sopenharmony_ci * @fb_top: y1 for fb damage bounding box.
14862306a36Sopenharmony_ci */
14962306a36Sopenharmony_cistruct vmw_du_update_plane_buffer {
15062306a36Sopenharmony_ci	struct vmw_du_update_plane base;
15162306a36Sopenharmony_ci	int fb_left, fb_top;
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/**
15562306a36Sopenharmony_ci * struct vmw_kms_dirty - closure structure for the vmw_kms_helper_dirty
15662306a36Sopenharmony_ci * function.
15762306a36Sopenharmony_ci *
15862306a36Sopenharmony_ci * @fifo_commit: Callback that is called once for each display unit after
15962306a36Sopenharmony_ci * all clip rects. This function must commit the fifo space reserved by the
16062306a36Sopenharmony_ci * helper. Set up by the caller.
16162306a36Sopenharmony_ci * @clip: Callback that is called for each cliprect on each display unit.
16262306a36Sopenharmony_ci * Set up by the caller.
16362306a36Sopenharmony_ci * @fifo_reserve_size: Fifo size that the helper should try to allocat for
16462306a36Sopenharmony_ci * each display unit. Set up by the caller.
16562306a36Sopenharmony_ci * @dev_priv: Pointer to the device private. Set up by the helper.
16662306a36Sopenharmony_ci * @unit: The current display unit. Set up by the helper before a call to @clip.
16762306a36Sopenharmony_ci * @cmd: The allocated fifo space. Set up by the helper before the first @clip
16862306a36Sopenharmony_ci * call.
16962306a36Sopenharmony_ci * @crtc: The crtc for which to build dirty commands.
17062306a36Sopenharmony_ci * @num_hits: Number of clip rect commands for this display unit.
17162306a36Sopenharmony_ci * Cleared by the helper before the first @clip call. Updated by the @clip
17262306a36Sopenharmony_ci * callback.
17362306a36Sopenharmony_ci * @fb_x: Clip rect left side in framebuffer coordinates.
17462306a36Sopenharmony_ci * @fb_y: Clip rect right side in framebuffer coordinates.
17562306a36Sopenharmony_ci * @unit_x1: Clip rect left side in crtc coordinates.
17662306a36Sopenharmony_ci * @unit_y1: Clip rect top side in crtc coordinates.
17762306a36Sopenharmony_ci * @unit_x2: Clip rect right side in crtc coordinates.
17862306a36Sopenharmony_ci * @unit_y2: Clip rect bottom side in crtc coordinates.
17962306a36Sopenharmony_ci *
18062306a36Sopenharmony_ci * The clip rect coordinates are updated by the helper for each @clip call.
18162306a36Sopenharmony_ci * Note that this may be derived from if more info needs to be passed between
18262306a36Sopenharmony_ci * helper caller and helper callbacks.
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_cistruct vmw_kms_dirty {
18562306a36Sopenharmony_ci	void (*fifo_commit)(struct vmw_kms_dirty *);
18662306a36Sopenharmony_ci	void (*clip)(struct vmw_kms_dirty *);
18762306a36Sopenharmony_ci	size_t fifo_reserve_size;
18862306a36Sopenharmony_ci	struct vmw_private *dev_priv;
18962306a36Sopenharmony_ci	struct vmw_display_unit *unit;
19062306a36Sopenharmony_ci	void *cmd;
19162306a36Sopenharmony_ci	struct drm_crtc *crtc;
19262306a36Sopenharmony_ci	u32 num_hits;
19362306a36Sopenharmony_ci	s32 fb_x;
19462306a36Sopenharmony_ci	s32 fb_y;
19562306a36Sopenharmony_ci	s32 unit_x1;
19662306a36Sopenharmony_ci	s32 unit_y1;
19762306a36Sopenharmony_ci	s32 unit_x2;
19862306a36Sopenharmony_ci	s32 unit_y2;
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci#define VMWGFX_NUM_DISPLAY_UNITS 8
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci#define vmw_framebuffer_to_vfb(x) \
20562306a36Sopenharmony_ci	container_of(x, struct vmw_framebuffer, base)
20662306a36Sopenharmony_ci#define vmw_framebuffer_to_vfbs(x) \
20762306a36Sopenharmony_ci	container_of(x, struct vmw_framebuffer_surface, base.base)
20862306a36Sopenharmony_ci#define vmw_framebuffer_to_vfbd(x) \
20962306a36Sopenharmony_ci	container_of(x, struct vmw_framebuffer_bo, base.base)
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci/**
21262306a36Sopenharmony_ci * Base class for framebuffers
21362306a36Sopenharmony_ci *
21462306a36Sopenharmony_ci * @pin is called the when ever a crtc uses this framebuffer
21562306a36Sopenharmony_ci * @unpin is called
21662306a36Sopenharmony_ci */
21762306a36Sopenharmony_cistruct vmw_framebuffer {
21862306a36Sopenharmony_ci	struct drm_framebuffer base;
21962306a36Sopenharmony_ci	bool bo;
22062306a36Sopenharmony_ci	uint32_t user_handle;
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci/*
22462306a36Sopenharmony_ci * Clip rectangle
22562306a36Sopenharmony_ci */
22662306a36Sopenharmony_cistruct vmw_clip_rect {
22762306a36Sopenharmony_ci	int x1, x2, y1, y2;
22862306a36Sopenharmony_ci};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cistruct vmw_framebuffer_surface {
23162306a36Sopenharmony_ci	struct vmw_framebuffer base;
23262306a36Sopenharmony_ci	struct vmw_surface *surface;
23362306a36Sopenharmony_ci	struct vmw_bo *buffer;
23462306a36Sopenharmony_ci	struct list_head head;
23562306a36Sopenharmony_ci	bool is_bo_proxy;  /* true if this is proxy surface for DMA buf */
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistruct vmw_framebuffer_bo {
24062306a36Sopenharmony_ci	struct vmw_framebuffer base;
24162306a36Sopenharmony_ci	struct vmw_bo *buffer;
24262306a36Sopenharmony_ci};
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistatic const uint32_t __maybe_unused vmw_primary_plane_formats[] = {
24662306a36Sopenharmony_ci	DRM_FORMAT_XRGB1555,
24762306a36Sopenharmony_ci	DRM_FORMAT_RGB565,
24862306a36Sopenharmony_ci	DRM_FORMAT_XRGB8888,
24962306a36Sopenharmony_ci	DRM_FORMAT_ARGB8888,
25062306a36Sopenharmony_ci};
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_cistatic const uint32_t __maybe_unused vmw_cursor_plane_formats[] = {
25362306a36Sopenharmony_ci	DRM_FORMAT_ARGB8888,
25462306a36Sopenharmony_ci};
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci#define vmw_crtc_state_to_vcs(x) container_of(x, struct vmw_crtc_state, base)
25862306a36Sopenharmony_ci#define vmw_plane_state_to_vps(x) container_of(x, struct vmw_plane_state, base)
25962306a36Sopenharmony_ci#define vmw_connector_state_to_vcs(x) \
26062306a36Sopenharmony_ci		container_of(x, struct vmw_connector_state, base)
26162306a36Sopenharmony_ci#define vmw_plane_to_vcp(x) container_of(x, struct vmw_cursor_plane, base)
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/**
26462306a36Sopenharmony_ci * Derived class for crtc state object
26562306a36Sopenharmony_ci *
26662306a36Sopenharmony_ci * @base DRM crtc object
26762306a36Sopenharmony_ci */
26862306a36Sopenharmony_cistruct vmw_crtc_state {
26962306a36Sopenharmony_ci	struct drm_crtc_state base;
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistruct vmw_cursor_plane_state {
27362306a36Sopenharmony_ci	struct vmw_bo *bo;
27462306a36Sopenharmony_ci	s32 hotspot_x;
27562306a36Sopenharmony_ci	s32 hotspot_y;
27662306a36Sopenharmony_ci};
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci/**
27962306a36Sopenharmony_ci * Derived class for plane state object
28062306a36Sopenharmony_ci *
28162306a36Sopenharmony_ci * @base DRM plane object
28262306a36Sopenharmony_ci * @surf Display surface for STDU
28362306a36Sopenharmony_ci * @bo display bo for SOU
28462306a36Sopenharmony_ci * @content_fb_type Used by STDU.
28562306a36Sopenharmony_ci * @bo_size Size of the bo, used by Screen Object Display Unit
28662306a36Sopenharmony_ci * @pinned pin count for STDU display surface
28762306a36Sopenharmony_ci */
28862306a36Sopenharmony_cistruct vmw_plane_state {
28962306a36Sopenharmony_ci	struct drm_plane_state base;
29062306a36Sopenharmony_ci	struct vmw_surface *surf;
29162306a36Sopenharmony_ci	struct vmw_bo *bo;
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	int content_fb_type;
29462306a36Sopenharmony_ci	unsigned long bo_size;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	int pinned;
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	/* For CPU Blit */
29962306a36Sopenharmony_ci	unsigned int cpp;
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	bool surf_mapped;
30262306a36Sopenharmony_ci	struct vmw_cursor_plane_state cursor;
30362306a36Sopenharmony_ci};
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci/**
30762306a36Sopenharmony_ci * Derived class for connector state object
30862306a36Sopenharmony_ci *
30962306a36Sopenharmony_ci * @base DRM connector object
31062306a36Sopenharmony_ci * @is_implicit connector property
31162306a36Sopenharmony_ci *
31262306a36Sopenharmony_ci */
31362306a36Sopenharmony_cistruct vmw_connector_state {
31462306a36Sopenharmony_ci	struct drm_connector_state base;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	/**
31762306a36Sopenharmony_ci	 * @gui_x:
31862306a36Sopenharmony_ci	 *
31962306a36Sopenharmony_ci	 * vmwgfx connector property representing the x position of this display
32062306a36Sopenharmony_ci	 * unit (connector is synonymous to display unit) in overall topology.
32162306a36Sopenharmony_ci	 * This is what the device expect as xRoot while creating screen.
32262306a36Sopenharmony_ci	 */
32362306a36Sopenharmony_ci	int gui_x;
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	/**
32662306a36Sopenharmony_ci	 * @gui_y:
32762306a36Sopenharmony_ci	 *
32862306a36Sopenharmony_ci	 * vmwgfx connector property representing the y position of this display
32962306a36Sopenharmony_ci	 * unit (connector is synonymous to display unit) in overall topology.
33062306a36Sopenharmony_ci	 * This is what the device expect as yRoot while creating screen.
33162306a36Sopenharmony_ci	 */
33262306a36Sopenharmony_ci	int gui_y;
33362306a36Sopenharmony_ci};
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/**
33662306a36Sopenharmony_ci * Derived class for cursor plane object
33762306a36Sopenharmony_ci *
33862306a36Sopenharmony_ci * @base DRM plane object
33962306a36Sopenharmony_ci * @cursor.cursor_mobs Cursor mobs available for re-use
34062306a36Sopenharmony_ci */
34162306a36Sopenharmony_cistruct vmw_cursor_plane {
34262306a36Sopenharmony_ci	struct drm_plane base;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	struct vmw_bo *cursor_mobs[3];
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci/**
34862306a36Sopenharmony_ci * Base class display unit.
34962306a36Sopenharmony_ci *
35062306a36Sopenharmony_ci * Since the SVGA hw doesn't have a concept of a crtc, encoder or connector
35162306a36Sopenharmony_ci * so the display unit is all of them at the same time. This is true for both
35262306a36Sopenharmony_ci * legacy multimon and screen objects.
35362306a36Sopenharmony_ci */
35462306a36Sopenharmony_cistruct vmw_display_unit {
35562306a36Sopenharmony_ci	struct drm_crtc crtc;
35662306a36Sopenharmony_ci	struct drm_encoder encoder;
35762306a36Sopenharmony_ci	struct drm_connector connector;
35862306a36Sopenharmony_ci	struct drm_plane primary;
35962306a36Sopenharmony_ci	struct vmw_cursor_plane cursor;
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	struct vmw_surface *cursor_surface;
36262306a36Sopenharmony_ci	struct vmw_bo *cursor_bo;
36362306a36Sopenharmony_ci	size_t cursor_age;
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	int cursor_x;
36662306a36Sopenharmony_ci	int cursor_y;
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	int hotspot_x;
36962306a36Sopenharmony_ci	int hotspot_y;
37062306a36Sopenharmony_ci	s32 core_hotspot_x;
37162306a36Sopenharmony_ci	s32 core_hotspot_y;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	unsigned unit;
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci	/*
37662306a36Sopenharmony_ci	 * Prefered mode tracking.
37762306a36Sopenharmony_ci	 */
37862306a36Sopenharmony_ci	unsigned pref_width;
37962306a36Sopenharmony_ci	unsigned pref_height;
38062306a36Sopenharmony_ci	bool pref_active;
38162306a36Sopenharmony_ci	struct drm_display_mode *pref_mode;
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	/*
38462306a36Sopenharmony_ci	 * Gui positioning
38562306a36Sopenharmony_ci	 */
38662306a36Sopenharmony_ci	int gui_x;
38762306a36Sopenharmony_ci	int gui_y;
38862306a36Sopenharmony_ci	bool is_implicit;
38962306a36Sopenharmony_ci	int set_gui_x;
39062306a36Sopenharmony_ci	int set_gui_y;
39162306a36Sopenharmony_ci};
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistruct vmw_validation_ctx {
39462306a36Sopenharmony_ci	struct vmw_resource *res;
39562306a36Sopenharmony_ci	struct vmw_bo *buf;
39662306a36Sopenharmony_ci};
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci#define vmw_crtc_to_du(x) \
39962306a36Sopenharmony_ci	container_of(x, struct vmw_display_unit, crtc)
40062306a36Sopenharmony_ci#define vmw_connector_to_du(x) \
40162306a36Sopenharmony_ci	container_of(x, struct vmw_display_unit, connector)
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci/*
40562306a36Sopenharmony_ci * Shared display unit functions - vmwgfx_kms.c
40662306a36Sopenharmony_ci */
40762306a36Sopenharmony_civoid vmw_du_cleanup(struct vmw_display_unit *du);
40862306a36Sopenharmony_civoid vmw_du_crtc_save(struct drm_crtc *crtc);
40962306a36Sopenharmony_civoid vmw_du_crtc_restore(struct drm_crtc *crtc);
41062306a36Sopenharmony_ciint vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
41162306a36Sopenharmony_ci			   u16 *r, u16 *g, u16 *b,
41262306a36Sopenharmony_ci			   uint32_t size,
41362306a36Sopenharmony_ci			   struct drm_modeset_acquire_ctx *ctx);
41462306a36Sopenharmony_ciint vmw_du_connector_set_property(struct drm_connector *connector,
41562306a36Sopenharmony_ci				  struct drm_property *property,
41662306a36Sopenharmony_ci				  uint64_t val);
41762306a36Sopenharmony_ciint vmw_du_connector_atomic_set_property(struct drm_connector *connector,
41862306a36Sopenharmony_ci					 struct drm_connector_state *state,
41962306a36Sopenharmony_ci					 struct drm_property *property,
42062306a36Sopenharmony_ci					 uint64_t val);
42162306a36Sopenharmony_ciint
42262306a36Sopenharmony_civmw_du_connector_atomic_get_property(struct drm_connector *connector,
42362306a36Sopenharmony_ci				     const struct drm_connector_state *state,
42462306a36Sopenharmony_ci				     struct drm_property *property,
42562306a36Sopenharmony_ci				     uint64_t *val);
42662306a36Sopenharmony_ciint vmw_du_connector_dpms(struct drm_connector *connector, int mode);
42762306a36Sopenharmony_civoid vmw_du_connector_save(struct drm_connector *connector);
42862306a36Sopenharmony_civoid vmw_du_connector_restore(struct drm_connector *connector);
42962306a36Sopenharmony_cienum drm_connector_status
43062306a36Sopenharmony_civmw_du_connector_detect(struct drm_connector *connector, bool force);
43162306a36Sopenharmony_ciint vmw_du_connector_fill_modes(struct drm_connector *connector,
43262306a36Sopenharmony_ci				uint32_t max_width, uint32_t max_height);
43362306a36Sopenharmony_ciint vmw_kms_helper_dirty(struct vmw_private *dev_priv,
43462306a36Sopenharmony_ci			 struct vmw_framebuffer *framebuffer,
43562306a36Sopenharmony_ci			 const struct drm_clip_rect *clips,
43662306a36Sopenharmony_ci			 const struct drm_vmw_rect *vclips,
43762306a36Sopenharmony_ci			 s32 dest_x, s32 dest_y,
43862306a36Sopenharmony_ci			 int num_clips,
43962306a36Sopenharmony_ci			 int increment,
44062306a36Sopenharmony_ci			 struct vmw_kms_dirty *dirty);
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_civoid vmw_kms_helper_validation_finish(struct vmw_private *dev_priv,
44362306a36Sopenharmony_ci				      struct drm_file *file_priv,
44462306a36Sopenharmony_ci				      struct vmw_validation_context *ctx,
44562306a36Sopenharmony_ci				      struct vmw_fence_obj **out_fence,
44662306a36Sopenharmony_ci				      struct drm_vmw_fence_rep __user *
44762306a36Sopenharmony_ci				      user_fence_rep);
44862306a36Sopenharmony_ciint vmw_kms_readback(struct vmw_private *dev_priv,
44962306a36Sopenharmony_ci		     struct drm_file *file_priv,
45062306a36Sopenharmony_ci		     struct vmw_framebuffer *vfb,
45162306a36Sopenharmony_ci		     struct drm_vmw_fence_rep __user *user_fence_rep,
45262306a36Sopenharmony_ci		     struct drm_vmw_rect *vclips,
45362306a36Sopenharmony_ci		     uint32_t num_clips);
45462306a36Sopenharmony_cistruct vmw_framebuffer *
45562306a36Sopenharmony_civmw_kms_new_framebuffer(struct vmw_private *dev_priv,
45662306a36Sopenharmony_ci			struct vmw_bo *bo,
45762306a36Sopenharmony_ci			struct vmw_surface *surface,
45862306a36Sopenharmony_ci			bool only_2d,
45962306a36Sopenharmony_ci			const struct drm_mode_fb_cmd2 *mode_cmd);
46062306a36Sopenharmony_civoid vmw_guess_mode_timing(struct drm_display_mode *mode);
46162306a36Sopenharmony_civoid vmw_kms_update_implicit_fb(struct vmw_private *dev_priv);
46262306a36Sopenharmony_civoid vmw_kms_create_implicit_placement_property(struct vmw_private *dev_priv);
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci/* Universal Plane Helpers */
46562306a36Sopenharmony_civoid vmw_du_primary_plane_destroy(struct drm_plane *plane);
46662306a36Sopenharmony_civoid vmw_du_cursor_plane_destroy(struct drm_plane *plane);
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci/* Atomic Helpers */
46962306a36Sopenharmony_ciint vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
47062306a36Sopenharmony_ci				      struct drm_atomic_state *state);
47162306a36Sopenharmony_ciint vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
47262306a36Sopenharmony_ci				     struct drm_atomic_state *state);
47362306a36Sopenharmony_civoid vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
47462306a36Sopenharmony_ci				       struct drm_atomic_state *state);
47562306a36Sopenharmony_ciint vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane,
47662306a36Sopenharmony_ci				   struct drm_plane_state *new_state);
47762306a36Sopenharmony_civoid vmw_du_cursor_plane_cleanup_fb(struct drm_plane *plane,
47862306a36Sopenharmony_ci			     struct drm_plane_state *old_state);
47962306a36Sopenharmony_civoid vmw_du_plane_cleanup_fb(struct drm_plane *plane,
48062306a36Sopenharmony_ci			     struct drm_plane_state *old_state);
48162306a36Sopenharmony_civoid vmw_du_plane_reset(struct drm_plane *plane);
48262306a36Sopenharmony_cistruct drm_plane_state *vmw_du_plane_duplicate_state(struct drm_plane *plane);
48362306a36Sopenharmony_civoid vmw_du_plane_destroy_state(struct drm_plane *plane,
48462306a36Sopenharmony_ci				struct drm_plane_state *state);
48562306a36Sopenharmony_civoid vmw_du_plane_unpin_surf(struct vmw_plane_state *vps,
48662306a36Sopenharmony_ci			     bool unreference);
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ciint vmw_du_crtc_atomic_check(struct drm_crtc *crtc,
48962306a36Sopenharmony_ci			     struct drm_atomic_state *state);
49062306a36Sopenharmony_civoid vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
49162306a36Sopenharmony_ci			      struct drm_atomic_state *state);
49262306a36Sopenharmony_civoid vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
49362306a36Sopenharmony_ci			      struct drm_atomic_state *state);
49462306a36Sopenharmony_civoid vmw_du_crtc_reset(struct drm_crtc *crtc);
49562306a36Sopenharmony_cistruct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc);
49662306a36Sopenharmony_civoid vmw_du_crtc_destroy_state(struct drm_crtc *crtc,
49762306a36Sopenharmony_ci				struct drm_crtc_state *state);
49862306a36Sopenharmony_civoid vmw_du_connector_reset(struct drm_connector *connector);
49962306a36Sopenharmony_cistruct drm_connector_state *
50062306a36Sopenharmony_civmw_du_connector_duplicate_state(struct drm_connector *connector);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_civoid vmw_du_connector_destroy_state(struct drm_connector *connector,
50362306a36Sopenharmony_ci				    struct drm_connector_state *state);
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci/*
50662306a36Sopenharmony_ci * Legacy display unit functions - vmwgfx_ldu.c
50762306a36Sopenharmony_ci */
50862306a36Sopenharmony_ciint vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
50962306a36Sopenharmony_ciint vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
51062306a36Sopenharmony_ciint vmw_kms_update_proxy(struct vmw_resource *res,
51162306a36Sopenharmony_ci			 const struct drm_clip_rect *clips,
51262306a36Sopenharmony_ci			 unsigned num_clips,
51362306a36Sopenharmony_ci			 int increment);
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci/*
51662306a36Sopenharmony_ci * Screen Objects display functions - vmwgfx_scrn.c
51762306a36Sopenharmony_ci */
51862306a36Sopenharmony_ciint vmw_kms_sou_init_display(struct vmw_private *dev_priv);
51962306a36Sopenharmony_ciint vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
52062306a36Sopenharmony_ci				 struct vmw_framebuffer *framebuffer,
52162306a36Sopenharmony_ci				 struct drm_clip_rect *clips,
52262306a36Sopenharmony_ci				 struct drm_vmw_rect *vclips,
52362306a36Sopenharmony_ci				 struct vmw_resource *srf,
52462306a36Sopenharmony_ci				 s32 dest_x,
52562306a36Sopenharmony_ci				 s32 dest_y,
52662306a36Sopenharmony_ci				 unsigned num_clips, int inc,
52762306a36Sopenharmony_ci				 struct vmw_fence_obj **out_fence,
52862306a36Sopenharmony_ci				 struct drm_crtc *crtc);
52962306a36Sopenharmony_ciint vmw_kms_sou_do_bo_dirty(struct vmw_private *dev_priv,
53062306a36Sopenharmony_ci			    struct vmw_framebuffer *framebuffer,
53162306a36Sopenharmony_ci			    struct drm_clip_rect *clips,
53262306a36Sopenharmony_ci			    struct drm_vmw_rect *vclips,
53362306a36Sopenharmony_ci			    unsigned int num_clips, int increment,
53462306a36Sopenharmony_ci			    bool interruptible,
53562306a36Sopenharmony_ci			    struct vmw_fence_obj **out_fence,
53662306a36Sopenharmony_ci			    struct drm_crtc *crtc);
53762306a36Sopenharmony_ciint vmw_kms_sou_readback(struct vmw_private *dev_priv,
53862306a36Sopenharmony_ci			 struct drm_file *file_priv,
53962306a36Sopenharmony_ci			 struct vmw_framebuffer *vfb,
54062306a36Sopenharmony_ci			 struct drm_vmw_fence_rep __user *user_fence_rep,
54162306a36Sopenharmony_ci			 struct drm_vmw_rect *vclips,
54262306a36Sopenharmony_ci			 uint32_t num_clips,
54362306a36Sopenharmony_ci			 struct drm_crtc *crtc);
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci/*
54662306a36Sopenharmony_ci * Screen Target Display Unit functions - vmwgfx_stdu.c
54762306a36Sopenharmony_ci */
54862306a36Sopenharmony_ciint vmw_kms_stdu_init_display(struct vmw_private *dev_priv);
54962306a36Sopenharmony_ciint vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv,
55062306a36Sopenharmony_ci			       struct vmw_framebuffer *framebuffer,
55162306a36Sopenharmony_ci			       struct drm_clip_rect *clips,
55262306a36Sopenharmony_ci			       struct drm_vmw_rect *vclips,
55362306a36Sopenharmony_ci			       struct vmw_resource *srf,
55462306a36Sopenharmony_ci			       s32 dest_x,
55562306a36Sopenharmony_ci			       s32 dest_y,
55662306a36Sopenharmony_ci			       unsigned num_clips, int inc,
55762306a36Sopenharmony_ci			       struct vmw_fence_obj **out_fence,
55862306a36Sopenharmony_ci			       struct drm_crtc *crtc);
55962306a36Sopenharmony_ciint vmw_kms_stdu_readback(struct vmw_private *dev_priv,
56062306a36Sopenharmony_ci			  struct drm_file *file_priv,
56162306a36Sopenharmony_ci			  struct vmw_framebuffer *vfb,
56262306a36Sopenharmony_ci			  struct drm_vmw_fence_rep __user *user_fence_rep,
56362306a36Sopenharmony_ci			  struct drm_clip_rect *clips,
56462306a36Sopenharmony_ci			  struct drm_vmw_rect *vclips,
56562306a36Sopenharmony_ci			  uint32_t num_clips,
56662306a36Sopenharmony_ci			  int increment,
56762306a36Sopenharmony_ci			  struct drm_crtc *crtc);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ciint vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci/**
57262306a36Sopenharmony_ci * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
57362306a36Sopenharmony_ci * @state: Plane state.
57462306a36Sopenharmony_ci * @r: Rectangle to translate.
57562306a36Sopenharmony_ci */
57662306a36Sopenharmony_cistatic inline void vmw_du_translate_to_crtc(struct drm_plane_state *state,
57762306a36Sopenharmony_ci					    struct drm_rect *r)
57862306a36Sopenharmony_ci{
57962306a36Sopenharmony_ci	int translate_crtc_x = -((state->src_x >> 16) - state->crtc_x);
58062306a36Sopenharmony_ci	int translate_crtc_y = -((state->src_y >> 16) - state->crtc_y);
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	drm_rect_translate(r, translate_crtc_x, translate_crtc_y);
58362306a36Sopenharmony_ci}
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci#endif
586