xref: /linux/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h (revision b08494a8f7416e5f09907318c5460ad6f6e2a548)
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