xf86drm.c revision ca37077fb78b69a00500827f1db12b70affa1514
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
3479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#ifdef HAVE_CONFIG_H
3579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie# include <config.h>
36b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
3779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdio.h>
3879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdlib.h>
3979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <unistd.h>
4079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <string.h>
4179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <ctype.h>
4279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <fcntl.h>
4379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <errno.h>
4479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <signal.h>
45f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes#include <time.h>
4679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/types.h>
4779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/stat.h>
4879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#define stat_t struct stat
4979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/ioctl.h>
5079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/mman.h>
5179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/time.h>
5279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdarg.h>
53b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
54b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */
55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED
56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1)
57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h"
60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
6127c3785d3f12743a9e160238a4d00353060ec2f2Hasso Tepper#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
62cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145
63cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif
64cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt
65cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__
66cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34
6788dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
6888dbee54ed400a3fd5594fab506518c171167805Rik Faith
69b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__
70b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#  define DRM_MAJOR 81
71b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif
72b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
73cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR
74cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226		/* Linux */
7588dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
7688dbee54ed400a3fd5594fab506518c171167805Rik Faith
7788dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR
7888dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16
7988dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
80569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
8122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/*
8222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure.
8322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best.
8422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */
85569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev
86569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
87569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif
88569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
8956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3
9056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
91731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define DRM_NODE_CONTROL 0
92731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define DRM_NODE_RENDER 1
93731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes
9479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info;
9579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
9679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info)
9779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
98ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    drm_server_info = info;
9979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
10079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
101d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr.
103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string.
105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf().
108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
10979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
11079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int drmDebugPrint(const char *format, va_list ap)
11179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
112ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return vfprintf(stderr, format, ap);
11379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
11479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint;
11679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
117c4857429c716f35e1fa054d1990cae28055d96d7Eric Anholtvoid
11856bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...)
11956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{
12056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    va_list	ap;
12156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    const char *env;
12279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info)
12356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    {
12456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_start(ap, format);
12579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (drm_server_info) {
12679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	  drm_server_info->debug_print(format,ap);
12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	} else {
12879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	  drm_debug_print(format, ap);
12979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	}
13056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_end(ap);
13156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
13256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes}
13356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
13479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid
13579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap))
13679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
137ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    drm_debug_print = debug_msg_ptr;
13879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
13979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */
141b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void)
14379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
144ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return drmHashTable;
14579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size)
148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void *pt;
150ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if ((pt = malloc(size)))
151ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	memset(pt, 0, size);
152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return pt;
153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt)
156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
157ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (pt)
158ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	free(pt);
159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
161569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s)
163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
16448198970ce449165fe1c7294108ca3afc775563dAdam Jackson    char *retval;
16548198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16648198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!s)
16748198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
16848198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    retval = malloc(strlen(s)+1);
17048198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!retval)
17148198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
17248198970ce449165fe1c7294108ca3afc775563dAdam Jackson
17348198970ce449165fe1c7294108ca3afc775563dAdam Jackson    strcpy(retval, s);
174360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
175569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard/**
1798b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard * Call ioctl, restarting if it is interupted
1808b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard */
181731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint
18241b83a99583486ad4f8760a6537d34783769bfc3Coleman KanedrmIoctl(int fd, unsigned long request, void *arg)
1838b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard{
1848b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    int	ret;
1858b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard
1868b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    do {
1878b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard	ret = ioctl(fd, request, arg);
1888b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
1898b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    return ret;
1908b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard}
191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd)
193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
194fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes    stat_t     st;
195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    st.st_rdev = 0;
197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    fstat(fd, &st);
198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return st.st_rdev;
199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd)
202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key = drmGetKeyFromFd(fd);
204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry;
206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
207ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!drmHashTable)
208ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	drmHashTable = drmHashCreate();
209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(drmHashTable, key, &value)) {
211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry           = drmMalloc(sizeof(*entry));
212b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->fd       = fd;
213b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->f        = NULL;
214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->tagTable = drmHashCreate();
215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(drmHashTable, key, entry);
216b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    } else {
217b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry = value;
218b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return entry;
220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
222d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
22306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings
22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first
22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second
22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched.
22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings.  It understands the older
23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format.  In the format, o is
23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function.
23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
23506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholtstatic int drmMatchBusID(const char *id1, const char *id2)
23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* First, check if the IDs are exactly the same */
23806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strcasecmp(id1, id2) == 0)
23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return 1;
24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Try to match old/new-style PCI bus IDs. */
24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strncasecmp(id1, "pci", 3) == 0) {
24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o1, b1, d1, f1;
24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o2, b2, d2, f2;
24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int ret;
24606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1);
24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o1 = 0;
25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1);
25106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
25206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
25306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
25406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
25506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2);
25606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
25706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o2 = 0;
25806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2);
25906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
26006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
26106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
26206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
26306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2))
26406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 0;
26506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	else
26606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 1;
26706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
26806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return 0;
26906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
27006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
27106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary.
273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device.
275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device.
276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
280d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device
281d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and
282d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root.
283d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
284731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenDevice(long dev, int minor, int type)
285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2869c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes    stat_t          st;
28788dbee54ed400a3fd5594fab506518c171167805Rik Faith    char            buf[64];
28888dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             fd;
28979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    mode_t          devmode = DRM_DEV_MODE, serv_mode;
29088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             isroot  = !geteuid();
29188dbee54ed400a3fd5594fab506518c171167805Rik Faith    uid_t           user    = DRM_DEV_UID;
29279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    gid_t           group   = DRM_DEV_GID, serv_group;
29379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
294731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes    sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor);
29506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenDevice: node name is %s\n", buf);
29656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
29779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (drm_server_info) {
298ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	drm_server_info->get_perms(&serv_group, &serv_mode);
299ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	devmode  = serv_mode ? serv_mode : DRM_DEV_MODE;
300ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
301ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	group = (serv_group >= 0) ? serv_group : DRM_DEV_GID;
30279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    }
303569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
3049101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#if !defined(UDEV)
30588dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (stat(DRM_DIR_NAME, &st)) {
306ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
307ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
308b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
309b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chown(DRM_DIR_NAME, 0, 0); /* root:root */
310b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
311569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
31306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node exists and create it if necessary. */
314d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (stat(buf, &st)) {
315ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
316ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
31788dbee54ed400a3fd5594fab506518c171167805Rik Faith	remove(buf);
31888dbee54ed400a3fd5594fab506518c171167805Rik Faith	mknod(buf, S_IFCHR | devmode, dev);
319b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
32079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
32179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (drm_server_info) {
322ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	chown(buf, user, group);
323ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	chmod(buf, devmode);
32479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    }
3259101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#else
3269101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie    /* if we modprobed then wait for udev */
3279101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie    {
3289101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie	int udev_count = 0;
3299101a0205c897fea28e6a3d875111a83ad7f7732Dave Airliewait_for_udev:
3309101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie        if (stat(DRM_DIR_NAME, &st)) {
3319101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		usleep(20);
3329101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		udev_count++;
3339101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie
3349101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		if (udev_count == 50)
3359101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie			return -1;
3369101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		goto wait_for_udev;
3379101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie	}
3389101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie
3399101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie    	if (stat(buf, &st)) {
3409101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		usleep(20);
3419101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		udev_count++;
3429101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie
3439101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		if (udev_count == 50)
3449101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie			return -1;
3459101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie		goto wait_for_udev;
3469101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie    	}
3479101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie    }
3489101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#endif
34988dbee54ed400a3fd5594fab506518c171167805Rik Faith
35056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    fd = open(buf, O_RDWR, 0);
35156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
35256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		fd, fd < 0 ? strerror(errno) : "OK");
353ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd >= 0)
354ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
355d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
35606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node is not what we expect it to be, and recreate it
35706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     * and try again if so.
35806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     */
359d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (st.st_rdev != dev) {
360ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
361ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
362d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	remove(buf);
363d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	mknod(buf, S_IFCHR | devmode, dev);
36479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (drm_server_info) {
365ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    chown(buf, user, group);
366ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    chmod(buf, devmode);
36779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	}
368d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    }
369d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    fd = open(buf, O_RDWR, 0);
370d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
371d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt		fd, fd < 0 ? strerror(errno) : "OK");
372ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd >= 0)
373ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
374d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
37556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: Open failed\n");
37688dbee54ed400a3fd5594fab506518c171167805Rik Faith    remove(buf);
37788dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
378b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
379b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
381d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
382d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device
383d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
384d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number.
385d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set.
386d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
387d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
388d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
389d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
390d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device
391d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it.
392d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
393731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenMinor(int minor, int create, int type)
39488dbee54ed400a3fd5594fab506518c171167805Rik Faith{
39588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int  fd;
39688dbee54ed400a3fd5594fab506518c171167805Rik Faith    char buf[64];
397db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie
398ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (create)
399731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
40088dbee54ed400a3fd5594fab506518c171167805Rik Faith
401731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes    sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor);
402ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if ((fd = open(buf, O_RDWR, 0)) >= 0)
403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
40488dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
40588dbee54ed400a3fd5594fab506518c171167805Rik Faith}
40688dbee54ed400a3fd5594fab506518c171167805Rik Faith
407569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded.
410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise.
412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0
415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information.  For backward compatibility with older
416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked.
417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
418569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void)
419569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{
420569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    drmVersionPtr version;
421569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           retval = 0;
422569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           fd;
423360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
424731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes    if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) {
425b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__
42622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	/* Try proc for backward Linux compatibility */
427ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!access("/proc/dri/0", R_OK))
428ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return 1;
429b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif
43088dbee54ed400a3fd5594fab506518c171167805Rik Faith	return 0;
431569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
43288dbee54ed400a3fd5594fab506518c171167805Rik Faith
43388dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((version = drmGetVersion(fd))) {
43488dbee54ed400a3fd5594fab506518c171167805Rik Faith	retval = 1;
43588dbee54ed400a3fd5594fab506518c171167805Rik Faith	drmFreeVersion(version);
43688dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
43788dbee54ed400a3fd5594fab506518c171167805Rik Faith    close(fd);
438569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
439569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
440569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul}
441569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
443d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID.
445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID.
447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR),
452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied.
453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid().
455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
456e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid)
457e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{
45888dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        i;
45988dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        fd;
46088dbee54ed400a3fd5594fab506518c171167805Rik Faith    const char *buf;
46106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmSetVersion sv;
46206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
46306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
464db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    for (i = 0; i < DRM_MAX_MINOR; i++) {
465731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	fd = drmOpenMinor(i, 1, DRM_NODE_RENDER);
46656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
46756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	if (fd >= 0) {
46806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_major = 1;
46906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_minor = 1;
47006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_dd_major = -1;	/* Don't care */
47126462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt	    sv.drm_dd_minor = -1;	/* Don't care */
47206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    drmSetInterfaceVersion(fd, &sv);
473e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    buf = drmGetBusid(fd);
47456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
47506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (buf && drmMatchBusID(buf, busid)) {
47688dbee54ed400a3fd5594fab506518c171167805Rik Faith		drmFreeBusid(buf);
47788dbee54ed400a3fd5594fab506518c171167805Rik Faith		return fd;
478e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    }
479ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    if (buf)
480ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		drmFreeBusid(buf);
481e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    close(fd);
482e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	}
483e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    }
484e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    return -1;
485e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss}
486e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss
487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name.
490d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
491d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name.
492d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
493d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
494d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
495d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
496d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and
497d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use.  If it's in use it then it will already have a bus ID
498d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned.
499d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
500d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid().
501d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
502b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name)
503b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{
50488dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           i;
50588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           fd;
50688dbee54ed400a3fd5594fab506518c171167805Rik Faith    drmVersionPtr version;
50756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    char *        id;
50888dbee54ed400a3fd5594fab506518c171167805Rik Faith
509db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    if (!drmAvailable()) {
510db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	if (!drm_server_info) {
511db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    return -1;
512db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	}
513db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	else {
514db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    /* try to load the kernel module now */
515db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    if (!drm_server_info->load_module(name)) {
516db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie		drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
517db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie		return -1;
518db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    }
519db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	}
520db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    }
521db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie
52256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    /*
52356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * Open the first minor number that matches the driver name and isn't
52456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * already in use.  If it's in use it will have a busid assigned already.
52556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     */
526db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    for (i = 0; i < DRM_MAX_MINOR; i++) {
527731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	if ((fd = drmOpenMinor(i, 1, DRM_NODE_RENDER)) >= 0) {
52888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    if ((version = drmGetVersion(fd))) {
52988dbee54ed400a3fd5594fab506518c171167805Rik Faith		if (!strcmp(version->name, name)) {
53088dbee54ed400a3fd5594fab506518c171167805Rik Faith		    drmFreeVersion(version);
53156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    id = drmGetBusid(fd);
53256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
53356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    if (!id || !*id) {
53422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			if (id)
53556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			    drmFreeBusid(id);
53656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			return fd;
53756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    } else {
53856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			drmFreeBusid(id);
53956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    }
54056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		} else {
54156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmFreeVersion(version);
54288dbee54ed400a3fd5594fab506518c171167805Rik Faith		}
54388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    }
54456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    close(fd);
54588dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
546b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
547b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
54888dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__
54922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* Backward-compatibility /proc support */
550b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    for (i = 0; i < 8; i++) {
55188dbee54ed400a3fd5594fab506518c171167805Rik Faith	char proc_name[64], buf[512];
55288dbee54ed400a3fd5594fab506518c171167805Rik Faith	char *driver, *pt, *devstring;
55388dbee54ed400a3fd5594fab506518c171167805Rik Faith	int  retcode;
55488dbee54ed400a3fd5594fab506518c171167805Rik Faith
5550371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss	sprintf(proc_name, "/proc/dri/%d/name", i);
556b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	if ((fd = open(proc_name, 0, 0)) >= 0) {
557b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    retcode = read(fd, buf, sizeof(buf)-1);
558b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    close(fd);
559b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    if (retcode) {
560b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		buf[retcode-1] = '\0';
561b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
562b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    ;
56322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson		if (*pt) { /* Device is next */
564b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    *pt = '\0';
565b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    if (!strcmp(driver, name)) { /* Match */
566b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
567b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			    ;
568b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			if (*pt) { /* Found busid */
56988dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenByBusid(++pt);
57022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			} else { /* No busid */
571731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes			    return drmOpenDevice(strtol(devstring, NULL, 0),i, DRM_NODE_RENDER);
572b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			}
573b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    }
574b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		}
575b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    }
576569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	}
577b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
57888dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
57988dbee54ed400a3fd5594fab506518c171167805Rik Faith
580b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return -1;
581b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss}
582b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
583b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
584d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
585d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device.
586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found.  The
588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root.
589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied.
591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known.
592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName()
597d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise.
598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
599b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid)
600b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
60179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (!drmAvailable() && name != NULL && drm_server_info) {
60206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	/* try to load the kernel */
60379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (!drm_server_info->load_module(name)) {
604ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
60506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return -1;
60606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
60706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
60806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
60906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (busid) {
610ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	int fd = drmOpenByBusid(busid);
61106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (fd >= 0)
61206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return fd;
61306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
61422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
61506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (name)
61606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return drmOpenByName(name);
61722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
61806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return -1;
619b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
620b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
621731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmOpenControl(int minor)
622731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{
623731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes    return drmOpenMinor(minor, 0, DRM_NODE_CONTROL);
624731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}
625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion().
628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
630d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
631d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
632d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings
633d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it.
634d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
635b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v)
636b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
637ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!v)
638ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return;
6399d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->name);
6409d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->date);
6419d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->desc);
642b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
643b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
645d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
646d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
647d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel.
648d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
649d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
650d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
651d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
652d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all
653d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it.
654d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
655b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v)
656b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
657ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!v)
658ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return;
6599d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->name);
6609d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->date);
6619d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->desc);
662b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
663b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
664b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
666d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
667d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information.
668d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
669d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer.
670d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer.
671d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
672d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
673d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl
674d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart.
675d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
676569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
677b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
678b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_major      = s->version_major;
679b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_minor      = s->version_minor;
680b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_patchlevel = s->version_patchlevel;
681b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name_len           = s->name_len;
682b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name               = drmStrdup(s->name);
683b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date_len           = s->date_len;
684b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date               = drmStrdup(s->date);
685b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc_len           = s->desc_len;
686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc               = drmStrdup(s->desc);
687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
688b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
689b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
690d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
691d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information.
692d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
693d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
694d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
695d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with
696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion().
697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri.
699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls,
702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings.
703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already.
704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
705b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd)
706b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
707b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmVersionPtr retval;
708b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_version_t *version = drmMalloc(sizeof(*version));
709b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
710b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name_len    = 0;
711b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name        = NULL;
712b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date_len    = 0;
713b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date        = NULL;
714b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc_len    = 0;
715b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc        = NULL;
716360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
7178b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) {
718b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
719b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
720b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
721b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
722b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len)
723b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->name    = drmMalloc(version->name_len + 1);
724b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len)
725b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->date    = drmMalloc(version->date_len + 1);
726b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len)
727b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->desc    = drmMalloc(version->desc_len + 1);
728360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
7298b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) {
730b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane	drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
731b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
732b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
733b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
734b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
73522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* The results might not be null-terminated strings, so terminate them. */
736b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len) version->name[version->name_len] = '\0';
737b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len) version->date[version->date_len] = '\0';
738b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len) version->desc[version->desc_len] = '\0';
739b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
740b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    retval = drmMalloc(sizeof(*retval));
741b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmCopyVersion(retval, version);
742b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFreeKernelVersion(version);
743b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
744b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
745b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
7463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library.
749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent.
751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
752d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
753d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
754d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information.
755d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
756d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
757d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded
758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number.
759d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
7603903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd)
7613903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
7623903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    drm_version_t *version = drmMalloc(sizeof(*version));
7633903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7643903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    /* Version history:
76579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie     *   NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it
7663903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
7673903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    entry point and many drm<Device> extensions
7683903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.1.x = added drmCommand entry points for device extensions
7693903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    added drmGetLibVersion to identify libdrm.a version
77006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *   revision 1.2.x = added drmSetInterfaceVersion
77106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *                    modified drmOpen to handle both busid and name
77279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie     *   revision 1.3.x = added server + memory manager
7733903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     */
77479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    version->version_major      = 1;
77579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    version->version_minor      = 3;
7763903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    version->version_patchlevel = 0;
7773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7783903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return (drmVersionPtr)version;
7793903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
7803903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information.
784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid().
786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid.
789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
790b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid)
791b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
792b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drmFree((void *)busid);
793b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
794b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
795d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device.
798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
799d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
800d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
801d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string.
802d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to
805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique
806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure.
807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
808b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd)
809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
810b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
811b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
812b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = 0;
813b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = NULL;
814b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8158b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
816ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
817b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique = drmMalloc(u.unique_len + 1);
8188b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
819ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
820b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique[u.unique_len] = '\0';
82106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
822b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return u.unique;
823b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
825d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device.
828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string.
831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure.
833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure.
837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
838b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid)
839b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
840b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
841b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
842b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = (char *)busid;
843b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = strlen(busid);
844b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8458b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
84656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	return -errno;
84756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
848b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
849b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
850b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8518696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic)
852b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
853b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = 0;
8568b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth))
857ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
858b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = auth.magic;
859b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
860b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
861b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8628696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic)
863b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
864b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
865b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    auth.magic = magic;
8678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
868ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
869b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
870b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
872d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
873d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a
874d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process.
875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of
878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below.
879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes.
880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped.
881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions.
882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset
883d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap().
884d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
885d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error.
886d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
887d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer
888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer
889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer,
890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and
891d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER.
892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the
895d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining.
896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area
898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area,
899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area,
900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and
901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS.
902d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached.
904d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
905d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA
906d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA,
907d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero,
908d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes,
909d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM.
910d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
911d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
912d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in
913d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle
914d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned.
915d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
916d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
917d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing
920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure.
921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
92222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
92322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	      drmMapFlags flags, drm_handle_t *handle)
924b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
925b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_map_t map;
926b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
927b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.offset  = offset;
928b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.size    = size;
929b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.handle  = 0;
930b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.type    = type;
931b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.flags   = flags;
9328b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map))
933ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
934ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (handle)
935ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*handle = (drm_handle_t)map.handle;
936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
937b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
938b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
9398696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle)
94074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
94174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_map_t map;
94274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
94374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
94474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
9458b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
946ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
94774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
94874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
94974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
950d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
951d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers.
952d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
953d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
954d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers.
955d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer.
956d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags.
957d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture
958d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error.
960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.
963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc.
965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
966ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
967ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann	       int agp_offset)
968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_desc_t request;
970360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
971b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count     = count;
972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.size      = size;
973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.low_mark  = 0;
974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.high_mark = 0;
975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.flags     = flags;
976ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    request.agp_start = agp_offset;
977360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
9788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request))
979ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
980b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return request.count;
981b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
982b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
983b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high)
984b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
985b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
986b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
987b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
988b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
989b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
9918b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
992ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
993b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
994ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!info.count)
995ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
996360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return -ENOMEM;
999360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
10008b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
1001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	int retval = -errno;
1002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
1003b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1005360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < info.count; i++) {
1007b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].low_mark  = low  * info.list[i].count;
1008b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].high_mark = high * info.list[i].count;
10098b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard	if (drmIoctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
1010b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    int retval = -errno;
1011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
1012b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return retval;
1013b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
1014b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1015b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(info.list);
1016360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1018b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1020d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1021d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers.
1022d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1023d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1024d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free.
1025d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed.
1026d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1027d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1028d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1029d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging.
1030d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1031d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1032d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
1033d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure.
1034d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list)
1036b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1037b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_free_t request;
1038b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1039b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count = count;
1040b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.list  = list;
10418b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request))
1042ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1043b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1044b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1045b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1047d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1048d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device.
1049d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1050d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1051d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1052d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1053d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor.
1054d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1055b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd)
1056b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1057b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key    = drmGetKeyFromFd(fd);
1058b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1060b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDestroy(entry->tagTable);
1061b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->fd       = 0;
1062b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f        = NULL;
1063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->tagTable = NULL;
1064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1065b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDelete(drmHashTable, key);
1066b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(entry);
1067b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1068b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return close(fd);
1069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1070b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1071d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1072d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1073d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory.
1074d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1075d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1076d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap().
1077d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap().
1078d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping
1079d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins.
1080d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1081d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1082d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1083d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap().
1085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
108622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
1087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1088c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    static unsigned long pagesize_mask = 0;
1089c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1090ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd < 0)
1091ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
1092c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1093c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    if (!pagesize_mask)
1094c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane	pagesize_mask = getpagesize() - 1;
1095c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1096c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    size = (size + pagesize_mask) & ~pagesize_mask;
1097c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
1099ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (*address == MAP_FAILED)
1100ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1102b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap().
1107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap().
1109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap().
1110d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1111d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1112d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1113d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
111422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap().
1115d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size)
1117b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1118b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return munmap(address, size);
1119b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1120b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1121b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd)
1122b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1123b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
1124b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufInfoPtr  retval;
1125b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
1126b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1127b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
1128b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
1129b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
11308b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
1131ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1132b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1133b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (info.count) {
1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
1135b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1136360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
11378b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard	if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
1138b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
1139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
114122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1143b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = info.count;
1144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
1145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < info.count; i++) {
1146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].count     = info.list[i].count;
1147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].size      = info.list[i].size;
1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].low_mark  = info.list[i].low_mark;
1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].high_mark = info.list[i].high_mark;
1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return NULL;
1155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1157d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1158d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space.
1159d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1160d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1161d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1162d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure.
1163d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1164d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices
1165d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA().
1166d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1167d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1168d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned
1169d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the
1170d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures.
1171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1172b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd)
1173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1174b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_map_t bufs;
1175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufMapPtr  retval;
1176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1177360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.count = 0;
1179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.list  = NULL;
11808696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    bufs.virtual = NULL;
11818b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
1182ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1184ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!bufs.count)
1185ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
11868696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
1188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
11908b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard	if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
1191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(bufs.list);
1192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
119422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = bufs.count;
1197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
1198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < bufs.count; i++) {
1199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].idx     = bufs.list[i].idx;
1200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].total   = bufs.list[i].total;
1201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].used    = 0;
1202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].address = bufs.list[i].address;
1203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
12048696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
12058696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	drmFree(bufs.list);
12068696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1210d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1211d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1212d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs().
1213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1214d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure.
1215d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1216d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
12178696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the
12188696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs().
1219d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs)
1221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int i;
1223360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1224b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < bufs->count; i++) {
1225b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	munmap(bufs->list[i].address, bufs->list[i].total);
1226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
12278696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
12288696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs->list);
12298696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs);
12308696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1234d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1235360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY		16
1236360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers.
1239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request
1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the
1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries.
1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1249b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request)
1250b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_dma_t dma;
1252360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    int ret, i = 0;
1253b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.context         = request->context;
1255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_count      = request->send_count;
1256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_indices    = request->send_list;
1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_sizes      = request->send_sizes;
1258b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.flags           = request->flags;
1259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_count   = request->request_count;
1260b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_size    = request->request_size;
1261b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_indices = request->request_list;
1262b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_sizes   = request->request_sizes;
12638696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    dma.granted_count   = 0;
1264360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1265360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    do {
1266360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
1267360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
1268360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1269360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    if ( ret == 0 ) {
1270360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	request->granted_count = dma.granted_count;
1271360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return 0;
1272360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } else {
1273360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return -errno;
1274360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    }
1275b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1276b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock.
1280d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1281d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1282d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1283d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function
1284d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns.
1285d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1286d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero.
1287d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1288d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1289d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue
1290d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.
1291d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
12928696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
1293b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1294b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1295b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1296b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1299b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1300b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1301b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1302b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1304360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
13058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    while (drmIoctl(fd, DRM_IOCTL_LOCK, &lock))
1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	;
1307b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1308b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1310d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1311d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock.
1312d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1313d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1314d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1315d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1316d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1317d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1318d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1319d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the
1320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure.
1321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
13228696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context)
1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1326b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
13288b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock);
1329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
133122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count)
1332b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1333b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_res_t res;
1334b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t     *list;
13358696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drm_context_t * retval;
1336b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1337b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1338b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.count    = 0;
1339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = NULL;
13408b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res))
1341ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1342b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1343ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!res.count)
1344ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1345b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1346ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!(list   = drmMalloc(res.count * sizeof(*list))))
1347ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1348b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
1349b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(list);
1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
1351b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = list;
13548b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res))
1355ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1357ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < res.count; i++)
1358ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	retval[i] = list[i].handle;
1359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(list);
1360b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *count = res.count;
1362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
136522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt)
1366b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(pt);
1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1370d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1371d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context.
1372d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1373d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes
1374d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated.
1375d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1376d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA
1378d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA().
1379d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1381d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1382d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1383d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1384d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1385d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the
1386d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1387d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
138822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle)
1389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1391b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1392b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags = 0;	/* Modified with functions below */
13938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx))
1394ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = ctx.handle;
1396b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1397b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1398b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13998696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context)
1400b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1401b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1402b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1403b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
14048b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx))
1405ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1406b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1407b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1408b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14098696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
1410b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1411b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1412b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
141322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /*
141422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * Context preserving means that no context switches are done between DMA
141522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * buffers from one context and the next.  This is suitable for use in the
141622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * X server (which promises to maintain hardware context), or in the
141722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * client-side library when buffers are swapped on behalf of two threads.
141822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     */
1419b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1420b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags  = 0;
1421ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (flags & DRM_CONTEXT_PRESERVED)
1422ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	ctx.flags |= _DRM_CONTEXT_PRESERVED;
1423ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (flags & DRM_CONTEXT_2DONLY)
1424ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	ctx.flags |= _DRM_CONTEXT_2DONLY;
14258b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_MOD_CTX, &ctx))
1426ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1428b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1429b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
143022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context,
143122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                       drm_context_tFlagsPtr flags)
1432b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1433b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1434b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1435b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
14368b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx))
1437ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1438b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *flags = 0;
1439ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ctx.flags & _DRM_CONTEXT_PRESERVED)
1440ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*flags |= DRM_CONTEXT_PRESERVED;
1441ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ctx.flags & _DRM_CONTEXT_2DONLY)
1442ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*flags |= DRM_CONTEXT_2DONLY;
1443b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1444b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1445360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context.
1448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated
1450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context.
1451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext().
1454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1456d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1458d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1459d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1460d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the
1461d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1462d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
14638696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle)
1464b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1465b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1466b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = handle;
14678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx))
1468ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1469b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1470b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1471b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
147222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle)
1473b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1474b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
14758b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw))
1476ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1477b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = draw.handle;
1478b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1479b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1480b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14818696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle)
1482b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1483b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
1484b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    draw.handle = handle;
14858b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw))
1486ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1487b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1488b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1489b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14909810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
14919810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   drm_drawable_info_type_t type, unsigned int num,
14929810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   void *data)
14939810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{
14949810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    drm_update_draw_t update;
14959810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14969810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.handle = handle;
14979810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.type = type;
14989810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.num = num;
14999810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.data = (unsigned long long)(unsigned long)data;
15009810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
15018b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_UPDATE_DRAW, &update))
1502ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
15039810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
15049810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    return 0;
15059810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer}
15069810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
1507d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1508d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device.
1509d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1510d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls.
1511d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1512d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1513d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1514d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1515d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1516d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1517d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.
1518d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1519ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd)
1520ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
15218b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL))
1522ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1523ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1524ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1525ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1526d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1527d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device.
1529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.
1536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1537ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd)
1538ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
15398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_RELEASE, NULL))
1540ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1541ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1542ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1543ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode.
1547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode.
1550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1551d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the
1555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure.
1556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1557ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode)
1558ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1559ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_mode_t m;
1560ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1561ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    m.mode = mode;
15628b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m))
1563ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1564ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1565ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1566ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1567d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1568d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1569d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory.
1570d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1571d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1572d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary.
1573d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate.
1574d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the
1575d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory.
1576d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory.
1577d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1578d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1579d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1580d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1581d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the
1582d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure.
1583d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1584ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type,
15857ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie		unsigned long *address, drm_handle_t *handle)
1586ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1587ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1588b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
1589b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane    *handle = DRM_AGP_NO_HANDLE;
1590ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = size;
1591ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = 0;
1592ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.type   = type;
15938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b))
1594ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1595ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (address != 0UL)
1596ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*address = b.physical;
1597ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    *handle = b.handle;
1598ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1599ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1600ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1601d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1602d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1603d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory.
1604d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1605d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1606d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1607d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1608d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the
1612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure.
1613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
16147ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle)
1615ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1616ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1617ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1618ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = 0;
1619ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
16208b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b))
1621ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1622ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1623ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1624ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory.
1628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1630d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1631d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary.
1632d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1633d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1634d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the
1637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure.
1638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
16397ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
1640ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1641ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1642ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1643ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1644ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = offset;
16458b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b))
1646ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1647ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1648ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1649ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1650d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1651d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1652d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory.
1653d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1654d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1655d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing
1661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure.
1662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
16637ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle)
1664ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1665ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1666ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1667ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1668ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = 0;
16698b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b))
1670ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1671ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1672ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1673ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1674d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1675d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1676d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number.
1677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure..
1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1686ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd)
1687ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1688ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1689ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
16908b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1691ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1692ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_major;
1693ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1694ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1695d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number.
1698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure.
1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1707ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd)
1708ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1709ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1710ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17118b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1712ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_minor;
1714ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1715ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1718d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode.
1719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode 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 long drmAgpGetMode(int fd)
1729ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1730ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1731ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17328b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1733ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1734ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.mode;
1735ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1736ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1737d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1738d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1739d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base.
1740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure.
1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1749ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd)
1750ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1751ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1752ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17538b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1754ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1755ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_base;
1756ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1757ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1759d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1760d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size.
1761d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1762d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1763d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1764d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure.
1765d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1770ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd)
1771ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1772ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1773ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17748b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1775ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1776ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_size;
1777ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1778ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory.
1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure.
1786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1791ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd)
1792ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1793ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1794ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
17958b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1796ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1797ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_used;
1798ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1799ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1800d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1801d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1802d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory.
1803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure.
1807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1812ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd)
1813ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1814ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1815ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
18168b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1817ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1818ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_allowed;
1819ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1820ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1821d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1822d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1823d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID.
1824d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1825d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure.
1828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1833ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd)
1834ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1835ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1836ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
18378b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1838ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1839ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_vendor;
1840ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1841ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID.
1845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure.
1849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1854ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd)
1855ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1856ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1857ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
18588b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
1859ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1860ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_device;
1861ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1862ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
18637ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
18645d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
18655d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
18665d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18675d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = 0;
18685d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = size;
18695d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = 0;
18708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg))
1871ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
18725d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = sg.handle;
18735d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
18745d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
18755d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18767ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle)
18775d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
18785d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
18795d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18805d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = 0;
18815d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = handle;
18828b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg))
1883ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
18845d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
18855d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
18865d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
1887d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK.
1889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1891d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure.
1892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1895d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.
1897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
189855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl)
189955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{
1900f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes    struct timespec timeout, cur;
190155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    int ret;
190255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
1903f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes    ret = clock_gettime(CLOCK_MONOTONIC, &timeout);
1904f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes    if (ret < 0) {
1905f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes	fprintf(stderr, "clock_gettime failed: %s\n", strerror(ret));
1906f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes	goto out;
1907f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes    }
1908f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes    timeout.tv_sec++;
1909f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes
191055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    do {
1911f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
1912c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
1913ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes       if (ret && errno == EINTR) {
1914ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes	       clock_gettime(CLOCK_MONOTONIC, &cur);
1915ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes	       /* Timeout after 1s */
1916ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes	       if (cur.tv_sec > timeout.tv_sec + 1 ||
1917ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes		   (cur.tv_sec == timeout.tv_sec && cur.tv_nsec >=
1918ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes		    timeout.tv_nsec)) {
1919ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes		       errno = EBUSY;
1920ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes		       ret = -1;
1921ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes		       break;
1922ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes	       }
1923f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes       }
192455acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    } while (ret && errno == EINTR);
192555acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
1926f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnesout:
192755acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    return ret;
192855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer}
192955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
1930b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label)
1931b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1932b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    switch (err) {
1933ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NO_DEVICE:
1934ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: no device\n", label);
1935ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1936ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NO_ACCESS:
1937ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: no access\n", label);
1938ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1939ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NOT_ROOT:
1940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: not root\n", label);
1941ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1942ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_INVALID:
1943ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: invalid args\n", label);
1944ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    default:
1946ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (err < 0)
1947ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    err = -err;
1948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
1949b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	break;
1950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1952b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 1;
1953b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1954b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1955d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1956d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler.
1957d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1958d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number.
1960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1967b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq)
1968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1970b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1971b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_INST_HANDLER;
1972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = irq;
19738b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
1974ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1977b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1978d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1979d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1980d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler.
1981d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1982d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1983d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd)
1991b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1992b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1993b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1994b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_UNINST_HANDLER;
1995b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = 0;
19968b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
1997ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags)
2002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2003b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
2004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
2006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
2007b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
2008b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
2009b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
2010b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
2011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
2012b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
20138b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_FINISH, &lock))
2014ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
2015b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
2016b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2018d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2019d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID.
2020d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2021d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2022d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number.
2023d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number.
2024d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number.
2025d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2026d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure.
2027d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2028d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2029d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
2030d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure.
2031d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
2032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
2033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_irq_busid_t p;
2035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2036b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.busnum  = busnum;
2037b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.devnum  = devnum;
2038b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.funcnum = funcnum;
20398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p))
2040ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
2041b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return p.irq;
2042b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2043b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20448696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag)
2045b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2046b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
2047b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashInsert(entry->tagTable, context, tag)) {
2049b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashDelete(entry->tagTable, context);
2050b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(entry->tagTable, context, tag);
2051b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
2052b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
2053b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2054b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20558696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context)
2056b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2057b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
2058b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return drmHashDelete(entry->tagTable, context);
2060b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2061b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20628696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context)
2063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
2065b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
2066360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
2067ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (drmHashLookup(entry->tagTable, context, &value))
2068ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
2069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2070b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return value;
2071b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2072b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
207322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
207422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t handle)
207574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
207674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
207774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
207874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
207974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
208074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
20818b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))
2082ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
208374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
208474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
208574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
208622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
208722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t *handle)
208874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
208974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
209074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
209174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
209274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
20938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
2094ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
2095ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (handle)
2096ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*handle = (drm_handle_t)map.handle;
209774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
209874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
209974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
210074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
21018696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
21028696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	      drmMapType *type, drmMapFlags *flags, drm_handle_t *handle,
210388dbee54ed400a3fd5594fab506518c171167805Rik Faith	      int *mtrr)
210488dbee54ed400a3fd5594fab506518c171167805Rik Faith{
210588dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_map_t map;
210688dbee54ed400a3fd5594fab506518c171167805Rik Faith
210788dbee54ed400a3fd5594fab506518c171167805Rik Faith    map.offset = idx;
21088b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map))
2109ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
211088dbee54ed400a3fd5594fab506518c171167805Rik Faith    *offset = map.offset;
211188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *size   = map.size;
211288dbee54ed400a3fd5594fab506518c171167805Rik Faith    *type   = map.type;
211388dbee54ed400a3fd5594fab506518c171167805Rik Faith    *flags  = map.flags;
211488dbee54ed400a3fd5594fab506518c171167805Rik Faith    *handle = (unsigned long)map.handle;
211588dbee54ed400a3fd5594fab506518c171167805Rik Faith    *mtrr   = map.mtrr;
211688dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
211788dbee54ed400a3fd5594fab506518c171167805Rik Faith}
211888dbee54ed400a3fd5594fab506518c171167805Rik Faith
211988dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
212088dbee54ed400a3fd5594fab506518c171167805Rik Faith		 unsigned long *magic, unsigned long *iocs)
212188dbee54ed400a3fd5594fab506518c171167805Rik Faith{
212288dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_client_t client;
212388dbee54ed400a3fd5594fab506518c171167805Rik Faith
212488dbee54ed400a3fd5594fab506518c171167805Rik Faith    client.idx = idx;
21258b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client))
2126ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
212788dbee54ed400a3fd5594fab506518c171167805Rik Faith    *auth      = client.auth;
212888dbee54ed400a3fd5594fab506518c171167805Rik Faith    *pid       = client.pid;
212988dbee54ed400a3fd5594fab506518c171167805Rik Faith    *uid       = client.uid;
213088dbee54ed400a3fd5594fab506518c171167805Rik Faith    *magic     = client.magic;
213188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *iocs      = client.iocs;
213288dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
213388dbee54ed400a3fd5594fab506518c171167805Rik Faith}
213488dbee54ed400a3fd5594fab506518c171167805Rik Faith
213588dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats)
213688dbee54ed400a3fd5594fab506518c171167805Rik Faith{
213788dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_stats_t s;
213888dbee54ed400a3fd5594fab506518c171167805Rik Faith    int         i;
213988dbee54ed400a3fd5594fab506518c171167805Rik Faith
21408b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s))
2141ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
214288dbee54ed400a3fd5594fab506518c171167805Rik Faith
214388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = 0;
214488dbee54ed400a3fd5594fab506518c171167805Rik Faith    memset(stats, 0, sizeof(*stats));
214588dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
214688dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
214788dbee54ed400a3fd5594fab506518c171167805Rik Faith
214888dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE                              \
214988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
215088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%8.8s";      \
215188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 1;            \
215288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
215388dbee54ed400a3fd5594fab506518c171167805Rik Faith
215488dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT                              \
215588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
215688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
215788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
215888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "kgm";        \
215988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1000;         \
216088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
216188dbee54ed400a3fd5594fab506518c171167805Rik Faith
216288dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE                               \
216388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
216488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
216588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
216688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "KGM";        \
216788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1024;         \
216888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
216988dbee54ed400a3fd5594fab506518c171167805Rik Faith
217088dbee54ed400a3fd5594fab506518c171167805Rik Faith
217188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = s.count;
217288dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < s.count; i++) {
217388dbee54ed400a3fd5594fab506518c171167805Rik Faith	stats->data[i].value = s.data[i].value;
217488dbee54ed400a3fd5594fab506518c171167805Rik Faith	switch (s.data[i].type) {
217588dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCK:
217688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Lock";
217788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
217888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
217988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
218088dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_OPENS:
218188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Opens";
218288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "O";
218388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
218488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
218588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
218688dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_CLOSES:
218788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Closes";
218888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
218988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
219088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
219188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
219288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IOCTLS:
219388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Ioctls";
219488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ioc/s";
219588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
219688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
219788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCKS:
219888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Locks";
219988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lck/s";
220088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
220188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
220288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_UNLOCKS:
220388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Unlocks";
220488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Unl/s";
220588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
220688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
220788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IRQ:
220888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "IRQs";
220988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "IRQ/s";
221088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
221188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
221288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_PRIMARY:
221388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Primary Bytes";
221488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "PB/s";
221588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
221688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
221788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SECONDARY:
221888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Secondary Bytes";
221988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "SB/s";
222088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
222188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
222288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_DMA:
222388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "DMA";
222488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "DMA/s";
222588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
222688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
222788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SPECIAL:
222888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Special DMA";
222988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "dma/s";
223088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
223188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
223288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_MISSED:
223388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Miss";
223488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ms/s";
223588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
223688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
223788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_VALUE:
223888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Value";
223988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Value";
224088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
224188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
224288dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_BYTE:
224388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Bytes";
224488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "B/s";
224588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
224688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
224788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_COUNT:
224888dbee54ed400a3fd5594fab506518c171167805Rik Faith	default:
224988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Count";
225088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Cnt/s";
225188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
225288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
225388dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
225488dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
225588dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
225688dbee54ed400a3fd5594fab506518c171167805Rik Faith}
225788dbee54ed400a3fd5594fab506518c171167805Rik Faith
2258d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
225906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl.
226006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
226106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor.
226206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index
226306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written.
226406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written.
226506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
226606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure.
226706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
226806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
226906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by
227006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
227106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
227222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version)
227306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
227406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    int retcode = 0;
227506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drm_set_version_t sv;
227606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
227706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_major = version->drm_di_major;
227806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_minor = version->drm_di_minor;
227906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_major = version->drm_dd_major;
228006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_minor = version->drm_dd_minor;
228106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
22828b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
228306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	retcode = -errno;
228406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
228506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
228606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_major = sv.drm_di_major;
228706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_minor = sv.drm_di_minor;
228806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_major = sv.drm_dd_major;
228906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_minor = sv.drm_dd_minor;
229006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
229106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return retcode;
229206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
229306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
229406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
2295d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command.
2296d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2297d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2298d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2299d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2300d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2301d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by
2304d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2305d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
23063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex)
23073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    void *data = NULL; /* dummy */
23093903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23103903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
23123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23138b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, request, data)) {
23143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
23153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
23163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
23173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
23183903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2319d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command.
2322d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2323d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2324d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2325d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read.
2326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read.
2327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by
2332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
233422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data,
233522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                   unsigned long size)
23363903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23383903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
233974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE,
234074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
23413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23428b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, request, data)) {
23433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
23443903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
23453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
23463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
23473903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2349d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2350d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command.
2351d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2352d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2353d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2354d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written.
2355d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written.
2356d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2357d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2358d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2359d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2360d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by
2361d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2362d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
236322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data,
236422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                    unsigned long size)
23653903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23663903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23673903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
236874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE,
236974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
23703903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, request, data)) {
23723903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
23733903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
23743903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
23753903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
23763903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2378d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2379d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command.
2380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2381d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2382d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2383d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written.
2384d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written.
2385d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2386d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2387d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2388d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2389d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by
2390d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2391d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
239222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,
239322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                        unsigned long size)
23943903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23953903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23963903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
239774ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE,
239874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
23993903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
24008b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard    if (drmIoctl(fd, request, data))
24013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
24023903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
24033903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
2404166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2405d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16
2406d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct {
2407ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    char *BusID;
2408ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int fd;
2409ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int refcount;
2410d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS];
2411d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2412d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0;
2413d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2414d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused,
2415d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie		const char *BusID,
2416d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie		int *newlyopened)
2417d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{
2418ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int i;
2419ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int fd;
2420d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2421ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < nr_fds; i++)
2422ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (strcmp(BusID, connection[i].BusID) == 0) {
2423ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    connection[i].refcount++;
2424ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    *newlyopened = 0;
2425ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return connection[i].fd;
2426ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	}
2427ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2428ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    fd = drmOpen(unused, BusID);
2429ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd <= 0 || nr_fds == DRM_MAX_FDS)
2430ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
2431d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2432ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].BusID = strdup(BusID);
2433ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].fd = fd;
2434ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].refcount = 1;
2435ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    *newlyopened = 1;
2436d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2437ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (0)
2438ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "saved connection %d for %s %d\n",
2439ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		nr_fds, connection[nr_fds].BusID,
2440ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		strcmp(BusID, connection[nr_fds].BusID));
2441d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2442ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    nr_fds++;
2443d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2444ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return fd;
2445d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie}
2446d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2447d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd)
2448d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{
2449ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int i;
2450d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2451ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < nr_fds; i++) {
2452ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (fd == connection[i].fd) {
2453ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    if (--connection[i].refcount == 0) {
2454ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		drmClose(connection[i].fd);
2455ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		free(connection[i].BusID);
2456d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2457ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		if (i < --nr_fds)
2458ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		    connection[i] = connection[nr_fds];
2459d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2460ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		return;
2461ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    }
2462ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	}
2463ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    }
2464d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie}
2465731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes
2466731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmSetMaster(int fd)
2467731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{
2468731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	int ret;
2469731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes
2470731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	fprintf(stderr,"Setting master \n");
2471731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	ret = ioctl(fd, DRM_IOCTL_SET_MASTER, 0);
2472731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	return ret;
2473731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}
2474731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes
2475731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmDropMaster(int fd)
2476731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{
2477731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	int ret;
2478731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	fprintf(stderr,"Dropping master \n");
2479731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	ret = ioctl(fd, DRM_IOCTL_DROP_MASTER, 0);
2480731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes	return ret;
2481731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes}
2482