Lines Matching +full:dev +full:- +full:handle

39  *  2001-11-16	Torsten Duwe <duwe@caldera.de>
44 #include <dev/drm2/drmP.h>
51 * Free a handle from the context bitmap.
53 * \param dev DRM device.
54 * \param ctx_handle context handle.
60 void drm_ctxbitmap_free(struct drm_device * dev, int ctx_handle) in drm_ctxbitmap_free() argument
63 dev->ctx_bitmap == NULL) { in drm_ctxbitmap_free()
64 DRM_ERROR("Attempt to free invalid context handle: %d\n", in drm_ctxbitmap_free()
69 DRM_LOCK(dev); in drm_ctxbitmap_free()
70 clear_bit(ctx_handle, dev->ctx_bitmap); in drm_ctxbitmap_free()
71 dev->context_sareas[ctx_handle] = NULL; in drm_ctxbitmap_free()
72 DRM_UNLOCK(dev); in drm_ctxbitmap_free()
78 * \param dev DRM device.
79 * \return (non-negative) context handle on success or a negative number on failure.
84 static int drm_ctxbitmap_next(struct drm_device * dev) in drm_ctxbitmap_next() argument
88 if (dev->ctx_bitmap == NULL) in drm_ctxbitmap_next()
89 return -1; in drm_ctxbitmap_next()
91 DRM_LOCK(dev); in drm_ctxbitmap_next()
92 bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP); in drm_ctxbitmap_next()
94 DRM_UNLOCK(dev); in drm_ctxbitmap_next()
95 return -1; in drm_ctxbitmap_next()
98 set_bit(bit, dev->ctx_bitmap); in drm_ctxbitmap_next()
100 if ((bit+1) > dev->max_context) { in drm_ctxbitmap_next()
104 ctx_sareas = realloc(dev->context_sareas, in drm_ctxbitmap_next()
105 max_ctx * sizeof(*dev->context_sareas), in drm_ctxbitmap_next()
108 clear_bit(bit, dev->ctx_bitmap); in drm_ctxbitmap_next()
110 DRM_UNLOCK(dev); in drm_ctxbitmap_next()
111 return -1; in drm_ctxbitmap_next()
113 dev->max_context = max_ctx; in drm_ctxbitmap_next()
114 dev->context_sareas = ctx_sareas; in drm_ctxbitmap_next()
115 dev->context_sareas[bit] = NULL; in drm_ctxbitmap_next()
117 DRM_UNLOCK(dev); in drm_ctxbitmap_next()
124 * \param dev DRM device.
128 int drm_ctxbitmap_init(struct drm_device * dev) in drm_ctxbitmap_init() argument
133 DRM_LOCK(dev); in drm_ctxbitmap_init()
134 dev->ctx_bitmap = malloc(PAGE_SIZE, DRM_MEM_CTXBITMAP, in drm_ctxbitmap_init()
136 if (dev->ctx_bitmap == NULL) { in drm_ctxbitmap_init()
137 DRM_UNLOCK(dev); in drm_ctxbitmap_init()
140 dev->context_sareas = NULL; in drm_ctxbitmap_init()
141 dev->max_context = -1; in drm_ctxbitmap_init()
142 DRM_UNLOCK(dev); in drm_ctxbitmap_init()
145 temp = drm_ctxbitmap_next(dev); in drm_ctxbitmap_init()
155 * \param dev DRM device.
160 void drm_ctxbitmap_cleanup(struct drm_device * dev) in drm_ctxbitmap_cleanup() argument
162 DRM_LOCK(dev); in drm_ctxbitmap_cleanup()
163 if (dev->context_sareas != NULL) in drm_ctxbitmap_cleanup()
164 free(dev->context_sareas, DRM_MEM_SAREA); in drm_ctxbitmap_cleanup()
165 free(dev->ctx_bitmap, DRM_MEM_CTXBITMAP); in drm_ctxbitmap_cleanup()
166 DRM_UNLOCK(dev); in drm_ctxbitmap_cleanup()
176 * Get per-context SAREA.
184 * Gets the map from drm_device::ctx_idr with the handle specified and
185 * returns its handle.
187 int drm_getsareactx(struct drm_device *dev, void *data, in drm_getsareactx() argument
193 DRM_LOCK(dev); in drm_getsareactx()
194 if (dev->max_context < 0 || in drm_getsareactx()
195 request->ctx_id >= (unsigned) dev->max_context) { in drm_getsareactx()
196 DRM_UNLOCK(dev); in drm_getsareactx()
200 map = dev->context_sareas[request->ctx_id]; in drm_getsareactx()
201 DRM_UNLOCK(dev); in drm_getsareactx()
203 request->handle = (void *)map->handle; in drm_getsareactx()
209 * Set per-context SAREA.
220 int drm_setsareactx(struct drm_device *dev, void *data, in drm_setsareactx() argument
227 DRM_LOCK(dev); in drm_setsareactx()
228 list_for_each_entry(r_list, &dev->maplist, head) { in drm_setsareactx()
229 if (r_list->map in drm_setsareactx()
230 && r_list->user_token == (unsigned long) request->handle) { in drm_setsareactx()
231 if (dev->max_context < 0) in drm_setsareactx()
233 if (request->ctx_id >= (unsigned) dev->max_context) in drm_setsareactx()
235 dev->context_sareas[request->ctx_id] = map; in drm_setsareactx()
236 DRM_UNLOCK(dev); in drm_setsareactx()
242 DRM_UNLOCK(dev); in drm_setsareactx()
255 * \param dev DRM device.
256 * \param old old context handle.
257 * \param new new context handle.
262 static int drm_context_switch(struct drm_device * dev, int old, int new) in drm_context_switch() argument
264 if (test_and_set_bit(0, &dev->context_flag)) { in drm_context_switch()
265 DRM_ERROR("Reentering -- FIXME\n"); in drm_context_switch()
266 return -EBUSY; in drm_context_switch()
271 if (new == dev->last_context) { in drm_context_switch()
272 clear_bit(0, &dev->context_flag); in drm_context_switch()
282 * \param dev DRM device.
283 * \param new new context handle.
290 static int drm_context_switch_complete(struct drm_device *dev, in drm_context_switch_complete() argument
293 dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ in drm_context_switch_complete()
294 dev->last_switch = jiffies; in drm_context_switch_complete()
296 if (!_DRM_LOCK_IS_HELD(file_priv->master->lock.hw_lock->lock)) { in drm_context_switch_complete()
303 clear_bit(0, &dev->context_flag); in drm_context_switch_complete()
304 wakeup(&dev->context_wait); in drm_context_switch_complete()
318 int drm_resctx(struct drm_device *dev, void *data, in drm_resctx() argument
325 if (res->count >= DRM_RESERVED_CONTEXTS) { in drm_resctx()
328 ctx.handle = i; in drm_resctx()
329 if (copy_to_user(&res->contexts[i], &ctx, sizeof(ctx))) in drm_resctx()
330 return -EFAULT; in drm_resctx()
333 res->count = DRM_RESERVED_CONTEXTS; in drm_resctx()
347 * Get a new handle for the context and copy to userspace.
349 int drm_addctx(struct drm_device *dev, void *data, in drm_addctx() argument
355 ctx->handle = drm_ctxbitmap_next(dev); in drm_addctx()
356 if (ctx->handle == DRM_KERNEL_CONTEXT) { in drm_addctx()
358 ctx->handle = drm_ctxbitmap_next(dev); in drm_addctx()
360 DRM_DEBUG("%d\n", ctx->handle); in drm_addctx()
361 if (ctx->handle == -1) { in drm_addctx()
363 /* Should this return -EBUSY instead? */ in drm_addctx()
364 return -ENOMEM; in drm_addctx()
370 return -ENOMEM; in drm_addctx()
373 INIT_LIST_HEAD(&ctx_entry->head); in drm_addctx()
374 ctx_entry->handle = ctx->handle; in drm_addctx()
375 ctx_entry->tag = file_priv; in drm_addctx()
377 DRM_LOCK(dev); in drm_addctx()
378 list_add(&ctx_entry->head, &dev->ctxlist); in drm_addctx()
379 ++dev->ctx_count; in drm_addctx()
380 DRM_UNLOCK(dev); in drm_addctx()
385 int drm_modctx(struct drm_device *dev, void *data, struct drm_file *file_priv) in drm_modctx() argument
400 int drm_getctx(struct drm_device *dev, void *data, struct drm_file *file_priv) in drm_getctx() argument
404 /* This is 0, because we don't handle any context flags */ in drm_getctx()
405 ctx->flags = 0; in drm_getctx()
421 int drm_switchctx(struct drm_device *dev, void *data, in drm_switchctx() argument
426 DRM_DEBUG("%d\n", ctx->handle); in drm_switchctx()
427 return drm_context_switch(dev, dev->last_context, ctx->handle); in drm_switchctx()
441 int drm_newctx(struct drm_device *dev, void *data, in drm_newctx() argument
446 DRM_DEBUG("%d\n", ctx->handle); in drm_newctx()
447 drm_context_switch_complete(dev, file_priv, ctx->handle); in drm_newctx()
463 int drm_rmctx(struct drm_device *dev, void *data, in drm_rmctx() argument
468 DRM_DEBUG("%d\n", ctx->handle); in drm_rmctx()
469 if (ctx->handle != DRM_KERNEL_CONTEXT) { in drm_rmctx()
470 if (dev->driver->context_dtor) in drm_rmctx()
471 dev->driver->context_dtor(dev, ctx->handle); in drm_rmctx()
472 drm_ctxbitmap_free(dev, ctx->handle); in drm_rmctx()
475 DRM_LOCK(dev); in drm_rmctx()
476 if (!list_empty(&dev->ctxlist)) { in drm_rmctx()
479 list_for_each_entry_safe(pos, n, &dev->ctxlist, head) { in drm_rmctx()
480 if (pos->handle == ctx->handle) { in drm_rmctx()
481 list_del(&pos->head); in drm_rmctx()
483 --dev->ctx_count; in drm_rmctx()
487 DRM_UNLOCK(dev); in drm_rmctx()