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