160405de4Skz151634 /*
2*d0538f66Scg149915 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
360405de4Skz151634 * Use is subject to license terms.
460405de4Skz151634 */
560405de4Skz151634
660405de4Skz151634 /*
760405de4Skz151634 * drm_context.h -- IOCTLs for generic contexts -*- linux-c -*-
860405de4Skz151634 * Created: Fri Nov 24 18:31:37 2000 by gareth@valinux.com
960405de4Skz151634 */
1060405de4Skz151634 /*
1160405de4Skz151634 * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
1260405de4Skz151634 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
1360405de4Skz151634 * All Rights Reserved.
1460405de4Skz151634 *
1560405de4Skz151634 * Permission is hereby granted, free of charge, to any person obtaining a
1660405de4Skz151634 * copy of this software and associated documentation files (the "Software"),
1760405de4Skz151634 * to deal in the Software without restriction, including without limitation
1860405de4Skz151634 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1960405de4Skz151634 * and/or sell copies of the Software, and to permit persons to whom the
2060405de4Skz151634 * Software is furnished to do so, subject to the following conditions:
2160405de4Skz151634 *
2260405de4Skz151634 * The above copyright notice and this permission notice (including the next
2360405de4Skz151634 * paragraph) shall be included in all copies or substantial portions of the
2460405de4Skz151634 * Software.
2560405de4Skz151634 *
2660405de4Skz151634 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2760405de4Skz151634 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2860405de4Skz151634 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
2960405de4Skz151634 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
3060405de4Skz151634 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
3160405de4Skz151634 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
3260405de4Skz151634 * OTHER DEALINGS IN THE SOFTWARE.
3360405de4Skz151634 *
3460405de4Skz151634 * Authors:
3560405de4Skz151634 * Rickard E. (Rik) Faith <faith@valinux.com>
3660405de4Skz151634 * Gareth Hughes <gareth@valinux.com>
3760405de4Skz151634 *
3860405de4Skz151634 */
3960405de4Skz151634
4060405de4Skz151634 #pragma ident "%Z%%M% %I% %E% SMI"
4160405de4Skz151634
4260405de4Skz151634 #include "drmP.h"
43*d0538f66Scg149915 #include "drm_io32.h"
4460405de4Skz151634
4566310b5bScg149915 static inline int
find_first_zero_bit(volatile void * p,int max)4666310b5bScg149915 find_first_zero_bit(volatile void *p, int max)
4766310b5bScg149915 {
4866310b5bScg149915 int b;
4966310b5bScg149915 volatile int *ptr = (volatile int *)p;
5066310b5bScg149915
5166310b5bScg149915 for (b = 0; b < max; b += 32) {
5266310b5bScg149915 if (ptr[b >> 5] != ~0) {
5366310b5bScg149915 for (;;) {
5466310b5bScg149915 if ((ptr[b >> 5] & (1 << (b & 0x1f))) == 0)
5566310b5bScg149915 return (b);
5666310b5bScg149915 b++;
5766310b5bScg149915 }
5866310b5bScg149915 }
5966310b5bScg149915 }
6066310b5bScg149915 return (max);
6166310b5bScg149915 }
6266310b5bScg149915
6360405de4Skz151634 /*
6460405de4Skz151634 * Context bitmap support
6560405de4Skz151634 */
6660405de4Skz151634 void
drm_ctxbitmap_free(drm_device_t * dev,int ctx_handle)6760405de4Skz151634 drm_ctxbitmap_free(drm_device_t *dev, int ctx_handle)
6860405de4Skz151634 {
6960405de4Skz151634 if (ctx_handle < 0 || ctx_handle >= DRM_MAX_CTXBITMAP ||
7060405de4Skz151634 dev->ctx_bitmap == NULL) {
7160405de4Skz151634 DRM_ERROR("drm_ctxbitmap_free: Attempt to free\
7260405de4Skz151634 invalid context handle: %d\n",
7360405de4Skz151634 ctx_handle);
7460405de4Skz151634 return;
7560405de4Skz151634 }
7660405de4Skz151634
7760405de4Skz151634 DRM_LOCK();
7860405de4Skz151634 clear_bit(ctx_handle, dev->ctx_bitmap);
7960405de4Skz151634 dev->context_sareas[ctx_handle] = NULL;
8060405de4Skz151634 DRM_UNLOCK();
8160405de4Skz151634 }
8260405de4Skz151634
8360405de4Skz151634 /* Is supposed to return -1 if any error by calling functions */
8460405de4Skz151634 int
drm_ctxbitmap_next(drm_device_t * dev)8560405de4Skz151634 drm_ctxbitmap_next(drm_device_t *dev)
8660405de4Skz151634 {
8760405de4Skz151634 int bit;
8860405de4Skz151634
8960405de4Skz151634 if (dev->ctx_bitmap == NULL)
9060405de4Skz151634 return (-1);
9160405de4Skz151634
9260405de4Skz151634 DRM_LOCK();
9360405de4Skz151634 bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP);
9460405de4Skz151634 if (bit >= DRM_MAX_CTXBITMAP) {
9560405de4Skz151634 DRM_UNLOCK();
9660405de4Skz151634 return (-1);
9760405de4Skz151634 }
9860405de4Skz151634
9960405de4Skz151634 set_bit(bit, dev->ctx_bitmap);
10060405de4Skz151634 DRM_DEBUG("drm_ctxbitmap_next: bit : %d", bit);
10160405de4Skz151634 if ((bit+1) > dev->max_context) {
10260405de4Skz151634 dev->max_context = (bit+1);
10360405de4Skz151634 if (dev->context_sareas != NULL) {
10460405de4Skz151634 drm_local_map_t **ctx_sareas;
10560405de4Skz151634 ctx_sareas = drm_realloc(dev->context_sareas,
10660405de4Skz151634 (dev->max_context - 1) *
10760405de4Skz151634 sizeof (*dev->context_sareas),
10860405de4Skz151634 dev->max_context *
10960405de4Skz151634 sizeof (*dev->context_sareas),
11060405de4Skz151634 DRM_MEM_MAPS);
11160405de4Skz151634 if (ctx_sareas == NULL) {
11260405de4Skz151634 clear_bit(bit, dev->ctx_bitmap);
11360405de4Skz151634 DRM_UNLOCK();
11460405de4Skz151634 return (-1);
11560405de4Skz151634 }
11660405de4Skz151634 dev->context_sareas = ctx_sareas;
11760405de4Skz151634 dev->context_sareas[bit] = NULL;
11860405de4Skz151634 } else {
11960405de4Skz151634 /* max_context == 1 at this point */
12060405de4Skz151634 dev->context_sareas = drm_alloc(dev->max_context *
12160405de4Skz151634 sizeof (*dev->context_sareas), KM_NOSLEEP);
12260405de4Skz151634 if (dev->context_sareas == NULL) {
12360405de4Skz151634 clear_bit(bit, dev->ctx_bitmap);
12460405de4Skz151634 DRM_UNLOCK();
12560405de4Skz151634 return (-1);
12660405de4Skz151634 }
12760405de4Skz151634 dev->context_sareas[bit] = NULL;
12860405de4Skz151634 }
12960405de4Skz151634 }
13060405de4Skz151634 DRM_UNLOCK();
13160405de4Skz151634 DRM_DEBUG("drm_ctxbitmap_next: return %d", bit);
13260405de4Skz151634 return (bit);
13360405de4Skz151634 }
13460405de4Skz151634
13560405de4Skz151634 int
drm_ctxbitmap_init(drm_device_t * dev)13660405de4Skz151634 drm_ctxbitmap_init(drm_device_t *dev)
13760405de4Skz151634 {
13860405de4Skz151634 int i;
13960405de4Skz151634 int temp;
14060405de4Skz151634
14160405de4Skz151634 DRM_LOCK();
14260405de4Skz151634 dev->ctx_bitmap = drm_calloc(1, DRM_PAGE_SIZE, DRM_MEM_CTXBITMAP);
14360405de4Skz151634 if (dev->ctx_bitmap == NULL) {
14460405de4Skz151634 DRM_UNLOCK();
145*d0538f66Scg149915 return (ENOMEM);
14660405de4Skz151634 }
14760405de4Skz151634 dev->context_sareas = NULL;
14860405de4Skz151634 dev->max_context = -1;
14960405de4Skz151634 DRM_UNLOCK();
15060405de4Skz151634
15160405de4Skz151634 for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
15260405de4Skz151634 temp = drm_ctxbitmap_next(dev);
15360405de4Skz151634 DRM_DEBUG("drm_ctxbitmap_init : %d", temp);
15460405de4Skz151634 }
15560405de4Skz151634 return (0);
15660405de4Skz151634 }
15760405de4Skz151634
15860405de4Skz151634 void
drm_ctxbitmap_cleanup(drm_device_t * dev)15960405de4Skz151634 drm_ctxbitmap_cleanup(drm_device_t *dev)
16060405de4Skz151634 {
16160405de4Skz151634 DRM_LOCK();
16260405de4Skz151634 if (dev->context_sareas != NULL)
16360405de4Skz151634 drm_free(dev->context_sareas,
16460405de4Skz151634 sizeof (*dev->context_sareas) *
16560405de4Skz151634 dev->max_context,
16660405de4Skz151634 DRM_MEM_MAPS);
16760405de4Skz151634 drm_free(dev->ctx_bitmap, DRM_PAGE_SIZE, DRM_MEM_CTXBITMAP);
16860405de4Skz151634 DRM_UNLOCK();
16960405de4Skz151634 }
17060405de4Skz151634
17160405de4Skz151634 /*
17260405de4Skz151634 * Per Context SAREA Support
17360405de4Skz151634 */
17460405de4Skz151634 /*ARGSUSED*/
17560405de4Skz151634 int
drm_getsareactx(DRM_IOCTL_ARGS)17660405de4Skz151634 drm_getsareactx(DRM_IOCTL_ARGS)
17760405de4Skz151634 {
17860405de4Skz151634 DRM_DEVICE;
17960405de4Skz151634 drm_ctx_priv_map_t request;
18060405de4Skz151634 drm_local_map_t *map;
18160405de4Skz151634
182*d0538f66Scg149915 #ifdef _MULTI_DATAMODEL
18360405de4Skz151634 if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
184*d0538f66Scg149915 drm_ctx_priv_map_32_t request32;
185*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&request32, (void *)data,
186*d0538f66Scg149915 sizeof (drm_ctx_priv_map_32_t));
18760405de4Skz151634 request.ctx_id = request32.ctx_id;
18860405de4Skz151634 request.handle = (void *)(uintptr_t)request32.handle;
18960405de4Skz151634 } else
190*d0538f66Scg149915 #endif
191*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&request, (void *)data,
19260405de4Skz151634 sizeof (request));
19360405de4Skz151634
19460405de4Skz151634 DRM_LOCK();
19560405de4Skz151634 if (dev->max_context < 0 || request.ctx_id >= (unsigned)
19660405de4Skz151634 dev->max_context) {
19760405de4Skz151634 DRM_UNLOCK();
198*d0538f66Scg149915 return (EINVAL);
19960405de4Skz151634 }
20060405de4Skz151634
20160405de4Skz151634 map = dev->context_sareas[request.ctx_id];
20260405de4Skz151634 DRM_UNLOCK();
20360405de4Skz151634
204*d0538f66Scg149915 if (!map)
205*d0538f66Scg149915 return (EINVAL);
206*d0538f66Scg149915
20760405de4Skz151634 request.handle = map->handle;
20860405de4Skz151634
209*d0538f66Scg149915 #ifdef _MULTI_DATAMODEL
21060405de4Skz151634 if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
211*d0538f66Scg149915 drm_ctx_priv_map_32_t request32;
21260405de4Skz151634 request32.ctx_id = request.ctx_id;
21360405de4Skz151634 request32.handle = (caddr32_t)(uintptr_t)request.handle;
214*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data, &request32,
215*d0538f66Scg149915 sizeof (drm_ctx_priv_map_32_t));
21660405de4Skz151634 } else
217*d0538f66Scg149915 #endif
218*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data,
219*d0538f66Scg149915 &request, sizeof (request));
22060405de4Skz151634
22160405de4Skz151634 return (0);
22260405de4Skz151634 }
22360405de4Skz151634
22460405de4Skz151634 /*ARGSUSED*/
22560405de4Skz151634 int
drm_setsareactx(DRM_IOCTL_ARGS)22660405de4Skz151634 drm_setsareactx(DRM_IOCTL_ARGS)
22760405de4Skz151634 {
22860405de4Skz151634 DRM_DEVICE;
22960405de4Skz151634 drm_ctx_priv_map_t request;
23060405de4Skz151634 drm_local_map_t *map = NULL;
23160405de4Skz151634
232*d0538f66Scg149915 #ifdef _MULTI_DATAMODEL
23360405de4Skz151634 if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
234*d0538f66Scg149915 drm_ctx_priv_map_32_t request32;
23560405de4Skz151634
236*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&request32, (void *)data,
237*d0538f66Scg149915 sizeof (drm_ctx_priv_map_32_t));
23860405de4Skz151634 request.ctx_id = request32.ctx_id;
23960405de4Skz151634 request.handle = (void *)(uintptr_t)request32.handle;
24060405de4Skz151634 } else
241*d0538f66Scg149915 #endif
242*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&request,
243*d0538f66Scg149915 (void *)data, sizeof (request));
24460405de4Skz151634
24560405de4Skz151634 DRM_LOCK();
24660405de4Skz151634 TAILQ_FOREACH(map, &dev->maplist, link) {
24760405de4Skz151634 if (map->handle == request.handle) {
24860405de4Skz151634 if (dev->max_context < 0)
24960405de4Skz151634 goto bad;
25060405de4Skz151634 if (request.ctx_id >= (unsigned)dev->max_context)
25160405de4Skz151634 goto bad;
25260405de4Skz151634 dev->context_sareas[request.ctx_id] = map;
25360405de4Skz151634 DRM_UNLOCK();
25460405de4Skz151634 return (0);
25560405de4Skz151634 }
25660405de4Skz151634 }
25760405de4Skz151634
25860405de4Skz151634 bad:
25960405de4Skz151634 DRM_UNLOCK();
260*d0538f66Scg149915 return (EINVAL);
26160405de4Skz151634 }
26260405de4Skz151634
26360405de4Skz151634 /*
26460405de4Skz151634 * The actual DRM context handling routines
26560405de4Skz151634 */
26660405de4Skz151634 int
drm_context_switch(drm_device_t * dev,int old,int new)26760405de4Skz151634 drm_context_switch(drm_device_t *dev, int old, int new)
26860405de4Skz151634 {
26960405de4Skz151634 if (test_and_set_bit(0, &dev->context_flag)) {
27060405de4Skz151634 DRM_ERROR("drm_context_switch: Reentering -- FIXME");
271*d0538f66Scg149915 return (EBUSY);
27260405de4Skz151634 }
27360405de4Skz151634
27460405de4Skz151634 DRM_DEBUG("drm_context_switch: Context switch from %d to %d",
27560405de4Skz151634 old, new);
27660405de4Skz151634
27760405de4Skz151634 if (new == dev->last_context) {
27860405de4Skz151634 clear_bit(0, &dev->context_flag);
27960405de4Skz151634 return (0);
28060405de4Skz151634 }
28160405de4Skz151634
28260405de4Skz151634 return (0);
28360405de4Skz151634 }
28460405de4Skz151634
28560405de4Skz151634 int
drm_context_switch_complete(drm_device_t * dev,int new)28660405de4Skz151634 drm_context_switch_complete(drm_device_t *dev, int new)
28760405de4Skz151634 {
28860405de4Skz151634 dev->last_context = new; /* PRE/POST: This is the _only_ writer. */
28960405de4Skz151634
29060405de4Skz151634 if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
29160405de4Skz151634 DRM_ERROR(
29260405de4Skz151634 "drm_context_switch_complete: Lock not held");
29360405de4Skz151634 }
29460405de4Skz151634 /*
29560405de4Skz151634 * If a context switch is ever initiated
29660405de4Skz151634 * when the kernel holds the lock, release
29760405de4Skz151634 * that lock here.
29860405de4Skz151634 */
29960405de4Skz151634 clear_bit(0, &dev->context_flag);
30060405de4Skz151634
30160405de4Skz151634 return (0);
30260405de4Skz151634 }
30360405de4Skz151634
30460405de4Skz151634 /*ARGSUSED*/
30560405de4Skz151634 int
drm_resctx(DRM_IOCTL_ARGS)30660405de4Skz151634 drm_resctx(DRM_IOCTL_ARGS)
30760405de4Skz151634 {
30860405de4Skz151634 drm_ctx_res_t res;
30960405de4Skz151634 drm_ctx_t ctx;
31060405de4Skz151634 int i;
31160405de4Skz151634
312*d0538f66Scg149915 #ifdef _MULTI_DATAMODEL
31360405de4Skz151634 if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
314*d0538f66Scg149915 drm_ctx_res_32_t res32;
315*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&res32, (void *)data, sizeof (res32));
31660405de4Skz151634 res.count = res32.count;
317*d0538f66Scg149915 res.contexts = (drm_ctx_t *)(uintptr_t)res32.contexts;
31860405de4Skz151634 } else
319*d0538f66Scg149915 #endif
320*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&res, (void *)data, sizeof (res));
32160405de4Skz151634
32260405de4Skz151634 if (res.count >= DRM_RESERVED_CONTEXTS) {
32360405de4Skz151634 bzero(&ctx, sizeof (ctx));
32460405de4Skz151634 for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
32560405de4Skz151634 ctx.handle = i;
326*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN(&res.contexts[i],
327*d0538f66Scg149915 &ctx, sizeof (ctx));
32860405de4Skz151634 }
32960405de4Skz151634 }
33060405de4Skz151634 res.count = DRM_RESERVED_CONTEXTS;
33160405de4Skz151634
332*d0538f66Scg149915 #ifdef _MULTI_DATAMODEL
33360405de4Skz151634 if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
334*d0538f66Scg149915 drm_ctx_res_32_t res32;
33560405de4Skz151634 res32.count = res.count;
33660405de4Skz151634 res32.contexts = (caddr32_t)(uintptr_t)res.contexts;
33760405de4Skz151634
338*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data, &res32,
339*d0538f66Scg149915 sizeof (drm_ctx_res_32_t));
34060405de4Skz151634 } else
341*d0538f66Scg149915 #endif
342*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data, &res, sizeof (res));
34360405de4Skz151634
34460405de4Skz151634 return (0);
34560405de4Skz151634 }
34660405de4Skz151634
34760405de4Skz151634 /*ARGSUSED*/
34860405de4Skz151634 int
drm_addctx(DRM_IOCTL_ARGS)34960405de4Skz151634 drm_addctx(DRM_IOCTL_ARGS)
35060405de4Skz151634 {
35160405de4Skz151634 DRM_DEVICE;
35260405de4Skz151634 drm_ctx_t ctx;
35360405de4Skz151634
354*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&ctx, (void *)data, sizeof (ctx));
35560405de4Skz151634
35660405de4Skz151634 ctx.handle = drm_ctxbitmap_next(dev);
35760405de4Skz151634 if (ctx.handle == DRM_KERNEL_CONTEXT) {
35860405de4Skz151634 /* Skip kernel's context and get a new one. */
35960405de4Skz151634 ctx.handle = drm_ctxbitmap_next(dev);
36060405de4Skz151634 }
361*d0538f66Scg149915 if (ctx.handle == (drm_context_t)-1) {
362*d0538f66Scg149915 return (ENOMEM);
36360405de4Skz151634 }
36460405de4Skz151634
365*d0538f66Scg149915 if (dev->driver->context_ctor && ctx.handle != DRM_KERNEL_CONTEXT) {
366*d0538f66Scg149915 dev->driver->context_ctor(dev, ctx.handle);
36760405de4Skz151634 }
36860405de4Skz151634
369*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data, &ctx, sizeof (ctx));
37060405de4Skz151634
37160405de4Skz151634 return (0);
37260405de4Skz151634 }
37360405de4Skz151634
37460405de4Skz151634 /*ARGSUSED*/
37560405de4Skz151634 int
drm_modctx(DRM_IOCTL_ARGS)37660405de4Skz151634 drm_modctx(DRM_IOCTL_ARGS)
37760405de4Skz151634 {
37860405de4Skz151634 /* This does nothing */
37960405de4Skz151634 return (0);
38060405de4Skz151634 }
38160405de4Skz151634
38260405de4Skz151634 /*ARGSUSED*/
38360405de4Skz151634 int
drm_getctx(DRM_IOCTL_ARGS)38460405de4Skz151634 drm_getctx(DRM_IOCTL_ARGS)
38560405de4Skz151634 {
38660405de4Skz151634 drm_ctx_t ctx;
38760405de4Skz151634
388*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&ctx, (void *)data, sizeof (ctx));
38960405de4Skz151634
39060405de4Skz151634 /* This is 0, because we don't handle any context flags */
39160405de4Skz151634 ctx.flags = 0;
39260405de4Skz151634
393*d0538f66Scg149915 DRM_COPYTO_WITH_RETURN((void *)data, &ctx, sizeof (ctx));
39460405de4Skz151634
39560405de4Skz151634 return (0);
39660405de4Skz151634 }
39760405de4Skz151634
39860405de4Skz151634 /*ARGSUSED*/
39960405de4Skz151634 int
drm_switchctx(DRM_IOCTL_ARGS)40060405de4Skz151634 drm_switchctx(DRM_IOCTL_ARGS)
40160405de4Skz151634 {
40260405de4Skz151634 DRM_DEVICE;
40360405de4Skz151634 drm_ctx_t ctx;
40460405de4Skz151634
405*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&ctx, (void *)data, sizeof (ctx));
40660405de4Skz151634
40760405de4Skz151634 DRM_DEBUG("drm_switchctx: %d", ctx.handle);
40860405de4Skz151634 return (drm_context_switch(dev, dev->last_context, ctx.handle));
40960405de4Skz151634 }
41060405de4Skz151634
41160405de4Skz151634 /*ARGSUSED*/
41260405de4Skz151634 int
drm_newctx(DRM_IOCTL_ARGS)41360405de4Skz151634 drm_newctx(DRM_IOCTL_ARGS)
41460405de4Skz151634 {
41560405de4Skz151634 DRM_DEVICE;
41660405de4Skz151634 drm_ctx_t ctx;
41760405de4Skz151634
418*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&ctx, (void *)data, sizeof (ctx));
41960405de4Skz151634
42060405de4Skz151634 DRM_DEBUG("drm_newctx: %d", ctx.handle);
42160405de4Skz151634 (void) drm_context_switch_complete(dev, ctx.handle);
42260405de4Skz151634
42360405de4Skz151634 return (0);
42460405de4Skz151634 }
42560405de4Skz151634
42660405de4Skz151634 /*ARGSUSED*/
42760405de4Skz151634 int
drm_rmctx(DRM_IOCTL_ARGS)42860405de4Skz151634 drm_rmctx(DRM_IOCTL_ARGS)
42960405de4Skz151634 {
43060405de4Skz151634 DRM_DEVICE;
43160405de4Skz151634 drm_ctx_t ctx;
43260405de4Skz151634
433*d0538f66Scg149915 DRM_COPYFROM_WITH_RETURN(&ctx, (void *)data, sizeof (ctx));
43460405de4Skz151634
43560405de4Skz151634 DRM_DEBUG("drm_rmctx : %d", ctx.handle);
43660405de4Skz151634 if (ctx.handle != DRM_KERNEL_CONTEXT) {
437*d0538f66Scg149915 if (dev->driver->context_dtor) {
43860405de4Skz151634 DRM_LOCK();
439*d0538f66Scg149915 dev->driver->context_dtor(dev, ctx.handle);
44060405de4Skz151634 DRM_UNLOCK();
44160405de4Skz151634 }
44260405de4Skz151634
44360405de4Skz151634 drm_ctxbitmap_free(dev, ctx.handle);
44460405de4Skz151634 }
44560405de4Skz151634
44660405de4Skz151634 return (0);
44760405de4Skz151634 }
448