xf86drm.c revision 9810ec2737de6aa81e764225f580e4ea39de437a
1d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \file xf86drm.c
3d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * User-level interface to DRM device
4b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *
5d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Rickard E. (Rik) Faith <faith@valinux.com>
6d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Kevin E. Martin <martin@valinux.com>
7d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
8d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
9d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/*
10569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
11569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
12b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * All Rights Reserved.
13b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *
14b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Permission is hereby granted, free of charge, to any person obtaining a
15b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * copy of this software and associated documentation files (the "Software"),
16b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * to deal in the Software without restriction, including without limitation
17b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * the rights to use, copy, modify, merge, publish, distribute, sublicense,
18b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * and/or sell copies of the Software, and to permit persons to whom the
19b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software is furnished to do so, subject to the following conditions:
20360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
21b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * The above copyright notice and this permission notice (including the next
22b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * paragraph) shall be included in all copies or substantial portions of the
23b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software.
24360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes *
25b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
28b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
29b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
30b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
31b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * DEALINGS IN THE SOFTWARE.
32b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss */
33b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
34f28dddb5515cb1c16f8c29e025195ea29d9f01d4Adam Jackson#ifdef HAVE_XORG_CONFIG_H
35f28dddb5515cb1c16f8c29e025195ea29d9f01d4Adam Jackson#include <xorg-config.h>
36f28dddb5515cb1c16f8c29e025195ea29d9f01d4Adam Jackson#endif
37f28dddb5515cb1c16f8c29e025195ea29d9f01d4Adam Jackson
38b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifdef XFree86Server
39b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86.h"
40b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86_OSproc.h"
41b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane# include "drm.h"
42b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include "xf86_ansic.h"
43b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# define _DRM_MALLOC xalloc
44b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# define _DRM_FREE   xfree
45b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# ifndef XFree86LOADER
46b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#  include <sys/mman.h>
47b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# endif
48b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#else
49b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <stdio.h>
50b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <stdlib.h>
51b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <unistd.h>
52b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <string.h>
53b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <ctype.h>
54b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <fcntl.h>
55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <errno.h>
56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <signal.h>
57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/types.h>
58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/stat.h>
59fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes# define stat_t struct stat
60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/ioctl.h>
61b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/mman.h>
62b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss# include <sys/time.h>
6356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes# include <stdarg.h>
646941b375e86542d669366a45553ec536f9d98e48Adam Jackson# define _DRM_MALLOC malloc
656941b375e86542d669366a45553ec536f9d98e48Adam Jackson# define _DRM_FREE   free
66b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane# include "drm.h"
67b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
6823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
69b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
70b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */
71b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED
72b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1)
73b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
74b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
75b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h"
76b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
77ea08b613bdc496b0e1aa3b723f8462d2c40ed8e5Adam Jackson#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
78cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145
79cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif
80cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt
81cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__
82cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34
8388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
8488dbee54ed400a3fd5594fab506518c171167805Rik Faith
85b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__
86b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#  define DRM_MAJOR 81
87b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif
88b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
89cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR
90cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226		/* Linux */
9188dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
9288dbee54ed400a3fd5594fab506518c171167805Rik Faith
9388dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR
9488dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16
9588dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
96569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
9722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/*
9822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure.
9922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best.
10022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */
101569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev
102569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
103569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif
104569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
10556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3
10656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr.
109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
110d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string.
111d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
112d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
113d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf().
114d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
11556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawesstatic void
11656bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...)
11756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{
11856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    va_list	ap;
11956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
12056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#ifndef XFree86Server
12156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    const char *env;
12256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose"))
12356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#endif
12456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    {
12556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_start(ap, format);
12656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#ifdef XFree86Server
12756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
12856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#else
12956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	vfprintf(stderr, format, ap);
13056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#endif
13156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_end(ap);
13256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
13356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes}
13456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
135b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */
136b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
137b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strausstypedef struct drmHashEntry {
138b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int      fd;
139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void     (*f)(int, void *, void *);
140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void     *tagTable;
141b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} drmHashEntry;
142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
143b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size)
144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void *pt;
146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size);
147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return pt;
148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt)
151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (pt) _DRM_FREE(pt);
153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
155569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s)
157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
15848198970ce449165fe1c7294108ca3afc775563dAdam Jackson    char *retval;
15948198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16048198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!s)
16148198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
16248198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16348198970ce449165fe1c7294108ca3afc775563dAdam Jackson    retval = _DRM_MALLOC(strlen(s)+1);
16448198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!retval)
16548198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
16648198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16748198970ce449165fe1c7294108ca3afc775563dAdam Jackson    strcpy(retval, s);
168360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
169569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
171b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
172b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd)
174b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
175fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes    stat_t     st;
176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    st.st_rdev = 0;
178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    fstat(fd, &st);
179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return st.st_rdev;
180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic drmHashEntry *drmGetEntry(int fd)
183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key = drmGetKeyFromFd(fd);
185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry;
187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!drmHashTable) drmHashTable = drmHashCreate();
189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(drmHashTable, key, &value)) {
191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry           = drmMalloc(sizeof(*entry));
192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->fd       = fd;
193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->f        = NULL;
194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->tagTable = drmHashCreate();
195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(drmHashTable, key, entry);
196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    } else {
197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry = value;
198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return entry;
200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
20306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings
20406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
20506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first
20606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second
20706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
20806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched.
20906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
21006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
21106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings.  It understands the older
21206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format.  In the format, o is
21306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function.
21406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
21506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholtstatic int drmMatchBusID(const char *id1, const char *id2)
21606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
21706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* First, check if the IDs are exactly the same */
21806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strcasecmp(id1, id2) == 0)
21906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return 1;
22006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
22106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Try to match old/new-style PCI bus IDs. */
22206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strncasecmp(id1, "pci", 3) == 0) {
22306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o1, b1, d1, f1;
22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o2, b2, d2, f2;
22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int ret;
22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1);
22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o1 = 0;
23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1);
23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
23506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2);
23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o2 = 0;
23806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2);
23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2))
24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 0;
24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	else
24606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 1;
24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return 0;
24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
25106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
252d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary.
253d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
254d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device.
255d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device.
256d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
257d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
258d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
259d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
260d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device
261d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and
262d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root.
263d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
26488dbee54ed400a3fd5594fab506518c171167805Rik Faithstatic int drmOpenDevice(long dev, int minor)
265b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2669c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes    stat_t          st;
26788dbee54ed400a3fd5594fab506518c171167805Rik Faith    char            buf[64];
26888dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             fd;
26988dbee54ed400a3fd5594fab506518c171167805Rik Faith    mode_t          devmode = DRM_DEV_MODE;
27088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             isroot  = !geteuid();
27188dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
27288dbee54ed400a3fd5594fab506518c171167805Rik Faith    uid_t           user    = DRM_DEV_UID;
27388dbee54ed400a3fd5594fab506518c171167805Rik Faith    gid_t           group   = DRM_DEV_GID;
27488dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
275b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
27606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
27706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenDevice: node name is %s\n", buf);
27856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
27988dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
28088dbee54ed400a3fd5594fab506518c171167805Rik Faith    devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
28188dbee54ed400a3fd5594fab506518c171167805Rik Faith    devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
28288dbee54ed400a3fd5594fab506518c171167805Rik Faith    group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
28388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
284569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
28588dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (stat(DRM_DIR_NAME, &st)) {
28688dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!isroot) return DRM_ERR_NOT_ROOT;
287b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
288b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chown(DRM_DIR_NAME, 0, 0); /* root:root */
289b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
290569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
29206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node exists and create it if necessary. */
293d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (stat(buf, &st)) {
29488dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!isroot) return DRM_ERR_NOT_ROOT;
29588dbee54ed400a3fd5594fab506518c171167805Rik Faith	remove(buf);
29688dbee54ed400a3fd5594fab506518c171167805Rik Faith	mknod(buf, S_IFCHR | devmode, dev);
297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
29888dbee54ed400a3fd5594fab506518c171167805Rik Faith#if defined(XFree86Server)
29988dbee54ed400a3fd5594fab506518c171167805Rik Faith    chown(buf, user, group);
30088dbee54ed400a3fd5594fab506518c171167805Rik Faith    chmod(buf, devmode);
30188dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
30288dbee54ed400a3fd5594fab506518c171167805Rik Faith
30356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    fd = open(buf, O_RDWR, 0);
30456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
30556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		fd, fd < 0 ? strerror(errno) : "OK");
30656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    if (fd >= 0) return fd;
307d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
30806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node is not what we expect it to be, and recreate it
30906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     * and try again if so.
31006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     */
311d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (st.st_rdev != dev) {
312d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	if (!isroot) return DRM_ERR_NOT_ROOT;
313d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	remove(buf);
314d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	mknod(buf, S_IFCHR | devmode, dev);
31506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt#if defined(XFree86Server)
31606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	chown(buf, user, group);
31706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	chmod(buf, devmode);
31806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt#endif
319d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    }
320d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    fd = open(buf, O_RDWR, 0);
321d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
322d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt		fd, fd < 0 ? strerror(errno) : "OK");
323c869f4a1e59c4fa0bed5681cad5ad49e685603ebBrian Paul    if (fd >= 0) return fd;
324d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
32556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: Open failed\n");
32688dbee54ed400a3fd5594fab506518c171167805Rik Faith    remove(buf);
32788dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device
333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number.
335d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set.
336d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
337d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
338d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
339d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
340d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device
341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it.
342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
343fcc21069b7019a4a93e1ceacc175ccd682353861David Dawesstatic int drmOpenMinor(int minor, int create)
34488dbee54ed400a3fd5594fab506518c171167805Rik Faith{
34588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int  fd;
34688dbee54ed400a3fd5594fab506518c171167805Rik Faith    char buf[64];
34788dbee54ed400a3fd5594fab506518c171167805Rik Faith
34888dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
34988dbee54ed400a3fd5594fab506518c171167805Rik Faith
35088dbee54ed400a3fd5594fab506518c171167805Rik Faith    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
35188dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
35288dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
35388dbee54ed400a3fd5594fab506518c171167805Rik Faith}
35488dbee54ed400a3fd5594fab506518c171167805Rik Faith
355569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
356d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
357d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded.
358d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
359d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise.
360d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
361d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
362d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0
363d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information.  For backward compatibility with older
364d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked.
365d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
366569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void)
367569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{
368569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    drmVersionPtr version;
369569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           retval = 0;
370569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           fd;
371360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
37288dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((fd = drmOpenMinor(0, 1)) < 0) {
373b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__
37422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	/* Try proc for backward Linux compatibility */
37588dbee54ed400a3fd5594fab506518c171167805Rik Faith	if (!access("/proc/dri/0", R_OK)) return 1;
376b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif
37788dbee54ed400a3fd5594fab506518c171167805Rik Faith	return 0;
378569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
37988dbee54ed400a3fd5594fab506518c171167805Rik Faith
38088dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((version = drmGetVersion(fd))) {
38188dbee54ed400a3fd5594fab506518c171167805Rik Faith	retval = 1;
38288dbee54ed400a3fd5594fab506518c171167805Rik Faith	drmFreeVersion(version);
38388dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
38488dbee54ed400a3fd5594fab506518c171167805Rik Faith    close(fd);
385569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
386569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
387569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul}
388569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
389d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
390d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
391d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID.
392d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
393d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID.
394d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
395d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
396d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
397d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
398d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR),
399d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied.
400d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
401d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid().
402d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
403e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid)
404e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{
40588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        i;
40688dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        fd;
40788dbee54ed400a3fd5594fab506518c171167805Rik Faith    const char *buf;
40806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmSetVersion sv;
40906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
41006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
41188dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < DRM_MAX_MINOR; i++) {
41256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	fd = drmOpenMinor(i, 1);
41356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
41456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	if (fd >= 0) {
41506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_major = 1;
41606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_minor = 1;
41706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_dd_major = -1;	/* Don't care */
41826462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt	    sv.drm_dd_minor = -1;	/* Don't care */
41906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    drmSetInterfaceVersion(fd, &sv);
420e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    buf = drmGetBusid(fd);
42156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
42206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (buf && drmMatchBusID(buf, busid)) {
42388dbee54ed400a3fd5594fab506518c171167805Rik Faith		drmFreeBusid(buf);
42488dbee54ed400a3fd5594fab506518c171167805Rik Faith		return fd;
425e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    }
426e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    if (buf) drmFreeBusid(buf);
427e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    close(fd);
428e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	}
429e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    }
430e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    return -1;
431e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss}
432e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss
433d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
434d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
435d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name.
436d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
437d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name.
438d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
439d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
440d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
441d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and
443d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use.  If it's in use it then it will already have a bus ID
444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned.
445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid().
447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
448b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name)
449b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{
45088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           i;
45188dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           fd;
45288dbee54ed400a3fd5594fab506518c171167805Rik Faith    drmVersionPtr version;
45356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    char *        id;
45488dbee54ed400a3fd5594fab506518c171167805Rik Faith
45501836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul    if (!drmAvailable()) {
45688dbee54ed400a3fd5594fab506518c171167805Rik Faith#if !defined(XFree86Server)
45788dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
45888dbee54ed400a3fd5594fab506518c171167805Rik Faith#else
45901836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul        /* try to load the kernel module now */
460ae5b4effc05cd5ac44ab44c5c733c6599652f1ebJeff Hartmann        if (!xf86LoadKernelModule(name)) {
46101836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul            ErrorF("[drm] failed to load kernel module \"%s\"\n",
46201836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul		   name);
46301836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul            return -1;
46401836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul        }
46501836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul#endif
46688dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
46701836824d5b3dd4833573ebf3f98ed4cfb9cd5b3Brian Paul
46856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    /*
46956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * Open the first minor number that matches the driver name and isn't
47056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * already in use.  If it's in use it will have a busid assigned already.
47156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     */
47288dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < DRM_MAX_MINOR; i++) {
47388dbee54ed400a3fd5594fab506518c171167805Rik Faith	if ((fd = drmOpenMinor(i, 1)) >= 0) {
47488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    if ((version = drmGetVersion(fd))) {
47588dbee54ed400a3fd5594fab506518c171167805Rik Faith		if (!strcmp(version->name, name)) {
47688dbee54ed400a3fd5594fab506518c171167805Rik Faith		    drmFreeVersion(version);
47756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    id = drmGetBusid(fd);
47856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
47956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    if (!id || !*id) {
48022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			if (id)
48156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			    drmFreeBusid(id);
48256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			return fd;
48356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    } else {
48456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			drmFreeBusid(id);
48556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    }
48656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		} else {
48756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmFreeVersion(version);
48888dbee54ed400a3fd5594fab506518c171167805Rik Faith		}
48988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    }
49056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    close(fd);
49188dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
492b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
493b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
49488dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__
49522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* Backward-compatibility /proc support */
496b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    for (i = 0; i < 8; i++) {
49788dbee54ed400a3fd5594fab506518c171167805Rik Faith	char proc_name[64], buf[512];
49888dbee54ed400a3fd5594fab506518c171167805Rik Faith	char *driver, *pt, *devstring;
49988dbee54ed400a3fd5594fab506518c171167805Rik Faith	int  retcode;
50088dbee54ed400a3fd5594fab506518c171167805Rik Faith
5010371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss	sprintf(proc_name, "/proc/dri/%d/name", i);
502b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	if ((fd = open(proc_name, 0, 0)) >= 0) {
503b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    retcode = read(fd, buf, sizeof(buf)-1);
504b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    close(fd);
505b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    if (retcode) {
506b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		buf[retcode-1] = '\0';
507b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
508b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    ;
50922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson		if (*pt) { /* Device is next */
510b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    *pt = '\0';
511b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    if (!strcmp(driver, name)) { /* Match */
512b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
513b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			    ;
514b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			if (*pt) { /* Found busid */
51588dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenByBusid(++pt);
51622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			} else { /* No busid */
51788dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenDevice(strtol(devstring, NULL, 0),i);
518b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			}
519b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    }
520b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		}
521b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    }
522569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	}
523b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
52488dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
52588dbee54ed400a3fd5594fab506518c171167805Rik Faith
526b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return -1;
527b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss}
528b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
529b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device.
532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found.  The
534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root.
535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied.
537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known.
538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName()
543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise.
544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
545b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid)
546b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
54706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt#ifdef XFree86Server
54806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (!drmAvailable() && name != NULL) {
54906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	/* try to load the kernel */
55006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (!xf86LoadKernelModule(name)) {
55106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ErrorF("[drm] failed to load kernel module \"%s\"\n",
55206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	           name);
55306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return -1;
55406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
55506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
55606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt#endif
55706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
55806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (busid) {
55906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int fd;
560b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
56106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	fd = drmOpenByBusid(busid);
56206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (fd >= 0)
56306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return fd;
56406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
56522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
56606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (name)
56706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return drmOpenByName(name);
56822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
56906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return -1;
570b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
571b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
572d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
573d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
574d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion().
575d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
576d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
577d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
578d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
579d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings
580d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it.
581d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
582b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v)
583b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
584b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!v) return;
585b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->name) drmFree(v->name);
586b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->date) drmFree(v->date);
587b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->desc) drmFree(v->desc);
588b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
589b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
590b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel.
594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
597d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all
599d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it.
600d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
601b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v)
602b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
603b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!v) return;
604b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->name) drmFree(v->name);
605b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->date) drmFree(v->date);
606b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (v->desc) drmFree(v->desc);
607b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
608b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
609b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information.
613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer.
615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer.
616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl
619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart.
620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
621569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
622b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
623b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_major      = s->version_major;
624b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_minor      = s->version_minor;
625b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_patchlevel = s->version_patchlevel;
626b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name_len           = s->name_len;
627b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name               = drmStrdup(s->name);
628b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date_len           = s->date_len;
629b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date               = drmStrdup(s->date);
630b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc_len           = s->desc_len;
631b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc               = drmStrdup(s->desc);
632b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
633b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
634b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information.
637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
639d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
640d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with
641d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion().
642d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
643d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri.
644d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
645d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
646d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls,
647d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings.
648d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already.
649d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd)
651b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
652b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmVersionPtr retval;
653b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_version_t *version = drmMalloc(sizeof(*version));
654b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
655b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name_len    = 0;
656b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name        = NULL;
657b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date_len    = 0;
658b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date        = NULL;
659b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc_len    = 0;
660b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc        = NULL;
661360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
662b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
663b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
664b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
665b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
666b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
667b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len)
668b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->name    = drmMalloc(version->name_len + 1);
669b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len)
670b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->date    = drmMalloc(version->date_len + 1);
671b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len)
672b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->desc    = drmMalloc(version->desc_len + 1);
673360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
674b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
675b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane	drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
676b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
677b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
678b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
679b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
68022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* The results might not be null-terminated strings, so terminate them. */
681b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len) version->name[version->name_len] = '\0';
682b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len) version->date[version->date_len] = '\0';
683b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len) version->desc[version->desc_len] = '\0';
684b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
685b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    retval = drmMalloc(sizeof(*retval));
686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmCopyVersion(retval, version);
687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFreeKernelVersion(version);
688b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
689b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
690b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
6913903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
692d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
693d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library.
694d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
695d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent.
696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information.
700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded
703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number.
704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
7053903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd)
7063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
7073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    drm_version_t *version = drmMalloc(sizeof(*version));
7083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7093903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    /* Version history:
7103903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
7113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    entry point and many drm<Device> extensions
7123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.1.x = added drmCommand entry points for device extensions
7133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    added drmGetLibVersion to identify libdrm.a version
71406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *   revision 1.2.x = added drmSetInterfaceVersion
71506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *                    modified drmOpen to handle both busid and name
7163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     */
7173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    version->version_major      = 1;
71806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->version_minor      = 2;
7193903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    version->version_patchlevel = 0;
7203903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return (drmVersionPtr)version;
7223903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
7233903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information.
727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid().
729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
731d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid.
732d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
733b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid)
734b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
735b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drmFree((void *)busid);
736b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
737b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
738d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
739d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device.
741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string.
745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to
748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique
749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure.
750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
751b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd)
752b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
753b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
755b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = 0;
756b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = NULL;
757b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
758b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
759b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique = drmMalloc(u.unique_len + 1);
760b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
761b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique[u.unique_len] = '\0';
76206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
763b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return u.unique;
764b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
765b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device.
769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
770d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
771d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string.
772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
773d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure.
774d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
775d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
776d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
777d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure.
778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
779b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid)
780b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
781b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
782b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
783b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = (char *)busid;
784b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = strlen(busid);
785b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
78656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
78756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	return -errno;
78856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
789b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
790b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
791b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
7928696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic)
793b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
794b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
795b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
796b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = 0;
797b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno;
798b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = auth.magic;
799b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
800b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
801b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8028696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic)
803b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
804b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
805b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
806b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    auth.magic = magic;
807b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno;
808b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a
813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process.
814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
816d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of
817d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below.
818d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes.
819d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped.
820d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions.
821d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset
822d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap().
823d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
824d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error.
825d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer
827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer
828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer,
829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and
830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER.
831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the
834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining.
835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area
837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area,
838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area,
839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and
840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS.
841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached.
843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA
845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA,
846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero,
847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes,
848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM.
849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in
852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle
853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned.
854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing
859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure.
860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
86122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
86222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	      drmMapFlags flags, drm_handle_t *handle)
863b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
864b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_map_t map;
865b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.offset  = offset;
867b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.size    = size;
868b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.handle  = 0;
869b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.type    = type;
870b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.flags   = flags;
871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno;
8728696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    if (handle) *handle = (drm_handle_t)map.handle;
873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
874b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
875b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8768696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle)
87774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
87874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_map_t map;
87974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
88074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
88174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
88274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno;
88374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
88474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
88574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
886d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
887d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers.
888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers.
891d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer.
892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags.
893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture
894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
895d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error.
896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.
899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc.
901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
902ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
903ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann	       int agp_offset)
904b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
905b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_desc_t request;
906360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
907b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count     = count;
908b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.size      = size;
909b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.low_mark  = 0;
910b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.high_mark = 0;
911b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.flags     = flags;
912ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    request.agp_start = agp_offset;
913360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
914b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
915b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return request.count;
916b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
917b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
918b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high)
919b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
920b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
921b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
922b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
923b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
924b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
925b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
926b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
927b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
928b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!info.count) return -EINVAL;
929360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
930b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
931b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return -ENOMEM;
932360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
933b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
934b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	int retval = -errno;
935b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
937b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
938360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
939b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < info.count; i++) {
940b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].low_mark  = low  * info.list[i].count;
941b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].high_mark = high * info.list[i].count;
942b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
943b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    int retval = -errno;
944b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return retval;
946b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
947b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(info.list);
949360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
952b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
953d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
954d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers.
955d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
956d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
957d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free.
958d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed.
959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging.
963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure.
967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list)
969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
970b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_free_t request;
971b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count = count;
973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.list  = list;
974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno;
975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
977b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
978d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
979d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
980d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device.
981d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
982d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
983d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor.
986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
987b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd)
988b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
989b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key    = drmGetKeyFromFd(fd);
990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
991b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
992b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDestroy(entry->tagTable);
993b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->fd       = 0;
994b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f        = NULL;
995b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->tagTable = NULL;
996b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDelete(drmHashTable, key);
998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(entry);
999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return close(fd);
1001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1003d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1004d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1005d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory.
1006d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1007d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1008d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap().
1009d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap().
1010d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping
1011d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins.
1012d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1016d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap().
1017d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
101822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1020c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    static unsigned long pagesize_mask = 0;
1021c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1022b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (fd < 0) return -EINVAL;
1023c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1024c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    if (!pagesize_mask)
1025c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane	pagesize_mask = getpagesize() - 1;
1026c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1027c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    size = (size + pagesize_mask) & ~pagesize_mask;
1028c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (*address == MAP_FAILED) return -errno;
1031b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1034d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1035d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap().
1037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap().
1039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap().
1040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
104422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap().
1045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1046b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size)
1047b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return munmap(address, size);
1049b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1050b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1051b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd)
1052b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1053b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
1054b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufInfoPtr  retval;
1055b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
1056b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1057b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
1058b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
1059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1060b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL;
1061b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1062b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (info.count) {
1063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
1064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1065360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1066b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
1067b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
1068b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
107022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1071b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1072b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = info.count;
1073b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
1074b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < info.count; i++) {
1075b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].count     = info.list[i].count;
1076b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].size      = info.list[i].size;
1077b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].low_mark  = info.list[i].low_mark;
1078b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].high_mark = info.list[i].high_mark;
1079b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
1080b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
1081b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1082b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1083b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return NULL;
1084b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1085b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1086d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1087d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space.
1088d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1089d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1090d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1091d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure.
1092d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1093d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices
1094d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA().
1095d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1096d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1097d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned
1098d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the
1099d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures.
1100d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd)
1102b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_map_t bufs;
1104b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufMapPtr  retval;
1105b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1106360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1107b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.count = 0;
1108b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.list  = NULL;
11098696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    bufs.virtual = NULL;
1110b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
1111b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
11128696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    if (!bufs.count) return NULL;
11138696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1114b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
1115b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1117b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
1118b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(bufs.list);
1119b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1120b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
112122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1122b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1123b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = bufs.count;
1124b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
1125b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < bufs.count; i++) {
1126b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].idx     = bufs.list[i].idx;
1127b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].total   = bufs.list[i].total;
1128b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].used    = 0;
1129b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].address = bufs.list[i].address;
1130b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
11318696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
11328696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	drmFree(bufs.list);
11338696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1135b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1136b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1137d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1138d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1139d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs().
1140d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1141d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure.
1142d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1143d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
11448696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the
11458696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs().
1146d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs)
1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int i;
1150360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < bufs->count; i++) {
1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	munmap(bufs->list[i].address, bufs->list[i].total);
1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
11548696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
11558696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs->list);
11568696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs);
11578696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1161d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1162360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY		16
1163360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1164d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1165d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers.
1166d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1167d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1168d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request
1169d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1170d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1172d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1173d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the
1174d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries.
1175d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request)
1177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_dma_t dma;
1179360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    int ret, i = 0;
1180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.context         = request->context;
1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_count      = request->send_count;
1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_indices    = request->send_list;
1184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_sizes      = request->send_sizes;
1185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.flags           = request->flags;
1186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_count   = request->request_count;
1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_size    = request->request_size;
1188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_indices = request->request_list;
1189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_sizes   = request->request_sizes;
11908696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    dma.granted_count   = 0;
1191360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1192360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    do {
1193360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
1194360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
1195360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1196360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    if ( ret == 0 ) {
1197360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	request->granted_count = dma.granted_count;
1198360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return 0;
1199360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } else {
1200360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return -errno;
1201360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    }
1202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1204d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1205d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1206d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock.
1207d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1209d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1210d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function
1211d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns.
1212d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero.
1214d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1215d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1216d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue
1217d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.
1218d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
12198696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1223b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1224b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1225b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1227b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1228b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1229b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1230b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1231360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
1233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	;
1234b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1235b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock.
1239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the
1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure.
1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
12498696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context)
1250b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1252b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1253b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return ioctl(fd, DRM_IOCTL_UNLOCK, &lock);
1256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
125822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count)
1259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1260b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_res_t res;
1261b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t     *list;
12628696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drm_context_t * retval;
1263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1265b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.count    = 0;
1266b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = NULL;
1267b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
1268b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1269b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!res.count) return NULL;
1270b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1271b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(list   = drmMalloc(res.count * sizeof(*list)))) return NULL;
1272b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
1273b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(list);
1274b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
1275b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1276b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1277b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = list;
1278b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
1279b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1280b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < res.count; i++) retval[i] = list[i].handle;
1281b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(list);
1282b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1283b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *count = res.count;
1284b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
1285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
128722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt)
1288b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(pt);
1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1292d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1293d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context.
1294d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1295d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes
1296d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated.
1297d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1298d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1299d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA
1300d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA().
1301d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1304d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1305d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1306d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1307d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the
1308d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1309d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
131022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle)
1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags = 0;	/* Modified with functions below */
1315b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno;
1316b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = ctx.handle;
1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1318b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1319b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13208696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context)
1321b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1322b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno;
1326b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13298696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1331b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1332b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
133322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /*
133422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * Context preserving means that no context switches are done between DMA
133522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * buffers from one context and the next.  This is suitable for use in the
133622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * X server (which promises to maintain hardware context), or in the
133722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * client-side library when buffers are swapped on behalf of two threads.
133822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     */
1339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1340b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags  = 0;
1341b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED;
1342b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_CONTEXT_2DONLY)    ctx.flags |= _DRM_CONTEXT_2DONLY;
1343b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno;
1344b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1345b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1346b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
134722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context,
134822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                       drm_context_tFlagsPtr flags)
1349b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1351b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno;
1354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *flags = 0;
1355b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED;
1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ctx.flags & _DRM_CONTEXT_2DONLY)    *flags |= DRM_CONTEXT_2DONLY;
1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1359360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1360d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1361d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context.
1362d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1363d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated
1364d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context.
1365d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1366d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1367d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext().
1368d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1369d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1370d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1371d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1372d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1373d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1374d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the
1375d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1376d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
13778696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle)
1378b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1379b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1380b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = handle;
1381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno;
1382b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1383b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1384b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
138522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle)
1386b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1387b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
1388b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno;
1389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = draw.handle;
1390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1391b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1392b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13938696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle)
1394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
1396b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    draw.handle = handle;
1397b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno;
1398b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1400b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14019810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
14029810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   drm_drawable_info_type_t type, unsigned int num,
14039810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   void *data)
14049810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{
14059810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    drm_update_draw_t update;
14069810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14079810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.handle = handle;
14089810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.type = type;
14099810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.num = num;
14109810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.data = (unsigned long long)(unsigned long)data;
14119810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14129810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) return -errno;
14139810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14149810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    return 0;
14159810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer}
14169810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
1417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device.
1419d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1420d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls.
1421d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1422d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1423d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1424d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1425d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1426d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1427d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.
1428d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1429ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd)
1430ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1431ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno;
1432ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1433ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1434ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1435d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1436d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1437d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device.
1438d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1439d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1440d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1441d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1443d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.
1445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1446ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd)
1447ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1448ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno;
1449ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1450ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1451ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode.
1455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1456d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode.
1458d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1459d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1460d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1461d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1462d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the
1463d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure.
1464d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1465ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode)
1466ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1467ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_mode_t m;
1468ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1469ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    m.mode = mode;
1470ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno;
1471ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1472ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1473ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory.
1477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary.
1480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate.
1481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the
1482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory.
1483d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory.
1484d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1485d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1486d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the
1489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure.
1490d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1491ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type,
14927ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie		unsigned long *address, drm_handle_t *handle)
1493ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1494ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1495b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
1496b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane    *handle = DRM_AGP_NO_HANDLE;
1497ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = size;
1498ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = 0;
1499ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.type   = type;
1500ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno;
1501ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (address != 0UL) *address = b.physical;
1502ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    *handle = b.handle;
1503ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1504ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1505ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1506d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1507d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1508d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory.
1509d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1510d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1511d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1512d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1513d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1514d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1515d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1516d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the
1517d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure.
1518d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
15197ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle)
1520ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1521ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1522ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1523ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = 0;
1524ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1525ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno;
1526ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1527ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1528ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory.
1532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary.
1536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the
1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure.
1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
15437ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
1544ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1545ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1546ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1547ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1548ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = offset;
1549ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno;
1550ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1551ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1552ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory.
1556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1561d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing
1564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure.
1565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
15667ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle)
1567ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1568ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1569ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1570ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1571ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = 0;
1572ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno;
1573ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1574ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1575ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1576d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1577d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1578d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number.
1579d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1580d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1581d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1582d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure..
1583d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1584d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1585d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1588ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd)
1589ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1590ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1591ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1592ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
1593ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_major;
1594ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1595ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1597d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number.
1599d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1600d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1601d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1602d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure.
1603d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1604d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1605d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1606d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1607d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1608ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd)
1609ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1610ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1611ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1612ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
1613ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_minor;
1614ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1615ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode.
1619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure.
1623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1628ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd)
1629ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1630ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1631ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1632ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1633ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.mode;
1634ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1635ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base.
1639d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1640d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1641d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1642d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure.
1643d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1644d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1645d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1646d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1647d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1648ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd)
1649ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1650ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1651ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1652ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1653ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_base;
1654ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1655ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size.
1659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure.
1663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1666d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1667d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1668ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd)
1669ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1670ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1671ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1672ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1673ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_size;
1674ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1675ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1676d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory.
1679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure.
1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1688ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd)
1689ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1690ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1691ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1692ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1693ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_used;
1694ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory.
1699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure.
1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1708ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd)
1709ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1710ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1711ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1712ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_allowed;
1714ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1715ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1718d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID.
1719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure.
1723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1728ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd)
1729ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1730ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1731ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1732ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1733ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_vendor;
1734ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1735ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1736d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1737d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1738d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID.
1739d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure.
1743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1748ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd)
1749ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1750ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1751ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1752ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
1753ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_device;
1754ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1755ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17567ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
17575d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
17585d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
17595d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
17605d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = 0;
17615d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = size;
17625d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = 0;
17635d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno;
17645d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = sg.handle;
17655d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
17665d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
17675d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
17687ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle)
17695d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
17705d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
17715d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
17725d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = 0;
17735d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = handle;
17745d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno;
17755d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
17765d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
17775d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
1778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK.
1780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure.
1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.
1788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
178955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl)
179055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{
179155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    int ret;
179255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
179355acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    do {
179455acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
1795c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
179655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    } while (ret && errno == EINTR);
179755acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
179855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    return ret;
179955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer}
180055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
1801b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label)
1802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1803b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    switch (err) {
1804b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label);   break;
1805b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label);   break;
1806b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_NOT_ROOT:  fprintf(stderr, "%s: not root\n", label);    break;
1807b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    case DRM_ERR_INVALID:   fprintf(stderr, "%s: invalid args\n", label);break;
1808b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    default:
1809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (err < 0) err = -err;
1810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
1811b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	break;
1812b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1813b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1814b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 1;
1815b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1816b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1817d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1818d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler.
1819d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1820d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1821d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number.
1822d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1823d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1824d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1825d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1829b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq)
1830b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1831b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1832b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1833b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_INST_HANDLER;
1834b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = irq;
1835b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
1836b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1837b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1838b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler.
1842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1851b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd)
1852b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1853b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_UNINST_HANDLER;
1856b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = 0;
1857b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
1858b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1859b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1860b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1861b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags)
1862b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1863b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1864b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1865b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1867b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1868b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1869b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1870b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno;
1874b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1875b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1876b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID.
1879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number.
1882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number.
1883d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number.
1884d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1885d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure.
1886d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1887d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
1889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure.
1890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
1892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1893b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_irq_busid_t p;
1894b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1895b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.busnum  = busnum;
1896b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.devnum  = devnum;
1897b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.funcnum = funcnum;
1898b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno;
1899b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return p.irq;
1900b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1901b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
19028696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag)
1903b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1904b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1905b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1906b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashInsert(entry->tagTable, context, tag)) {
1907b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashDelete(entry->tagTable, context);
1908b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(entry->tagTable, context, tag);
1909b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1910b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1911b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1912b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
19138696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context)
1914b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1915b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1916b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1917b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return drmHashDelete(entry->tagTable, context);
1918b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1919b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
19208696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context)
1921b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1922b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1923b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
1924360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1925b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
1926b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1927b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return value;
1928b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1929b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
193022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
193122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t handle)
193274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
193374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
193474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
193574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
193674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
193774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
193874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno;
193974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
194074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
194174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
194222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
194322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t *handle)
194474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
194574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
194674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
194774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
194874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
194974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno;
19508696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    if (handle) *handle = (drm_handle_t)map.handle;
195174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
195274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
195374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
195474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
19558696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
19568696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	      drmMapType *type, drmMapFlags *flags, drm_handle_t *handle,
195788dbee54ed400a3fd5594fab506518c171167805Rik Faith	      int *mtrr)
195888dbee54ed400a3fd5594fab506518c171167805Rik Faith{
195988dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_map_t map;
196088dbee54ed400a3fd5594fab506518c171167805Rik Faith
196188dbee54ed400a3fd5594fab506518c171167805Rik Faith    map.offset = idx;
196288dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
196388dbee54ed400a3fd5594fab506518c171167805Rik Faith    *offset = map.offset;
196488dbee54ed400a3fd5594fab506518c171167805Rik Faith    *size   = map.size;
196588dbee54ed400a3fd5594fab506518c171167805Rik Faith    *type   = map.type;
196688dbee54ed400a3fd5594fab506518c171167805Rik Faith    *flags  = map.flags;
196788dbee54ed400a3fd5594fab506518c171167805Rik Faith    *handle = (unsigned long)map.handle;
196888dbee54ed400a3fd5594fab506518c171167805Rik Faith    *mtrr   = map.mtrr;
196988dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
197088dbee54ed400a3fd5594fab506518c171167805Rik Faith}
197188dbee54ed400a3fd5594fab506518c171167805Rik Faith
197288dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
197388dbee54ed400a3fd5594fab506518c171167805Rik Faith		 unsigned long *magic, unsigned long *iocs)
197488dbee54ed400a3fd5594fab506518c171167805Rik Faith{
197588dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_client_t client;
197688dbee54ed400a3fd5594fab506518c171167805Rik Faith
197788dbee54ed400a3fd5594fab506518c171167805Rik Faith    client.idx = idx;
197888dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
197988dbee54ed400a3fd5594fab506518c171167805Rik Faith    *auth      = client.auth;
198088dbee54ed400a3fd5594fab506518c171167805Rik Faith    *pid       = client.pid;
198188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *uid       = client.uid;
198288dbee54ed400a3fd5594fab506518c171167805Rik Faith    *magic     = client.magic;
198388dbee54ed400a3fd5594fab506518c171167805Rik Faith    *iocs      = client.iocs;
198488dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
198588dbee54ed400a3fd5594fab506518c171167805Rik Faith}
198688dbee54ed400a3fd5594fab506518c171167805Rik Faith
198788dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats)
198888dbee54ed400a3fd5594fab506518c171167805Rik Faith{
198988dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_stats_t s;
199088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int         i;
199188dbee54ed400a3fd5594fab506518c171167805Rik Faith
199288dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
199388dbee54ed400a3fd5594fab506518c171167805Rik Faith
199488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = 0;
199588dbee54ed400a3fd5594fab506518c171167805Rik Faith    memset(stats, 0, sizeof(*stats));
199688dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
199788dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
199888dbee54ed400a3fd5594fab506518c171167805Rik Faith
199988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE                              \
200088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
200188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%8.8s";      \
200288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 1;            \
200388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
200488dbee54ed400a3fd5594fab506518c171167805Rik Faith
200588dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT                              \
200688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
200788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
200888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
200988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "kgm";        \
201088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1000;         \
201188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
201288dbee54ed400a3fd5594fab506518c171167805Rik Faith
201388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE                               \
201488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
201588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
201688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
201788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "KGM";        \
201888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1024;         \
201988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
202088dbee54ed400a3fd5594fab506518c171167805Rik Faith
202188dbee54ed400a3fd5594fab506518c171167805Rik Faith
202288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = s.count;
202388dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < s.count; i++) {
202488dbee54ed400a3fd5594fab506518c171167805Rik Faith	stats->data[i].value = s.data[i].value;
202588dbee54ed400a3fd5594fab506518c171167805Rik Faith	switch (s.data[i].type) {
202688dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCK:
202788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Lock";
202888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
202988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
203088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
203188dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_OPENS:
203288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Opens";
203388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "O";
203488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
203588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
203688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
203788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_CLOSES:
203888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Closes";
203988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
204088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
204188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
204288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
204388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IOCTLS:
204488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Ioctls";
204588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ioc/s";
204688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
204788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
204888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCKS:
204988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Locks";
205088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lck/s";
205188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
205288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
205388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_UNLOCKS:
205488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Unlocks";
205588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Unl/s";
205688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
205788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
205888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IRQ:
205988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "IRQs";
206088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "IRQ/s";
206188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
206288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
206388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_PRIMARY:
206488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Primary Bytes";
206588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "PB/s";
206688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
206788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
206888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SECONDARY:
206988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Secondary Bytes";
207088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "SB/s";
207188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
207288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
207388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_DMA:
207488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "DMA";
207588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "DMA/s";
207688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
207788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
207888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SPECIAL:
207988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Special DMA";
208088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "dma/s";
208188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
208288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
208388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_MISSED:
208488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Miss";
208588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ms/s";
208688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
208788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
208888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_VALUE:
208988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Value";
209088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Value";
209188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
209288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
209388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_BYTE:
209488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Bytes";
209588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "B/s";
209688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
209788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
209888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_COUNT:
209988dbee54ed400a3fd5594fab506518c171167805Rik Faith	default:
210088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Count";
210188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Cnt/s";
210288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
210388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
210488dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
210588dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
210688dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
210788dbee54ed400a3fd5594fab506518c171167805Rik Faith}
210888dbee54ed400a3fd5594fab506518c171167805Rik Faith
2109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
211006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl.
211106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
211206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor.
211306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index
211406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written.
211506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written.
211606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
211706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure.
211806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
211906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
212006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by
212106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
212206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
212322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version)
212406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
212506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    int retcode = 0;
212606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drm_set_version_t sv;
212706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
212806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_major = version->drm_di_major;
212906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_minor = version->drm_di_minor;
213006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_major = version->drm_dd_major;
213106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_minor = version->drm_dd_minor;
213206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
213306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (ioctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
213406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	retcode = -errno;
213506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
213606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
213706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_major = sv.drm_di_major;
213806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_minor = sv.drm_di_minor;
213906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_major = sv.drm_dd_major;
214006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_minor = sv.drm_dd_minor;
214106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
214206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return retcode;
214306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
214406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
214506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
2146d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command.
2147d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2148d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2149d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2150d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2151d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2152d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2153d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2154d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by
2155d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2156d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
21573903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex)
21583903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
21593903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    void *data = NULL; /* dummy */
21603903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
21613903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
21623903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
21633903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
21643903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
21653903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
21663903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
21673903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
21683903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
21693903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2170d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2172d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command.
2173d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2174d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2175d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2176d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read.
2177d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read.
2178d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2179d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2180d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2181d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2182d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by
2183d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2184d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
218522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data,
218622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                   unsigned long size)
21873903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
21883903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
21893903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
219074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE,
219174ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
21923903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
21933903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
21943903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
21953903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
21963903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
21973903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
21983903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2200d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2201d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command.
2202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2203d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2204d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2205d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written.
2206d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written.
2207d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2209d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2210d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2211d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by
2212d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
221422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data,
221522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                    unsigned long size)
22163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
22173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
22183903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
221974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE,
222074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
22213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
22223903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
22233903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
22243903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
22253903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
22263903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
22273903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2228d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2229d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2230d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command.
2231d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2232d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2233d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2234d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written.
2235d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written.
2236d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by
2241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
224322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,
224422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                        unsigned long size)
22453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
22463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
22473903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
224874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE,
224974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
22503903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
22513903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
22523903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
22533903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
22543903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
22553903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
2256166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2257279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom#ifdef __linux__
2258279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom
225949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
226049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
226149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_EMIT
226249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
226349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
226449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
226549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
226649fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceCreate(int fd, unsigned flags, int class,unsigned type,
2267166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom		   drmFence *fence)
2268166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2269166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2270166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2271bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2272166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = type;
2273a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    arg.class = class;
2274166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_create;
2275166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2276166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2277166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->handle = arg.handle;
2278a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    fence->class = arg.class;
2279166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2280191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    fence->flags = arg.flags;
2281166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = 0;
2282166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2283166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2284604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom
228549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
228649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
228749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
228849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
228949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
229049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
229149fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceBuffers(int fd, unsigned flags, drmFence *fence)
2292604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom{
2293604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    drm_fence_arg_t arg;
2294604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom
2295bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
229649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
2297604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    arg.op = drm_fence_buffers;
2298604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2299604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom	return -errno;
2300604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->handle = arg.handle;
2301604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->class = arg.class;
2302604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->type = arg.type;
2303191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    fence->flags = arg.flags;
2304604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->signaled = 0;
2305604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    return 0;
2306604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom}
2307166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2308166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceDestroy(int fd, const drmFence *fence)
2309166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2310166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2311166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2312bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2313166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2314166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_destroy;
2315166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2316166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2317166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2318166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2319166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2320166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceReference(int fd, unsigned handle, drmFence *fence)
2321166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2322166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2323166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2324bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2325166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = handle;
2326166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_reference;
2327166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2328166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2329166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->handle = arg.handle;
2330a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    fence->class = arg.class;
2331166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
233249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    fence->flags = arg.flags;
2333166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2334166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2335166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2336166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2337166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceUnreference(int fd, const drmFence *fence)
2338166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2339166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2340166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2341bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2342166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2343166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_unreference;
2344166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2345166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2346166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2347166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2348166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2349166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
2350166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2351166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2352166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2353bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2354166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2355166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = flush_type;
2356166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_flush;
2357166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2358166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2359a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    fence->class = arg.class;
2360166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2361166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2362166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2363166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2364166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2365191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceUpdate(int fd, drmFence *fence)
2366166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2367191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	drm_fence_arg_t arg;
2368191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2369bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2370191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	arg.handle = fence->handle;
2371191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	arg.op = drm_fence_signaled;
2372191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2373191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	    return -errno;
2374191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	fence->class = arg.class;
2375191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	fence->type = arg.type;
2376191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	fence->signaled = arg.signaled;
2377191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	return 0;
2378191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom}
2379191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2380191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType,
2381191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom		     int *signaled)
2382191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom{
2383191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    int
2384191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	ret;
2385191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2386191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
2387191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	((fenceType & fence->signaled) != fenceType)) {
2388191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2389191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	ret = drmFenceFlush(fd, fence, fenceType);
2390191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	if (ret)
2391191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	    return ret;
2392191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    }
2393191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2394191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    *signaled = ((fenceType & fence->signaled) == fenceType);
2395191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2396166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2397166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2398166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
239949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
240049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
240149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
240249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
240349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
2404191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2405191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
240649fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)
2407166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2408166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2409166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2410bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
241149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
2412166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2413166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = emit_type;
2414166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_emit;
2415166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
2416166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2417a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    fence->class = arg.class;
2418166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2419166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2420166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2421166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
242249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
242349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
242449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
242549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_LAZY
242649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS
242749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
2428166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
242949fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)
2430166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2431166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2432166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    int ret;
2433166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2434c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    if (flush_type == 0) {
2435c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	flush_type = fence->type;
2436c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    }
2437c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2438191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) {
243949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom	if ((flush_type & fence->signaled) == flush_type) {
2440191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	    return 0;
2441191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	}
2442191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    }
2443191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2444bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2445166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2446166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = flush_type;
244749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
2448166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.op = drm_fence_wait;
2449166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    do {
2450166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	ret = ioctl(fd, DRM_IOCTL_FENCE, &arg);
2451166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    } while (ret != 0 && errno == EAGAIN);
2452166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2453166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ret)
2454166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2455166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2456a6535c8db4614376ce8ecb7d889b92db066a96ccThomas Hellstrom    fence->class = arg.class;
2457166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2458166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2459166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2460166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2461166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2462b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstromint drmTTMCreate(int fd, drmTTM *ttm, unsigned long size, unsigned flags)
2463b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom{
2464886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    drm_ttm_arg_t arg;
2465b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2466bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2467886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.op = drm_ttm_create;
2468886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.flags = flags;
2469279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom    arg.size = size;
2470b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2471b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_TTM, &arg))
2472b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom	return -errno;
2473b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2474886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->handle = arg.handle;
2475886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->user_token = (drm_handle_t) arg.user_token;
2476886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->flags = arg.flags;
2477279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom    ttm->size = arg.size;
2478de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    ttm->virtual = NULL;
2479de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    ttm->mapCount = 0;
2480b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    return 0;
2481b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom}
2482b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2483b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstromint drmTTMDestroy(int fd, const drmTTM *ttm)
2484b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom{
248523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    drm_ttm_arg_t arg;
2486166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2487bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2488886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.op = drm_ttm_destroy;
2489886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.handle = ttm->handle;
2490b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_TTM, &arg))
2491b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom	return -errno;
2492b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    return 0;
2493b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom}
2494b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2495b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2496b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstromint drmTTMReference(int fd, unsigned handle, drmTTM *ttm)
2497b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom{
2498886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    drm_ttm_arg_t arg;
2499b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2500bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2501886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.handle = handle;
2502886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.op = drm_ttm_reference;
2503b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_TTM, &arg))
2504b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom	return -errno;
2505886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->handle = arg.handle;
2506886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->user_token = (drm_handle_t) arg.user_token;
2507886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    ttm->flags = arg.flags;
2508279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom    ttm->size = arg.size;
2509b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    return 0;
2510b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom}
2511b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2512b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstromint drmTTMUnreference(int fd, const drmTTM *ttm)
2513b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom{
2514886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    drm_ttm_arg_t arg;
2515b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2516bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2517886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.op = drm_ttm_destroy;
2518886d3b3061cdf53f5a353cbaac843f63104d2658Thomas Hellstrom    arg.handle = ttm->handle;
2519b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_TTM, &arg))
2520b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom	return -errno;
2521b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    return 0;
2522b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom}
2523b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom
2524b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstromdrm_handle_t drmTTMMapHandle(int fd, const drmTTM *ttm)
2525b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom{
2526b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    (void) fd;
2527b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom    return ttm->user_token;
2528b4b7b997605f88f3ffdcb0cc7cd1271e0cb24073Thomas Hellstrom}
252923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2530de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromstatic int drmAdjustListNodes(drmBOList *list)
253123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom{
2532de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmBONode *node;
2533de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmMMListHead *l;
253423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    int ret = 0;
253523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
253623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    while(list->numCurrent < list->numTarget) {
2537de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = (drmBONode *) malloc(sizeof(*node));
253823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	if (!node) {
253923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	    ret = -ENOMEM;
254023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	    break;
254123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	}
254223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numCurrent++;
254323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTADD(&node->head, &list->free);
254423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
254523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
254623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    while(list->numCurrent > list->numTarget) {
254723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	l = list->free.next;
254823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	if (l == &list->free)
254923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	    break;
255023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTDEL(l);
2551de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = DRMLISTENTRY(drmBONode, l, head);
255223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	free(node);
255323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numCurrent--;
255423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
255523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    return ret;
255623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom}
255723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2558f88c32fd4cb93fe8b9dfa543a26d74733d0cd8efThomas Hellstromvoid drmBOFreeList(drmBOList *list)
255923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom{
2560de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmBONode *node;
2561de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmMMListHead *l;
256223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    int ret = 0;
256323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
256423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    l = list->list.next;
256523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    while(l != &list->list) {
256623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTDEL(l);
2567de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = DRMLISTENTRY(drmBONode, l, head);
256823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	free(node);
256923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	l = list->free.next;
257023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numCurrent--;
257123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numOnList--;
257223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
257323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
257423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    l = list->free.next;
257523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    while(l != &list->free) {
257623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTDEL(l);
2577de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = DRMLISTENTRY(drmBONode, l, head);
257823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	free(node);
257923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	l = list->free.next;
258023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numCurrent--;
258123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
258223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom}
258323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2584f88c32fd4cb93fe8b9dfa543a26d74733d0cd8efThomas Hellstromint drmBOResetList(drmBOList *list) {
258523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2586de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmMMListHead *l;
258723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    int ret;
258823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
258923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    ret = drmAdjustListNodes(list);
259023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    if (ret)
259123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	return ret;
259223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
259323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    l = list->list.next;
259423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    while(l != &list->list) {
259523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTDEL(l);
259623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTADD(l, &list->free);
259723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numOnList--;
259899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	l = list->list.next;
259923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
260023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    return drmAdjustListNodes(list);
260123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom}
260223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2603ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromstatic drmBONode *drmAddListItem(drmBOList *list, drmBO *item,
2604ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom				 unsigned long arg0,
2605ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom				 unsigned long arg1)
260623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom{
2607de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmBONode *node;
2608de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drmMMListHead *l;
260923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
261023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    l = list->free.next;
261123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    if (l == &list->free) {
2612de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = (drmBONode *) malloc(sizeof(*node));
261323f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	if (!node) {
2614ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    return NULL;
261523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	}
261623f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	list->numCurrent++;
261723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    } else {
261823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	DRMLISTDEL(l);
2619de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	node = DRMLISTENTRY(drmBONode, l, head);
262023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    }
262123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    node->buf = item;
2622ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    node->arg0 = arg0;
2623ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    node->arg1 = arg1;
262423f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    DRMLISTADD(&node->head, &list->list);
262523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom    list->numOnList++;
2626ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return node;
262723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom}
262823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2629ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromvoid *drmBOListIterator(drmBOList *list)
263023f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom{
2631ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    void *ret = list->list.next;
263223f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2633ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (ret == &list->list)
2634ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return NULL;
2635ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return ret;
2636ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
263723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2638ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromvoid *drmBOListNext(drmBOList *list, void *iterator)
263923f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom{
2640ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    void *ret;
264123f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2642ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drmMMListHead *l = (drmMMListHead *) iterator;
2643ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    ret = l->next;
2644ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (ret == &list->list)
264523f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom	return NULL;
2646ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return ret;
2647ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
264823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2649f88c32fd4cb93fe8b9dfa543a26d74733d0cd8efThomas HellstromdrmBO *drmBOListBuf(void *iterator)
2650ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
2651ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drmBONode *node;
2652ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drmMMListHead *l = (drmMMListHead *) iterator;
2653ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    node = DRMLISTENTRY(drmBONode, l, head);
2654ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2655f88c32fd4cb93fe8b9dfa543a26d74733d0cd8efThomas Hellstrom    return node->buf;
2656ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
265723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2658ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2659f88c32fd4cb93fe8b9dfa543a26d74733d0cd8efThomas Hellstromint drmBOCreateList(int numTarget, drmBOList *list)
2660ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
2661ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    DRMINITLISTHEAD(&list->list);
2662ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    DRMINITLISTHEAD(&list->free);
2663ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    list->numTarget = numTarget;
2664ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    list->numCurrent = 0;
2665ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    list->numOnList = 0;
2666ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return drmAdjustListNodes(list);
266723f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom}
266823f01c9fe8e6170459fe46ad5fc9757bbe967d96Thomas Hellstrom
2669ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstromstatic void drmBOCopyReply(const drm_bo_arg_reply_t *rep,
2670ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom			   drmBO *buf)
2671ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
2672ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->handle = rep->handle;
2673ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->flags = rep->flags;
2674ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->size = rep->size;
2675ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->offset = rep->offset;
2676ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->mapHandle = rep->arg_handle;
2677ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->mask = rep->mask;
2678ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->start = rep->buffer_start;
2679ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->fenceFlags = rep->fence_flags;
2680ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->replyFlags = rep->rep_flags;
2681ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
2682ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2683ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2684ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2685de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBOCreate(int fd, drmTTM *ttm, unsigned long start, unsigned long size,
2686de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom		void *user_buffer, drm_bo_type_t type, unsigned mask,
2687de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom		unsigned hint, drmBO *buf)
2688de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
2689de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drm_bo_arg_t arg;
269099acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
269199acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2692bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom
2693bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(buf, 0, sizeof(*buf));
2694bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2695de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->mask = mask;
2696de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->hint = hint;
2697de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->size = size;
2698de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->type = type;
2699de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2700de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->ttm = NULL;
2701405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    buf->virtual = NULL;
2702de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2703de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    switch(type) {
2704de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    case drm_bo_type_ttm:
2705de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	req->arg_handle = ttm->handle;
2706de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	req->buffer_start = start;
2707de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	buf->ttm = ttm;
2708de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	break;
2709de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    case drm_bo_type_dc:
2710e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom        req->buffer_start = start;
2711de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	break;
2712de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    case drm_bo_type_user:
2713de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	req->buffer_start = (unsigned long) user_buffer;
2714de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	buf->virtual = user_buffer;
2715de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	break;
271699acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    case drm_bo_type_fake:
271799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom        req->buffer_start = start;
271899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	break;
2719de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    default:
2720de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -EINVAL;
2721de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2722de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->op = drm_bo_create;
2723de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2724de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
2725de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2726ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled) {
2727ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      fprintf(stderr, "Not handled\n");
2728de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -EFAULT;
2729de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2730de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (rep->ret) {
2731de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return rep->ret;
2732de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2733de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2734ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
273514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapVirtual = NULL;
273614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapCount = 0;
2737de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2738de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2739de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2740de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2741de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBODestroy(int fd, drmBO *buf)
2742de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
2743de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drm_bo_arg_t arg;
274499acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
274599acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2746de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
274799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
2748405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
2749405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->mapVirtual = NULL;
2750405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->virtual = NULL;
2751405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    }
2752405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom
2753bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2754de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->handle = buf->handle;
2755de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->op = drm_bo_destroy;
2756de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2757de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
2758de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2759ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled) {
2760de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -EFAULT;
2761de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2762de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (rep->ret) {
2763de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return rep->ret;
2764de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2765de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2766de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->handle = 0;
2767de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2768de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2769de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2770de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBOReference(int fd, unsigned handle, drmBO *buf)
2771de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
2772de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2773de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drm_bo_arg_t arg;
277499acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
277599acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2776de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2777bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2778de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->handle = handle;
2779de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->op = drm_bo_reference;
2780de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2781de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
2782de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2783ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled) {
2784de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -EFAULT;
2785de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2786de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (rep->ret) {
2787de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return rep->ret;
2788de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2789de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2790ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
2791de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->type = drm_bo_type_dc;
279214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapVirtual = NULL;
279314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapCount = 0;
2794de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->virtual = NULL;
2795ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2796de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2797de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2798de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2799de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBOUnReference(int fd, drmBO *buf)
2800de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
2801de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    drm_bo_arg_t arg;
280299acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
280399acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2804de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
280599acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom
280699acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
280799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
280899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	buf->mapVirtual = NULL;
280999acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	buf->virtual = NULL;
281099acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    }
281199acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom
2812bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2813de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->handle = buf->handle;
2814de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->op = drm_bo_unreference;
2815de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2816de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
2817de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2818ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled) {
2819de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -EFAULT;
2820de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2821de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    if (rep->ret) {
2822de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return rep->ret;
2823de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    }
2824de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2825de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->handle = 0;
2826de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2827de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2828de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
282914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom/*
2830ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Flags can be  DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together
2831ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the
2832ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * call return an -EBUSY if it can' immediately honor the mapping request.
283314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom */
283414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2835ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
2836ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	     void **address)
283714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{
283814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
283914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    drm_bo_arg_t arg;
284099acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
284199acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
284214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    int ret = 0;
284314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
284414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    /*
284514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * Make sure we have a virtual address of the buffer.
284614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     */
284714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
284899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    if (!buf->virtual && buf->type != drm_bo_type_fake) {
2849405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	drmAddress virtual;
2850405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	ret = drmMap(fd, buf->mapHandle, buf->size + buf->start, &virtual);
2851405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	if (ret)
2852405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	    return ret;
2853405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->mapVirtual = virtual;
2854405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->virtual = ((char *) virtual) + buf->start;
285599acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom#ifdef BODEBUG
2856405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	fprintf(stderr,"Mapvirtual, virtual: 0x%08x 0x%08x\n",
2857405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom		buf->mapVirtual, buf->virtual);
285899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom#endif
285914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    }
286014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2861bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
286214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    req->handle = buf->handle;
2863ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->mask = mapFlags;
2864ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->hint = mapHint;
286514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    req->op = drm_bo_map;
286614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
286714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    /*
286814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * May hang if the buffer object is busy.
286914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * This IOCTL synchronizes the buffer.
287014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     */
287114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
287214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    do {
287314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
287414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    } while (ret != 0 && errno == EAGAIN);
287514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
287614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    if (ret)
287714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	return ret;
2878ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled)
287914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	return -EFAULT;
288014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    if (rep->ret)
288114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	return rep->ret;
2882405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom
2883405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    drmBOCopyReply(rep, buf);
2884ff95ea5536d70f9bc8eac12f2c97dae71fb97066Thomas Hellstrom    buf->mapFlags = mapFlags;
2885405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    ++buf->mapCount;
288614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    *address = buf->virtual;
288714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
288814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    return 0;
288914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom}
289014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
289114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstromint drmBOUnmap(int fd, drmBO *buf)
289214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{
289314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    drm_bo_arg_t arg;
289499acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
289599acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
289614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
289714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2898bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
289914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    req->handle = buf->handle;
290014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    req->op = drm_bo_unmap;
290114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
290214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) {
290314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	return -errno;
290414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    }
2905ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled)
2906ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom        return -EFAULT;
2907ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (rep->ret)
2908ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return rep->ret;
2909ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2910ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return 0;
2911ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
2912ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2913ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,
2914ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom		  unsigned hint)
2915ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
2916ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drm_bo_arg_t arg;
291799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
291899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2919ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    int ret = 0;
2920ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2921bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2922ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->handle = buf->handle;
2923ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->mask = flags;
2924ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->hint = hint;
2925ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->arg_handle = mask; /* Encode mask in the arg_handle field :/ */
2926ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->op = drm_bo_validate;
2927e3f54ecdd9d266607afd7d8b62960b2154b63e9dThomas Hellstrom
2928ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    do{
2929ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
293049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    } while (ret && errno == EAGAIN);
2931ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2932ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (ret)
2933ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return ret;
2934ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled)
2935ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return -EFAULT;
2936ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (rep->ret)
2937ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return rep->ret;
2938ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2939ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
2940ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return 0;
2941ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
2942ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2943ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2944ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle)
2945ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
2946ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drm_bo_arg_t arg;
294799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
294899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2949ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    int ret = 0;
2950ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2951bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2952ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->handle = buf->handle;
2953ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->mask = flags;
2954ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->arg_handle = fenceHandle;
2955ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->op = drm_bo_validate;
295614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2957ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
2958ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2959ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (ret)
2960ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return ret;
2961ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!arg.handled)
2962ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return -EFAULT;
2963ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (rep->ret)
2964ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	return rep->ret;
296514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    return 0;
296614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom}
2967ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2968ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstromint drmBOInfo(int fd, drmBO *buf)
2969ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
2970ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drm_bo_arg_t arg;
297199acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
297299acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2973ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    int ret = 0;
2974ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2975bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2976ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    req->handle = buf->handle;
2977ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    req->op = drm_bo_info;
2978ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2979ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
2980ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2981ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (ret)
2982ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return ret;
2983ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (!arg.handled)
2984ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return -EFAULT;
2985ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (rep->ret)
2986ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return rep->ret;
2987ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
2988ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    return 0;
2989ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
2990c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2991c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
2992c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom{
2993c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    drm_bo_arg_t arg;
2994c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    drm_bo_arg_request_t *req = &arg.d.req;
2995c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    drm_bo_arg_reply_t *rep = &arg.d.rep;
2996c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    int ret = 0;
2997c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2998c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||
2999c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	(buf->replyFlags & DRM_BO_REP_BUSY)) {
3000bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom        memset(&arg, 0, sizeof(arg));
3001c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	req->handle = buf->handle;
3002c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	req->op = drm_bo_wait_idle;
3003c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	req->hint = hint;
3004c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
3005ca1b15d645c74e20f638f5a09981bcf02f58caeeThomas Hellstrom	do {
3006ca1b15d645c74e20f638f5a09981bcf02f58caeeThomas Hellstrom	    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
3007ca1b15d645c74e20f638f5a09981bcf02f58caeeThomas Hellstrom	} while (ret && errno == EAGAIN);
3008ca1b15d645c74e20f638f5a09981bcf02f58caeeThomas Hellstrom
3009c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	if (ret)
3010c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	    return ret;
3011c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	if (!arg.handled)
3012c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	    return -EFAULT;
3013c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	if (rep->ret)
3014c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	    return rep->ret;
3015c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	drmBOCopyReply(rep, buf);
3016c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    }
3017c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    return 0;
3018c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom}
3019ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
3020c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOBusy(int fd, drmBO *buf, int *busy)
3021ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
3022ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (!(buf->flags & DRM_BO_FLAG_SHAREABLE) &&
3023ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	!(buf->replyFlags & DRM_BO_REP_BUSY)) {
3024ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	*busy = 0;
3025ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return 0;
3026ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    } else {
3027ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	int ret = drmBOInfo(fd, buf);
3028ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	if (ret)
3029ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	    return ret;
3030ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	*busy = (buf->replyFlags & DRM_BO_REP_BUSY);
3031ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return 0;
3032ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    }
3033ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
3034ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
303514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
3036ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,
3037ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom		       unsigned mask,
3038ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom		       int *newItem)
3039ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
3040ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drmBONode *node, *cur;
3041ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    unsigned oldFlags, newFlags;
3042ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    drmMMListHead *l;
3043ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3044ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    *newItem = 0;
3045ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    cur = NULL;
3046ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3047ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    for (l = list->list.next; l != &list->list; l = l->next) {
3048ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	node = DRMLISTENTRY(drmBONode, l, head);
3049ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	if (node->buf == buf) {
3050ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    cur = node;
3051ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    break;
3052ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	}
3053ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    }
3054ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (!cur) {
3055ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	cur = drmAddListItem(list, buf, flags, mask);
3056ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	if (!cur) {
3057ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    drmMsg("Out of memory creating validate list node.\n");
3058ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    return -ENOMEM;
3059ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	}
3060ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	*newItem = 1;
3061ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	cur->arg0 = flags;
3062ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	cur->arg1 = mask;
3063ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    } else {
3064191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM;
3065191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	unsigned memFlags = cur->arg0 & flags & memMask;
3066ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3067191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	if (!memFlags) {
3068ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    drmMsg("Incompatible memory location requests "
3069ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom		   "on validate list.\n");
3070861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
3071861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom		   cur->arg0, cur->arg1);
3072861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
3073861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom		   flags, mask);
3074ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    return -EINVAL;
3075ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	}
3076861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom	if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
3077ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    drmMsg("Incompatible buffer flag requests "
3078861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom		   "on validate list.\n");
3079861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
3080861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom		   cur->arg0, cur->arg1);
3081861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
3082861b26578cd5e497fb506ad5952fa62bd03ea201Thomas Hellstrom		   flags, mask);
3083ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	    return -EINVAL;
3084ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	}
3085ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	cur->arg1 |= mask;
3086191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	cur->arg0 = memFlags | ((cur->arg0 | flags) &
3087191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom				cur->arg1 & ~DRM_BO_MASK_MEM);
3088ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    }
308999acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    return 0;
3090ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
3091ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3092ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3093ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOValidateList(int fd, drmBOList *list)
3094ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
3095ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3096ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmBONode *node;
3097ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmMMListHead *l;
3098ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_t *arg, *first;
3099ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_request_t *req;
3100ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_reply_t *rep;
3101ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_u64_t *prevNext = NULL;
3102ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmBO *buf;
3103ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  int ret;
3104ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3105ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  first = NULL;
3106ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3107ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  for (l = list->list.next; l != &list->list; l = l->next) {
3108ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      node = DRMLISTENTRY(drmBONode, l, head);
3109ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3110ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      arg = &node->bo_arg;
311199acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom      req = &arg->d.req;
3112ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3113ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (!first)
3114ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  first = arg;
3115ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3116ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (prevNext)
3117ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  *prevNext = (unsigned long) arg;
3118ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3119bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom      memset(arg, 0, sizeof(*arg));
312049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom      prevNext = &arg->next;
3121ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->handle = node->buf->handle;
3122ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->op = drm_bo_validate;
3123ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->mask = node->arg0;
3124ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->hint = 0;
312549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom      req->arg_handle = node->arg1;
3126ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  }
3127ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3128ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  if (!first)
3129ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      return 0;
3130ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3131ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  do{
313299acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
313349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom  } while (ret && errno == EAGAIN);
3134ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3135e3f54ecdd9d266607afd7d8b62960b2154b63e9dThomas Hellstrom
3136ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  if (ret)
3137ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      return -errno;
3138ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3139ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  for (l = list->list.next; l != &list->list; l = l->next) {
3140ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      node = DRMLISTENTRY(drmBONode, l, head);
3141ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      arg = &node->bo_arg;
314299acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom      rep = &arg->d.rep;
3143ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
314449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom      if (!arg->handled) {
314549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom	  drmMsg("Unhandled request\n");
3146ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  return -EFAULT;
314749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom      }
3148ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (rep->ret)
3149ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  return rep->ret;
3150ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3151ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      buf = node->buf;
3152ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom      drmBOCopyReply(rep, buf);
3153ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  }
3154ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3155ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  return 0;
3156ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
3157ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3158ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3159ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
3160ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
3161ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3162ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmBONode *node;
3163ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmMMListHead *l;
3164ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_t *arg, *first;
3165ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_request_t *req;
3166ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_bo_arg_reply_t *rep;
3167ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drm_u64_t *prevNext = NULL;
3168ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  drmBO *buf;
3169ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom  unsigned fence_flags;
3170ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  int ret;
3171ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3172ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  first = NULL;
3173ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3174ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  for (l = list->list.next; l != &list->list; l = l->next) {
3175ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      node = DRMLISTENTRY(drmBONode, l, head);
3176ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3177ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      arg = &node->bo_arg;
317899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom      req = &arg->d.req;
3179ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3180ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (!first)
3181ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  first = arg;
3182ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3183ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (prevNext)
3184ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  *prevNext = (unsigned long) arg;
3185ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3186bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom      memset(arg, 0, sizeof(*arg));
318749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom      prevNext = &arg->next;
3188ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->handle = node->buf->handle;
3189ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->op = drm_bo_fence;
3190ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->mask = node->arg0;
3191ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      req->arg_handle = fenceHandle;
3192ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  }
3193ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3194ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  if (!first)
3195ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      return 0;
3196ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
319799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom  ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
3198ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3199ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  if (ret)
3200ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      return -errno;
3201ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3202ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  for (l = list->list.next; l != &list->list; l = l->next) {
3203ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      node = DRMLISTENTRY(drmBONode, l, head);
3204ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3205ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      arg = &node->bo_arg;
320699acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom      rep = &arg->d.rep;
3207ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3208ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (!arg->handled)
3209ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  return -EFAULT;
3210ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom      if (rep->ret)
3211ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	  return rep->ret;
3212ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom      drmBOCopyReply(rep, buf);
3213ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  }
3214ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
3215ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom  return 0;
3216ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
321714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
3218e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstromint drmMMInit(int fd, unsigned long vramPOffset, unsigned long vramPSize,
3219191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	      unsigned long ttPOffset, unsigned long ttPSize,
3220191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	      unsigned long max_locked_size)
3221e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{
3222e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    drm_mm_init_arg_t arg;
3223191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
3224bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
3225e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    arg.req.op = mm_init;
3226e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    arg.req.vr_p_offset = vramPOffset;
3227e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    arg.req.vr_p_size = vramPSize;
32284edb95d6e0a00a9a8885603cab2c99e3c6daa705Thomas Hellstrom    arg.req.tt_p_offset = ttPOffset;
32294edb95d6e0a00a9a8885603cab2c99e3c6daa705Thomas Hellstrom    arg.req.tt_p_size = ttPSize;
3230191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    arg.req.max_locked_pages = max_locked_size / getpagesize();
3231191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
3232e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
3233e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom	return -errno;
3234e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
3235e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    return 0;
3236e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom}
3237e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
3238e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstromint drmMMTakedown(int fd)
3239e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{
3240e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    drm_mm_init_arg_t arg;
3241bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom
3242bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom
3243bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
3244e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    arg.req.op = mm_takedown;
3245e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
3246e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
3247e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom	return -errno;
3248e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
3249e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    return 0;
3250e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom}
3251e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
3252279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom#endif
3253