xf86drm.c revision 9c775d0b2f303389c24aea5e8abc1473f0cf93e8
1b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* xf86drm.c -- User-level interface to DRM device
2b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Created: Tue Jan  5 08:16:21 1999 by faith@precisioninsight.com
3b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *
4569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * All Rights Reserved.
7b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *
8b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Permission is hereby granted, free of charge, to any person obtaining a
9b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * copy of this software and associated documentation files (the "Software"),
10b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * to deal in the Software without restriction, including without limitation
11b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * and/or sell copies of the Software, and to permit persons to whom the
13b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software is furnished to do so, subject to the following conditions:
14360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
15b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * The above copyright notice and this permission notice (including the next
16b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * paragraph) shall be included in all copies or substantial portions of the
17b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software.
18360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
19b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * DEALINGS IN THE SOFTWARE.
26360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
27569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
28569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul *	    Kevin E. Martin <martin@valinux.com>
29569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul *
302ea12226a675cc8d4b95799129f143fa61d97296David Dawes * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.20 2001/04/18 18:44:39 dawes Exp $
31360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
32b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss */
33b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
34b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifdef XFree86Server
35b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86.h"
36b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86_OSproc.h"
37b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86_ansic.h"
38b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# define _DRM_MALLOC xalloc
39b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# define _DRM_FREE   xfree
40b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# ifndef XFree86LOADER
41b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  include <sys/mman.h>
42b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# endif
43b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#else
44b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <stdio.h>
45b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <stdlib.h>
46b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <unistd.h>
47b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <string.h>
48b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <ctype.h>
49b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <fcntl.h>
50b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <errno.h>
51b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <signal.h>
52b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/types.h>
53b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/stat.h>
54fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes# define stat_t struct stat
55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/ioctl.h>
56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/mman.h>
57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/time.h>
58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# ifdef DRM_USE_MALLOC
59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  define _DRM_MALLOC malloc
60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  define _DRM_FREE   free
61e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussextern int xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *);
62b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussextern int xf86RemoveSIGIOHandler(int fd);
63b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# else
64b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  include <Xlibint.h>
65b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  define _DRM_MALLOC Xmalloc
66b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  define _DRM_FREE   Xfree
67b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# endif
68b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
69b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
700813760110535d8989af187d23b4eedc4c6b225fAlan Hourihane/* No longer needed with CVS kernel modules on alpha
712ea12226a675cc8d4b95799129f143fa61d97296David Dawes#if defined(__alpha__) && defined(__linux__)
722ea12226a675cc8d4b95799129f143fa61d97296David Dawesextern unsigned long _bus_base(void);
732ea12226a675cc8d4b95799129f143fa61d97296David Dawes#define BUS_BASE _bus_base()
742ea12226a675cc8d4b95799129f143fa61d97296David Dawes#endif
750813760110535d8989af187d23b4eedc4c6b225fAlan Hourihane*/
762ea12226a675cc8d4b95799129f143fa61d97296David Dawes
77b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */
78b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED
79b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1)
80b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
81b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
82b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h"
83b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "drm.h"
84b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8588dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAJOR
8688dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAJOR 226		/* Linux */
8788dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
8888dbee54ed400a3fd5594fab506518c171167805Rik Faith
8988dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef __linux__
9088dbee54ed400a3fd5594fab506518c171167805Rik Faith#undef  DRM_MAJOR
9188dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAJOR 145		/* Should set in drm.h for *BSD */
9288dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
9388dbee54ed400a3fd5594fab506518c171167805Rik Faith
9488dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR
9588dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16
9688dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
97569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
98569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifdef __linux__
99569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#include <sys/sysmacros.h>	/* for makedev() */
100569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif
101569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
102569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev
103569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul				/* This definition needs to be changed on
104569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul                                   some systems if dev_t is a structure.
105569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul                                   If there is a header file we can get it
106569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul                                   from, there would be best. */
107569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
108569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif
109569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
110b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */
111b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
112b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strausstypedef struct drmHashEntry {
113b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int      fd;
114b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void     (*f)(int, void *, void *);
115b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void     *tagTable;
116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} drmHashEntry;
117b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
118b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size)
119b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
120b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void *pt;
121b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size);
122b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return pt;
123b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
124b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
125b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt)
126b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
127b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (pt) _DRM_FREE(pt);
128b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
129b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
130569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
131b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s)
132b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
133569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    char *retval = NULL;
134360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
135569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    if (s) {
136569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	retval = _DRM_MALLOC(strlen(s)+1);
137569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	strcpy(retval, s);
138569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
139569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
141b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
143b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd)
144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
145fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes    stat_t     st;
146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    st.st_rdev = 0;
148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    fstat(fd, &st);
149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return st.st_rdev;
150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic drmHashEntry *drmGetEntry(int fd)
153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key = drmGetKeyFromFd(fd);
155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry;
157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!drmHashTable) drmHashTable = drmHashCreate();
159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(drmHashTable, key, &value)) {
161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry           = drmMalloc(sizeof(*entry));
162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->fd       = fd;
163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->f        = NULL;
164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->tagTable = drmHashCreate();
165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(drmHashTable, key, entry);
166b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    } else {
167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry = value;
168b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return entry;
170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
171b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
17288dbee54ed400a3fd5594fab506518c171167805Rik Faithstatic int drmOpenDevice(long dev, int minor)
173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1749c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes    stat_t          st;
17588dbee54ed400a3fd5594fab506518c171167805Rik Faith    char            buf[64];
17688dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             fd;
17788dbee54ed400a3fd5594fab506518c171167805Rik Faith    mode_t          dirmode = DRM_DEV_DIRMODE;
17888dbee54ed400a3fd5594fab506518c171167805Rik Faith    mode_t          devmode = DRM_DEV_MODE;
17988dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             isroot  = !geteuid();
18088dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
18188dbee54ed400a3fd5594fab506518c171167805Rik Faith    uid_t           user    = DRM_DEV_UID;
18288dbee54ed400a3fd5594fab506518c171167805Rik Faith    gid_t           group   = DRM_DEV_GID;
18388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
18588dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
18688dbee54ed400a3fd5594fab506518c171167805Rik Faith    devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
18788dbee54ed400a3fd5594fab506518c171167805Rik Faith    dirmode  = (devmode & S_IRUSR) ? S_IXUSR : 0;
18888dbee54ed400a3fd5594fab506518c171167805Rik Faith    dirmode |= (devmode & S_IRGRP) ? S_IXGRP : 0;
18988dbee54ed400a3fd5594fab506518c171167805Rik Faith    dirmode |= (devmode & S_IROTH) ? S_IXOTH : 0;
19088dbee54ed400a3fd5594fab506518c171167805Rik Faith    dirmode |= devmode;
19188dbee54ed400a3fd5594fab506518c171167805Rik Faith    devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
19288dbee54ed400a3fd5594fab506518c171167805Rik Faith    group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
19388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
194569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
19588dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (stat(DRM_DIR_NAME, &st)) {
19688dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!isroot) return DRM_ERR_NOT_ROOT;
19788dbee54ed400a3fd5594fab506518c171167805Rik Faith	remove(DRM_DIR_NAME);
19888dbee54ed400a3fd5594fab506518c171167805Rik Faith	mkdir(DRM_DIR_NAME, dirmode);
199569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
20088dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
20188dbee54ed400a3fd5594fab506518c171167805Rik Faith    chown(DRM_DIR_NAME, user, group);
20288dbee54ed400a3fd5594fab506518c171167805Rik Faith    chmod(DRM_DIR_NAME, dirmode);
20388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20588dbee54ed400a3fd5594fab506518c171167805Rik Faith    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
20688dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (stat(buf, &st) || st.st_rdev != dev) {
20788dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!isroot) return DRM_ERR_NOT_ROOT;
20888dbee54ed400a3fd5594fab506518c171167805Rik Faith	remove(buf);
20988dbee54ed400a3fd5594fab506518c171167805Rik Faith	mknod(buf, S_IFCHR | devmode, dev);
210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
21188dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
21288dbee54ed400a3fd5594fab506518c171167805Rik Faith    chown(buf, user, group);
21388dbee54ed400a3fd5594fab506518c171167805Rik Faith    chmod(buf, devmode);
21488dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
21588dbee54ed400a3fd5594fab506518c171167805Rik Faith
21688dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
21788dbee54ed400a3fd5594fab506518c171167805Rik Faith    remove(buf);
21888dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
221fcc21069b7019a4a93e1ceacc175ccd682353861David Dawesstatic int drmOpenMinor(int minor, int create)
22288dbee54ed400a3fd5594fab506518c171167805Rik Faith{
22388dbee54ed400a3fd5594fab506518c171167805Rik Faith    int  fd;
22488dbee54ed400a3fd5594fab506518c171167805Rik Faith    char buf[64];
22588dbee54ed400a3fd5594fab506518c171167805Rik Faith
22688dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
22788dbee54ed400a3fd5594fab506518c171167805Rik Faith
22888dbee54ed400a3fd5594fab506518c171167805Rik Faith    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
22988dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
23088dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
23188dbee54ed400a3fd5594fab506518c171167805Rik Faith}
23288dbee54ed400a3fd5594fab506518c171167805Rik Faith
23388dbee54ed400a3fd5594fab506518c171167805Rik Faith/* drmAvailable looks for (DRM_MAJOR, 0) and returns 1 if it returns
23488dbee54ed400a3fd5594fab506518c171167805Rik Faith   information for DRM_IOCTL_VERSION.  For backward compatibility with
23588dbee54ed400a3fd5594fab506518c171167805Rik Faith   older Linux implementations, /proc/dri is also checked. */
236569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
237569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void)
238569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{
239569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    drmVersionPtr version;
240569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           retval = 0;
241569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           fd;
242360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
24388dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((fd = drmOpenMinor(0, 1)) < 0) {
24488dbee54ed400a3fd5594fab506518c171167805Rik Faith				/* Try proc for backward Linux compatibility */
24588dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!access("/proc/dri/0", R_OK)) return 1;
24688dbee54ed400a3fd5594fab506518c171167805Rik Faith	return 0;
247569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
24888dbee54ed400a3fd5594fab506518c171167805Rik Faith
24988dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((version = drmGetVersion(fd))) {
25088dbee54ed400a3fd5594fab506518c171167805Rik Faith	retval = 1;
25188dbee54ed400a3fd5594fab506518c171167805Rik Faith	drmFreeVersion(version);
25288dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
25388dbee54ed400a3fd5594fab506518c171167805Rik Faith    close(fd);
254569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
255569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
256569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul}
257569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
258e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid)
259e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{
26088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        i;
26188dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        fd;
26288dbee54ed400a3fd5594fab506518c171167805Rik Faith    const char *buf;
26388dbee54ed400a3fd5594fab506518c171167805Rik Faith
26488dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < DRM_MAX_MINOR; i++) {
26588dbee54ed400a3fd5594fab506518c171167805Rik Faith	if ((fd = drmOpenMinor(i, 0)) >= 0) {
266e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    buf = drmGetBusid(fd);
267e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    if (buf && !strcmp(buf, busid)) {
26888dbee54ed400a3fd5594fab506518c171167805Rik Faith		drmFreeBusid(buf);
26988dbee54ed400a3fd5594fab506518c171167805Rik Faith		return fd;
270e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    }
271e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    if (buf) drmFreeBusid(buf);
272e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    close(fd);
273e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	}
274e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    }
275e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    return -1;
276e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss}
277e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss
278b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name)
279b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{
28088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           i;
28188dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           fd;
28288dbee54ed400a3fd5594fab506518c171167805Rik Faith    drmVersionPtr version;
28388dbee54ed400a3fd5594fab506518c171167805Rik Faith
28401836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul    if (!drmAvailable()) {
28588dbee54ed400a3fd5594fab506518c171167805Rik Faith#if !defined(XFree86Server)
28688dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
28788dbee54ed400a3fd5594fab506518c171167805Rik Faith#else
28801836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul        /* try to load the kernel module now */
28901836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul        if (!xf86LoadKernelModule(name)) {
29001836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul            ErrorF("[drm] failed to load kernel module \"%s\"\n",
29101836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul		   name);
29201836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul            return -1;
29301836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul        }
29401836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul#endif
29588dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
29601836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul
29788dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < DRM_MAX_MINOR; i++) {
29888dbee54ed400a3fd5594fab506518c171167805Rik Faith	if ((fd = drmOpenMinor(i, 1)) >= 0) {
29988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    if ((version = drmGetVersion(fd))) {
30088dbee54ed400a3fd5594fab506518c171167805Rik Faith		if (!strcmp(version->name, name)) {
30188dbee54ed400a3fd5594fab506518c171167805Rik Faith		    drmFreeVersion(version);
30288dbee54ed400a3fd5594fab506518c171167805Rik Faith		    return fd;
30388dbee54ed400a3fd5594fab506518c171167805Rik Faith		}
30488dbee54ed400a3fd5594fab506518c171167805Rik Faith		drmFreeVersion(version);
30588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    }
30688dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
307b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
308b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
30988dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__
31088dbee54ed400a3fd5594fab506518c171167805Rik Faith				/* Backward-compatibility /proc support */
311b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    for (i = 0; i < 8; i++) {
31288dbee54ed400a3fd5594fab506518c171167805Rik Faith	char proc_name[64], buf[512];
31388dbee54ed400a3fd5594fab506518c171167805Rik Faith	char *driver, *pt, *devstring;
31488dbee54ed400a3fd5594fab506518c171167805Rik Faith	int  retcode;
31588dbee54ed400a3fd5594fab506518c171167805Rik Faith
3160371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss	sprintf(proc_name, "/proc/dri/%d/name", i);
317b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	if ((fd = open(proc_name, 0, 0)) >= 0) {
318b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    retcode = read(fd, buf, sizeof(buf)-1);
319b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    close(fd);
320b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    if (retcode) {
321b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		buf[retcode-1] = '\0';
322b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
323b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    ;
324b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		if (*pt) {	/* Device is next */
325b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    *pt = '\0';
326b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    if (!strcmp(driver, name)) { /* Match */
327b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
328b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			    ;
329b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			if (*pt) { /* Found busid */
33088dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenByBusid(++pt);
331b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			} else {	/* No busid */
33288dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenDevice(strtol(devstring, NULL, 0),i);
333b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			}
334b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    }
335b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		}
336b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    }
337569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	}
338b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
33988dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
34088dbee54ed400a3fd5594fab506518c171167805Rik Faith
341b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return -1;
342b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss}
343b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
344b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss/* drmOpen looks up the specified name and busid, and opens the device
3450371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss   found.  The entry in /dev/dri is created if necessary (and if root).
346b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss   A file descriptor is returned.  On error, the return value is
347b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss   negative. */
348b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
349b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid)
350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
351b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
352b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (busid) return drmOpenByBusid(busid);
353b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return drmOpenByName(name);
354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
355b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v)
357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!v) return;
359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->name) drmFree(v->name);
360b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->date) drmFree(v->date);
361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->desc) drmFree(v->desc);
362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
365b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v)
366b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!v) return;
368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->name) drmFree(v->name);
369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->date) drmFree(v->date);
370b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->desc) drmFree(v->desc);
371b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
372b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
373b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
374569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
375b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
376b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_major      = s->version_major;
377b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_minor      = s->version_minor;
378b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_patchlevel = s->version_patchlevel;
379b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name_len           = s->name_len;
380b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name               = drmStrdup(s->name);
381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date_len           = s->date_len;
382b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date               = drmStrdup(s->date);
383b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc_len           = s->desc_len;
384b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc               = drmStrdup(s->desc);
385b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
386b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
387b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* drmVersion obtains the version information via an ioctl.  Similar
388569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * information is available via /proc/dri. */
389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd)
391b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
392b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmVersionPtr retval;
393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_version_t *version = drmMalloc(sizeof(*version));
394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* First, get the lengths */
396b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name_len    = 0;
397b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name        = NULL;
398b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date_len    = 0;
399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date        = NULL;
400b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc_len    = 0;
401b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc        = NULL;
402360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
403b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
404b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
405b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
406b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
407b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
408b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Now, allocate space and get the data */
409b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len)
410b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->name    = drmMalloc(version->name_len + 1);
411b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len)
412b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->date    = drmMalloc(version->date_len + 1);
413b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len)
414b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->desc    = drmMalloc(version->desc_len + 1);
415360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
416b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
417b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
418b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
419b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
420b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
421b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* The results might not be null-terminated
422b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   strings, so terminate them. */
423b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
424b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len) version->name[version->name_len] = '\0';
425b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len) version->date[version->date_len] = '\0';
426b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len) version->desc[version->desc_len] = '\0';
427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
428b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Now, copy it all back into the
429b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   client-visible data structure... */
430b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    retval = drmMalloc(sizeof(*retval));
431b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmCopyVersion(retval, version);
432b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFreeKernelVersion(version);
433b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
434b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
435b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
436b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid)
437b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
438b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drmFree((void *)busid);
439b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
440b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
441b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd)
442b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
443b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
444b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
445b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = 0;
446b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = NULL;
447b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
448b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
449b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique = drmMalloc(u.unique_len + 1);
450b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
451b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique[u.unique_len] = '\0';
452b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return u.unique;
453b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
454b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
455b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid)
456b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
457b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
458b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
459b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = (char *)busid;
460b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = strlen(busid);
461b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
462b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) return -errno;
463b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
464b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
465b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
466b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetMagic(int fd, drmMagicPtr magic)
467b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
468b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
469b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
470b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = 0;
471b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno;
472b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = auth.magic;
473b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
474b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
475b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
476b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmAuthMagic(int fd, drmMagic magic)
477b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
478b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
479b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
480b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    auth.magic = magic;
481b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno;
482b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
483b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
484b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
485b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmAddMap(int fd,
486b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	      drmHandle offset,
487b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	      drmSize size,
488b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	      drmMapType type,
489b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	      drmMapFlags flags,
490b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	      drmHandlePtr handle)
491b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
492b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_map_t map;
493b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
494b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.offset  = offset;
4950813760110535d8989af187d23b4eedc4c6b225fAlan Hourihane/* No longer needed with CVS kernel modules on alpha
4962ea12226a675cc8d4b95799129f143fa61d97296David Dawes#ifdef __alpha__
4972ea12226a675cc8d4b95799129f143fa61d97296David Dawes    if (type != DRM_SHM)
4982ea12226a675cc8d4b95799129f143fa61d97296David Dawes	map.offset += BUS_BASE;
4992ea12226a675cc8d4b95799129f143fa61d97296David Dawes#endif
5000813760110535d8989af187d23b4eedc4c6b225fAlan Hourihane*/
501b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.size    = size;
502b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.handle  = 0;
503b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.type    = type;
504b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.flags   = flags;
505b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno;
506b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (handle) *handle = (drmHandle)map.handle;
507b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
508b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
509b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
51074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martinint drmRmMap(int fd, drmHandle handle)
51174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
51274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_map_t map;
51374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
51474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
51574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
51674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno;
51774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
51874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
51974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
520ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
521ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann	       int agp_offset)
522b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
523b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_desc_t request;
524360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
525b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count     = count;
526b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.size      = size;
527b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.low_mark  = 0;
528b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.high_mark = 0;
529b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.flags     = flags;
530ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    request.agp_start = agp_offset;
531360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
532b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
533b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return request.count;
534b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
535b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
536b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high)
537b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
538b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
539b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
540b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
541b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
542b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
543b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
544b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
545b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
546b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!info.count) return -EINVAL;
547360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
548b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
549b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return -ENOMEM;
550360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
551b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
552b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	int retval = -errno;
553b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
554b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
555b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
556360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
557b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < info.count; i++) {
558b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].low_mark  = low  * info.list[i].count;
559b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].high_mark = high * info.list[i].count;
560b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
561b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    int retval = -errno;
562b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
563b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return retval;
564b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
565b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
566b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(info.list);
567360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
568b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
569b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
570b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
571b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list)
572b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
573b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_free_t request;
574b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
575b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count = count;
576b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.list  = list;
577b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno;
578b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
579b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
580b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
581b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd)
582b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
583b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key    = drmGetKeyFromFd(fd);
584b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
585b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
586b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDestroy(entry->tagTable);
587b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->fd       = 0;
588b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f        = NULL;
589b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->tagTable = NULL;
590b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
591b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDelete(drmHashTable, key);
592b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(entry);
593b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
594b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return close(fd);
595b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
596b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
597b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMap(int fd,
598b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	   drmHandle handle,
599b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	   drmSize size,
600b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	   drmAddressPtr address)
601b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
602c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    static unsigned long pagesize_mask = 0;
603c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
604b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (fd < 0) return -EINVAL;
605c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
606c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    if (!pagesize_mask)
607c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane	pagesize_mask = getpagesize() - 1;
608c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
609c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    size = (size + pagesize_mask) & ~pagesize_mask;
610c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
611b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
612b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (*address == MAP_FAILED) return -errno;
613b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
614b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
615b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
616b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size)
617b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
618b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return munmap(address, size);
619b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
620b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
621b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd)
622b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
623b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
624b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufInfoPtr  retval;
625b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
626b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
627b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
628b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
629b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
630b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL;
631b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
632b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (info.count) {
633b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
634b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
635360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
636b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
637b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
638b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
639b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
640b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Now, copy it all back into the
641b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   client-visible data structure... */
642b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
643b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = info.count;
644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
645b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < info.count; i++) {
646b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].count     = info.list[i].count;
647b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].size      = info.list[i].size;
648b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].low_mark  = info.list[i].low_mark;
649b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].high_mark = info.list[i].high_mark;
650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
651b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
652b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
653b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
654b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return NULL;
655b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
656b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
657b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd)
658b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
659b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_map_t bufs;
660b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufMapPtr  retval;
661b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
662360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
663b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.count = 0;
664b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.list  = NULL;
665b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
666b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
667b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (bufs.count) {
668b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
669b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
670b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
671b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
672b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(bufs.list);
673b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
674b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
675b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Now, copy it all back into the
676b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   client-visible data structure... */
677b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
678b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = bufs.count;
679b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
680b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < bufs.count; i++) {
681b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].idx     = bufs.list[i].idx;
682b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].total   = bufs.list[i].total;
683b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].used    = 0;
684b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].address = bufs.list[i].address;
685b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
688b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return NULL;
689b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
690b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
691b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs)
692b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
693b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int i;
694360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
695b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < bufs->count; i++) {
696b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	munmap(bufs->list[i].address, bufs->list[i].total);
697b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
698b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
699b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
700b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
701360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY		16
702360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
703b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request)
704b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
705b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_dma_t dma;
706360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    int ret, i = 0;
707b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
708b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Copy to hidden structure */
709b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.context         = request->context;
710b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_count      = request->send_count;
711b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_indices    = request->send_list;
712b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_sizes      = request->send_sizes;
713b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.flags           = request->flags;
714b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_count   = request->request_count;
715b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_size    = request->request_size;
716b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_indices = request->request_list;
717b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_sizes   = request->request_sizes;
718360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
719360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    do {
720360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
721360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
722360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
723360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    if ( ret == 0 ) {
724360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	request->granted_count = dma.granted_count;
725360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return 0;
726360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } else {
727360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return -errno;
728360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    }
729b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
730b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
731b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetLock(int fd, drmContext context, drmLockFlags flags)
732b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
733b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
734b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
735b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
736b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
737b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
738b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
739b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
740b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
741b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
742b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
743360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
744b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
745b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	;
746b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
747b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
748b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
749b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnlock(int fd, drmContext context)
750b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
751b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
752b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
753b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
755b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return ioctl(fd, DRM_IOCTL_UNLOCK, &lock);
756b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
757b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
758b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmContextPtr drmGetReservedContextList(int fd, int *count)
759b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
760b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_res_t res;
761b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t     *list;
762b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmContextPtr retval;
763b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
764b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
765b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.count    = 0;
766b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = NULL;
767b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
768b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
769b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!res.count) return NULL;
770b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
771b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(list   = drmMalloc(res.count * sizeof(*list)))) return NULL;
772b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
773b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(list);
774b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
775b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
776b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
777b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = list;
778b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
779b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
780b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < res.count; i++) retval[i] = list[i].handle;
781b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(list);
782b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
783b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *count = res.count;
784b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
785b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
786b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
787b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeReservedContextList(drmContextPtr pt)
788b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
789b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(pt);
790b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
791b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
792b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCreateContext(int fd, drmContextPtr handle)
793b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
794b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
795b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
796b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags = 0;	/* Modified with functions below */
797b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno;
798b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = ctx.handle;
799b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
800b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
801b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmSwitchToContext(int fd, drmContext context)
803b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
804b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
805b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
806b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
807b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno;
808b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
811b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmSetContextFlags(int fd, drmContext context, drmContextFlags flags)
812b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
813b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
814b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
815b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss				/* Context preserving means that no context
816b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   switched are done between DMA buffers
817b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   from one context and the next.  This is
818b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   suitable for use in the X server (which
819b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   promises to maintain hardware context,
820b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   or in the client-side library when
821b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   buffers are swapped on behalf of two
822b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss                                   threads. */
823b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags  = 0;
825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED;
826b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_CONTEXT_2DONLY)    ctx.flags |= _DRM_CONTEXT_2DONLY;
827b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno;
828b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
829b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
830b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
831b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetContextFlags(int fd, drmContext context, drmContextFlagsPtr flags)
832b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
833b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
834b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
835b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
836b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno;
837b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *flags = 0;
838b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED;
839b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ctx.flags & _DRM_CONTEXT_2DONLY)    *flags |= DRM_CONTEXT_2DONLY;
840b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
841b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
842360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
843b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDestroyContext(int fd, drmContext handle)
844b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
845b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
846b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = handle;
847b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno;
848b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
849b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
850b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
851b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCreateDrawable(int fd, drmDrawablePtr handle)
852b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
853b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno;
855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = draw.handle;
856b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
857b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
858b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
859b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDestroyDrawable(int fd, drmDrawable handle)
860b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
861b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
862b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    draw.handle = handle;
863b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno;
864b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
865b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
867ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd)
868ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
869ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno;
870ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
871ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
872ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
873ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd)
874ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
875ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno;
876ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
877ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
878ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
879ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode)
880ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
881ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_mode_t m;
882ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
883ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    m.mode = mode;
884ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno;
885ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
886ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
887ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
888ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type,
889ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann		unsigned long *address, unsigned long *handle)
890ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
891ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
892ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    *handle = 0;
893ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = size;
894ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = 0;
895ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.type   = type;
896ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno;
897ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (address != 0UL) *address = b.physical;
898ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    *handle = b.handle;
899ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
900ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
901ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
902ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpFree(int fd, unsigned long handle)
903ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
904ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
905ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
906ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = 0;
907ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
908ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno;
909ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
910ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
911ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
912ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpBind(int fd, unsigned long handle, unsigned long offset)
913ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
914ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
915ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
916ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
917ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = offset;
918ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno;
919ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
920ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
921ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
922ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpUnbind(int fd, unsigned long handle)
923ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
924ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
925ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
926ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
927ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = 0;
928ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno;
929ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
930ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
931ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
932ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd)
933ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
934ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
935ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
936ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
937ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_major;
938ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
939ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
940ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd)
941ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
942ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
943ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
944ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
945ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_minor;
946ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
947ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
948ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd)
949ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
950ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
951ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
952ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
953ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.mode;
954ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
955ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
956ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd)
957ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
958ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
959ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
960ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
961ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_base;
962ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
963ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
964ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd)
965ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
966ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
967ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
968ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
969ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_size;
970ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
971ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
972ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd)
973ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
974ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
975ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
976ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
977ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_used;
978ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
979ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
980ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd)
981ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
982ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
983ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
984ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
985ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_allowed;
986ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
987ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
988ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd)
989ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
990ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
991ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
992ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
993ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_vendor;
994ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
995ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
996ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd)
997ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
998ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
999ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1000ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1001ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_device;
1002ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1003ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
10045d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martinint drmScatterGatherAlloc(int fd, unsigned long size, unsigned long *handle)
10055d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
10065d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
10075d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
10085d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = 0;
10095d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = size;
10105d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = 0;
10115d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno;
10125d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = sg.handle;
10135d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
10145d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
10155d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
10165d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martinint drmScatterGatherFree(int fd, unsigned long handle)
10175d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
10185d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
10195d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
10205d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = 0;
10215d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = handle;
10225d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno;
10235d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
10245d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
10255d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
1026b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label)
1027b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    switch (err) {
1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label);   break;
1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label);   break;
1031b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NOT_ROOT:  fprintf(stderr, "%s: not root\n", label);    break;
1032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_INVALID:   fprintf(stderr, "%s: invalid args\n", label);break;
1033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    default:
1034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (err < 0) err = -err;
1035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
1036b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	break;
1037b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1038b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1039b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 1;
1040b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1041b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1042b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq)
1043b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1044b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1045b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1046b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_INST_HANDLER;
1047b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = irq;
1048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
1049b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1050b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1051b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1052b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd)
1053b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1054b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1055b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1056b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_UNINST_HANDLER;
1057b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = 0;
1058b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
1059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1060b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1061b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1062b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags)
1063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1065b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1066b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1067b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1068b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1070b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1071b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1072b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1073b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1074b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno;
1075b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1076b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1077b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1078b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
1079b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1080b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_irq_busid_t p;
1081b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1082b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.busnum  = busnum;
1083b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.devnum  = devnum;
1084b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.funcnum = funcnum;
1085b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno;
1086b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return p.irq;
1087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmAddContextTag(int fd, drmContext context, void *tag)
1090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1091b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1092b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1093b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashInsert(entry->tagTable, context, tag)) {
1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashDelete(entry->tagTable, context);
1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(entry->tagTable, context, tag);
1096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1097b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1099b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDelContextTag(int fd, drmContext context)
1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1102b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1104b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return drmHashDelete(entry->tagTable, context);
1105b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1106b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1107b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmGetContextTag(int fd, drmContext context)
1108b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1109b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1110b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
1111360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1112b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
1113b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1114b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return value;
1115b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
111774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martinint drmAddContextPrivateMapping(int fd, drmContext ctx_id, drmHandle handle)
111874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
111974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
112074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
112174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
112274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
112374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
112474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno;
112574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
112674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
112774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
112874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martinint drmGetContextPrivateMapping(int fd, drmContext ctx_id, drmHandlePtr handle)
112974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
113074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
113174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
113274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
113374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
113474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno;
113574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if (handle) *handle = (drmHandle)map.handle;
113674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
113774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
113874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
113974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
114088dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetMap(int fd, int idx, drmHandle *offset, drmSize *size,
114188dbee54ed400a3fd5594fab506518c171167805Rik Faith	      drmMapType *type, drmMapFlags *flags, drmHandle *handle,
114288dbee54ed400a3fd5594fab506518c171167805Rik Faith	      int *mtrr)
114388dbee54ed400a3fd5594fab506518c171167805Rik Faith{
114488dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_map_t map;
114588dbee54ed400a3fd5594fab506518c171167805Rik Faith
114688dbee54ed400a3fd5594fab506518c171167805Rik Faith    map.offset = idx;
114788dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
114888dbee54ed400a3fd5594fab506518c171167805Rik Faith    *offset = map.offset;
114988dbee54ed400a3fd5594fab506518c171167805Rik Faith    *size   = map.size;
115088dbee54ed400a3fd5594fab506518c171167805Rik Faith    *type   = map.type;
115188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *flags  = map.flags;
115288dbee54ed400a3fd5594fab506518c171167805Rik Faith    *handle = (unsigned long)map.handle;
115388dbee54ed400a3fd5594fab506518c171167805Rik Faith    *mtrr   = map.mtrr;
115488dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
115588dbee54ed400a3fd5594fab506518c171167805Rik Faith}
115688dbee54ed400a3fd5594fab506518c171167805Rik Faith
115788dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
115888dbee54ed400a3fd5594fab506518c171167805Rik Faith		 unsigned long *magic, unsigned long *iocs)
115988dbee54ed400a3fd5594fab506518c171167805Rik Faith{
116088dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_client_t client;
116188dbee54ed400a3fd5594fab506518c171167805Rik Faith
116288dbee54ed400a3fd5594fab506518c171167805Rik Faith    client.idx = idx;
116388dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
116488dbee54ed400a3fd5594fab506518c171167805Rik Faith    *auth      = client.auth;
116588dbee54ed400a3fd5594fab506518c171167805Rik Faith    *pid       = client.pid;
116688dbee54ed400a3fd5594fab506518c171167805Rik Faith    *uid       = client.uid;
116788dbee54ed400a3fd5594fab506518c171167805Rik Faith    *magic     = client.magic;
116888dbee54ed400a3fd5594fab506518c171167805Rik Faith    *iocs      = client.iocs;
116988dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
117088dbee54ed400a3fd5594fab506518c171167805Rik Faith}
117188dbee54ed400a3fd5594fab506518c171167805Rik Faith
117288dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats)
117388dbee54ed400a3fd5594fab506518c171167805Rik Faith{
117488dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_stats_t s;
117588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int         i;
117688dbee54ed400a3fd5594fab506518c171167805Rik Faith
117788dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
117888dbee54ed400a3fd5594fab506518c171167805Rik Faith
117988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = 0;
118088dbee54ed400a3fd5594fab506518c171167805Rik Faith    memset(stats, 0, sizeof(*stats));
118188dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
118288dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
118388dbee54ed400a3fd5594fab506518c171167805Rik Faith
118488dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE                              \
118588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
118688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%8.8s";      \
118788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 1;            \
118888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
118988dbee54ed400a3fd5594fab506518c171167805Rik Faith
119088dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT                              \
119188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
119288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
119388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
119488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "kgm";        \
119588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1000;         \
119688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
119788dbee54ed400a3fd5594fab506518c171167805Rik Faith
119888dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE                               \
119988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
120088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
120188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
120288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "KGM";        \
120388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1024;         \
120488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
120588dbee54ed400a3fd5594fab506518c171167805Rik Faith
120688dbee54ed400a3fd5594fab506518c171167805Rik Faith
120788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = s.count;
120888dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < s.count; i++) {
120988dbee54ed400a3fd5594fab506518c171167805Rik Faith	stats->data[i].value = s.data[i].value;
121088dbee54ed400a3fd5594fab506518c171167805Rik Faith	switch (s.data[i].type) {
121188dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCK:
121288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Lock";
121388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
121488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
121588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
121688dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_OPENS:
121788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Opens";
121888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "O";
121988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
122088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
122188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
122288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_CLOSES:
122388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Closes";
122488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
122588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
122688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
122788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
122888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IOCTLS:
122988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Ioctls";
123088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ioc/s";
123188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
123288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
123388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCKS:
123488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Locks";
123588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lck/s";
123688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
123788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
123888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_UNLOCKS:
123988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Unlocks";
124088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Unl/s";
124188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
124288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
124388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IRQ:
124488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "IRQs";
124588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "IRQ/s";
124688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
124788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
124888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_PRIMARY:
124988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Primary Bytes";
125088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "PB/s";
125188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
125288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
125388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SECONDARY:
125488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Secondary Bytes";
125588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "SB/s";
125688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
125788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
125888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_DMA:
125988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "DMA";
126088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "DMA/s";
126188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
126288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
126388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SPECIAL:
126488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Special DMA";
126588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "dma/s";
126688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
126788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
126888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_MISSED:
126988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Miss";
127088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ms/s";
127188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
127288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
127388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_VALUE:
127488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Value";
127588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Value";
127688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
127788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
127888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_BYTE:
127988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Bytes";
128088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "B/s";
128188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
128288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
128388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_COUNT:
128488dbee54ed400a3fd5594fab506518c171167805Rik Faith	default:
128588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Count";
128688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Cnt/s";
128788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
128888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
128988dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
129088dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
129188dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
129288dbee54ed400a3fd5594fab506518c171167805Rik Faith}
129388dbee54ed400a3fd5594fab506518c171167805Rik Faith
1294b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#if defined(XFree86Server) || defined(DRM_USE_MALLOC)
1295e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic void drmSIGIOHandler(int interrupt, void *closure)
1296b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key;
1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
1299b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ssize_t       count;
1300b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t     ctx;
1301b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    typedef void  (*_drmCallback)(int, void *, void *);
1302b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    char          buf[256];
1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmContext    old;
1304b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmContext    new;
1305b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *oldctx;
1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *newctx;
1307b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    char          *pt;
1308b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry;
1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1310b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!drmHashTable) return;
1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashFirst(drmHashTable, &key, &value)) {
1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry = value;
1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	do {
1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#if 0
1315b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    fprintf(stderr, "Trying %d\n", entry->fd);
1316b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    if ((count = read(entry->fd, buf, sizeof(buf)))) {
1318b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		buf[count] = '\0';
1319b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#if 0
1320b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		fprintf(stderr, "Got %s\n", buf);
1321b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
1322360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		for (pt = buf; *pt != ' '; ++pt); /* Find first space */
1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		++pt;
1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		old    = strtol(pt, &pt, 0);
1326b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		new    = strtol(pt, NULL, 0);
1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		oldctx = drmGetContextTag(entry->fd, old);
1328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		newctx = drmGetContextTag(entry->fd, new);
1329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#if 0
1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
1331b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
1332b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
1333b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		ctx.handle = new;
1334b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss		ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
1335b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    }
1336b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	} while (drmHashNext(drmHashTable, &key, &value));
1337b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1338b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1340b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
1341b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1342b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry     *entry;
1343b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1344b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry     = drmGetEntry(fd);
1345b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f  = f;
1346b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1347e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
1348b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1349b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmRemoveSIGIOHandler(int fd)
1351b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry     *entry = drmGetEntry(fd);
1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f = NULL;
1355360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return xf86RemoveSIGIOHandler(fd);
1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
1359