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_DRV_H_ 298c2ecf20Sopenharmony_ci#define _VMWGFX_DRV_H_ 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <linux/suspend.h> 328c2ecf20Sopenharmony_ci#include <linux/sync_file.h> 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#include <drm/drm_auth.h> 358c2ecf20Sopenharmony_ci#include <drm/drm_device.h> 368c2ecf20Sopenharmony_ci#include <drm/drm_file.h> 378c2ecf20Sopenharmony_ci#include <drm/drm_hashtab.h> 388c2ecf20Sopenharmony_ci#include <drm/drm_rect.h> 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#include <drm/ttm/ttm_bo_driver.h> 418c2ecf20Sopenharmony_ci#include <drm/ttm/ttm_execbuf_util.h> 428c2ecf20Sopenharmony_ci#include <drm/ttm/ttm_module.h> 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#include "ttm_lock.h" 458c2ecf20Sopenharmony_ci#include "ttm_object.h" 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci#include "vmwgfx_fence.h" 488c2ecf20Sopenharmony_ci#include "vmwgfx_reg.h" 498c2ecf20Sopenharmony_ci#include "vmwgfx_validation.h" 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* 528c2ecf20Sopenharmony_ci * FIXME: vmwgfx_drm.h needs to be last due to dependencies. 538c2ecf20Sopenharmony_ci * uapi headers should not depend on header files outside uapi/. 548c2ecf20Sopenharmony_ci */ 558c2ecf20Sopenharmony_ci#include <drm/vmwgfx_drm.h> 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci#define VMWGFX_DRIVER_NAME "vmwgfx" 598c2ecf20Sopenharmony_ci#define VMWGFX_DRIVER_DATE "20200114" 608c2ecf20Sopenharmony_ci#define VMWGFX_DRIVER_MAJOR 2 618c2ecf20Sopenharmony_ci#define VMWGFX_DRIVER_MINOR 18 628c2ecf20Sopenharmony_ci#define VMWGFX_DRIVER_PATCHLEVEL 0 638c2ecf20Sopenharmony_ci#define VMWGFX_FIFO_STATIC_SIZE (1024*1024) 648c2ecf20Sopenharmony_ci#define VMWGFX_MAX_RELOCATIONS 2048 658c2ecf20Sopenharmony_ci#define VMWGFX_MAX_VALIDATIONS 2048 668c2ecf20Sopenharmony_ci#define VMWGFX_MAX_DISPLAYS 16 678c2ecf20Sopenharmony_ci#define VMWGFX_CMD_BOUNCE_INIT_SIZE 32768 688c2ecf20Sopenharmony_ci#define VMWGFX_ENABLE_SCREEN_TARGET_OTABLE 1 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci/* 718c2ecf20Sopenharmony_ci * Perhaps we should have sysfs entries for these. 728c2ecf20Sopenharmony_ci */ 738c2ecf20Sopenharmony_ci#define VMWGFX_NUM_GB_CONTEXT 256 748c2ecf20Sopenharmony_ci#define VMWGFX_NUM_GB_SHADER 20000 758c2ecf20Sopenharmony_ci#define VMWGFX_NUM_GB_SURFACE 32768 768c2ecf20Sopenharmony_ci#define VMWGFX_NUM_GB_SCREEN_TARGET VMWGFX_MAX_DISPLAYS 778c2ecf20Sopenharmony_ci#define VMWGFX_NUM_DXCONTEXT 256 788c2ecf20Sopenharmony_ci#define VMWGFX_NUM_DXQUERY 512 798c2ecf20Sopenharmony_ci#define VMWGFX_NUM_MOB (VMWGFX_NUM_GB_CONTEXT +\ 808c2ecf20Sopenharmony_ci VMWGFX_NUM_GB_SHADER +\ 818c2ecf20Sopenharmony_ci VMWGFX_NUM_GB_SURFACE +\ 828c2ecf20Sopenharmony_ci VMWGFX_NUM_GB_SCREEN_TARGET) 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci#define VMW_PL_GMR (TTM_PL_PRIV + 0) 858c2ecf20Sopenharmony_ci#define VMW_PL_MOB (TTM_PL_PRIV + 1) 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci#define VMW_RES_CONTEXT ttm_driver_type0 888c2ecf20Sopenharmony_ci#define VMW_RES_SURFACE ttm_driver_type1 898c2ecf20Sopenharmony_ci#define VMW_RES_STREAM ttm_driver_type2 908c2ecf20Sopenharmony_ci#define VMW_RES_FENCE ttm_driver_type3 918c2ecf20Sopenharmony_ci#define VMW_RES_SHADER ttm_driver_type4 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistruct vmw_fpriv { 948c2ecf20Sopenharmony_ci struct ttm_object_file *tfile; 958c2ecf20Sopenharmony_ci bool gb_aware; /* user-space is guest-backed aware */ 968c2ecf20Sopenharmony_ci}; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/** 998c2ecf20Sopenharmony_ci * struct vmw_buffer_object - TTM buffer object with vmwgfx additions 1008c2ecf20Sopenharmony_ci * @base: The TTM buffer object 1018c2ecf20Sopenharmony_ci * @res_tree: RB tree of resources using this buffer object as a backing MOB 1028c2ecf20Sopenharmony_ci * @pin_count: pin depth 1038c2ecf20Sopenharmony_ci * @cpu_writers: Number of synccpu write grabs. Protected by reservation when 1048c2ecf20Sopenharmony_ci * increased. May be decreased without reservation. 1058c2ecf20Sopenharmony_ci * @dx_query_ctx: DX context if this buffer object is used as a DX query MOB 1068c2ecf20Sopenharmony_ci * @map: Kmap object for semi-persistent mappings 1078c2ecf20Sopenharmony_ci * @res_prios: Eviction priority counts for attached resources 1088c2ecf20Sopenharmony_ci * @dirty: structure for user-space dirty-tracking 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_cistruct vmw_buffer_object { 1118c2ecf20Sopenharmony_ci struct ttm_buffer_object base; 1128c2ecf20Sopenharmony_ci struct rb_root res_tree; 1138c2ecf20Sopenharmony_ci s32 pin_count; 1148c2ecf20Sopenharmony_ci atomic_t cpu_writers; 1158c2ecf20Sopenharmony_ci /* Not ref-counted. Protected by binding_mutex */ 1168c2ecf20Sopenharmony_ci struct vmw_resource *dx_query_ctx; 1178c2ecf20Sopenharmony_ci /* Protected by reservation */ 1188c2ecf20Sopenharmony_ci struct ttm_bo_kmap_obj map; 1198c2ecf20Sopenharmony_ci u32 res_prios[TTM_MAX_BO_PRIORITY]; 1208c2ecf20Sopenharmony_ci struct vmw_bo_dirty *dirty; 1218c2ecf20Sopenharmony_ci}; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci/** 1248c2ecf20Sopenharmony_ci * struct vmw_validate_buffer - Carries validation info about buffers. 1258c2ecf20Sopenharmony_ci * 1268c2ecf20Sopenharmony_ci * @base: Validation info for TTM. 1278c2ecf20Sopenharmony_ci * @hash: Hash entry for quick lookup of the TTM buffer object. 1288c2ecf20Sopenharmony_ci * 1298c2ecf20Sopenharmony_ci * This structure contains also driver private validation info 1308c2ecf20Sopenharmony_ci * on top of the info needed by TTM. 1318c2ecf20Sopenharmony_ci */ 1328c2ecf20Sopenharmony_cistruct vmw_validate_buffer { 1338c2ecf20Sopenharmony_ci struct ttm_validate_buffer base; 1348c2ecf20Sopenharmony_ci struct drm_hash_item hash; 1358c2ecf20Sopenharmony_ci bool validate_as_mob; 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cistruct vmw_res_func; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci/** 1428c2ecf20Sopenharmony_ci * struct vmw-resource - base class for hardware resources 1438c2ecf20Sopenharmony_ci * 1448c2ecf20Sopenharmony_ci * @kref: For refcounting. 1458c2ecf20Sopenharmony_ci * @dev_priv: Pointer to the device private for this resource. Immutable. 1468c2ecf20Sopenharmony_ci * @id: Device id. Protected by @dev_priv::resource_lock. 1478c2ecf20Sopenharmony_ci * @backup_size: Backup buffer size. Immutable. 1488c2ecf20Sopenharmony_ci * @res_dirty: Resource contains data not yet in the backup buffer. Protected 1498c2ecf20Sopenharmony_ci * by resource reserved. 1508c2ecf20Sopenharmony_ci * @backup_dirty: Backup buffer contains data not yet in the HW resource. 1518c2ecf20Sopenharmony_ci * Protected by resource reserved. 1528c2ecf20Sopenharmony_ci * @coherent: Emulate coherency by tracking vm accesses. 1538c2ecf20Sopenharmony_ci * @backup: The backup buffer if any. Protected by resource reserved. 1548c2ecf20Sopenharmony_ci * @backup_offset: Offset into the backup buffer if any. Protected by resource 1558c2ecf20Sopenharmony_ci * reserved. Note that only a few resource types can have a @backup_offset 1568c2ecf20Sopenharmony_ci * different from zero. 1578c2ecf20Sopenharmony_ci * @pin_count: The pin count for this resource. A pinned resource has a 1588c2ecf20Sopenharmony_ci * pin-count greater than zero. It is not on the resource LRU lists and its 1598c2ecf20Sopenharmony_ci * backup buffer is pinned. Hence it can't be evicted. 1608c2ecf20Sopenharmony_ci * @func: Method vtable for this resource. Immutable. 1618c2ecf20Sopenharmony_ci * @mob_node; Node for the MOB backup rbtree. Protected by @backup reserved. 1628c2ecf20Sopenharmony_ci * @lru_head: List head for the LRU list. Protected by @dev_priv::resource_lock. 1638c2ecf20Sopenharmony_ci * @binding_head: List head for the context binding list. Protected by 1648c2ecf20Sopenharmony_ci * the @dev_priv::binding_mutex 1658c2ecf20Sopenharmony_ci * @res_free: The resource destructor. 1668c2ecf20Sopenharmony_ci * @hw_destroy: Callback to destroy the resource on the device, as part of 1678c2ecf20Sopenharmony_ci * resource destruction. 1688c2ecf20Sopenharmony_ci */ 1698c2ecf20Sopenharmony_cistruct vmw_resource_dirty; 1708c2ecf20Sopenharmony_cistruct vmw_resource { 1718c2ecf20Sopenharmony_ci struct kref kref; 1728c2ecf20Sopenharmony_ci struct vmw_private *dev_priv; 1738c2ecf20Sopenharmony_ci int id; 1748c2ecf20Sopenharmony_ci u32 used_prio; 1758c2ecf20Sopenharmony_ci unsigned long backup_size; 1768c2ecf20Sopenharmony_ci u32 res_dirty : 1; 1778c2ecf20Sopenharmony_ci u32 backup_dirty : 1; 1788c2ecf20Sopenharmony_ci u32 coherent : 1; 1798c2ecf20Sopenharmony_ci struct vmw_buffer_object *backup; 1808c2ecf20Sopenharmony_ci unsigned long backup_offset; 1818c2ecf20Sopenharmony_ci unsigned long pin_count; 1828c2ecf20Sopenharmony_ci const struct vmw_res_func *func; 1838c2ecf20Sopenharmony_ci struct rb_node mob_node; 1848c2ecf20Sopenharmony_ci struct list_head lru_head; 1858c2ecf20Sopenharmony_ci struct list_head binding_head; 1868c2ecf20Sopenharmony_ci struct vmw_resource_dirty *dirty; 1878c2ecf20Sopenharmony_ci void (*res_free) (struct vmw_resource *res); 1888c2ecf20Sopenharmony_ci void (*hw_destroy) (struct vmw_resource *res); 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * Resources that are managed using ioctls. 1948c2ecf20Sopenharmony_ci */ 1958c2ecf20Sopenharmony_cienum vmw_res_type { 1968c2ecf20Sopenharmony_ci vmw_res_context, 1978c2ecf20Sopenharmony_ci vmw_res_surface, 1988c2ecf20Sopenharmony_ci vmw_res_stream, 1998c2ecf20Sopenharmony_ci vmw_res_shader, 2008c2ecf20Sopenharmony_ci vmw_res_dx_context, 2018c2ecf20Sopenharmony_ci vmw_res_cotable, 2028c2ecf20Sopenharmony_ci vmw_res_view, 2038c2ecf20Sopenharmony_ci vmw_res_streamoutput, 2048c2ecf20Sopenharmony_ci vmw_res_max 2058c2ecf20Sopenharmony_ci}; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci/* 2088c2ecf20Sopenharmony_ci * Resources that are managed using command streams. 2098c2ecf20Sopenharmony_ci */ 2108c2ecf20Sopenharmony_cienum vmw_cmdbuf_res_type { 2118c2ecf20Sopenharmony_ci vmw_cmdbuf_res_shader, 2128c2ecf20Sopenharmony_ci vmw_cmdbuf_res_view, 2138c2ecf20Sopenharmony_ci vmw_cmdbuf_res_streamoutput 2148c2ecf20Sopenharmony_ci}; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cistruct vmw_cmdbuf_res_manager; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistruct vmw_cursor_snooper { 2198c2ecf20Sopenharmony_ci size_t age; 2208c2ecf20Sopenharmony_ci uint32_t *image; 2218c2ecf20Sopenharmony_ci}; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistruct vmw_framebuffer; 2248c2ecf20Sopenharmony_cistruct vmw_surface_offset; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci/** 2278c2ecf20Sopenharmony_ci * struct vmw_surface_metadata - Metadata describing a surface. 2288c2ecf20Sopenharmony_ci * 2298c2ecf20Sopenharmony_ci * @flags: Device flags. 2308c2ecf20Sopenharmony_ci * @format: Surface SVGA3D_x format. 2318c2ecf20Sopenharmony_ci * @mip_levels: Mip level for each face. For GB first index is used only. 2328c2ecf20Sopenharmony_ci * @multisample_count: Sample count. 2338c2ecf20Sopenharmony_ci * @multisample_pattern: Sample patterns. 2348c2ecf20Sopenharmony_ci * @quality_level: Quality level. 2358c2ecf20Sopenharmony_ci * @autogen_filter: Filter for automatically generated mipmaps. 2368c2ecf20Sopenharmony_ci * @array_size: Number of array elements for a 1D/2D texture. For cubemap 2378c2ecf20Sopenharmony_ci texture number of faces * array_size. This should be 0 for pre 2388c2ecf20Sopenharmony_ci SM4 device. 2398c2ecf20Sopenharmony_ci * @buffer_byte_stride: Buffer byte stride. 2408c2ecf20Sopenharmony_ci * @num_sizes: Size of @sizes. For GB surface this should always be 1. 2418c2ecf20Sopenharmony_ci * @base_size: Surface dimension. 2428c2ecf20Sopenharmony_ci * @sizes: Array representing mip sizes. Legacy only. 2438c2ecf20Sopenharmony_ci * @scanout: Whether this surface will be used for scanout. 2448c2ecf20Sopenharmony_ci * 2458c2ecf20Sopenharmony_ci * This tracks metadata for both legacy and guest backed surface. 2468c2ecf20Sopenharmony_ci */ 2478c2ecf20Sopenharmony_cistruct vmw_surface_metadata { 2488c2ecf20Sopenharmony_ci u64 flags; 2498c2ecf20Sopenharmony_ci u32 format; 2508c2ecf20Sopenharmony_ci u32 mip_levels[DRM_VMW_MAX_SURFACE_FACES]; 2518c2ecf20Sopenharmony_ci u32 multisample_count; 2528c2ecf20Sopenharmony_ci u32 multisample_pattern; 2538c2ecf20Sopenharmony_ci u32 quality_level; 2548c2ecf20Sopenharmony_ci u32 autogen_filter; 2558c2ecf20Sopenharmony_ci u32 array_size; 2568c2ecf20Sopenharmony_ci u32 num_sizes; 2578c2ecf20Sopenharmony_ci u32 buffer_byte_stride; 2588c2ecf20Sopenharmony_ci struct drm_vmw_size base_size; 2598c2ecf20Sopenharmony_ci struct drm_vmw_size *sizes; 2608c2ecf20Sopenharmony_ci bool scanout; 2618c2ecf20Sopenharmony_ci}; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci/** 2648c2ecf20Sopenharmony_ci * struct vmw_surface: Resource structure for a surface. 2658c2ecf20Sopenharmony_ci * 2668c2ecf20Sopenharmony_ci * @res: The base resource for this surface. 2678c2ecf20Sopenharmony_ci * @metadata: Metadata for this surface resource. 2688c2ecf20Sopenharmony_ci * @snooper: Cursor data. Legacy surface only. 2698c2ecf20Sopenharmony_ci * @offsets: Legacy surface only. 2708c2ecf20Sopenharmony_ci * @view_list: List of views bound to this surface. 2718c2ecf20Sopenharmony_ci */ 2728c2ecf20Sopenharmony_cistruct vmw_surface { 2738c2ecf20Sopenharmony_ci struct vmw_resource res; 2748c2ecf20Sopenharmony_ci struct vmw_surface_metadata metadata; 2758c2ecf20Sopenharmony_ci struct vmw_cursor_snooper snooper; 2768c2ecf20Sopenharmony_ci struct vmw_surface_offset *offsets; 2778c2ecf20Sopenharmony_ci struct list_head view_list; 2788c2ecf20Sopenharmony_ci}; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_cistruct vmw_marker_queue { 2818c2ecf20Sopenharmony_ci struct list_head head; 2828c2ecf20Sopenharmony_ci u64 lag; 2838c2ecf20Sopenharmony_ci u64 lag_time; 2848c2ecf20Sopenharmony_ci spinlock_t lock; 2858c2ecf20Sopenharmony_ci}; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_cistruct vmw_fifo_state { 2888c2ecf20Sopenharmony_ci unsigned long reserved_size; 2898c2ecf20Sopenharmony_ci u32 *dynamic_buffer; 2908c2ecf20Sopenharmony_ci u32 *static_buffer; 2918c2ecf20Sopenharmony_ci unsigned long static_buffer_size; 2928c2ecf20Sopenharmony_ci bool using_bounce_buffer; 2938c2ecf20Sopenharmony_ci uint32_t capabilities; 2948c2ecf20Sopenharmony_ci struct mutex fifo_mutex; 2958c2ecf20Sopenharmony_ci struct rw_semaphore rwsem; 2968c2ecf20Sopenharmony_ci struct vmw_marker_queue marker_queue; 2978c2ecf20Sopenharmony_ci bool dx; 2988c2ecf20Sopenharmony_ci}; 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci/** 3018c2ecf20Sopenharmony_ci * struct vmw_res_cache_entry - resource information cache entry 3028c2ecf20Sopenharmony_ci * @handle: User-space handle of a resource. 3038c2ecf20Sopenharmony_ci * @res: Non-ref-counted pointer to the resource. 3048c2ecf20Sopenharmony_ci * @valid_handle: Whether the @handle member is valid. 3058c2ecf20Sopenharmony_ci * @valid: Whether the entry is valid, which also implies that the execbuf 3068c2ecf20Sopenharmony_ci * code holds a reference to the resource, and it's placed on the 3078c2ecf20Sopenharmony_ci * validation list. 3088c2ecf20Sopenharmony_ci * 3098c2ecf20Sopenharmony_ci * Used to avoid frequent repeated user-space handle lookups of the 3108c2ecf20Sopenharmony_ci * same resource. 3118c2ecf20Sopenharmony_ci */ 3128c2ecf20Sopenharmony_cistruct vmw_res_cache_entry { 3138c2ecf20Sopenharmony_ci uint32_t handle; 3148c2ecf20Sopenharmony_ci struct vmw_resource *res; 3158c2ecf20Sopenharmony_ci void *private; 3168c2ecf20Sopenharmony_ci unsigned short valid_handle; 3178c2ecf20Sopenharmony_ci unsigned short valid; 3188c2ecf20Sopenharmony_ci}; 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci/** 3218c2ecf20Sopenharmony_ci * enum vmw_dma_map_mode - indicate how to perform TTM page dma mappings. 3228c2ecf20Sopenharmony_ci */ 3238c2ecf20Sopenharmony_cienum vmw_dma_map_mode { 3248c2ecf20Sopenharmony_ci vmw_dma_phys, /* Use physical page addresses */ 3258c2ecf20Sopenharmony_ci vmw_dma_alloc_coherent, /* Use TTM coherent pages */ 3268c2ecf20Sopenharmony_ci vmw_dma_map_populate, /* Unmap from DMA just after unpopulate */ 3278c2ecf20Sopenharmony_ci vmw_dma_map_bind, /* Unmap from DMA just before unbind */ 3288c2ecf20Sopenharmony_ci vmw_dma_map_max 3298c2ecf20Sopenharmony_ci}; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci/** 3328c2ecf20Sopenharmony_ci * struct vmw_sg_table - Scatter/gather table for binding, with additional 3338c2ecf20Sopenharmony_ci * device-specific information. 3348c2ecf20Sopenharmony_ci * 3358c2ecf20Sopenharmony_ci * @sgt: Pointer to a struct sg_table with binding information 3368c2ecf20Sopenharmony_ci * @num_regions: Number of regions with device-address contiguous pages 3378c2ecf20Sopenharmony_ci */ 3388c2ecf20Sopenharmony_cistruct vmw_sg_table { 3398c2ecf20Sopenharmony_ci enum vmw_dma_map_mode mode; 3408c2ecf20Sopenharmony_ci struct page **pages; 3418c2ecf20Sopenharmony_ci const dma_addr_t *addrs; 3428c2ecf20Sopenharmony_ci struct sg_table *sgt; 3438c2ecf20Sopenharmony_ci unsigned long num_regions; 3448c2ecf20Sopenharmony_ci unsigned long num_pages; 3458c2ecf20Sopenharmony_ci}; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci/** 3488c2ecf20Sopenharmony_ci * struct vmw_piter - Page iterator that iterates over a list of pages 3498c2ecf20Sopenharmony_ci * and DMA addresses that could be either a scatter-gather list or 3508c2ecf20Sopenharmony_ci * arrays 3518c2ecf20Sopenharmony_ci * 3528c2ecf20Sopenharmony_ci * @pages: Array of page pointers to the pages. 3538c2ecf20Sopenharmony_ci * @addrs: DMA addresses to the pages if coherent pages are used. 3548c2ecf20Sopenharmony_ci * @iter: Scatter-gather page iterator. Current position in SG list. 3558c2ecf20Sopenharmony_ci * @i: Current position in arrays. 3568c2ecf20Sopenharmony_ci * @num_pages: Number of pages total. 3578c2ecf20Sopenharmony_ci * @next: Function to advance the iterator. Returns false if past the list 3588c2ecf20Sopenharmony_ci * of pages, true otherwise. 3598c2ecf20Sopenharmony_ci * @dma_address: Function to return the DMA address of the current page. 3608c2ecf20Sopenharmony_ci */ 3618c2ecf20Sopenharmony_cistruct vmw_piter { 3628c2ecf20Sopenharmony_ci struct page **pages; 3638c2ecf20Sopenharmony_ci const dma_addr_t *addrs; 3648c2ecf20Sopenharmony_ci struct sg_dma_page_iter iter; 3658c2ecf20Sopenharmony_ci unsigned long i; 3668c2ecf20Sopenharmony_ci unsigned long num_pages; 3678c2ecf20Sopenharmony_ci bool (*next)(struct vmw_piter *); 3688c2ecf20Sopenharmony_ci dma_addr_t (*dma_address)(struct vmw_piter *); 3698c2ecf20Sopenharmony_ci struct page *(*page)(struct vmw_piter *); 3708c2ecf20Sopenharmony_ci}; 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci/* 3738c2ecf20Sopenharmony_ci * enum vmw_display_unit_type - Describes the display unit 3748c2ecf20Sopenharmony_ci */ 3758c2ecf20Sopenharmony_cienum vmw_display_unit_type { 3768c2ecf20Sopenharmony_ci vmw_du_invalid = 0, 3778c2ecf20Sopenharmony_ci vmw_du_legacy, 3788c2ecf20Sopenharmony_ci vmw_du_screen_object, 3798c2ecf20Sopenharmony_ci vmw_du_screen_target 3808c2ecf20Sopenharmony_ci}; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_cistruct vmw_validation_context; 3838c2ecf20Sopenharmony_cistruct vmw_ctx_validation_info; 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci/** 3868c2ecf20Sopenharmony_ci * struct vmw_sw_context - Command submission context 3878c2ecf20Sopenharmony_ci * @res_ht: Pointer hash table used to find validation duplicates 3888c2ecf20Sopenharmony_ci * @kernel: Whether the command buffer originates from kernel code rather 3898c2ecf20Sopenharmony_ci * than from user-space 3908c2ecf20Sopenharmony_ci * @fp: If @kernel is false, points to the file of the client. Otherwise 3918c2ecf20Sopenharmony_ci * NULL 3928c2ecf20Sopenharmony_ci * @cmd_bounce: Command bounce buffer used for command validation before 3938c2ecf20Sopenharmony_ci * copying to fifo space 3948c2ecf20Sopenharmony_ci * @cmd_bounce_size: Current command bounce buffer size 3958c2ecf20Sopenharmony_ci * @cur_query_bo: Current buffer object used as query result buffer 3968c2ecf20Sopenharmony_ci * @bo_relocations: List of buffer object relocations 3978c2ecf20Sopenharmony_ci * @res_relocations: List of resource relocations 3988c2ecf20Sopenharmony_ci * @buf_start: Pointer to start of memory where command validation takes 3998c2ecf20Sopenharmony_ci * place 4008c2ecf20Sopenharmony_ci * @res_cache: Cache of recently looked up resources 4018c2ecf20Sopenharmony_ci * @last_query_ctx: Last context that submitted a query 4028c2ecf20Sopenharmony_ci * @needs_post_query_barrier: Whether a query barrier is needed after 4038c2ecf20Sopenharmony_ci * command submission 4048c2ecf20Sopenharmony_ci * @staged_bindings: Cached per-context binding tracker 4058c2ecf20Sopenharmony_ci * @staged_bindings_inuse: Whether the cached per-context binding tracker 4068c2ecf20Sopenharmony_ci * is in use 4078c2ecf20Sopenharmony_ci * @staged_cmd_res: List of staged command buffer managed resources in this 4088c2ecf20Sopenharmony_ci * command buffer 4098c2ecf20Sopenharmony_ci * @ctx_list: List of context resources referenced in this command buffer 4108c2ecf20Sopenharmony_ci * @dx_ctx_node: Validation metadata of the current DX context 4118c2ecf20Sopenharmony_ci * @dx_query_mob: The MOB used for DX queries 4128c2ecf20Sopenharmony_ci * @dx_query_ctx: The DX context used for the last DX query 4138c2ecf20Sopenharmony_ci * @man: Pointer to the command buffer managed resource manager 4148c2ecf20Sopenharmony_ci * @ctx: The validation context 4158c2ecf20Sopenharmony_ci */ 4168c2ecf20Sopenharmony_cistruct vmw_sw_context{ 4178c2ecf20Sopenharmony_ci struct drm_open_hash res_ht; 4188c2ecf20Sopenharmony_ci bool res_ht_initialized; 4198c2ecf20Sopenharmony_ci bool kernel; 4208c2ecf20Sopenharmony_ci struct vmw_fpriv *fp; 4218c2ecf20Sopenharmony_ci uint32_t *cmd_bounce; 4228c2ecf20Sopenharmony_ci uint32_t cmd_bounce_size; 4238c2ecf20Sopenharmony_ci struct vmw_buffer_object *cur_query_bo; 4248c2ecf20Sopenharmony_ci struct list_head bo_relocations; 4258c2ecf20Sopenharmony_ci struct list_head res_relocations; 4268c2ecf20Sopenharmony_ci uint32_t *buf_start; 4278c2ecf20Sopenharmony_ci struct vmw_res_cache_entry res_cache[vmw_res_max]; 4288c2ecf20Sopenharmony_ci struct vmw_resource *last_query_ctx; 4298c2ecf20Sopenharmony_ci bool needs_post_query_barrier; 4308c2ecf20Sopenharmony_ci struct vmw_ctx_binding_state *staged_bindings; 4318c2ecf20Sopenharmony_ci bool staged_bindings_inuse; 4328c2ecf20Sopenharmony_ci struct list_head staged_cmd_res; 4338c2ecf20Sopenharmony_ci struct list_head ctx_list; 4348c2ecf20Sopenharmony_ci struct vmw_ctx_validation_info *dx_ctx_node; 4358c2ecf20Sopenharmony_ci struct vmw_buffer_object *dx_query_mob; 4368c2ecf20Sopenharmony_ci struct vmw_resource *dx_query_ctx; 4378c2ecf20Sopenharmony_ci struct vmw_cmdbuf_res_manager *man; 4388c2ecf20Sopenharmony_ci struct vmw_validation_context *ctx; 4398c2ecf20Sopenharmony_ci}; 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_cistruct vmw_legacy_display; 4428c2ecf20Sopenharmony_cistruct vmw_overlay; 4438c2ecf20Sopenharmony_ci 4448c2ecf20Sopenharmony_cistruct vmw_vga_topology_state { 4458c2ecf20Sopenharmony_ci uint32_t width; 4468c2ecf20Sopenharmony_ci uint32_t height; 4478c2ecf20Sopenharmony_ci uint32_t primary; 4488c2ecf20Sopenharmony_ci uint32_t pos_x; 4498c2ecf20Sopenharmony_ci uint32_t pos_y; 4508c2ecf20Sopenharmony_ci}; 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci/* 4548c2ecf20Sopenharmony_ci * struct vmw_otable - Guest Memory OBject table metadata 4558c2ecf20Sopenharmony_ci * 4568c2ecf20Sopenharmony_ci * @size: Size of the table (page-aligned). 4578c2ecf20Sopenharmony_ci * @page_table: Pointer to a struct vmw_mob holding the page table. 4588c2ecf20Sopenharmony_ci */ 4598c2ecf20Sopenharmony_cistruct vmw_otable { 4608c2ecf20Sopenharmony_ci unsigned long size; 4618c2ecf20Sopenharmony_ci struct vmw_mob *page_table; 4628c2ecf20Sopenharmony_ci bool enabled; 4638c2ecf20Sopenharmony_ci}; 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_cistruct vmw_otable_batch { 4668c2ecf20Sopenharmony_ci unsigned num_otables; 4678c2ecf20Sopenharmony_ci struct vmw_otable *otables; 4688c2ecf20Sopenharmony_ci struct vmw_resource *context; 4698c2ecf20Sopenharmony_ci struct ttm_buffer_object *otable_bo; 4708c2ecf20Sopenharmony_ci}; 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_cienum { 4738c2ecf20Sopenharmony_ci VMW_IRQTHREAD_FENCE, 4748c2ecf20Sopenharmony_ci VMW_IRQTHREAD_CMDBUF, 4758c2ecf20Sopenharmony_ci VMW_IRQTHREAD_MAX 4768c2ecf20Sopenharmony_ci}; 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci/** 4798c2ecf20Sopenharmony_ci * enum vmw_sm_type - Graphics context capability supported by device. 4808c2ecf20Sopenharmony_ci * @VMW_SM_LEGACY: Pre DX context. 4818c2ecf20Sopenharmony_ci * @VMW_SM_4: Context support upto SM4. 4828c2ecf20Sopenharmony_ci * @VMW_SM_4_1: Context support upto SM4_1. 4838c2ecf20Sopenharmony_ci * @VMW_SM_5: Context support up to SM5. 4848c2ecf20Sopenharmony_ci * @VMW_SM_MAX: Should be the last. 4858c2ecf20Sopenharmony_ci */ 4868c2ecf20Sopenharmony_cienum vmw_sm_type { 4878c2ecf20Sopenharmony_ci VMW_SM_LEGACY = 0, 4888c2ecf20Sopenharmony_ci VMW_SM_4, 4898c2ecf20Sopenharmony_ci VMW_SM_4_1, 4908c2ecf20Sopenharmony_ci VMW_SM_5, 4918c2ecf20Sopenharmony_ci VMW_SM_MAX 4928c2ecf20Sopenharmony_ci}; 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_cistruct vmw_private { 4958c2ecf20Sopenharmony_ci struct ttm_bo_device bdev; 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci struct vmw_fifo_state fifo; 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci struct drm_device *dev; 5008c2ecf20Sopenharmony_ci struct drm_vma_offset_manager vma_manager; 5018c2ecf20Sopenharmony_ci unsigned long vmw_chipset; 5028c2ecf20Sopenharmony_ci unsigned int io_start; 5038c2ecf20Sopenharmony_ci uint32_t vram_start; 5048c2ecf20Sopenharmony_ci uint32_t vram_size; 5058c2ecf20Sopenharmony_ci uint32_t prim_bb_mem; 5068c2ecf20Sopenharmony_ci uint32_t mmio_start; 5078c2ecf20Sopenharmony_ci uint32_t mmio_size; 5088c2ecf20Sopenharmony_ci uint32_t fb_max_width; 5098c2ecf20Sopenharmony_ci uint32_t fb_max_height; 5108c2ecf20Sopenharmony_ci uint32_t texture_max_width; 5118c2ecf20Sopenharmony_ci uint32_t texture_max_height; 5128c2ecf20Sopenharmony_ci uint32_t stdu_max_width; 5138c2ecf20Sopenharmony_ci uint32_t stdu_max_height; 5148c2ecf20Sopenharmony_ci uint32_t initial_width; 5158c2ecf20Sopenharmony_ci uint32_t initial_height; 5168c2ecf20Sopenharmony_ci u32 *mmio_virt; 5178c2ecf20Sopenharmony_ci uint32_t capabilities; 5188c2ecf20Sopenharmony_ci uint32_t capabilities2; 5198c2ecf20Sopenharmony_ci uint32_t max_gmr_ids; 5208c2ecf20Sopenharmony_ci uint32_t max_gmr_pages; 5218c2ecf20Sopenharmony_ci uint32_t max_mob_pages; 5228c2ecf20Sopenharmony_ci uint32_t max_mob_size; 5238c2ecf20Sopenharmony_ci uint32_t memory_size; 5248c2ecf20Sopenharmony_ci bool has_gmr; 5258c2ecf20Sopenharmony_ci bool has_mob; 5268c2ecf20Sopenharmony_ci spinlock_t hw_lock; 5278c2ecf20Sopenharmony_ci spinlock_t cap_lock; 5288c2ecf20Sopenharmony_ci bool assume_16bpp; 5298c2ecf20Sopenharmony_ci 5308c2ecf20Sopenharmony_ci enum vmw_sm_type sm_type; 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci /* 5338c2ecf20Sopenharmony_ci * Framebuffer info. 5348c2ecf20Sopenharmony_ci */ 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci void *fb_info; 5378c2ecf20Sopenharmony_ci enum vmw_display_unit_type active_display_unit; 5388c2ecf20Sopenharmony_ci struct vmw_legacy_display *ldu_priv; 5398c2ecf20Sopenharmony_ci struct vmw_overlay *overlay_priv; 5408c2ecf20Sopenharmony_ci struct drm_property *hotplug_mode_update_property; 5418c2ecf20Sopenharmony_ci struct drm_property *implicit_placement_property; 5428c2ecf20Sopenharmony_ci struct mutex global_kms_state_mutex; 5438c2ecf20Sopenharmony_ci spinlock_t cursor_lock; 5448c2ecf20Sopenharmony_ci struct drm_atomic_state *suspend_state; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ci /* 5478c2ecf20Sopenharmony_ci * Context and surface management. 5488c2ecf20Sopenharmony_ci */ 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci spinlock_t resource_lock; 5518c2ecf20Sopenharmony_ci struct idr res_idr[vmw_res_max]; 5528c2ecf20Sopenharmony_ci 5538c2ecf20Sopenharmony_ci /* 5548c2ecf20Sopenharmony_ci * A resource manager for kernel-only surfaces and 5558c2ecf20Sopenharmony_ci * contexts. 5568c2ecf20Sopenharmony_ci */ 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci struct ttm_object_device *tdev; 5598c2ecf20Sopenharmony_ci 5608c2ecf20Sopenharmony_ci /* 5618c2ecf20Sopenharmony_ci * Fencing and IRQs. 5628c2ecf20Sopenharmony_ci */ 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci atomic_t marker_seq; 5658c2ecf20Sopenharmony_ci wait_queue_head_t fence_queue; 5668c2ecf20Sopenharmony_ci wait_queue_head_t fifo_queue; 5678c2ecf20Sopenharmony_ci spinlock_t waiter_lock; 5688c2ecf20Sopenharmony_ci int fence_queue_waiters; /* Protected by waiter_lock */ 5698c2ecf20Sopenharmony_ci int goal_queue_waiters; /* Protected by waiter_lock */ 5708c2ecf20Sopenharmony_ci int cmdbuf_waiters; /* Protected by waiter_lock */ 5718c2ecf20Sopenharmony_ci int error_waiters; /* Protected by waiter_lock */ 5728c2ecf20Sopenharmony_ci int fifo_queue_waiters; /* Protected by waiter_lock */ 5738c2ecf20Sopenharmony_ci uint32_t last_read_seqno; 5748c2ecf20Sopenharmony_ci struct vmw_fence_manager *fman; 5758c2ecf20Sopenharmony_ci uint32_t irq_mask; /* Updates protected by waiter_lock */ 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci /* 5788c2ecf20Sopenharmony_ci * Device state 5798c2ecf20Sopenharmony_ci */ 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci uint32_t traces_state; 5828c2ecf20Sopenharmony_ci uint32_t enable_state; 5838c2ecf20Sopenharmony_ci uint32_t config_done_state; 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci /** 5868c2ecf20Sopenharmony_ci * Execbuf 5878c2ecf20Sopenharmony_ci */ 5888c2ecf20Sopenharmony_ci /** 5898c2ecf20Sopenharmony_ci * Protected by the cmdbuf mutex. 5908c2ecf20Sopenharmony_ci */ 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci struct vmw_sw_context ctx; 5938c2ecf20Sopenharmony_ci struct mutex cmdbuf_mutex; 5948c2ecf20Sopenharmony_ci struct mutex binding_mutex; 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_ci /** 5978c2ecf20Sopenharmony_ci * Operating mode. 5988c2ecf20Sopenharmony_ci */ 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_ci bool stealth; 6018c2ecf20Sopenharmony_ci bool enable_fb; 6028c2ecf20Sopenharmony_ci spinlock_t svga_lock; 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_ci /** 6058c2ecf20Sopenharmony_ci * PM management. 6068c2ecf20Sopenharmony_ci */ 6078c2ecf20Sopenharmony_ci struct notifier_block pm_nb; 6088c2ecf20Sopenharmony_ci bool refuse_hibernation; 6098c2ecf20Sopenharmony_ci bool suspend_locked; 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_ci struct mutex release_mutex; 6128c2ecf20Sopenharmony_ci atomic_t num_fifo_resources; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci /* 6158c2ecf20Sopenharmony_ci * Replace this with an rwsem as soon as we have down_xx_interruptible() 6168c2ecf20Sopenharmony_ci */ 6178c2ecf20Sopenharmony_ci struct ttm_lock reservation_sem; 6188c2ecf20Sopenharmony_ci 6198c2ecf20Sopenharmony_ci /* 6208c2ecf20Sopenharmony_ci * Query processing. These members 6218c2ecf20Sopenharmony_ci * are protected by the cmdbuf mutex. 6228c2ecf20Sopenharmony_ci */ 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_ci struct vmw_buffer_object *dummy_query_bo; 6258c2ecf20Sopenharmony_ci struct vmw_buffer_object *pinned_bo; 6268c2ecf20Sopenharmony_ci uint32_t query_cid; 6278c2ecf20Sopenharmony_ci uint32_t query_cid_valid; 6288c2ecf20Sopenharmony_ci bool dummy_query_bo_pinned; 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_ci /* 6318c2ecf20Sopenharmony_ci * Surface swapping. The "surface_lru" list is protected by the 6328c2ecf20Sopenharmony_ci * resource lock in order to be able to destroy a surface and take 6338c2ecf20Sopenharmony_ci * it off the lru atomically. "used_memory_size" is currently 6348c2ecf20Sopenharmony_ci * protected by the cmdbuf mutex for simplicity. 6358c2ecf20Sopenharmony_ci */ 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ci struct list_head res_lru[vmw_res_max]; 6388c2ecf20Sopenharmony_ci uint32_t used_memory_size; 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_ci /* 6418c2ecf20Sopenharmony_ci * DMA mapping stuff. 6428c2ecf20Sopenharmony_ci */ 6438c2ecf20Sopenharmony_ci enum vmw_dma_map_mode map_mode; 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci /* 6468c2ecf20Sopenharmony_ci * Guest Backed stuff 6478c2ecf20Sopenharmony_ci */ 6488c2ecf20Sopenharmony_ci struct vmw_otable_batch otable_batch; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci struct vmw_cmdbuf_man *cman; 6518c2ecf20Sopenharmony_ci DECLARE_BITMAP(irqthread_pending, VMW_IRQTHREAD_MAX); 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci /* Validation memory reservation */ 6548c2ecf20Sopenharmony_ci struct vmw_validation_mem vvm; 6558c2ecf20Sopenharmony_ci}; 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_cistatic inline struct vmw_surface *vmw_res_to_srf(struct vmw_resource *res) 6588c2ecf20Sopenharmony_ci{ 6598c2ecf20Sopenharmony_ci return container_of(res, struct vmw_surface, res); 6608c2ecf20Sopenharmony_ci} 6618c2ecf20Sopenharmony_ci 6628c2ecf20Sopenharmony_cistatic inline struct vmw_private *vmw_priv(struct drm_device *dev) 6638c2ecf20Sopenharmony_ci{ 6648c2ecf20Sopenharmony_ci return (struct vmw_private *)dev->dev_private; 6658c2ecf20Sopenharmony_ci} 6668c2ecf20Sopenharmony_ci 6678c2ecf20Sopenharmony_cistatic inline struct vmw_fpriv *vmw_fpriv(struct drm_file *file_priv) 6688c2ecf20Sopenharmony_ci{ 6698c2ecf20Sopenharmony_ci return (struct vmw_fpriv *)file_priv->driver_priv; 6708c2ecf20Sopenharmony_ci} 6718c2ecf20Sopenharmony_ci 6728c2ecf20Sopenharmony_ci/* 6738c2ecf20Sopenharmony_ci * The locking here is fine-grained, so that it is performed once 6748c2ecf20Sopenharmony_ci * for every read- and write operation. This is of course costly, but we 6758c2ecf20Sopenharmony_ci * don't perform much register access in the timing critical paths anyway. 6768c2ecf20Sopenharmony_ci * Instead we have the extra benefit of being sure that we don't forget 6778c2ecf20Sopenharmony_ci * the hw lock around register accesses. 6788c2ecf20Sopenharmony_ci */ 6798c2ecf20Sopenharmony_cistatic inline void vmw_write(struct vmw_private *dev_priv, 6808c2ecf20Sopenharmony_ci unsigned int offset, uint32_t value) 6818c2ecf20Sopenharmony_ci{ 6828c2ecf20Sopenharmony_ci spin_lock(&dev_priv->hw_lock); 6838c2ecf20Sopenharmony_ci outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 6848c2ecf20Sopenharmony_ci outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); 6858c2ecf20Sopenharmony_ci spin_unlock(&dev_priv->hw_lock); 6868c2ecf20Sopenharmony_ci} 6878c2ecf20Sopenharmony_ci 6888c2ecf20Sopenharmony_cistatic inline uint32_t vmw_read(struct vmw_private *dev_priv, 6898c2ecf20Sopenharmony_ci unsigned int offset) 6908c2ecf20Sopenharmony_ci{ 6918c2ecf20Sopenharmony_ci u32 val; 6928c2ecf20Sopenharmony_ci 6938c2ecf20Sopenharmony_ci spin_lock(&dev_priv->hw_lock); 6948c2ecf20Sopenharmony_ci outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 6958c2ecf20Sopenharmony_ci val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); 6968c2ecf20Sopenharmony_ci spin_unlock(&dev_priv->hw_lock); 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_ci return val; 6998c2ecf20Sopenharmony_ci} 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci/** 7028c2ecf20Sopenharmony_ci * has_sm4_context - Does the device support SM4 context. 7038c2ecf20Sopenharmony_ci * @dev_priv: Device private. 7048c2ecf20Sopenharmony_ci * 7058c2ecf20Sopenharmony_ci * Return: Bool value if device support SM4 context or not. 7068c2ecf20Sopenharmony_ci */ 7078c2ecf20Sopenharmony_cistatic inline bool has_sm4_context(const struct vmw_private *dev_priv) 7088c2ecf20Sopenharmony_ci{ 7098c2ecf20Sopenharmony_ci return (dev_priv->sm_type >= VMW_SM_4); 7108c2ecf20Sopenharmony_ci} 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci/** 7138c2ecf20Sopenharmony_ci * has_sm4_1_context - Does the device support SM4_1 context. 7148c2ecf20Sopenharmony_ci * @dev_priv: Device private. 7158c2ecf20Sopenharmony_ci * 7168c2ecf20Sopenharmony_ci * Return: Bool value if device support SM4_1 context or not. 7178c2ecf20Sopenharmony_ci */ 7188c2ecf20Sopenharmony_cistatic inline bool has_sm4_1_context(const struct vmw_private *dev_priv) 7198c2ecf20Sopenharmony_ci{ 7208c2ecf20Sopenharmony_ci return (dev_priv->sm_type >= VMW_SM_4_1); 7218c2ecf20Sopenharmony_ci} 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci/** 7248c2ecf20Sopenharmony_ci * has_sm5_context - Does the device support SM5 context. 7258c2ecf20Sopenharmony_ci * @dev_priv: Device private. 7268c2ecf20Sopenharmony_ci * 7278c2ecf20Sopenharmony_ci * Return: Bool value if device support SM5 context or not. 7288c2ecf20Sopenharmony_ci */ 7298c2ecf20Sopenharmony_cistatic inline bool has_sm5_context(const struct vmw_private *dev_priv) 7308c2ecf20Sopenharmony_ci{ 7318c2ecf20Sopenharmony_ci return (dev_priv->sm_type >= VMW_SM_5); 7328c2ecf20Sopenharmony_ci} 7338c2ecf20Sopenharmony_ci 7348c2ecf20Sopenharmony_ciextern void vmw_svga_enable(struct vmw_private *dev_priv); 7358c2ecf20Sopenharmony_ciextern void vmw_svga_disable(struct vmw_private *dev_priv); 7368c2ecf20Sopenharmony_ci 7378c2ecf20Sopenharmony_ci 7388c2ecf20Sopenharmony_ci/** 7398c2ecf20Sopenharmony_ci * GMR utilities - vmwgfx_gmr.c 7408c2ecf20Sopenharmony_ci */ 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ciextern int vmw_gmr_bind(struct vmw_private *dev_priv, 7438c2ecf20Sopenharmony_ci const struct vmw_sg_table *vsgt, 7448c2ecf20Sopenharmony_ci unsigned long num_pages, 7458c2ecf20Sopenharmony_ci int gmr_id); 7468c2ecf20Sopenharmony_ciextern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id); 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci/** 7498c2ecf20Sopenharmony_ci * Resource utilities - vmwgfx_resource.c 7508c2ecf20Sopenharmony_ci */ 7518c2ecf20Sopenharmony_cistruct vmw_user_resource_conv; 7528c2ecf20Sopenharmony_ci 7538c2ecf20Sopenharmony_ciextern void vmw_resource_unreference(struct vmw_resource **p_res); 7548c2ecf20Sopenharmony_ciextern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res); 7558c2ecf20Sopenharmony_ciextern struct vmw_resource * 7568c2ecf20Sopenharmony_civmw_resource_reference_unless_doomed(struct vmw_resource *res); 7578c2ecf20Sopenharmony_ciextern int vmw_resource_validate(struct vmw_resource *res, bool intr, 7588c2ecf20Sopenharmony_ci bool dirtying); 7598c2ecf20Sopenharmony_ciextern int vmw_resource_reserve(struct vmw_resource *res, bool interruptible, 7608c2ecf20Sopenharmony_ci bool no_backup); 7618c2ecf20Sopenharmony_ciextern bool vmw_resource_needs_backup(const struct vmw_resource *res); 7628c2ecf20Sopenharmony_ciextern int vmw_user_lookup_handle(struct vmw_private *dev_priv, 7638c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 7648c2ecf20Sopenharmony_ci uint32_t handle, 7658c2ecf20Sopenharmony_ci struct vmw_surface **out_surf, 7668c2ecf20Sopenharmony_ci struct vmw_buffer_object **out_buf); 7678c2ecf20Sopenharmony_ciextern int vmw_user_resource_lookup_handle( 7688c2ecf20Sopenharmony_ci struct vmw_private *dev_priv, 7698c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 7708c2ecf20Sopenharmony_ci uint32_t handle, 7718c2ecf20Sopenharmony_ci const struct vmw_user_resource_conv *converter, 7728c2ecf20Sopenharmony_ci struct vmw_resource **p_res); 7738c2ecf20Sopenharmony_ciextern struct vmw_resource * 7748c2ecf20Sopenharmony_civmw_user_resource_noref_lookup_handle(struct vmw_private *dev_priv, 7758c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 7768c2ecf20Sopenharmony_ci uint32_t handle, 7778c2ecf20Sopenharmony_ci const struct vmw_user_resource_conv * 7788c2ecf20Sopenharmony_ci converter); 7798c2ecf20Sopenharmony_ciextern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, 7808c2ecf20Sopenharmony_ci struct drm_file *file_priv); 7818c2ecf20Sopenharmony_ciextern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, 7828c2ecf20Sopenharmony_ci struct drm_file *file_priv); 7838c2ecf20Sopenharmony_ciextern int vmw_user_stream_lookup(struct vmw_private *dev_priv, 7848c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 7858c2ecf20Sopenharmony_ci uint32_t *inout_id, 7868c2ecf20Sopenharmony_ci struct vmw_resource **out); 7878c2ecf20Sopenharmony_ciextern void vmw_resource_unreserve(struct vmw_resource *res, 7888c2ecf20Sopenharmony_ci bool dirty_set, 7898c2ecf20Sopenharmony_ci bool dirty, 7908c2ecf20Sopenharmony_ci bool switch_backup, 7918c2ecf20Sopenharmony_ci struct vmw_buffer_object *new_backup, 7928c2ecf20Sopenharmony_ci unsigned long new_backup_offset); 7938c2ecf20Sopenharmony_ciextern void vmw_query_move_notify(struct ttm_buffer_object *bo, 7948c2ecf20Sopenharmony_ci struct ttm_resource *mem); 7958c2ecf20Sopenharmony_ciextern int vmw_query_readback_all(struct vmw_buffer_object *dx_query_mob); 7968c2ecf20Sopenharmony_ciextern void vmw_resource_evict_all(struct vmw_private *dev_priv); 7978c2ecf20Sopenharmony_ciextern void vmw_resource_unbind_list(struct vmw_buffer_object *vbo); 7988c2ecf20Sopenharmony_civoid vmw_resource_mob_attach(struct vmw_resource *res); 7998c2ecf20Sopenharmony_civoid vmw_resource_mob_detach(struct vmw_resource *res); 8008c2ecf20Sopenharmony_civoid vmw_resource_dirty_update(struct vmw_resource *res, pgoff_t start, 8018c2ecf20Sopenharmony_ci pgoff_t end); 8028c2ecf20Sopenharmony_ciint vmw_resources_clean(struct vmw_buffer_object *vbo, pgoff_t start, 8038c2ecf20Sopenharmony_ci pgoff_t end, pgoff_t *num_prefault); 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_ci/** 8068c2ecf20Sopenharmony_ci * vmw_resource_mob_attached - Whether a resource currently has a mob attached 8078c2ecf20Sopenharmony_ci * @res: The resource 8088c2ecf20Sopenharmony_ci * 8098c2ecf20Sopenharmony_ci * Return: true if the resource has a mob attached, false otherwise. 8108c2ecf20Sopenharmony_ci */ 8118c2ecf20Sopenharmony_cistatic inline bool vmw_resource_mob_attached(const struct vmw_resource *res) 8128c2ecf20Sopenharmony_ci{ 8138c2ecf20Sopenharmony_ci return !RB_EMPTY_NODE(&res->mob_node); 8148c2ecf20Sopenharmony_ci} 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci/** 8178c2ecf20Sopenharmony_ci * vmw_user_resource_noref_release - release a user resource pointer looked up 8188c2ecf20Sopenharmony_ci * without reference 8198c2ecf20Sopenharmony_ci */ 8208c2ecf20Sopenharmony_cistatic inline void vmw_user_resource_noref_release(void) 8218c2ecf20Sopenharmony_ci{ 8228c2ecf20Sopenharmony_ci ttm_base_object_noref_release(); 8238c2ecf20Sopenharmony_ci} 8248c2ecf20Sopenharmony_ci 8258c2ecf20Sopenharmony_ci/** 8268c2ecf20Sopenharmony_ci * Buffer object helper functions - vmwgfx_bo.c 8278c2ecf20Sopenharmony_ci */ 8288c2ecf20Sopenharmony_ciextern int vmw_bo_pin_in_placement(struct vmw_private *vmw_priv, 8298c2ecf20Sopenharmony_ci struct vmw_buffer_object *bo, 8308c2ecf20Sopenharmony_ci struct ttm_placement *placement, 8318c2ecf20Sopenharmony_ci bool interruptible); 8328c2ecf20Sopenharmony_ciextern int vmw_bo_pin_in_vram(struct vmw_private *dev_priv, 8338c2ecf20Sopenharmony_ci struct vmw_buffer_object *buf, 8348c2ecf20Sopenharmony_ci bool interruptible); 8358c2ecf20Sopenharmony_ciextern int vmw_bo_pin_in_vram_or_gmr(struct vmw_private *dev_priv, 8368c2ecf20Sopenharmony_ci struct vmw_buffer_object *buf, 8378c2ecf20Sopenharmony_ci bool interruptible); 8388c2ecf20Sopenharmony_ciextern int vmw_bo_pin_in_start_of_vram(struct vmw_private *vmw_priv, 8398c2ecf20Sopenharmony_ci struct vmw_buffer_object *bo, 8408c2ecf20Sopenharmony_ci bool interruptible); 8418c2ecf20Sopenharmony_ciextern int vmw_bo_unpin(struct vmw_private *vmw_priv, 8428c2ecf20Sopenharmony_ci struct vmw_buffer_object *bo, 8438c2ecf20Sopenharmony_ci bool interruptible); 8448c2ecf20Sopenharmony_ciextern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf, 8458c2ecf20Sopenharmony_ci SVGAGuestPtr *ptr); 8468c2ecf20Sopenharmony_ciextern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin); 8478c2ecf20Sopenharmony_ciextern void vmw_bo_bo_free(struct ttm_buffer_object *bo); 8488c2ecf20Sopenharmony_ciextern int vmw_bo_init(struct vmw_private *dev_priv, 8498c2ecf20Sopenharmony_ci struct vmw_buffer_object *vmw_bo, 8508c2ecf20Sopenharmony_ci size_t size, struct ttm_placement *placement, 8518c2ecf20Sopenharmony_ci bool interruptible, 8528c2ecf20Sopenharmony_ci void (*bo_free)(struct ttm_buffer_object *bo)); 8538c2ecf20Sopenharmony_ciextern int vmw_user_bo_verify_access(struct ttm_buffer_object *bo, 8548c2ecf20Sopenharmony_ci struct ttm_object_file *tfile); 8558c2ecf20Sopenharmony_ciextern int vmw_user_bo_alloc(struct vmw_private *dev_priv, 8568c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 8578c2ecf20Sopenharmony_ci uint32_t size, 8588c2ecf20Sopenharmony_ci bool shareable, 8598c2ecf20Sopenharmony_ci uint32_t *handle, 8608c2ecf20Sopenharmony_ci struct vmw_buffer_object **p_dma_buf, 8618c2ecf20Sopenharmony_ci struct ttm_base_object **p_base); 8628c2ecf20Sopenharmony_ciextern int vmw_user_bo_reference(struct ttm_object_file *tfile, 8638c2ecf20Sopenharmony_ci struct vmw_buffer_object *dma_buf, 8648c2ecf20Sopenharmony_ci uint32_t *handle); 8658c2ecf20Sopenharmony_ciextern int vmw_bo_alloc_ioctl(struct drm_device *dev, void *data, 8668c2ecf20Sopenharmony_ci struct drm_file *file_priv); 8678c2ecf20Sopenharmony_ciextern int vmw_bo_unref_ioctl(struct drm_device *dev, void *data, 8688c2ecf20Sopenharmony_ci struct drm_file *file_priv); 8698c2ecf20Sopenharmony_ciextern int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data, 8708c2ecf20Sopenharmony_ci struct drm_file *file_priv); 8718c2ecf20Sopenharmony_ciextern int vmw_user_bo_lookup(struct ttm_object_file *tfile, 8728c2ecf20Sopenharmony_ci uint32_t id, struct vmw_buffer_object **out, 8738c2ecf20Sopenharmony_ci struct ttm_base_object **base); 8748c2ecf20Sopenharmony_ciextern void vmw_bo_fence_single(struct ttm_buffer_object *bo, 8758c2ecf20Sopenharmony_ci struct vmw_fence_obj *fence); 8768c2ecf20Sopenharmony_ciextern void *vmw_bo_map_and_cache(struct vmw_buffer_object *vbo); 8778c2ecf20Sopenharmony_ciextern void vmw_bo_unmap(struct vmw_buffer_object *vbo); 8788c2ecf20Sopenharmony_ciextern void vmw_bo_move_notify(struct ttm_buffer_object *bo, 8798c2ecf20Sopenharmony_ci struct ttm_resource *mem); 8808c2ecf20Sopenharmony_ciextern void vmw_bo_swap_notify(struct ttm_buffer_object *bo); 8818c2ecf20Sopenharmony_ciextern struct vmw_buffer_object * 8828c2ecf20Sopenharmony_civmw_user_bo_noref_lookup(struct ttm_object_file *tfile, u32 handle); 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_ci/** 8858c2ecf20Sopenharmony_ci * vmw_user_bo_noref_release - release a buffer object pointer looked up 8868c2ecf20Sopenharmony_ci * without reference 8878c2ecf20Sopenharmony_ci */ 8888c2ecf20Sopenharmony_cistatic inline void vmw_user_bo_noref_release(void) 8898c2ecf20Sopenharmony_ci{ 8908c2ecf20Sopenharmony_ci ttm_base_object_noref_release(); 8918c2ecf20Sopenharmony_ci} 8928c2ecf20Sopenharmony_ci 8938c2ecf20Sopenharmony_ci/** 8948c2ecf20Sopenharmony_ci * vmw_bo_adjust_prio - Adjust the buffer object eviction priority 8958c2ecf20Sopenharmony_ci * according to attached resources 8968c2ecf20Sopenharmony_ci * @vbo: The struct vmw_buffer_object 8978c2ecf20Sopenharmony_ci */ 8988c2ecf20Sopenharmony_cistatic inline void vmw_bo_prio_adjust(struct vmw_buffer_object *vbo) 8998c2ecf20Sopenharmony_ci{ 9008c2ecf20Sopenharmony_ci int i = ARRAY_SIZE(vbo->res_prios); 9018c2ecf20Sopenharmony_ci 9028c2ecf20Sopenharmony_ci while (i--) { 9038c2ecf20Sopenharmony_ci if (vbo->res_prios[i]) { 9048c2ecf20Sopenharmony_ci vbo->base.priority = i; 9058c2ecf20Sopenharmony_ci return; 9068c2ecf20Sopenharmony_ci } 9078c2ecf20Sopenharmony_ci } 9088c2ecf20Sopenharmony_ci 9098c2ecf20Sopenharmony_ci vbo->base.priority = 3; 9108c2ecf20Sopenharmony_ci} 9118c2ecf20Sopenharmony_ci 9128c2ecf20Sopenharmony_ci/** 9138c2ecf20Sopenharmony_ci * vmw_bo_prio_add - Notify a buffer object of a newly attached resource 9148c2ecf20Sopenharmony_ci * eviction priority 9158c2ecf20Sopenharmony_ci * @vbo: The struct vmw_buffer_object 9168c2ecf20Sopenharmony_ci * @prio: The resource priority 9178c2ecf20Sopenharmony_ci * 9188c2ecf20Sopenharmony_ci * After being notified, the code assigns the highest resource eviction priority 9198c2ecf20Sopenharmony_ci * to the backing buffer object (mob). 9208c2ecf20Sopenharmony_ci */ 9218c2ecf20Sopenharmony_cistatic inline void vmw_bo_prio_add(struct vmw_buffer_object *vbo, int prio) 9228c2ecf20Sopenharmony_ci{ 9238c2ecf20Sopenharmony_ci if (vbo->res_prios[prio]++ == 0) 9248c2ecf20Sopenharmony_ci vmw_bo_prio_adjust(vbo); 9258c2ecf20Sopenharmony_ci} 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_ci/** 9288c2ecf20Sopenharmony_ci * vmw_bo_prio_del - Notify a buffer object of a resource with a certain 9298c2ecf20Sopenharmony_ci * priority being removed 9308c2ecf20Sopenharmony_ci * @vbo: The struct vmw_buffer_object 9318c2ecf20Sopenharmony_ci * @prio: The resource priority 9328c2ecf20Sopenharmony_ci * 9338c2ecf20Sopenharmony_ci * After being notified, the code assigns the highest resource eviction priority 9348c2ecf20Sopenharmony_ci * to the backing buffer object (mob). 9358c2ecf20Sopenharmony_ci */ 9368c2ecf20Sopenharmony_cistatic inline void vmw_bo_prio_del(struct vmw_buffer_object *vbo, int prio) 9378c2ecf20Sopenharmony_ci{ 9388c2ecf20Sopenharmony_ci if (--vbo->res_prios[prio] == 0) 9398c2ecf20Sopenharmony_ci vmw_bo_prio_adjust(vbo); 9408c2ecf20Sopenharmony_ci} 9418c2ecf20Sopenharmony_ci 9428c2ecf20Sopenharmony_ci/** 9438c2ecf20Sopenharmony_ci * Misc Ioctl functionality - vmwgfx_ioctl.c 9448c2ecf20Sopenharmony_ci */ 9458c2ecf20Sopenharmony_ci 9468c2ecf20Sopenharmony_ciextern int vmw_getparam_ioctl(struct drm_device *dev, void *data, 9478c2ecf20Sopenharmony_ci struct drm_file *file_priv); 9488c2ecf20Sopenharmony_ciextern int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, 9498c2ecf20Sopenharmony_ci struct drm_file *file_priv); 9508c2ecf20Sopenharmony_ciextern int vmw_present_ioctl(struct drm_device *dev, void *data, 9518c2ecf20Sopenharmony_ci struct drm_file *file_priv); 9528c2ecf20Sopenharmony_ciextern int vmw_present_readback_ioctl(struct drm_device *dev, void *data, 9538c2ecf20Sopenharmony_ci struct drm_file *file_priv); 9548c2ecf20Sopenharmony_ciextern __poll_t vmw_fops_poll(struct file *filp, 9558c2ecf20Sopenharmony_ci struct poll_table_struct *wait); 9568c2ecf20Sopenharmony_ciextern ssize_t vmw_fops_read(struct file *filp, char __user *buffer, 9578c2ecf20Sopenharmony_ci size_t count, loff_t *offset); 9588c2ecf20Sopenharmony_ci 9598c2ecf20Sopenharmony_ci/** 9608c2ecf20Sopenharmony_ci * Fifo utilities - vmwgfx_fifo.c 9618c2ecf20Sopenharmony_ci */ 9628c2ecf20Sopenharmony_ci 9638c2ecf20Sopenharmony_ciextern int vmw_fifo_init(struct vmw_private *dev_priv, 9648c2ecf20Sopenharmony_ci struct vmw_fifo_state *fifo); 9658c2ecf20Sopenharmony_ciextern void vmw_fifo_release(struct vmw_private *dev_priv, 9668c2ecf20Sopenharmony_ci struct vmw_fifo_state *fifo); 9678c2ecf20Sopenharmony_ciextern void * 9688c2ecf20Sopenharmony_civmw_fifo_reserve_dx(struct vmw_private *dev_priv, uint32_t bytes, int ctx_id); 9698c2ecf20Sopenharmony_ciextern void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes); 9708c2ecf20Sopenharmony_ciextern void vmw_fifo_commit_flush(struct vmw_private *dev_priv, uint32_t bytes); 9718c2ecf20Sopenharmony_ciextern int vmw_fifo_send_fence(struct vmw_private *dev_priv, 9728c2ecf20Sopenharmony_ci uint32_t *seqno); 9738c2ecf20Sopenharmony_ciextern void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason); 9748c2ecf20Sopenharmony_ciextern bool vmw_fifo_have_3d(struct vmw_private *dev_priv); 9758c2ecf20Sopenharmony_ciextern bool vmw_fifo_have_pitchlock(struct vmw_private *dev_priv); 9768c2ecf20Sopenharmony_ciextern int vmw_fifo_emit_dummy_query(struct vmw_private *dev_priv, 9778c2ecf20Sopenharmony_ci uint32_t cid); 9788c2ecf20Sopenharmony_ciextern int vmw_fifo_flush(struct vmw_private *dev_priv, 9798c2ecf20Sopenharmony_ci bool interruptible); 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_ci#define VMW_FIFO_RESERVE_DX(__priv, __bytes, __ctx_id) \ 9828c2ecf20Sopenharmony_ci({ \ 9838c2ecf20Sopenharmony_ci vmw_fifo_reserve_dx(__priv, __bytes, __ctx_id) ? : ({ \ 9848c2ecf20Sopenharmony_ci DRM_ERROR("FIFO reserve failed at %s for %u bytes\n", \ 9858c2ecf20Sopenharmony_ci __func__, (unsigned int) __bytes); \ 9868c2ecf20Sopenharmony_ci NULL; \ 9878c2ecf20Sopenharmony_ci }); \ 9888c2ecf20Sopenharmony_ci}) 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci#define VMW_FIFO_RESERVE(__priv, __bytes) \ 9918c2ecf20Sopenharmony_ci VMW_FIFO_RESERVE_DX(__priv, __bytes, SVGA3D_INVALID_ID) 9928c2ecf20Sopenharmony_ci 9938c2ecf20Sopenharmony_ci/** 9948c2ecf20Sopenharmony_ci * TTM glue - vmwgfx_ttm_glue.c 9958c2ecf20Sopenharmony_ci */ 9968c2ecf20Sopenharmony_ci 9978c2ecf20Sopenharmony_ciextern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ciextern void vmw_validation_mem_init_ttm(struct vmw_private *dev_priv, 10008c2ecf20Sopenharmony_ci size_t gran); 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_ci/** 10038c2ecf20Sopenharmony_ci * TTM buffer object driver - vmwgfx_ttm_buffer.c 10048c2ecf20Sopenharmony_ci */ 10058c2ecf20Sopenharmony_ci 10068c2ecf20Sopenharmony_ciextern const size_t vmw_tt_size; 10078c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_vram_placement; 10088c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_vram_ne_placement; 10098c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_vram_sys_placement; 10108c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_vram_gmr_placement; 10118c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_vram_gmr_ne_placement; 10128c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_sys_placement; 10138c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_sys_ne_placement; 10148c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_evictable_placement; 10158c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_srf_placement; 10168c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_mob_placement; 10178c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_mob_ne_placement; 10188c2ecf20Sopenharmony_ciextern struct ttm_placement vmw_nonfixed_placement; 10198c2ecf20Sopenharmony_ciextern struct ttm_bo_driver vmw_bo_driver; 10208c2ecf20Sopenharmony_ciextern const struct vmw_sg_table * 10218c2ecf20Sopenharmony_civmw_bo_sg_table(struct ttm_buffer_object *bo); 10228c2ecf20Sopenharmony_ciextern int vmw_bo_create_and_populate(struct vmw_private *dev_priv, 10238c2ecf20Sopenharmony_ci unsigned long bo_size, 10248c2ecf20Sopenharmony_ci struct ttm_buffer_object **bo_p); 10258c2ecf20Sopenharmony_ci 10268c2ecf20Sopenharmony_ciextern void vmw_piter_start(struct vmw_piter *viter, 10278c2ecf20Sopenharmony_ci const struct vmw_sg_table *vsgt, 10288c2ecf20Sopenharmony_ci unsigned long p_offs); 10298c2ecf20Sopenharmony_ci 10308c2ecf20Sopenharmony_ci/** 10318c2ecf20Sopenharmony_ci * vmw_piter_next - Advance the iterator one page. 10328c2ecf20Sopenharmony_ci * 10338c2ecf20Sopenharmony_ci * @viter: Pointer to the iterator to advance. 10348c2ecf20Sopenharmony_ci * 10358c2ecf20Sopenharmony_ci * Returns false if past the list of pages, true otherwise. 10368c2ecf20Sopenharmony_ci */ 10378c2ecf20Sopenharmony_cistatic inline bool vmw_piter_next(struct vmw_piter *viter) 10388c2ecf20Sopenharmony_ci{ 10398c2ecf20Sopenharmony_ci return viter->next(viter); 10408c2ecf20Sopenharmony_ci} 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_ci/** 10438c2ecf20Sopenharmony_ci * vmw_piter_dma_addr - Return the DMA address of the current page. 10448c2ecf20Sopenharmony_ci * 10458c2ecf20Sopenharmony_ci * @viter: Pointer to the iterator 10468c2ecf20Sopenharmony_ci * 10478c2ecf20Sopenharmony_ci * Returns the DMA address of the page pointed to by @viter. 10488c2ecf20Sopenharmony_ci */ 10498c2ecf20Sopenharmony_cistatic inline dma_addr_t vmw_piter_dma_addr(struct vmw_piter *viter) 10508c2ecf20Sopenharmony_ci{ 10518c2ecf20Sopenharmony_ci return viter->dma_address(viter); 10528c2ecf20Sopenharmony_ci} 10538c2ecf20Sopenharmony_ci 10548c2ecf20Sopenharmony_ci/** 10558c2ecf20Sopenharmony_ci * vmw_piter_page - Return a pointer to the current page. 10568c2ecf20Sopenharmony_ci * 10578c2ecf20Sopenharmony_ci * @viter: Pointer to the iterator 10588c2ecf20Sopenharmony_ci * 10598c2ecf20Sopenharmony_ci * Returns the DMA address of the page pointed to by @viter. 10608c2ecf20Sopenharmony_ci */ 10618c2ecf20Sopenharmony_cistatic inline struct page *vmw_piter_page(struct vmw_piter *viter) 10628c2ecf20Sopenharmony_ci{ 10638c2ecf20Sopenharmony_ci return viter->page(viter); 10648c2ecf20Sopenharmony_ci} 10658c2ecf20Sopenharmony_ci 10668c2ecf20Sopenharmony_ci/** 10678c2ecf20Sopenharmony_ci * Command submission - vmwgfx_execbuf.c 10688c2ecf20Sopenharmony_ci */ 10698c2ecf20Sopenharmony_ci 10708c2ecf20Sopenharmony_ciextern int vmw_execbuf_ioctl(struct drm_device *dev, void *data, 10718c2ecf20Sopenharmony_ci struct drm_file *file_priv); 10728c2ecf20Sopenharmony_ciextern int vmw_execbuf_process(struct drm_file *file_priv, 10738c2ecf20Sopenharmony_ci struct vmw_private *dev_priv, 10748c2ecf20Sopenharmony_ci void __user *user_commands, 10758c2ecf20Sopenharmony_ci void *kernel_commands, 10768c2ecf20Sopenharmony_ci uint32_t command_size, 10778c2ecf20Sopenharmony_ci uint64_t throttle_us, 10788c2ecf20Sopenharmony_ci uint32_t dx_context_handle, 10798c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user 10808c2ecf20Sopenharmony_ci *user_fence_rep, 10818c2ecf20Sopenharmony_ci struct vmw_fence_obj **out_fence, 10828c2ecf20Sopenharmony_ci uint32_t flags); 10838c2ecf20Sopenharmony_ciextern void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv, 10848c2ecf20Sopenharmony_ci struct vmw_fence_obj *fence); 10858c2ecf20Sopenharmony_ciextern void vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv); 10868c2ecf20Sopenharmony_ci 10878c2ecf20Sopenharmony_ciextern int vmw_execbuf_fence_commands(struct drm_file *file_priv, 10888c2ecf20Sopenharmony_ci struct vmw_private *dev_priv, 10898c2ecf20Sopenharmony_ci struct vmw_fence_obj **p_fence, 10908c2ecf20Sopenharmony_ci uint32_t *p_handle); 10918c2ecf20Sopenharmony_ciextern int vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv, 10928c2ecf20Sopenharmony_ci struct vmw_fpriv *vmw_fp, 10938c2ecf20Sopenharmony_ci int ret, 10948c2ecf20Sopenharmony_ci struct drm_vmw_fence_rep __user 10958c2ecf20Sopenharmony_ci *user_fence_rep, 10968c2ecf20Sopenharmony_ci struct vmw_fence_obj *fence, 10978c2ecf20Sopenharmony_ci uint32_t fence_handle, 10988c2ecf20Sopenharmony_ci int32_t out_fence_fd); 10998c2ecf20Sopenharmony_cibool vmw_cmd_describe(const void *buf, u32 *size, char const **cmd); 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ci/** 11028c2ecf20Sopenharmony_ci * IRQs and wating - vmwgfx_irq.c 11038c2ecf20Sopenharmony_ci */ 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ciextern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy, 11068c2ecf20Sopenharmony_ci uint32_t seqno, bool interruptible, 11078c2ecf20Sopenharmony_ci unsigned long timeout); 11088c2ecf20Sopenharmony_ciextern int vmw_irq_install(struct drm_device *dev, int irq); 11098c2ecf20Sopenharmony_ciextern void vmw_irq_uninstall(struct drm_device *dev); 11108c2ecf20Sopenharmony_ciextern bool vmw_seqno_passed(struct vmw_private *dev_priv, 11118c2ecf20Sopenharmony_ci uint32_t seqno); 11128c2ecf20Sopenharmony_ciextern int vmw_fallback_wait(struct vmw_private *dev_priv, 11138c2ecf20Sopenharmony_ci bool lazy, 11148c2ecf20Sopenharmony_ci bool fifo_idle, 11158c2ecf20Sopenharmony_ci uint32_t seqno, 11168c2ecf20Sopenharmony_ci bool interruptible, 11178c2ecf20Sopenharmony_ci unsigned long timeout); 11188c2ecf20Sopenharmony_ciextern void vmw_update_seqno(struct vmw_private *dev_priv, 11198c2ecf20Sopenharmony_ci struct vmw_fifo_state *fifo_state); 11208c2ecf20Sopenharmony_ciextern void vmw_seqno_waiter_add(struct vmw_private *dev_priv); 11218c2ecf20Sopenharmony_ciextern void vmw_seqno_waiter_remove(struct vmw_private *dev_priv); 11228c2ecf20Sopenharmony_ciextern void vmw_goal_waiter_add(struct vmw_private *dev_priv); 11238c2ecf20Sopenharmony_ciextern void vmw_goal_waiter_remove(struct vmw_private *dev_priv); 11248c2ecf20Sopenharmony_ciextern void vmw_generic_waiter_add(struct vmw_private *dev_priv, u32 flag, 11258c2ecf20Sopenharmony_ci int *waiter_count); 11268c2ecf20Sopenharmony_ciextern void vmw_generic_waiter_remove(struct vmw_private *dev_priv, 11278c2ecf20Sopenharmony_ci u32 flag, int *waiter_count); 11288c2ecf20Sopenharmony_ci 11298c2ecf20Sopenharmony_ci/** 11308c2ecf20Sopenharmony_ci * Rudimentary fence-like objects currently used only for throttling - 11318c2ecf20Sopenharmony_ci * vmwgfx_marker.c 11328c2ecf20Sopenharmony_ci */ 11338c2ecf20Sopenharmony_ci 11348c2ecf20Sopenharmony_ciextern void vmw_marker_queue_init(struct vmw_marker_queue *queue); 11358c2ecf20Sopenharmony_ciextern void vmw_marker_queue_takedown(struct vmw_marker_queue *queue); 11368c2ecf20Sopenharmony_ciextern int vmw_marker_push(struct vmw_marker_queue *queue, 11378c2ecf20Sopenharmony_ci uint32_t seqno); 11388c2ecf20Sopenharmony_ciextern int vmw_marker_pull(struct vmw_marker_queue *queue, 11398c2ecf20Sopenharmony_ci uint32_t signaled_seqno); 11408c2ecf20Sopenharmony_ciextern int vmw_wait_lag(struct vmw_private *dev_priv, 11418c2ecf20Sopenharmony_ci struct vmw_marker_queue *queue, uint32_t us); 11428c2ecf20Sopenharmony_ci 11438c2ecf20Sopenharmony_ci/** 11448c2ecf20Sopenharmony_ci * Kernel framebuffer - vmwgfx_fb.c 11458c2ecf20Sopenharmony_ci */ 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_ciint vmw_fb_init(struct vmw_private *vmw_priv); 11488c2ecf20Sopenharmony_ciint vmw_fb_close(struct vmw_private *dev_priv); 11498c2ecf20Sopenharmony_ciint vmw_fb_off(struct vmw_private *vmw_priv); 11508c2ecf20Sopenharmony_ciint vmw_fb_on(struct vmw_private *vmw_priv); 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci/** 11538c2ecf20Sopenharmony_ci * Kernel modesetting - vmwgfx_kms.c 11548c2ecf20Sopenharmony_ci */ 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ciint vmw_kms_init(struct vmw_private *dev_priv); 11578c2ecf20Sopenharmony_ciint vmw_kms_close(struct vmw_private *dev_priv); 11588c2ecf20Sopenharmony_ciint vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data, 11598c2ecf20Sopenharmony_ci struct drm_file *file_priv); 11608c2ecf20Sopenharmony_civoid vmw_kms_cursor_post_execbuf(struct vmw_private *dev_priv); 11618c2ecf20Sopenharmony_civoid vmw_kms_cursor_snoop(struct vmw_surface *srf, 11628c2ecf20Sopenharmony_ci struct ttm_object_file *tfile, 11638c2ecf20Sopenharmony_ci struct ttm_buffer_object *bo, 11648c2ecf20Sopenharmony_ci SVGA3dCmdHeader *header); 11658c2ecf20Sopenharmony_ciint vmw_kms_write_svga(struct vmw_private *vmw_priv, 11668c2ecf20Sopenharmony_ci unsigned width, unsigned height, unsigned pitch, 11678c2ecf20Sopenharmony_ci unsigned bpp, unsigned depth); 11688c2ecf20Sopenharmony_cibool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv, 11698c2ecf20Sopenharmony_ci uint32_t pitch, 11708c2ecf20Sopenharmony_ci uint32_t height); 11718c2ecf20Sopenharmony_ciu32 vmw_get_vblank_counter(struct drm_crtc *crtc); 11728c2ecf20Sopenharmony_ciint vmw_enable_vblank(struct drm_crtc *crtc); 11738c2ecf20Sopenharmony_civoid vmw_disable_vblank(struct drm_crtc *crtc); 11748c2ecf20Sopenharmony_ciint vmw_kms_present(struct vmw_private *dev_priv, 11758c2ecf20Sopenharmony_ci struct drm_file *file_priv, 11768c2ecf20Sopenharmony_ci struct vmw_framebuffer *vfb, 11778c2ecf20Sopenharmony_ci struct vmw_surface *surface, 11788c2ecf20Sopenharmony_ci uint32_t sid, int32_t destX, int32_t destY, 11798c2ecf20Sopenharmony_ci struct drm_vmw_rect *clips, 11808c2ecf20Sopenharmony_ci uint32_t num_clips); 11818c2ecf20Sopenharmony_ciint vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, 11828c2ecf20Sopenharmony_ci struct drm_file *file_priv); 11838c2ecf20Sopenharmony_civoid vmw_kms_legacy_hotspot_clear(struct vmw_private *dev_priv); 11848c2ecf20Sopenharmony_ciint vmw_kms_suspend(struct drm_device *dev); 11858c2ecf20Sopenharmony_ciint vmw_kms_resume(struct drm_device *dev); 11868c2ecf20Sopenharmony_civoid vmw_kms_lost_device(struct drm_device *dev); 11878c2ecf20Sopenharmony_ci 11888c2ecf20Sopenharmony_ciint vmw_dumb_create(struct drm_file *file_priv, 11898c2ecf20Sopenharmony_ci struct drm_device *dev, 11908c2ecf20Sopenharmony_ci struct drm_mode_create_dumb *args); 11918c2ecf20Sopenharmony_ci 11928c2ecf20Sopenharmony_ciint vmw_dumb_map_offset(struct drm_file *file_priv, 11938c2ecf20Sopenharmony_ci struct drm_device *dev, uint32_t handle, 11948c2ecf20Sopenharmony_ci uint64_t *offset); 11958c2ecf20Sopenharmony_ciint vmw_dumb_destroy(struct drm_file *file_priv, 11968c2ecf20Sopenharmony_ci struct drm_device *dev, 11978c2ecf20Sopenharmony_ci uint32_t handle); 11988c2ecf20Sopenharmony_ciextern int vmw_resource_pin(struct vmw_resource *res, bool interruptible); 11998c2ecf20Sopenharmony_ciextern void vmw_resource_unpin(struct vmw_resource *res); 12008c2ecf20Sopenharmony_ciextern enum vmw_res_type vmw_res_type(const struct vmw_resource *res); 12018c2ecf20Sopenharmony_ci 12028c2ecf20Sopenharmony_ci/** 12038c2ecf20Sopenharmony_ci * Overlay control - vmwgfx_overlay.c 12048c2ecf20Sopenharmony_ci */ 12058c2ecf20Sopenharmony_ci 12068c2ecf20Sopenharmony_ciint vmw_overlay_init(struct vmw_private *dev_priv); 12078c2ecf20Sopenharmony_ciint vmw_overlay_close(struct vmw_private *dev_priv); 12088c2ecf20Sopenharmony_ciint vmw_overlay_ioctl(struct drm_device *dev, void *data, 12098c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12108c2ecf20Sopenharmony_ciint vmw_overlay_resume_all(struct vmw_private *dev_priv); 12118c2ecf20Sopenharmony_ciint vmw_overlay_pause_all(struct vmw_private *dev_priv); 12128c2ecf20Sopenharmony_ciint vmw_overlay_claim(struct vmw_private *dev_priv, uint32_t *out); 12138c2ecf20Sopenharmony_ciint vmw_overlay_unref(struct vmw_private *dev_priv, uint32_t stream_id); 12148c2ecf20Sopenharmony_ciint vmw_overlay_num_overlays(struct vmw_private *dev_priv); 12158c2ecf20Sopenharmony_ciint vmw_overlay_num_free_overlays(struct vmw_private *dev_priv); 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci/** 12188c2ecf20Sopenharmony_ci * GMR Id manager 12198c2ecf20Sopenharmony_ci */ 12208c2ecf20Sopenharmony_ci 12218c2ecf20Sopenharmony_ciint vmw_gmrid_man_init(struct vmw_private *dev_priv, int type); 12228c2ecf20Sopenharmony_civoid vmw_gmrid_man_fini(struct vmw_private *dev_priv, int type); 12238c2ecf20Sopenharmony_ci 12248c2ecf20Sopenharmony_ci/** 12258c2ecf20Sopenharmony_ci * Prime - vmwgfx_prime.c 12268c2ecf20Sopenharmony_ci */ 12278c2ecf20Sopenharmony_ci 12288c2ecf20Sopenharmony_ciextern const struct dma_buf_ops vmw_prime_dmabuf_ops; 12298c2ecf20Sopenharmony_ciextern int vmw_prime_fd_to_handle(struct drm_device *dev, 12308c2ecf20Sopenharmony_ci struct drm_file *file_priv, 12318c2ecf20Sopenharmony_ci int fd, u32 *handle); 12328c2ecf20Sopenharmony_ciextern int vmw_prime_handle_to_fd(struct drm_device *dev, 12338c2ecf20Sopenharmony_ci struct drm_file *file_priv, 12348c2ecf20Sopenharmony_ci uint32_t handle, uint32_t flags, 12358c2ecf20Sopenharmony_ci int *prime_fd); 12368c2ecf20Sopenharmony_ci 12378c2ecf20Sopenharmony_ci/* 12388c2ecf20Sopenharmony_ci * MemoryOBject management - vmwgfx_mob.c 12398c2ecf20Sopenharmony_ci */ 12408c2ecf20Sopenharmony_cistruct vmw_mob; 12418c2ecf20Sopenharmony_ciextern int vmw_mob_bind(struct vmw_private *dev_priv, struct vmw_mob *mob, 12428c2ecf20Sopenharmony_ci const struct vmw_sg_table *vsgt, 12438c2ecf20Sopenharmony_ci unsigned long num_data_pages, int32_t mob_id); 12448c2ecf20Sopenharmony_ciextern void vmw_mob_unbind(struct vmw_private *dev_priv, 12458c2ecf20Sopenharmony_ci struct vmw_mob *mob); 12468c2ecf20Sopenharmony_ciextern void vmw_mob_destroy(struct vmw_mob *mob); 12478c2ecf20Sopenharmony_ciextern struct vmw_mob *vmw_mob_create(unsigned long data_pages); 12488c2ecf20Sopenharmony_ciextern int vmw_otables_setup(struct vmw_private *dev_priv); 12498c2ecf20Sopenharmony_ciextern void vmw_otables_takedown(struct vmw_private *dev_priv); 12508c2ecf20Sopenharmony_ci 12518c2ecf20Sopenharmony_ci/* 12528c2ecf20Sopenharmony_ci * Context management - vmwgfx_context.c 12538c2ecf20Sopenharmony_ci */ 12548c2ecf20Sopenharmony_ci 12558c2ecf20Sopenharmony_ciextern const struct vmw_user_resource_conv *user_context_converter; 12568c2ecf20Sopenharmony_ci 12578c2ecf20Sopenharmony_ciextern int vmw_context_define_ioctl(struct drm_device *dev, void *data, 12588c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12598c2ecf20Sopenharmony_ciextern int vmw_extended_context_define_ioctl(struct drm_device *dev, void *data, 12608c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12618c2ecf20Sopenharmony_ciextern int vmw_context_destroy_ioctl(struct drm_device *dev, void *data, 12628c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12638c2ecf20Sopenharmony_ciextern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx); 12648c2ecf20Sopenharmony_ciextern struct vmw_cmdbuf_res_manager * 12658c2ecf20Sopenharmony_civmw_context_res_man(struct vmw_resource *ctx); 12668c2ecf20Sopenharmony_ciextern struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx, 12678c2ecf20Sopenharmony_ci SVGACOTableType cotable_type); 12688c2ecf20Sopenharmony_ciextern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx); 12698c2ecf20Sopenharmony_cistruct vmw_ctx_binding_state; 12708c2ecf20Sopenharmony_ciextern struct vmw_ctx_binding_state * 12718c2ecf20Sopenharmony_civmw_context_binding_state(struct vmw_resource *ctx); 12728c2ecf20Sopenharmony_ciextern void vmw_dx_context_scrub_cotables(struct vmw_resource *ctx, 12738c2ecf20Sopenharmony_ci bool readback); 12748c2ecf20Sopenharmony_ciextern int vmw_context_bind_dx_query(struct vmw_resource *ctx_res, 12758c2ecf20Sopenharmony_ci struct vmw_buffer_object *mob); 12768c2ecf20Sopenharmony_ciextern struct vmw_buffer_object * 12778c2ecf20Sopenharmony_civmw_context_get_dx_query_mob(struct vmw_resource *ctx_res); 12788c2ecf20Sopenharmony_ci 12798c2ecf20Sopenharmony_ci 12808c2ecf20Sopenharmony_ci/* 12818c2ecf20Sopenharmony_ci * Surface management - vmwgfx_surface.c 12828c2ecf20Sopenharmony_ci */ 12838c2ecf20Sopenharmony_ci 12848c2ecf20Sopenharmony_ciextern const struct vmw_user_resource_conv *user_surface_converter; 12858c2ecf20Sopenharmony_ci 12868c2ecf20Sopenharmony_ciextern int vmw_surface_destroy_ioctl(struct drm_device *dev, void *data, 12878c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12888c2ecf20Sopenharmony_ciextern int vmw_surface_define_ioctl(struct drm_device *dev, void *data, 12898c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12908c2ecf20Sopenharmony_ciextern int vmw_surface_reference_ioctl(struct drm_device *dev, void *data, 12918c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12928c2ecf20Sopenharmony_ciextern int vmw_gb_surface_define_ioctl(struct drm_device *dev, void *data, 12938c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12948c2ecf20Sopenharmony_ciextern int vmw_gb_surface_reference_ioctl(struct drm_device *dev, void *data, 12958c2ecf20Sopenharmony_ci struct drm_file *file_priv); 12968c2ecf20Sopenharmony_ciint vmw_surface_gb_priv_define(struct drm_device *dev, 12978c2ecf20Sopenharmony_ci uint32_t user_accounting_size, 12988c2ecf20Sopenharmony_ci SVGA3dSurfaceAllFlags svga3d_flags, 12998c2ecf20Sopenharmony_ci SVGA3dSurfaceFormat format, 13008c2ecf20Sopenharmony_ci bool for_scanout, 13018c2ecf20Sopenharmony_ci uint32_t num_mip_levels, 13028c2ecf20Sopenharmony_ci uint32_t multisample_count, 13038c2ecf20Sopenharmony_ci uint32_t array_size, 13048c2ecf20Sopenharmony_ci struct drm_vmw_size size, 13058c2ecf20Sopenharmony_ci SVGA3dMSPattern multisample_pattern, 13068c2ecf20Sopenharmony_ci SVGA3dMSQualityLevel quality_level, 13078c2ecf20Sopenharmony_ci struct vmw_surface **srf_out); 13088c2ecf20Sopenharmony_ciextern int vmw_gb_surface_define_ext_ioctl(struct drm_device *dev, 13098c2ecf20Sopenharmony_ci void *data, 13108c2ecf20Sopenharmony_ci struct drm_file *file_priv); 13118c2ecf20Sopenharmony_ciextern int vmw_gb_surface_reference_ext_ioctl(struct drm_device *dev, 13128c2ecf20Sopenharmony_ci void *data, 13138c2ecf20Sopenharmony_ci struct drm_file *file_priv); 13148c2ecf20Sopenharmony_ci 13158c2ecf20Sopenharmony_ciint vmw_gb_surface_define(struct vmw_private *dev_priv, 13168c2ecf20Sopenharmony_ci uint32_t user_accounting_size, 13178c2ecf20Sopenharmony_ci const struct vmw_surface_metadata *req, 13188c2ecf20Sopenharmony_ci struct vmw_surface **srf_out); 13198c2ecf20Sopenharmony_ci 13208c2ecf20Sopenharmony_ci/* 13218c2ecf20Sopenharmony_ci * Shader management - vmwgfx_shader.c 13228c2ecf20Sopenharmony_ci */ 13238c2ecf20Sopenharmony_ci 13248c2ecf20Sopenharmony_ciextern const struct vmw_user_resource_conv *user_shader_converter; 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_ciextern int vmw_shader_define_ioctl(struct drm_device *dev, void *data, 13278c2ecf20Sopenharmony_ci struct drm_file *file_priv); 13288c2ecf20Sopenharmony_ciextern int vmw_shader_destroy_ioctl(struct drm_device *dev, void *data, 13298c2ecf20Sopenharmony_ci struct drm_file *file_priv); 13308c2ecf20Sopenharmony_ciextern int vmw_compat_shader_add(struct vmw_private *dev_priv, 13318c2ecf20Sopenharmony_ci struct vmw_cmdbuf_res_manager *man, 13328c2ecf20Sopenharmony_ci u32 user_key, const void *bytecode, 13338c2ecf20Sopenharmony_ci SVGA3dShaderType shader_type, 13348c2ecf20Sopenharmony_ci size_t size, 13358c2ecf20Sopenharmony_ci struct list_head *list); 13368c2ecf20Sopenharmony_ciextern int vmw_shader_remove(struct vmw_cmdbuf_res_manager *man, 13378c2ecf20Sopenharmony_ci u32 user_key, SVGA3dShaderType shader_type, 13388c2ecf20Sopenharmony_ci struct list_head *list); 13398c2ecf20Sopenharmony_ciextern int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man, 13408c2ecf20Sopenharmony_ci struct vmw_resource *ctx, 13418c2ecf20Sopenharmony_ci u32 user_key, 13428c2ecf20Sopenharmony_ci SVGA3dShaderType shader_type, 13438c2ecf20Sopenharmony_ci struct list_head *list); 13448c2ecf20Sopenharmony_ciextern void vmw_dx_shader_cotable_list_scrub(struct vmw_private *dev_priv, 13458c2ecf20Sopenharmony_ci struct list_head *list, 13468c2ecf20Sopenharmony_ci bool readback); 13478c2ecf20Sopenharmony_ci 13488c2ecf20Sopenharmony_ciextern struct vmw_resource * 13498c2ecf20Sopenharmony_civmw_shader_lookup(struct vmw_cmdbuf_res_manager *man, 13508c2ecf20Sopenharmony_ci u32 user_key, SVGA3dShaderType shader_type); 13518c2ecf20Sopenharmony_ci 13528c2ecf20Sopenharmony_ci/* 13538c2ecf20Sopenharmony_ci * Streamoutput management 13548c2ecf20Sopenharmony_ci */ 13558c2ecf20Sopenharmony_cistruct vmw_resource * 13568c2ecf20Sopenharmony_civmw_dx_streamoutput_lookup(struct vmw_cmdbuf_res_manager *man, 13578c2ecf20Sopenharmony_ci u32 user_key); 13588c2ecf20Sopenharmony_ciint vmw_dx_streamoutput_add(struct vmw_cmdbuf_res_manager *man, 13598c2ecf20Sopenharmony_ci struct vmw_resource *ctx, 13608c2ecf20Sopenharmony_ci SVGA3dStreamOutputId user_key, 13618c2ecf20Sopenharmony_ci struct list_head *list); 13628c2ecf20Sopenharmony_civoid vmw_dx_streamoutput_set_size(struct vmw_resource *res, u32 size); 13638c2ecf20Sopenharmony_ciint vmw_dx_streamoutput_remove(struct vmw_cmdbuf_res_manager *man, 13648c2ecf20Sopenharmony_ci SVGA3dStreamOutputId user_key, 13658c2ecf20Sopenharmony_ci struct list_head *list); 13668c2ecf20Sopenharmony_civoid vmw_dx_streamoutput_cotable_list_scrub(struct vmw_private *dev_priv, 13678c2ecf20Sopenharmony_ci struct list_head *list, 13688c2ecf20Sopenharmony_ci bool readback); 13698c2ecf20Sopenharmony_ci 13708c2ecf20Sopenharmony_ci/* 13718c2ecf20Sopenharmony_ci * Command buffer managed resources - vmwgfx_cmdbuf_res.c 13728c2ecf20Sopenharmony_ci */ 13738c2ecf20Sopenharmony_ci 13748c2ecf20Sopenharmony_ciextern struct vmw_cmdbuf_res_manager * 13758c2ecf20Sopenharmony_civmw_cmdbuf_res_man_create(struct vmw_private *dev_priv); 13768c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man); 13778c2ecf20Sopenharmony_ciextern size_t vmw_cmdbuf_res_man_size(void); 13788c2ecf20Sopenharmony_ciextern struct vmw_resource * 13798c2ecf20Sopenharmony_civmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man, 13808c2ecf20Sopenharmony_ci enum vmw_cmdbuf_res_type res_type, 13818c2ecf20Sopenharmony_ci u32 user_key); 13828c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_res_revert(struct list_head *list); 13838c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_res_commit(struct list_head *list); 13848c2ecf20Sopenharmony_ciextern int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man, 13858c2ecf20Sopenharmony_ci enum vmw_cmdbuf_res_type res_type, 13868c2ecf20Sopenharmony_ci u32 user_key, 13878c2ecf20Sopenharmony_ci struct vmw_resource *res, 13888c2ecf20Sopenharmony_ci struct list_head *list); 13898c2ecf20Sopenharmony_ciextern int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man, 13908c2ecf20Sopenharmony_ci enum vmw_cmdbuf_res_type res_type, 13918c2ecf20Sopenharmony_ci u32 user_key, 13928c2ecf20Sopenharmony_ci struct list_head *list, 13938c2ecf20Sopenharmony_ci struct vmw_resource **res); 13948c2ecf20Sopenharmony_ci 13958c2ecf20Sopenharmony_ci/* 13968c2ecf20Sopenharmony_ci * COTable management - vmwgfx_cotable.c 13978c2ecf20Sopenharmony_ci */ 13988c2ecf20Sopenharmony_ciextern const SVGACOTableType vmw_cotable_scrub_order[]; 13998c2ecf20Sopenharmony_ciextern struct vmw_resource *vmw_cotable_alloc(struct vmw_private *dev_priv, 14008c2ecf20Sopenharmony_ci struct vmw_resource *ctx, 14018c2ecf20Sopenharmony_ci u32 type); 14028c2ecf20Sopenharmony_ciextern int vmw_cotable_notify(struct vmw_resource *res, int id); 14038c2ecf20Sopenharmony_ciextern int vmw_cotable_scrub(struct vmw_resource *res, bool readback); 14048c2ecf20Sopenharmony_ciextern void vmw_cotable_add_resource(struct vmw_resource *ctx, 14058c2ecf20Sopenharmony_ci struct list_head *head); 14068c2ecf20Sopenharmony_ci 14078c2ecf20Sopenharmony_ci/* 14088c2ecf20Sopenharmony_ci * Command buffer managerment vmwgfx_cmdbuf.c 14098c2ecf20Sopenharmony_ci */ 14108c2ecf20Sopenharmony_cistruct vmw_cmdbuf_man; 14118c2ecf20Sopenharmony_cistruct vmw_cmdbuf_header; 14128c2ecf20Sopenharmony_ci 14138c2ecf20Sopenharmony_ciextern struct vmw_cmdbuf_man * 14148c2ecf20Sopenharmony_civmw_cmdbuf_man_create(struct vmw_private *dev_priv); 14158c2ecf20Sopenharmony_ciextern int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, 14168c2ecf20Sopenharmony_ci size_t size, size_t default_size); 14178c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man); 14188c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man); 14198c2ecf20Sopenharmony_ciextern int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible, 14208c2ecf20Sopenharmony_ci unsigned long timeout); 14218c2ecf20Sopenharmony_ciextern void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size, 14228c2ecf20Sopenharmony_ci int ctx_id, bool interruptible, 14238c2ecf20Sopenharmony_ci struct vmw_cmdbuf_header *header); 14248c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size, 14258c2ecf20Sopenharmony_ci struct vmw_cmdbuf_header *header, 14268c2ecf20Sopenharmony_ci bool flush); 14278c2ecf20Sopenharmony_ciextern void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man, 14288c2ecf20Sopenharmony_ci size_t size, bool interruptible, 14298c2ecf20Sopenharmony_ci struct vmw_cmdbuf_header **p_header); 14308c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header); 14318c2ecf20Sopenharmony_ciextern int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man, 14328c2ecf20Sopenharmony_ci bool interruptible); 14338c2ecf20Sopenharmony_ciextern void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man); 14348c2ecf20Sopenharmony_ci 14358c2ecf20Sopenharmony_ci/* CPU blit utilities - vmwgfx_blit.c */ 14368c2ecf20Sopenharmony_ci 14378c2ecf20Sopenharmony_ci/** 14388c2ecf20Sopenharmony_ci * struct vmw_diff_cpy - CPU blit information structure 14398c2ecf20Sopenharmony_ci * 14408c2ecf20Sopenharmony_ci * @rect: The output bounding box rectangle. 14418c2ecf20Sopenharmony_ci * @line: The current line of the blit. 14428c2ecf20Sopenharmony_ci * @line_offset: Offset of the current line segment. 14438c2ecf20Sopenharmony_ci * @cpp: Bytes per pixel (granularity information). 14448c2ecf20Sopenharmony_ci * @memcpy: Which memcpy function to use. 14458c2ecf20Sopenharmony_ci */ 14468c2ecf20Sopenharmony_cistruct vmw_diff_cpy { 14478c2ecf20Sopenharmony_ci struct drm_rect rect; 14488c2ecf20Sopenharmony_ci size_t line; 14498c2ecf20Sopenharmony_ci size_t line_offset; 14508c2ecf20Sopenharmony_ci int cpp; 14518c2ecf20Sopenharmony_ci void (*do_cpy)(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, 14528c2ecf20Sopenharmony_ci size_t n); 14538c2ecf20Sopenharmony_ci}; 14548c2ecf20Sopenharmony_ci 14558c2ecf20Sopenharmony_ci#define VMW_CPU_BLIT_INITIALIZER { \ 14568c2ecf20Sopenharmony_ci .do_cpy = vmw_memcpy, \ 14578c2ecf20Sopenharmony_ci} 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_ci#define VMW_CPU_BLIT_DIFF_INITIALIZER(_cpp) { \ 14608c2ecf20Sopenharmony_ci .line = 0, \ 14618c2ecf20Sopenharmony_ci .line_offset = 0, \ 14628c2ecf20Sopenharmony_ci .rect = { .x1 = INT_MAX/2, \ 14638c2ecf20Sopenharmony_ci .y1 = INT_MAX/2, \ 14648c2ecf20Sopenharmony_ci .x2 = INT_MIN/2, \ 14658c2ecf20Sopenharmony_ci .y2 = INT_MIN/2 \ 14668c2ecf20Sopenharmony_ci }, \ 14678c2ecf20Sopenharmony_ci .cpp = _cpp, \ 14688c2ecf20Sopenharmony_ci .do_cpy = vmw_diff_memcpy, \ 14698c2ecf20Sopenharmony_ci} 14708c2ecf20Sopenharmony_ci 14718c2ecf20Sopenharmony_civoid vmw_diff_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, 14728c2ecf20Sopenharmony_ci size_t n); 14738c2ecf20Sopenharmony_ci 14748c2ecf20Sopenharmony_civoid vmw_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, size_t n); 14758c2ecf20Sopenharmony_ci 14768c2ecf20Sopenharmony_ciint vmw_bo_cpu_blit(struct ttm_buffer_object *dst, 14778c2ecf20Sopenharmony_ci u32 dst_offset, u32 dst_stride, 14788c2ecf20Sopenharmony_ci struct ttm_buffer_object *src, 14798c2ecf20Sopenharmony_ci u32 src_offset, u32 src_stride, 14808c2ecf20Sopenharmony_ci u32 w, u32 h, 14818c2ecf20Sopenharmony_ci struct vmw_diff_cpy *diff); 14828c2ecf20Sopenharmony_ci 14838c2ecf20Sopenharmony_ci/* Host messaging -vmwgfx_msg.c: */ 14848c2ecf20Sopenharmony_ciint vmw_host_get_guestinfo(const char *guest_info_param, 14858c2ecf20Sopenharmony_ci char *buffer, size_t *length); 14868c2ecf20Sopenharmony_ciint vmw_host_log(const char *log); 14878c2ecf20Sopenharmony_ciint vmw_msg_ioctl(struct drm_device *dev, void *data, 14888c2ecf20Sopenharmony_ci struct drm_file *file_priv); 14898c2ecf20Sopenharmony_ci 14908c2ecf20Sopenharmony_ci/* VMW logging */ 14918c2ecf20Sopenharmony_ci 14928c2ecf20Sopenharmony_ci/** 14938c2ecf20Sopenharmony_ci * VMW_DEBUG_USER - Debug output for user-space debugging. 14948c2ecf20Sopenharmony_ci * 14958c2ecf20Sopenharmony_ci * @fmt: printf() like format string. 14968c2ecf20Sopenharmony_ci * 14978c2ecf20Sopenharmony_ci * This macro is for logging user-space error and debugging messages for e.g. 14988c2ecf20Sopenharmony_ci * command buffer execution errors due to malformed commands, invalid context, 14998c2ecf20Sopenharmony_ci * etc. 15008c2ecf20Sopenharmony_ci */ 15018c2ecf20Sopenharmony_ci#define VMW_DEBUG_USER(fmt, ...) \ 15028c2ecf20Sopenharmony_ci DRM_DEBUG_DRIVER(fmt, ##__VA_ARGS__) 15038c2ecf20Sopenharmony_ci 15048c2ecf20Sopenharmony_ci/* Resource dirtying - vmwgfx_page_dirty.c */ 15058c2ecf20Sopenharmony_civoid vmw_bo_dirty_scan(struct vmw_buffer_object *vbo); 15068c2ecf20Sopenharmony_ciint vmw_bo_dirty_add(struct vmw_buffer_object *vbo); 15078c2ecf20Sopenharmony_civoid vmw_bo_dirty_transfer_to_res(struct vmw_resource *res); 15088c2ecf20Sopenharmony_civoid vmw_bo_dirty_clear_res(struct vmw_resource *res); 15098c2ecf20Sopenharmony_civoid vmw_bo_dirty_release(struct vmw_buffer_object *vbo); 15108c2ecf20Sopenharmony_civoid vmw_bo_dirty_unmap(struct vmw_buffer_object *vbo, 15118c2ecf20Sopenharmony_ci pgoff_t start, pgoff_t end); 15128c2ecf20Sopenharmony_civm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf); 15138c2ecf20Sopenharmony_civm_fault_t vmw_bo_vm_mkwrite(struct vm_fault *vmf); 15148c2ecf20Sopenharmony_ci#ifdef CONFIG_TRANSPARENT_HUGEPAGE 15158c2ecf20Sopenharmony_civm_fault_t vmw_bo_vm_huge_fault(struct vm_fault *vmf, 15168c2ecf20Sopenharmony_ci enum page_entry_size pe_size); 15178c2ecf20Sopenharmony_ci#endif 15188c2ecf20Sopenharmony_ci 15198c2ecf20Sopenharmony_ci/* Transparent hugepage support - vmwgfx_thp.c */ 15208c2ecf20Sopenharmony_ci#ifdef CONFIG_TRANSPARENT_HUGEPAGE 15218c2ecf20Sopenharmony_ciextern int vmw_thp_init(struct vmw_private *dev_priv); 15228c2ecf20Sopenharmony_civoid vmw_thp_fini(struct vmw_private *dev_priv); 15238c2ecf20Sopenharmony_ci#endif 15248c2ecf20Sopenharmony_ci 15258c2ecf20Sopenharmony_ci/** 15268c2ecf20Sopenharmony_ci * VMW_DEBUG_KMS - Debug output for kernel mode-setting 15278c2ecf20Sopenharmony_ci * 15288c2ecf20Sopenharmony_ci * This macro is for debugging vmwgfx mode-setting code. 15298c2ecf20Sopenharmony_ci */ 15308c2ecf20Sopenharmony_ci#define VMW_DEBUG_KMS(fmt, ...) \ 15318c2ecf20Sopenharmony_ci DRM_DEBUG_DRIVER(fmt, ##__VA_ARGS__) 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ci/** 15348c2ecf20Sopenharmony_ci * Inline helper functions 15358c2ecf20Sopenharmony_ci */ 15368c2ecf20Sopenharmony_ci 15378c2ecf20Sopenharmony_cistatic inline void vmw_surface_unreference(struct vmw_surface **srf) 15388c2ecf20Sopenharmony_ci{ 15398c2ecf20Sopenharmony_ci struct vmw_surface *tmp_srf = *srf; 15408c2ecf20Sopenharmony_ci struct vmw_resource *res = &tmp_srf->res; 15418c2ecf20Sopenharmony_ci *srf = NULL; 15428c2ecf20Sopenharmony_ci 15438c2ecf20Sopenharmony_ci vmw_resource_unreference(&res); 15448c2ecf20Sopenharmony_ci} 15458c2ecf20Sopenharmony_ci 15468c2ecf20Sopenharmony_cistatic inline struct vmw_surface *vmw_surface_reference(struct vmw_surface *srf) 15478c2ecf20Sopenharmony_ci{ 15488c2ecf20Sopenharmony_ci (void) vmw_resource_reference(&srf->res); 15498c2ecf20Sopenharmony_ci return srf; 15508c2ecf20Sopenharmony_ci} 15518c2ecf20Sopenharmony_ci 15528c2ecf20Sopenharmony_cistatic inline void vmw_bo_unreference(struct vmw_buffer_object **buf) 15538c2ecf20Sopenharmony_ci{ 15548c2ecf20Sopenharmony_ci struct vmw_buffer_object *tmp_buf = *buf; 15558c2ecf20Sopenharmony_ci 15568c2ecf20Sopenharmony_ci *buf = NULL; 15578c2ecf20Sopenharmony_ci if (tmp_buf != NULL) { 15588c2ecf20Sopenharmony_ci ttm_bo_put(&tmp_buf->base); 15598c2ecf20Sopenharmony_ci } 15608c2ecf20Sopenharmony_ci} 15618c2ecf20Sopenharmony_ci 15628c2ecf20Sopenharmony_cistatic inline struct vmw_buffer_object * 15638c2ecf20Sopenharmony_civmw_bo_reference(struct vmw_buffer_object *buf) 15648c2ecf20Sopenharmony_ci{ 15658c2ecf20Sopenharmony_ci ttm_bo_get(&buf->base); 15668c2ecf20Sopenharmony_ci return buf; 15678c2ecf20Sopenharmony_ci} 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_cistatic inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv) 15708c2ecf20Sopenharmony_ci{ 15718c2ecf20Sopenharmony_ci return &ttm_mem_glob; 15728c2ecf20Sopenharmony_ci} 15738c2ecf20Sopenharmony_ci 15748c2ecf20Sopenharmony_cistatic inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv) 15758c2ecf20Sopenharmony_ci{ 15768c2ecf20Sopenharmony_ci atomic_inc(&dev_priv->num_fifo_resources); 15778c2ecf20Sopenharmony_ci} 15788c2ecf20Sopenharmony_ci 15798c2ecf20Sopenharmony_cistatic inline void vmw_fifo_resource_dec(struct vmw_private *dev_priv) 15808c2ecf20Sopenharmony_ci{ 15818c2ecf20Sopenharmony_ci atomic_dec(&dev_priv->num_fifo_resources); 15828c2ecf20Sopenharmony_ci} 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci/** 15858c2ecf20Sopenharmony_ci * vmw_mmio_read - Perform a MMIO read from volatile memory 15868c2ecf20Sopenharmony_ci * 15878c2ecf20Sopenharmony_ci * @addr: The address to read from 15888c2ecf20Sopenharmony_ci * 15898c2ecf20Sopenharmony_ci * This function is intended to be equivalent to ioread32() on 15908c2ecf20Sopenharmony_ci * memremap'd memory, but without byteswapping. 15918c2ecf20Sopenharmony_ci */ 15928c2ecf20Sopenharmony_cistatic inline u32 vmw_mmio_read(u32 *addr) 15938c2ecf20Sopenharmony_ci{ 15948c2ecf20Sopenharmony_ci return READ_ONCE(*addr); 15958c2ecf20Sopenharmony_ci} 15968c2ecf20Sopenharmony_ci 15978c2ecf20Sopenharmony_ci/** 15988c2ecf20Sopenharmony_ci * vmw_mmio_write - Perform a MMIO write to volatile memory 15998c2ecf20Sopenharmony_ci * 16008c2ecf20Sopenharmony_ci * @addr: The address to write to 16018c2ecf20Sopenharmony_ci * 16028c2ecf20Sopenharmony_ci * This function is intended to be equivalent to iowrite32 on 16038c2ecf20Sopenharmony_ci * memremap'd memory, but without byteswapping. 16048c2ecf20Sopenharmony_ci */ 16058c2ecf20Sopenharmony_cistatic inline void vmw_mmio_write(u32 value, u32 *addr) 16068c2ecf20Sopenharmony_ci{ 16078c2ecf20Sopenharmony_ci WRITE_ONCE(*addr, value); 16088c2ecf20Sopenharmony_ci} 16098c2ecf20Sopenharmony_ci 16108c2ecf20Sopenharmony_cistatic inline bool vmw_shadertype_is_valid(enum vmw_sm_type shader_model, 16118c2ecf20Sopenharmony_ci u32 shader_type) 16128c2ecf20Sopenharmony_ci{ 16138c2ecf20Sopenharmony_ci SVGA3dShaderType max_allowed = SVGA3D_SHADERTYPE_PREDX_MAX; 16148c2ecf20Sopenharmony_ci 16158c2ecf20Sopenharmony_ci if (shader_model >= VMW_SM_5) 16168c2ecf20Sopenharmony_ci max_allowed = SVGA3D_SHADERTYPE_MAX; 16178c2ecf20Sopenharmony_ci else if (shader_model >= VMW_SM_4) 16188c2ecf20Sopenharmony_ci max_allowed = SVGA3D_SHADERTYPE_DX10_MAX; 16198c2ecf20Sopenharmony_ci return shader_type >= SVGA3D_SHADERTYPE_MIN && shader_type < max_allowed; 16208c2ecf20Sopenharmony_ci} 16218c2ecf20Sopenharmony_ci 16228c2ecf20Sopenharmony_ci#endif 1623