197ff1946SArunpravin Paneer Selvam /* SPDX-License-Identifier: MIT */ 297ff1946SArunpravin Paneer Selvam /* 397ff1946SArunpravin Paneer Selvam * Copyright 2023 Advanced Micro Devices, Inc. 497ff1946SArunpravin Paneer Selvam * 597ff1946SArunpravin Paneer Selvam * Permission is hereby granted, free of charge, to any person obtaining a 697ff1946SArunpravin Paneer Selvam * copy of this software and associated documentation files (the "Software"), 797ff1946SArunpravin Paneer Selvam * to deal in the Software without restriction, including without limitation 897ff1946SArunpravin Paneer Selvam * the rights to use, copy, modify, merge, publish, distribute, sublicense, 997ff1946SArunpravin Paneer Selvam * and/or sell copies of the Software, and to permit persons to whom the 1097ff1946SArunpravin Paneer Selvam * Software is furnished to do so, subject to the following conditions: 1197ff1946SArunpravin Paneer Selvam * 1297ff1946SArunpravin Paneer Selvam * The above copyright notice and this permission notice shall be included in 1397ff1946SArunpravin Paneer Selvam * all copies or substantial portions of the Software. 1497ff1946SArunpravin Paneer Selvam * 1597ff1946SArunpravin Paneer Selvam * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1697ff1946SArunpravin Paneer Selvam * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1797ff1946SArunpravin Paneer Selvam * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1897ff1946SArunpravin Paneer Selvam * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1997ff1946SArunpravin Paneer Selvam * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2097ff1946SArunpravin Paneer Selvam * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2197ff1946SArunpravin Paneer Selvam * OTHER DEALINGS IN THE SOFTWARE. 2297ff1946SArunpravin Paneer Selvam * 2397ff1946SArunpravin Paneer Selvam */ 2497ff1946SArunpravin Paneer Selvam 2597ff1946SArunpravin Paneer Selvam #ifndef __AMDGPU_USERQ_FENCE_H__ 2697ff1946SArunpravin Paneer Selvam #define __AMDGPU_USERQ_FENCE_H__ 2797ff1946SArunpravin Paneer Selvam 2897ff1946SArunpravin Paneer Selvam #include <linux/types.h> 2997ff1946SArunpravin Paneer Selvam 30*42a66677SAlex Deucher #include "amdgpu_userq.h" 3197ff1946SArunpravin Paneer Selvam 3297ff1946SArunpravin Paneer Selvam struct amdgpu_userq_fence { 3397ff1946SArunpravin Paneer Selvam struct dma_fence base; 3497ff1946SArunpravin Paneer Selvam /* 3597ff1946SArunpravin Paneer Selvam * This lock is necessary to synchronize the 3697ff1946SArunpravin Paneer Selvam * userqueue dma fence operations. 3797ff1946SArunpravin Paneer Selvam */ 3897ff1946SArunpravin Paneer Selvam spinlock_t lock; 3997ff1946SArunpravin Paneer Selvam struct list_head link; 40a292fdecSArunpravin Paneer Selvam unsigned long fence_drv_array_count; 4197ff1946SArunpravin Paneer Selvam struct amdgpu_userq_fence_driver *fence_drv; 42a292fdecSArunpravin Paneer Selvam struct amdgpu_userq_fence_driver **fence_drv_array; 4397ff1946SArunpravin Paneer Selvam }; 4497ff1946SArunpravin Paneer Selvam 4597ff1946SArunpravin Paneer Selvam struct amdgpu_userq_fence_driver { 4697ff1946SArunpravin Paneer Selvam struct kref refcount; 47f7cb6a28SArunpravin Paneer Selvam u64 va; 4897ff1946SArunpravin Paneer Selvam u64 gpu_addr; 4997ff1946SArunpravin Paneer Selvam u64 *cpu_addr; 5097ff1946SArunpravin Paneer Selvam u64 context; 5197ff1946SArunpravin Paneer Selvam /* 5297ff1946SArunpravin Paneer Selvam * This lock is necesaary to synchronize the access 5397ff1946SArunpravin Paneer Selvam * to the fences list by the fence driver. 5497ff1946SArunpravin Paneer Selvam */ 5597ff1946SArunpravin Paneer Selvam spinlock_t fence_list_lock; 5697ff1946SArunpravin Paneer Selvam struct list_head fences; 5797ff1946SArunpravin Paneer Selvam struct amdgpu_device *adev; 5897ff1946SArunpravin Paneer Selvam char timeline_name[TASK_COMM_LEN]; 5997ff1946SArunpravin Paneer Selvam }; 6097ff1946SArunpravin Paneer Selvam 6197ff1946SArunpravin Paneer Selvam int amdgpu_userq_fence_slab_init(void); 6297ff1946SArunpravin Paneer Selvam void amdgpu_userq_fence_slab_fini(void); 63f15d4e92SArvind Yadav 6497ff1946SArunpravin Paneer Selvam void amdgpu_userq_fence_driver_get(struct amdgpu_userq_fence_driver *fence_drv); 6597ff1946SArunpravin Paneer Selvam void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv); 6697ff1946SArunpravin Paneer Selvam int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev, 6797ff1946SArunpravin Paneer Selvam struct amdgpu_usermode_queue *userq); 68edc762a5SAlex Deucher void amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq); 6997ff1946SArunpravin Paneer Selvam void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv); 7097ff1946SArunpravin Paneer Selvam void amdgpu_userq_fence_driver_destroy(struct kref *ref); 71a292fdecSArunpravin Paneer Selvam int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data, 72a292fdecSArunpravin Paneer Selvam struct drm_file *filp); 73a292fdecSArunpravin Paneer Selvam int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data, 74a292fdecSArunpravin Paneer Selvam struct drm_file *filp); 7597ff1946SArunpravin Paneer Selvam 7697ff1946SArunpravin Paneer Selvam #endif 77