diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 30 | ||||
-rw-r--r-- | include/uapi/drm/amdgpu_drm.h | 2 |
4 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index cef3a43ab0aa..bf0c607de195 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1902,6 +1902,8 @@ int amdgpu_ctx_query(struct amdgpu_device *adev, struct amdgpu_fpriv *fpriv, | |||
1902 | uint32_t id,struct amdgpu_ctx_state *state); | 1902 | uint32_t id,struct amdgpu_ctx_state *state); |
1903 | 1903 | ||
1904 | void amdgpu_ctx_fini(struct amdgpu_fpriv *fpriv); | 1904 | void amdgpu_ctx_fini(struct amdgpu_fpriv *fpriv); |
1905 | struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id); | ||
1906 | int amdgpu_ctx_put(struct amdgpu_ctx *ctx); | ||
1905 | 1907 | ||
1906 | extern int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, | 1908 | extern int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, |
1907 | struct drm_file *filp); | 1909 | struct drm_file *filp); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index ffbe9aa9f232..86b93245bf9d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -768,8 +768,13 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
768 | uint64_t seq[AMDGPU_MAX_RINGS] = {0}; | 768 | uint64_t seq[AMDGPU_MAX_RINGS] = {0}; |
769 | struct amdgpu_ring *ring = NULL; | 769 | struct amdgpu_ring *ring = NULL; |
770 | unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout); | 770 | unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout); |
771 | struct amdgpu_ctx *ctx; | ||
771 | long r; | 772 | long r; |
772 | 773 | ||
774 | ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id); | ||
775 | if (ctx == NULL) | ||
776 | return -EINVAL; | ||
777 | |||
773 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, | 778 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, |
774 | wait->in.ring, &ring); | 779 | wait->in.ring, &ring); |
775 | if (r) | 780 | if (r) |
@@ -778,6 +783,7 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
778 | seq[ring->idx] = wait->in.handle; | 783 | seq[ring->idx] = wait->in.handle; |
779 | 784 | ||
780 | r = amdgpu_fence_wait_seq_timeout(adev, seq, true, timeout); | 785 | r = amdgpu_fence_wait_seq_timeout(adev, seq, true, timeout); |
786 | amdgpu_ctx_put(ctx); | ||
781 | if (r < 0) | 787 | if (r < 0) |
782 | return r; | 788 | return r; |
783 | 789 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 0dc3a4ebd5d3..bcd332e085f6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |||
@@ -151,3 +151,33 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data, | |||
151 | 151 | ||
152 | return r; | 152 | return r; |
153 | } | 153 | } |
154 | |||
155 | struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id) | ||
156 | { | ||
157 | struct amdgpu_ctx *ctx; | ||
158 | struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr; | ||
159 | |||
160 | mutex_lock(&mgr->lock); | ||
161 | ctx = idr_find(&mgr->ctx_handles, id); | ||
162 | if (ctx) | ||
163 | kref_get(&ctx->refcount); | ||
164 | mutex_unlock(&mgr->lock); | ||
165 | return ctx; | ||
166 | } | ||
167 | |||
168 | int amdgpu_ctx_put(struct amdgpu_ctx *ctx) | ||
169 | { | ||
170 | struct amdgpu_fpriv *fpriv; | ||
171 | struct amdgpu_ctx_mgr *mgr; | ||
172 | |||
173 | if (ctx == NULL) | ||
174 | return -EINVAL; | ||
175 | |||
176 | fpriv = ctx->fpriv; | ||
177 | mgr = &fpriv->ctx_mgr; | ||
178 | mutex_lock(&mgr->lock); | ||
179 | kref_put(&ctx->refcount, amdgpu_ctx_do_release); | ||
180 | mutex_unlock(&mgr->lock); | ||
181 | |||
182 | return 0; | ||
183 | } | ||
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index 77bc5740fd7c..ca0ea1efa3f4 100644 --- a/include/uapi/drm/amdgpu_drm.h +++ b/include/uapi/drm/amdgpu_drm.h | |||
@@ -260,7 +260,7 @@ struct drm_amdgpu_wait_cs_in { | |||
260 | uint32_t ip_type; | 260 | uint32_t ip_type; |
261 | uint32_t ip_instance; | 261 | uint32_t ip_instance; |
262 | uint32_t ring; | 262 | uint32_t ring; |
263 | uint32_t _pad; | 263 | uint32_t ctx_id; |
264 | }; | 264 | }; |
265 | 265 | ||
266 | struct drm_amdgpu_wait_cs_out { | 266 | struct drm_amdgpu_wait_cs_out { |