18290268fSChristian König /*
28290268fSChristian König  * Copyright 2018 Advanced Micro Devices, Inc.
38290268fSChristian König  *
48290268fSChristian König  * Permission is hereby granted, free of charge, to any person obtaining a
58290268fSChristian König  * copy of this software and associated documentation files (the "Software"),
68290268fSChristian König  * to deal in the Software without restriction, including without limitation
78290268fSChristian König  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
88290268fSChristian König  * and/or sell copies of the Software, and to permit persons to whom the
98290268fSChristian König  * Software is furnished to do so, subject to the following conditions:
108290268fSChristian König  *
118290268fSChristian König  * The above copyright notice and this permission notice shall be included in
128290268fSChristian König  * all copies or substantial portions of the Software.
138290268fSChristian König  *
148290268fSChristian König  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
158290268fSChristian König  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
168290268fSChristian König  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
178290268fSChristian König  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
188290268fSChristian König  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
198290268fSChristian König  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
208290268fSChristian König  * OTHER DEALINGS IN THE SOFTWARE.
218290268fSChristian König  *
228290268fSChristian König  */
238290268fSChristian König #ifndef __AMDGPU_CTX_H__
248290268fSChristian König #define __AMDGPU_CTX_H__
258290268fSChristian König 
26af0b5416SChristian König #include <linux/ktime.h>
27af0b5416SChristian König #include <linux/types.h>
28af0b5416SChristian König 
298290268fSChristian König #include "amdgpu_ring.h"
308290268fSChristian König 
318290268fSChristian König struct drm_device;
328290268fSChristian König struct drm_file;
338290268fSChristian König struct amdgpu_fpriv;
34af0b5416SChristian König struct amdgpu_ctx_mgr;
358290268fSChristian König 
36977f7e10SNirmoy Das #define AMDGPU_MAX_ENTITY_NUM 4
37977f7e10SNirmoy Das 
381b1f2fecSChristian König struct amdgpu_ctx_entity {
39af0b5416SChristian König 	uint32_t		hw_ip;
408290268fSChristian König 	uint64_t		sequence;
418290268fSChristian König 	struct drm_sched_entity	entity;
42977f7e10SNirmoy Das 	struct dma_fence	*fences[];
438290268fSChristian König };
448290268fSChristian König 
458290268fSChristian König struct amdgpu_ctx {
468290268fSChristian König 	struct kref			refcount;
4769493c03SChristian König 	struct amdgpu_ctx_mgr		*mgr;
488290268fSChristian König 	unsigned			reset_counter;
498290268fSChristian König 	unsigned			reset_counter_query;
50*f88e295eSChristian König 	uint64_t			generation;
518290268fSChristian König 	spinlock_t			ring_lock;
52977f7e10SNirmoy Das 	struct amdgpu_ctx_entity	*entities[AMDGPU_HW_IP_NUM][AMDGPU_MAX_ENTITY_NUM];
538290268fSChristian König 	bool				preamble_presented;
5484d588c3SNirmoy Das 	int32_t				init_priority;
5584d588c3SNirmoy Das 	int32_t				override_priority;
568290268fSChristian König 	atomic_t			guilty;
5764cc5414SGuchun Chen 	unsigned long			ras_counter_ce;
5864cc5414SGuchun Chen 	unsigned long			ras_counter_ue;
598cda7a4fSAlex Deucher 	uint32_t			stable_pstate;
60c30e326eSJames Zhu 	struct amdgpu_ctx_mgr		*ctx_mgr;
618290268fSChristian König };
628290268fSChristian König 
638290268fSChristian König struct amdgpu_ctx_mgr {
648290268fSChristian König 	struct amdgpu_device	*adev;
658290268fSChristian König 	struct mutex		lock;
668290268fSChristian König 	/* protected by lock */
678290268fSChristian König 	struct idr		ctx_handles;
68af0b5416SChristian König 	atomic64_t		time_spend[AMDGPU_HW_IP_NUM];
698290268fSChristian König };
708290268fSChristian König 
711b1f2fecSChristian König extern const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM];
721b1f2fecSChristian König 
738290268fSChristian König struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id);
748290268fSChristian König int amdgpu_ctx_put(struct amdgpu_ctx *ctx);
758290268fSChristian König 
760d346a14SChristian König int amdgpu_ctx_get_entity(struct amdgpu_ctx *ctx, u32 hw_ip, u32 instance,
770d346a14SChristian König 			  u32 ring, struct drm_sched_entity **entity);
7869493c03SChristian König uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx,
790d346a14SChristian König 			      struct drm_sched_entity *entity,
8069493c03SChristian König 			      struct dma_fence *fence);
818290268fSChristian König struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
820d346a14SChristian König 				       struct drm_sched_entity *entity,
830d346a14SChristian König 				       uint64_t seq);
8484d588c3SNirmoy Das bool amdgpu_ctx_priority_is_valid(int32_t ctx_prio);
8584d588c3SNirmoy Das void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx, int32_t ctx_prio);
868290268fSChristian König 
878290268fSChristian König int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
888290268fSChristian König 		     struct drm_file *filp);
898290268fSChristian König 
900d346a14SChristian König int amdgpu_ctx_wait_prev_fence(struct amdgpu_ctx *ctx,
910d346a14SChristian König 			       struct drm_sched_entity *entity);
928290268fSChristian König 
9369493c03SChristian König void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr,
9469493c03SChristian König 			 struct amdgpu_device *adev);
958290268fSChristian König void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr);
9656753e73SChristian König long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout);
978290268fSChristian König void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr);
98af0b5416SChristian König void amdgpu_ctx_mgr_usage(struct amdgpu_ctx_mgr *mgr,
99af0b5416SChristian König 			  ktime_t usage[AMDGPU_HW_IP_NUM]);
100af0b5416SChristian König 
1018290268fSChristian König #endif
102