156113504SChristian König /*
256113504SChristian König  * Copyright 2016 Advanced Micro Devices, Inc.
356113504SChristian König  *
456113504SChristian König  * Permission is hereby granted, free of charge, to any person obtaining a
556113504SChristian König  * copy of this software and associated documentation files (the "Software"),
656113504SChristian König  * to deal in the Software without restriction, including without limitation
756113504SChristian König  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
856113504SChristian König  * and/or sell copies of the Software, and to permit persons to whom the
956113504SChristian König  * Software is furnished to do so, subject to the following conditions:
1056113504SChristian König  *
1156113504SChristian König  * The above copyright notice and this permission notice shall be included in
1256113504SChristian König  * all copies or substantial portions of the Software.
1356113504SChristian König  *
1456113504SChristian König  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1556113504SChristian König  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1656113504SChristian König  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1756113504SChristian König  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1856113504SChristian König  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1956113504SChristian König  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2056113504SChristian König  * OTHER DEALINGS IN THE SOFTWARE.
2156113504SChristian König  *
2256113504SChristian König  * Authors: Christian König
2356113504SChristian König  */
2456113504SChristian König #ifndef __AMDGPU_SYNC_H__
2556113504SChristian König #define __AMDGPU_SYNC_H__
2656113504SChristian König 
2756113504SChristian König #include <linux/hashtable.h>
2856113504SChristian König 
29220196b3SDave Airlie struct dma_fence;
3052791eeeSChristian König struct dma_resv;
3156113504SChristian König struct amdgpu_device;
3256113504SChristian König struct amdgpu_ring;
33aab9cf7bSChristian König struct amdgpu_job;
3456113504SChristian König 
355d319660SChristian König enum amdgpu_sync_mode {
365d319660SChristian König 	AMDGPU_SYNC_ALWAYS,
375d319660SChristian König 	AMDGPU_SYNC_NE_OWNER,
385d319660SChristian König 	AMDGPU_SYNC_EQ_OWNER,
395d319660SChristian König 	AMDGPU_SYNC_EXPLICIT
405d319660SChristian König };
415d319660SChristian König 
4256113504SChristian König /*
4356113504SChristian König  * Container for fences used to sync command submissions.
4456113504SChristian König  */
4556113504SChristian König struct amdgpu_sync {
4656113504SChristian König 	DECLARE_HASHTABLE(fences, 4);
4756113504SChristian König };
4856113504SChristian König 
4956113504SChristian König void amdgpu_sync_create(struct amdgpu_sync *sync);
5016590745SChristian König int amdgpu_sync_fence(struct amdgpu_sync *sync, struct dma_fence *f,
5116590745SChristian König 		      gfp_t flags);
525d319660SChristian König int amdgpu_sync_resv(struct amdgpu_device *adev, struct amdgpu_sync *sync,
535d319660SChristian König 		     struct dma_resv *resv, enum amdgpu_sync_mode mode,
545d319660SChristian König 		     void *owner);
55126be9b2SChristian König int amdgpu_sync_kfd(struct amdgpu_sync *sync, struct dma_resv *resv);
56220196b3SDave Airlie struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
5756113504SChristian König 				     struct amdgpu_ring *ring);
58174b328bSChristian König struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
593c728d3aSFelix Kuehling int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone);
60*bd22e44aSChristian König void amdgpu_sync_move(struct amdgpu_sync *src, struct amdgpu_sync *dst);
61aab9cf7bSChristian König int amdgpu_sync_push_to_job(struct amdgpu_sync *sync, struct amdgpu_job *job);
62a6583af4SHarish Kasiviswanathan int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr);
6356113504SChristian König void amdgpu_sync_free(struct amdgpu_sync *sync);
6456113504SChristian König int amdgpu_sync_init(void);
6556113504SChristian König void amdgpu_sync_fini(void);
6656113504SChristian König 
6756113504SChristian König #endif
68