// SPDX-License-Identifier: GPL-2.0 OR MIT /************************************************************************** * * Copyright (c) 2011-2024 Broadcom. All Rights Reserved. The term * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. * **************************************************************************/ #include "vmwgfx_bo.h" #include "vmwgfx_drv.h" #include "vmwgfx_resource_priv.h" #include <drm/ttm/ttm_placement.h> static void vmw_bo_release(struct vmw_bo *vbo) { … } /** * vmw_bo_free - vmw_bo destructor * * @bo: Pointer to the embedded struct ttm_buffer_object */ static void vmw_bo_free(struct ttm_buffer_object *bo) { … } /** * vmw_bo_pin_in_placement - Validate a buffer to placement. * * @dev_priv: Driver private. * @buf: DMA buffer to move. * @placement: The placement to pin it. * @interruptible: Use interruptible wait. * Return: Zero on success, Negative error code on failure. In particular * -ERESTARTSYS if interrupted by a signal */ static int vmw_bo_pin_in_placement(struct vmw_private *dev_priv, struct vmw_bo *buf, struct ttm_placement *placement, bool interruptible) { … } /** * vmw_bo_pin_in_vram_or_gmr - Move a buffer to vram or gmr. * * This function takes the reservation_sem in write mode. * Flushes and unpins the query bo to avoid failures. * * @dev_priv: Driver private. * @buf: DMA buffer to move. * @interruptible: Use interruptible wait. * Return: Zero on success, Negative error code on failure. In particular * -ERESTARTSYS if interrupted by a signal */ int vmw_bo_pin_in_vram_or_gmr(struct vmw_private *dev_priv, struct vmw_bo *buf, bool interruptible) { … } /** * vmw_bo_pin_in_vram - Move a buffer to vram. * * This function takes the reservation_sem in write mode. * Flushes and unpins the query bo to avoid failures. * * @dev_priv: Driver private. * @buf: DMA buffer to move. * @interruptible: Use interruptible wait. * Return: Zero on success, Negative error code on failure. In particular * -ERESTARTSYS if interrupted by a signal */ int vmw_bo_pin_in_vram(struct vmw_private *dev_priv, struct vmw_bo *buf, bool interruptible) { … } /** * vmw_bo_pin_in_start_of_vram - Move a buffer to start of vram. * * This function takes the reservation_sem in write mode. * Flushes and unpins the query bo to avoid failures. * * @dev_priv: Driver private. * @buf: DMA buffer to pin. * @interruptible: Use interruptible wait. * Return: Zero on success, Negative error code on failure. In particular * -ERESTARTSYS if interrupted by a signal */ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv, struct vmw_bo *buf, bool interruptible) { … } /** * vmw_bo_unpin - Unpin the buffer given buffer, does not move the buffer. * * This function takes the reservation_sem in write mode. * * @dev_priv: Driver private. * @buf: DMA buffer to unpin. * @interruptible: Use interruptible wait. * Return: Zero on success, Negative error code on failure. In particular * -ERESTARTSYS if interrupted by a signal */ int vmw_bo_unpin(struct vmw_private *dev_priv, struct vmw_bo *buf, bool interruptible) { … } /** * vmw_bo_get_guest_ptr - Get the guest ptr representing the current placement * of a buffer. * * @bo: Pointer to a struct ttm_buffer_object. Must be pinned or reserved. * @ptr: SVGAGuestPtr returning the result. */ void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *bo, SVGAGuestPtr *ptr) { … } /** * vmw_bo_pin_reserved - Pin or unpin a buffer object without moving it. * * @vbo: The buffer object. Must be reserved. * @pin: Whether to pin or unpin. * */ void vmw_bo_pin_reserved(struct vmw_bo *vbo, bool pin) { … } /** * vmw_bo_map_and_cache - Map a buffer object and cache the map * * @vbo: The buffer object to map * Return: A kernel virtual address or NULL if mapping failed. * * This function maps a buffer object into the kernel address space, or * returns the virtual kernel address of an already existing map. The virtual * address remains valid as long as the buffer object is pinned or reserved. * The cached map is torn down on either * 1) Buffer object move * 2) Buffer object swapout * 3) Buffer object destruction * */ void *vmw_bo_map_and_cache(struct vmw_bo *vbo) { … } void *vmw_bo_map_and_cache_size(struct vmw_bo *vbo, size_t size) { … } /** * vmw_bo_unmap - Tear down a cached buffer object map. * * @vbo: The buffer object whose map we are tearing down. * * This function tears down a cached map set up using * vmw_bo_map_and_cache(). */ void vmw_bo_unmap(struct vmw_bo *vbo) { … } /** * vmw_bo_init - Initialize a vmw buffer object * * @dev_priv: Pointer to the device private struct * @vmw_bo: Buffer object to initialize * @params: Parameters used to initialize the buffer object * @destroy: The function used to delete the buffer object * Returns: Zero on success, negative error code on error. * */ static int vmw_bo_init(struct vmw_private *dev_priv, struct vmw_bo *vmw_bo, struct vmw_bo_params *params, void (*destroy)(struct ttm_buffer_object *)) { … } int vmw_bo_create(struct vmw_private *vmw, struct vmw_bo_params *params, struct vmw_bo **p_bo) { … } /** * vmw_user_bo_synccpu_grab - Grab a struct vmw_bo for cpu * access, idling previous GPU operations on the buffer and optionally * blocking it for further command submissions. * * @vmw_bo: Pointer to the buffer object being grabbed for CPU access * @flags: Flags indicating how the grab should be performed. * Return: Zero on success, Negative error code on error. In particular, * -EBUSY will be returned if a dontblock operation is requested and the * buffer object is busy, and -ERESTARTSYS will be returned if a wait is * interrupted by a signal. * * A blocking grab will be automatically released when @tfile is closed. */ static int vmw_user_bo_synccpu_grab(struct vmw_bo *vmw_bo, uint32_t flags) { … } /** * vmw_user_bo_synccpu_release - Release a previous grab for CPU access, * and unblock command submission on the buffer if blocked. * * @filp: Identifying the caller. * @handle: Handle identifying the buffer object. * @flags: Flags indicating the type of release. */ static int vmw_user_bo_synccpu_release(struct drm_file *filp, uint32_t handle, uint32_t flags) { … } /** * vmw_user_bo_synccpu_ioctl - ioctl function implementing the synccpu * functionality. * * @dev: Identifies the drm device. * @data: Pointer to the ioctl argument. * @file_priv: Identifies the caller. * Return: Zero on success, negative error code on error. * * This function checks the ioctl arguments for validity and calls the * relevant synccpu functions. */ int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { … } /** * vmw_bo_unref_ioctl - Generic handle close ioctl. * * @dev: Identifies the drm device. * @data: Pointer to the ioctl argument. * @file_priv: Identifies the caller. * Return: Zero on success, negative error code on error. * * This function checks the ioctl arguments for validity and closes a * handle to a TTM base object, optionally freeing the object. */ int vmw_bo_unref_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { … } /** * vmw_user_bo_lookup - Look up a vmw user buffer object from a handle. * * @filp: The file the handle is registered with. * @handle: The user buffer object handle * @out: Pointer to a where a pointer to the embedded * struct vmw_bo should be placed. * Return: Zero on success, Negative error code on error. * * The vmw buffer object pointer will be refcounted (both ttm and gem) */ int vmw_user_bo_lookup(struct drm_file *filp, u32 handle, struct vmw_bo **out) { … } /** * vmw_bo_fence_single - Utility function to fence a single TTM buffer * object without unreserving it. * * @bo: Pointer to the struct ttm_buffer_object to fence. * @fence: Pointer to the fence. If NULL, this function will * insert a fence into the command stream.. * * Contrary to the ttm_eu version of this function, it takes only * a single buffer object instead of a list, and it also doesn't * unreserve the buffer object, which needs to be done separately. */ void vmw_bo_fence_single(struct ttm_buffer_object *bo, struct vmw_fence_obj *fence) { … } /** * vmw_bo_swap_notify - swapout notify callback. * * @bo: The buffer object to be swapped out. */ void vmw_bo_swap_notify(struct ttm_buffer_object *bo) { … } /** * vmw_bo_move_notify - TTM move_notify_callback * * @bo: The TTM buffer object about to move. * @mem: The struct ttm_resource indicating to what memory * region the move is taking place. * * Detaches cached maps and device bindings that require that the * buffer doesn't move. */ void vmw_bo_move_notify(struct ttm_buffer_object *bo, struct ttm_resource *mem) { … } static u32 placement_flags(u32 domain, u32 desired, u32 fallback) { … } static u32 set_placement_list(struct ttm_place *pl, u32 desired, u32 fallback) { … } void vmw_bo_placement_set(struct vmw_bo *bo, u32 domain, u32 busy_domain) { … } void vmw_bo_placement_set_default_accelerated(struct vmw_bo *bo) { … } void vmw_bo_add_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res) { … } void vmw_bo_del_detached_resource(struct vmw_bo *vbo, struct vmw_resource *res) { … } struct vmw_surface *vmw_bo_surface(struct vmw_bo *vbo) { … }