xf86drm.c revision db85ed25afc616acfaadb21facf6066354f9d490
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>
4579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/types.h>
4679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/stat.h>
4779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#define stat_t struct stat
4879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/ioctl.h>
4979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/mman.h>
5079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/time.h>
5179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdarg.h>
52b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
53b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */
54b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED
55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1)
56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif
57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h"
59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
60ea08b613bdc496b0e1aa3b723f8462d2c40ed8e5Adam Jackson#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
61cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145
62cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif
63cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt
64cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__
65cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34
6688dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
6788dbee54ed400a3fd5594fab506518c171167805Rik Faith
68b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__
69b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#  define DRM_MAJOR 81
70b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif
71b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
72cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR
73cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226		/* Linux */
7488dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
7588dbee54ed400a3fd5594fab506518c171167805Rik Faith
7688dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR
7788dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16
7888dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
79569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
8022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/*
8122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure.
8222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best.
8322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */
84569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev
85569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
86569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif
87569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
8856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3
8956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
9073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie#define DRM_NODE_CONTROL 0
9173bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie#define DRM_NODE_RENDER 1
9273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie
9379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info;
9479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
9579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info)
9679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
97ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    drm_server_info = info;
9879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
9979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
100d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
101d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr.
102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string.
104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf().
107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
10879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
10979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int drmDebugPrint(const char *format, va_list ap)
11079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
111ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return vfprintf(stderr, format, ap);
11279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
11379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
11479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint;
11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
11656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawesstatic void
11756bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...)
11856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{
11956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    va_list	ap;
12056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    const char *env;
12179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info)
12256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    {
12356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_start(ap, format);
12479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (drm_server_info) {
12579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	  drm_server_info->debug_print(format,ap);
12679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	} else {
12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	  drm_debug_print(format, ap);
12879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	}
12956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	va_end(ap);
13056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
13156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes}
13256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
13379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid
13479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap))
13579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
136ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    drm_debug_print = debug_msg_ptr;
13779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
13879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */
140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void)
14279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{
143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return drmHashTable;
14479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie}
145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size)
147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void *pt;
149ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if ((pt = malloc(size)))
150ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	memset(pt, 0, size);
151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return pt;
152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt)
155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
156ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (pt)
157ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	free(pt);
158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
160569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s)
162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
16348198970ce449165fe1c7294108ca3afc775563dAdam Jackson    char *retval;
16448198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16548198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!s)
16648198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
16748198970ce449165fe1c7294108ca3afc775563dAdam Jackson
16879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    retval = malloc(strlen(s)+1);
16948198970ce449165fe1c7294108ca3afc775563dAdam Jackson    if (!retval)
17048198970ce449165fe1c7294108ca3afc775563dAdam Jackson        return NULL;
17148198970ce449165fe1c7294108ca3afc775563dAdam Jackson
17248198970ce449165fe1c7294108ca3afc775563dAdam Jackson    strcpy(retval, s);
173360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
174569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd)
179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
180fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes    stat_t     st;
181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    st.st_rdev = 0;
183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    fstat(fd, &st);
184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return st.st_rdev;
185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
18779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd)
188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key = drmGetKeyFromFd(fd);
190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry;
192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
193ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!drmHashTable)
194ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	drmHashTable = drmHashCreate();
195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashLookup(drmHashTable, key, &value)) {
197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry           = drmMalloc(sizeof(*entry));
198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->fd       = fd;
199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->f        = NULL;
200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry->tagTable = drmHashCreate();
201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(drmHashTable, key, entry);
202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    } else {
203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	entry = value;
204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return entry;
206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
20906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings
21006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
21106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first
21206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second
21306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
21406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched.
21506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
21606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
21706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings.  It understands the older
21806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format.  In the format, o is
21906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function.
22006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
22106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholtstatic int drmMatchBusID(const char *id1, const char *id2)
22206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
22306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* First, check if the IDs are exactly the same */
22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strcasecmp(id1, id2) == 0)
22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return 1;
22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Try to match old/new-style PCI bus IDs. */
22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (strncasecmp(id1, "pci", 3) == 0) {
22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o1, b1, d1, f1;
23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int o2, b2, d2, f2;
23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	int ret;
23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1);
23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
23506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o1 = 0;
23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1);
23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
23806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2);
24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (ret != 4) {
24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    o2 = 0;
24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2);
24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (ret != 3)
24606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt		return 0;
24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2))
25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 0;
25106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	else
25206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return 1;
25306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
25406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return 0;
25506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
25606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
25706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
258d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary.
259d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
260d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device.
261d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device.
262d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
263d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
264d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
265d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
266d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device
267d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and
268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root.
269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
27073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airliestatic int drmOpenDevice(long dev, int minor, int type)
271b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2729c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes    stat_t          st;
27388dbee54ed400a3fd5594fab506518c171167805Rik Faith    char            buf[64];
27488dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             fd;
27579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    mode_t          devmode = DRM_DEV_MODE, serv_mode;
27688dbee54ed400a3fd5594fab506518c171167805Rik Faith    int             isroot  = !geteuid();
27788dbee54ed400a3fd5594fab506518c171167805Rik Faith    uid_t           user    = DRM_DEV_UID;
27879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    gid_t           group   = DRM_DEV_GID, serv_group;
27979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
28073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie    sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor);
28106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenDevice: node name is %s\n", buf);
28256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes
28379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (drm_server_info) {
284ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	drm_server_info->get_perms(&serv_group, &serv_mode);
285ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	devmode  = serv_mode ? serv_mode : DRM_DEV_MODE;
286ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
287ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	group = (serv_group >= 0) ? serv_group : DRM_DEV_GID;
28879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    }
289569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
29088dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (stat(DRM_DIR_NAME, &st)) {
291ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
292ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
293b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
294b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chown(DRM_DIR_NAME, 0, 0); /* root:root */
295b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane	chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
296569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
29806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node exists and create it if necessary. */
299d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (stat(buf, &st)) {
300ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
301ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
30288dbee54ed400a3fd5594fab506518c171167805Rik Faith	remove(buf);
30388dbee54ed400a3fd5594fab506518c171167805Rik Faith	mknod(buf, S_IFCHR | devmode, dev);
304b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
30579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie
30679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (drm_server_info) {
307ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	chown(buf, user, group);
308ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	chmod(buf, devmode);
30979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    }
31088dbee54ed400a3fd5594fab506518c171167805Rik Faith
31156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    fd = open(buf, O_RDWR, 0);
31256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
31356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		fd, fd < 0 ? strerror(errno) : "OK");
314ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd >= 0)
315ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
316d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
31706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    /* Check if the device node is not what we expect it to be, and recreate it
31806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     * and try again if so.
31906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     */
320d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    if (st.st_rdev != dev) {
321ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!isroot)
322ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return DRM_ERR_NOT_ROOT;
323d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	remove(buf);
324d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt	mknod(buf, S_IFCHR | devmode, dev);
32579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (drm_server_info) {
326ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    chown(buf, user, group);
327ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    chmod(buf, devmode);
32879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	}
329d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    }
330d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    fd = open(buf, O_RDWR, 0);
331d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
332d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt		fd, fd < 0 ? strerror(errno) : "OK");
333ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd >= 0)
334ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
335d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt
33656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    drmMsg("drmOpenDevice: Open failed\n");
33788dbee54ed400a3fd5594fab506518c171167805Rik Faith    remove(buf);
33888dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
340b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
343d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device
344d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
345d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number.
346d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set.
347d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
349d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
350d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
351d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device
352d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it.
353d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
35473bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airliestatic int drmOpenMinor(int minor, int create, int type)
35588dbee54ed400a3fd5594fab506518c171167805Rik Faith{
35688dbee54ed400a3fd5594fab506518c171167805Rik Faith    int  fd;
35788dbee54ed400a3fd5594fab506518c171167805Rik Faith    char buf[64];
358db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie
359ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (create)
36073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie      return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type);
36188dbee54ed400a3fd5594fab506518c171167805Rik Faith
36273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie    sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor);
363ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if ((fd = open(buf, O_RDWR, 0)) >= 0)
364ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
36588dbee54ed400a3fd5594fab506518c171167805Rik Faith    return -errno;
36688dbee54ed400a3fd5594fab506518c171167805Rik Faith}
36788dbee54ed400a3fd5594fab506518c171167805Rik Faith
368569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
369d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
370d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded.
371d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
372d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise.
373d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
374d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
375d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0
376d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information.  For backward compatibility with older
377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked.
378d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
379569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void)
380569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{
381569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    drmVersionPtr version;
382569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           retval = 0;
383569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    int           fd;
384360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
38573bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie    if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) {
386b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__
38722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	/* Try proc for backward Linux compatibility */
388ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (!access("/proc/dri/0", R_OK))
389ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return 1;
390b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif
39188dbee54ed400a3fd5594fab506518c171167805Rik Faith	return 0;
392569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    }
39388dbee54ed400a3fd5594fab506518c171167805Rik Faith
39488dbee54ed400a3fd5594fab506518c171167805Rik Faith    if ((version = drmGetVersion(fd))) {
39588dbee54ed400a3fd5594fab506518c171167805Rik Faith	retval = 1;
39688dbee54ed400a3fd5594fab506518c171167805Rik Faith	drmFreeVersion(version);
39788dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
39888dbee54ed400a3fd5594fab506518c171167805Rik Faith    close(fd);
399569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
400569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul    return retval;
401569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul}
402569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul
403d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
404d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
405d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID.
406d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID.
408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR),
413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied.
414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid().
416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
417e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid)
418e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{
41988dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        i;
42088dbee54ed400a3fd5594fab506518c171167805Rik Faith    int        fd;
42188dbee54ed400a3fd5594fab506518c171167805Rik Faith    const char *buf;
42206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmSetVersion sv;
42306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
42406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
425db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    for (i = 0; i < DRM_MAX_MINOR; i++) {
42673bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie	fd = drmOpenMinor(i, 1, DRM_NODE_RENDER);
42756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
42856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	if (fd >= 0) {
42906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_major = 1;
43006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_di_minor = 1;
43106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    sv.drm_dd_major = -1;	/* Don't care */
43226462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt	    sv.drm_dd_minor = -1;	/* Don't care */
43306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    drmSetInterfaceVersion(fd, &sv);
434e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    buf = drmGetBusid(fd);
43556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
43606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    if (buf && drmMatchBusID(buf, busid)) {
43788dbee54ed400a3fd5594fab506518c171167805Rik Faith		drmFreeBusid(buf);
43888dbee54ed400a3fd5594fab506518c171167805Rik Faith		return fd;
439e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    }
440ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    if (buf)
441ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		drmFreeBusid(buf);
442e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	    close(fd);
443e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss	}
444e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    }
445e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss    return -1;
446e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss}
447e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss
448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name.
451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name.
453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
456d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and
458d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use.  If it's in use it then it will already have a bus ID
459d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned.
460d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
461d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid().
462d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
463b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name)
464b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{
46588dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           i;
46688dbee54ed400a3fd5594fab506518c171167805Rik Faith    int           fd;
46788dbee54ed400a3fd5594fab506518c171167805Rik Faith    drmVersionPtr version;
46856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    char *        id;
46988dbee54ed400a3fd5594fab506518c171167805Rik Faith
470db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    if (!drmAvailable()) {
471db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	if (!drm_server_info) {
472db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    return -1;
473db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	}
474db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	else {
475db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    /* try to load the kernel module now */
476db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    if (!drm_server_info->load_module(name)) {
477db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie		drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
478db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie		return -1;
479db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	    }
480db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie	}
481db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    }
482db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie
48356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    /*
48456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * Open the first minor number that matches the driver name and isn't
48556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     * already in use.  If it's in use it will have a busid assigned already.
48656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes     */
487db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie    for (i = 0; i < DRM_MAX_MINOR; i++) {
48873bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie	if ((fd = drmOpenMinor(i, 1, DRM_NODE_RENDER)) >= 0) {
48988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    if ((version = drmGetVersion(fd))) {
49088dbee54ed400a3fd5594fab506518c171167805Rik Faith		if (!strcmp(version->name, name)) {
49188dbee54ed400a3fd5594fab506518c171167805Rik Faith		    drmFreeVersion(version);
49256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    id = drmGetBusid(fd);
49356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
49456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    if (!id || !*id) {
49522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			if (id)
49656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			    drmFreeBusid(id);
49756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			return fd;
49856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    } else {
49956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes			drmFreeBusid(id);
50056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    }
50156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		} else {
50256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes		    drmFreeVersion(version);
50388dbee54ed400a3fd5594fab506518c171167805Rik Faith		}
50488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    }
50556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	    close(fd);
50688dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
507b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
508b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
50988dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__
51022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* Backward-compatibility /proc support */
511b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    for (i = 0; i < 8; i++) {
51288dbee54ed400a3fd5594fab506518c171167805Rik Faith	char proc_name[64], buf[512];
51388dbee54ed400a3fd5594fab506518c171167805Rik Faith	char *driver, *pt, *devstring;
51488dbee54ed400a3fd5594fab506518c171167805Rik Faith	int  retcode;
51588dbee54ed400a3fd5594fab506518c171167805Rik Faith
5160371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss	sprintf(proc_name, "/proc/dri/%d/name", i);
517b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	if ((fd = open(proc_name, 0, 0)) >= 0) {
518b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    retcode = read(fd, buf, sizeof(buf)-1);
519b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    close(fd);
520b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    if (retcode) {
521b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		buf[retcode-1] = '\0';
522b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
523b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    ;
52422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson		if (*pt) { /* Device is next */
525b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    *pt = '\0';
526b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    if (!strcmp(driver, name)) { /* Match */
527b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
528b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			    ;
529b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			if (*pt) { /* Found busid */
53088dbee54ed400a3fd5594fab506518c171167805Rik Faith			    return drmOpenByBusid(++pt);
53122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson			} else { /* No busid */
53273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie			    return drmOpenDevice(strtol(devstring, NULL, 0),i, DRM_NODE_RENDER);
533b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss			}
534b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		    }
535b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss		}
536b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss	    }
537569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul	}
538b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    }
53988dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif
54088dbee54ed400a3fd5594fab506518c171167805Rik Faith
541b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return -1;
542b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss}
543b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
544b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss
545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device.
547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found.  The
549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root.
550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
551d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied.
552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known.
553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error.
555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName()
558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise.
559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
560b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid)
561b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
56279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    if (!drmAvailable() && name != NULL && drm_server_info) {
56306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	/* try to load the kernel */
56479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie	if (!drm_server_info->load_module(name)) {
565ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
56606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return -1;
56706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	}
56806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
56906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
57006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (busid) {
571ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	int fd = drmOpenByBusid(busid);
57206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	if (fd >= 0)
57306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	    return fd;
57406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
57522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
57606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (name)
57706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	return drmOpenByName(name);
57822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
57906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return -1;
580b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
581b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
58287a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlieint drmOpenControl(int minor)
58387a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie{
58487a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie    return drmOpenMinor(minor, 0, DRM_NODE_CONTROL);
58587a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie}
586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion().
589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings
594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it.
595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
596b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v)
597b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
598ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!v)
599ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return;
6009d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->name);
6019d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->date);
6029d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->desc);
603b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
604b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
605b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
606d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
607d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
608d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel.
609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information.
611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all
614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it.
615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
616b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v)
617b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
618ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!v)
619ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return;
6209d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->name);
6219d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->date);
6229d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz    drmFree(v->desc);
623b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(v);
624b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
625b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information.
629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
630d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer.
631d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer.
632d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
633d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
634d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl
635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart.
636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
637569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
638b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
639b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_major      = s->version_major;
640b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_minor      = s->version_minor;
641b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->version_patchlevel = s->version_patchlevel;
642b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name_len           = s->name_len;
643b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->name               = drmStrdup(s->name);
644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date_len           = s->date_len;
645b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->date               = drmStrdup(s->date);
646b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc_len           = s->desc_len;
647b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    d->desc               = drmStrdup(s->desc);
648b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
649b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
651d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
652d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information.
653d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
654d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
655d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with
657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion().
658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri.
660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls,
663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings.
664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already.
665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
666b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd)
667b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
668b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmVersionPtr retval;
669b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_version_t *version = drmMalloc(sizeof(*version));
670b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
671b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name_len    = 0;
672b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->name        = NULL;
673b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date_len    = 0;
674b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->date        = NULL;
675b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc_len    = 0;
676b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    version->desc        = NULL;
677360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
678b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
679b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
680b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
681b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
682b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
683b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len)
684b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->name    = drmMalloc(version->name_len + 1);
685b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len)
686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->date    = drmMalloc(version->date_len + 1);
687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len)
688b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	version->desc    = drmMalloc(version->desc_len + 1);
689360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
690b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
691b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane	drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
692b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFreeKernelVersion(version);
693b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
694b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
695b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
69622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /* The results might not be null-terminated strings, so terminate them. */
697b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->name_len) version->name[version->name_len] = '\0';
698b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->date_len) version->date[version->date_len] = '\0';
699b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (version->desc_len) version->desc[version->desc_len] = '\0';
700b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
701b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    retval = drmMalloc(sizeof(*retval));
702b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmCopyVersion(retval, version);
703b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFreeKernelVersion(version);
704b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
705b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
706b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
7073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library.
710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent.
712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
713d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
714d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
715d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information.
716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
718d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded
719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number.
720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
7213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd)
7223903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
7233903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    drm_version_t *version = drmMalloc(sizeof(*version));
7243903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7253903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    /* Version history:
72679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie     *   NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it
7273903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
7283903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    entry point and many drm<Device> extensions
7293903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *   revision 1.1.x = added drmCommand entry points for device extensions
7303903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     *                    added drmGetLibVersion to identify libdrm.a version
73106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *   revision 1.2.x = added drmSetInterfaceVersion
73206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt     *                    modified drmOpen to handle both busid and name
73379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie     *   revision 1.3.x = added server + memory manager
7343903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen     */
73579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    version->version_major      = 1;
73679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie    version->version_minor      = 3;
7373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    version->version_patchlevel = 0;
7383903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
7393903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return (drmVersionPtr)version;
7403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
7413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information.
745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid().
747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid.
750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
751b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid)
752b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
753b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drmFree((void *)busid);
754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
755b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
756d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
757d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device.
759d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
760d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
761d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
762d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string.
763d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
764d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
765d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to
766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique
767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure.
768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
769b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd)
770b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
771b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
772b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
773b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = 0;
774b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = NULL;
775b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
776ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
777ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
778b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique = drmMalloc(u.unique_len + 1);
779ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
780ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
781b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique[u.unique_len] = '\0';
78206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
783b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    return u.unique;
784b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
785b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device.
789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string.
792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure.
794d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
795d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure.
798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
799b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid)
800b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
801b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    drm_unique_t u;
802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
803b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique     = (char *)busid;
804b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss    u.unique_len = strlen(busid);
805b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
80656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
80756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes	return -errno;
80856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes    }
809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
811b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8128696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic)
813b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
814b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
815b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
816b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = 0;
817ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth))
818ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
819b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *magic = auth.magic;
820b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
821b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
822b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
8238696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic)
824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_auth_t auth;
826b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
827b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    auth.magic = magic;
828ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
829ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
830b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
831b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
832b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a
835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process.
836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of
839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below.
840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes.
841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped.
842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions.
843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset
844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap().
845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error.
847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer
849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer
850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer,
851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and
852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER.
853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the
856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining.
857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area
859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area,
860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area,
861d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and
862d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS.
863d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
864d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached.
865d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
866d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA
867d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA,
868d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero,
869d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes,
870d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM.
871d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
872d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par
873d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in
874d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle
875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned.
876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing
881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure.
882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
88322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
88422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson	      drmMapFlags flags, drm_handle_t *handle)
885b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_map_t map;
887b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
888b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.offset  = offset;
889b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.size    = size;
890b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.handle  = 0;
891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.type    = type;
892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    map.flags   = flags;
893ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map))
894ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
895ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (handle)
896ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*handle = (drm_handle_t)map.handle;
897b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
898b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
899b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
9008696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle)
90174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
90274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_map_t map;
90374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
90474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
90574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
906ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if(ioctl(fd, DRM_IOCTL_RM_MAP, &map))
907ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
90874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
90974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
91074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
911d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
912d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers.
913d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
914d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
915d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers.
916d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer.
917d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags.
918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture
919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error.
921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.
924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc.
926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
927ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
928ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann	       int agp_offset)
929b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
930b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_desc_t request;
931360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
932b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count     = count;
933b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.size      = size;
934b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.low_mark  = 0;
935b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.high_mark = 0;
936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.flags     = flags;
937ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    request.agp_start = agp_offset;
938360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
939ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request))
940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
941b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return request.count;
942b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
943b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
944b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high)
945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
946b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
947b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
949b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
952ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info))
953ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
954b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
955ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!info.count)
956ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
957360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
959b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return -ENOMEM;
960360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
961b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
962b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	int retval = -errno;
963b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
964b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
965b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
966360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
967b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < info.count; i++) {
968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].low_mark  = low  * info.list[i].count;
969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	info.list[i].high_mark = high * info.list[i].count;
970b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
971b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    int retval = -errno;
972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return retval;
974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(info.list);
977360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
978b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
979b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
980b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
981d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
982d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers.
983d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free.
986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed.
987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging.
991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure.
995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
996b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list)
997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_free_t request;
999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.count = count;
1001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    request.list  = list;
1002ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request))
1003ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1007d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1008d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1009d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device.
1010d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1011d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1012d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor.
1015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1016b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd)
1017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1018b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    unsigned long key    = drmGetKeyFromFd(fd);
1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1020b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDestroy(entry->tagTable);
1022b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->fd       = 0;
1023b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->f        = NULL;
1024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    entry->tagTable = NULL;
1025b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1026b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashDelete(drmHashTable, key);
1027b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(entry);
1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return close(fd);
1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1031b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1032d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1033d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1034d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory.
1035d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap().
1038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap().
1039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping
1040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins.
1041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1044d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap().
1046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
104722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
1048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1049c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    static unsigned long pagesize_mask = 0;
1050c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1051ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd < 0)
1052ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -EINVAL;
1053c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1054c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    if (!pagesize_mask)
1055c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane	pagesize_mask = getpagesize() - 1;
1056c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1057c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane    size = (size + pagesize_mask) & ~pagesize_mask;
1058c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane
1059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
1060ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (*address == MAP_FAILED)
1061ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1062b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1065d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1066d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1067d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap().
1068d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1069d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap().
1070d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap().
1071d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1072d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1073d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1074d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
107522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap().
1076d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1077b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size)
1078b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1079b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return munmap(address, size);
1080b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1081b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1082b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd)
1083b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1084b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_info_t info;
1085b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufInfoPtr  retval;
1086b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int            i;
1087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.count = 0;
1089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    info.list  = NULL;
1090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1091ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info))
1092ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1093b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (info.count) {
1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
1096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1097360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
1099b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(info.list);
1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
110222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1104b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = info.count;
1105b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
1106b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < info.count; i++) {
1107b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].count     = info.list[i].count;
1108b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].size      = info.list[i].size;
1109b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].low_mark  = info.list[i].low_mark;
1110b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].high_mark = info.list[i].high_mark;
1111b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
1112b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(info.list);
1113b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1114b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1115b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return NULL;
1116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1117b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1118d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1119d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space.
1120d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1121d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1122d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1123d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure.
1124d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1125d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices
1126d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA().
1127d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1128d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1129d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned
1130d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the
1131d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures.
1132d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1133b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd)
1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1135b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_buf_map_t bufs;
1136b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmBufMapPtr  retval;
1137b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1138360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.count = 0;
1140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    bufs.list  = NULL;
11418696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    bufs.virtual = NULL;
1142ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
1143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1145ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!bufs.count)
1146ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
11478696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    drmFree(bufs.list);
1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    return NULL;
1154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
115522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson
1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval = drmMalloc(sizeof(*retval));
1157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->count = bufs.count;
1158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
1159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	for (i = 0; i < bufs.count; i++) {
1160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].idx     = bufs.list[i].idx;
1161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].total   = bufs.list[i].total;
1162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].used    = 0;
1163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	    retval->list[i].address = bufs.list[i].address;
1164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	}
11658696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
11668696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	drmFree(bufs.list);
11678696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1168b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return retval;
1169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1172d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1173d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs().
1174d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1175d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure.
1176d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1177d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
11788696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the
11798696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs().
1180d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs)
1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int i;
1184360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    for (i = 0; i < bufs->count; i++) {
1186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	munmap(bufs->list[i].address, bufs->list[i].total);
1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
11888696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
11898696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs->list);
11908696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drmFree(bufs);
11918696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl
1192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1195d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1196360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY		16
1197360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1198d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers.
1200d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1201d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request
1203d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1204d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1205d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1206d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1207d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the
1208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries.
1209d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request)
1211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1212b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_dma_t dma;
1213360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    int ret, i = 0;
1214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.context         = request->context;
1216b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_count      = request->send_count;
1217b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_indices    = request->send_list;
1218b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.send_sizes      = request->send_sizes;
1219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.flags           = request->flags;
1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_count   = request->request_count;
1221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_size    = request->request_size;
1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_indices = request->request_list;
1223b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    dma.request_sizes   = request->request_sizes;
12248696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    dma.granted_count   = 0;
1225360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1226360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    do {
1227360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
1228360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
1229360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1230360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    if ( ret == 0 ) {
1231360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	request->granted_count = dma.granted_count;
1232360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return 0;
1233360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    } else {
1234360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes	return -errno;
1235360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes    }
1236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1237b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock.
1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function
1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns.
1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero.
1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1249d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1250d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue
1251d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.
1252d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
12538696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
1254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1258b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1260b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1261b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1262b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1265360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1266b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
1267b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	;
1268b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1269b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1270b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock.
1273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context.
1276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1280d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the
1281d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure.
1282d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
12838696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context)
1284b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1287b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1288b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return ioctl(fd, DRM_IOCTL_UNLOCK, &lock);
1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
129222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count)
1293b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1294b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_res_t res;
1295b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t     *list;
12968696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl    drm_context_t * retval;
1297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    int           i;
1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1299b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.count    = 0;
1300b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = NULL;
1301ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res))
1302ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1304ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!res.count)
1305ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1307ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (!(list   = drmMalloc(res.count * sizeof(*list))))
1308ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
1310b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmFree(list);
1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	return NULL;
1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    res.contexts = list;
1315ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res))
1316ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1318ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < res.count; i++)
1319ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	retval[i] = list[i].handle;
1320b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(list);
1321b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1322b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *count = res.count;
1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return retval;
1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
132622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt)
1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmFree(pt);
1329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context.
1333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes
1335d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated.
1336d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1337d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1338d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA
1339d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA().
1340d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1343d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1344d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1345d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1346d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the
1347d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
134922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle)
1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1351b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags = 0;	/* Modified with functions below */
1354ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx))
1355ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = ctx.handle;
1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13608696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context)
1361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1365ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx))
1366ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
13708696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
1371b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1372b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1373b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
137422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson    /*
137522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * Context preserving means that no context switches are done between DMA
137622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * buffers from one context and the next.  This is suitable for use in the
137722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * X server (which promises to maintain hardware context), or in the
137822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     * client-side library when buffers are swapped on behalf of two threads.
137922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson     */
1380b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.flags  = 0;
1382ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (flags & DRM_CONTEXT_PRESERVED)
1383ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	ctx.flags |= _DRM_CONTEXT_PRESERVED;
1384ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (flags & DRM_CONTEXT_2DONLY)
1385ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	ctx.flags |= _DRM_CONTEXT_2DONLY;
1386ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx))
1387ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1388b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
139122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context,
139222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                       drm_context_tFlagsPtr flags)
1393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1396b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = context;
1397ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx))
1398ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *flags = 0;
1400ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ctx.flags & _DRM_CONTEXT_PRESERVED)
1401ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*flags |= DRM_CONTEXT_PRESERVED;
1402ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ctx.flags & _DRM_CONTEXT_2DONLY)
1403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*flags |= DRM_CONTEXT_2DONLY;
1404b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1405b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1406360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
1407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context.
1409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated
1411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context.
1412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext().
1415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root.
1419d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1420d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1421d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the
1422d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure.
1423d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
14248696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle)
1425b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1426b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_ctx_t ctx;
1427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctx.handle = handle;
1428ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx))
1429ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1430b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1431b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1432b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
143322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle)
1434b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1435b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
1436ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw))
1437ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1438b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    *handle = draw.handle;
1439b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1440b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1441b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14428696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle)
1443b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1444b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_draw_t draw;
1445b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    draw.handle = handle;
1446ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw))
1447ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1448b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1449b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1450b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
14519810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
14529810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   drm_drawable_info_type_t type, unsigned int num,
14539810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer			   void *data)
14549810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{
14559810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    drm_update_draw_t update;
14569810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14579810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.handle = handle;
14589810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.type = type;
14599810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.num = num;
14609810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    update.data = (unsigned long long)(unsigned long)data;
14619810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
1462ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update))
1463ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
14649810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
14659810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer    return 0;
14669810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer}
14679810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer
1468d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1469d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device.
1470d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1471d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls.
1472d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.
1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1480ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd)
1481ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1482ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL))
1483ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1484ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1485ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1486ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device.
1490d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1491d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1492d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1493d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1494d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1495d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1496d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.
1497d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1498ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd)
1499ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1500ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL))
1501ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1502ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1503ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1504ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1505d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1506d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1507d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode.
1508d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1509d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1510d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode.
1511d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1512d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1513d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1514d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1515d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the
1516d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure.
1517d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1518ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode)
1519ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1520ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_mode_t m;
1521ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1522ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    m.mode = mode;
1523ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m))
1524ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1525ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1526ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1527ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory.
1531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary.
1534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate.
1535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the
1536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory.
1537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory.
1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the
1543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure.
1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1545ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type,
15467ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie		unsigned long *address, drm_handle_t *handle)
1547ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1548ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1549b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane
1550b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane    *handle = DRM_AGP_NO_HANDLE;
1551ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = size;
1552ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = 0;
1553ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.type   = type;
1554ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b))
1555ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1556ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (address != 0UL)
1557ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*address = b.physical;
1558ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    *handle = b.handle;
1559ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1560ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1561ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory.
1565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1566d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1567d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1568d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1569d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1570d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1571d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1572d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the
1573d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure.
1574d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
15757ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle)
1576ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1577ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_buffer_t b;
1578ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1579ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.size   = 0;
1580ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1581ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b))
1582ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1583ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1584ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1585ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory.
1589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary.
1593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1597d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the
1598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure.
1599d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
16007ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
1601ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1602ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1603ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1604ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1605ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = offset;
1606ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b))
1607ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1608ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1609ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1610ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory.
1614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate().
1617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing
1622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure.
1623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
16247ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle)
1625ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1626ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_binding_t b;
1627ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1628ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.handle = handle;
1629ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    b.offset = 0;
1630ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b))
1631ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1632ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return 0;
1633ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1634ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number.
1638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1639d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1640d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1641d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure..
1642d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1643d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1644d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1645d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1646d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1647ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd)
1648ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1649ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1650ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1651ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1652ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1653ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_major;
1654ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1655ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number.
1659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure.
1663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1666d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1667d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1668ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd)
1669ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1670ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1671ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1672ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1673ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1674ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.agp_version_minor;
1675ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1676ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode.
1680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure.
1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1688d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1689ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd)
1690ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1691ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1692ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1693ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1694ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.mode;
1696ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1697ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base.
1701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure.
1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1710ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd)
1711ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1712ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1714ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1715ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1716ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_base;
1717ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1718ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size.
1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure.
1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1731ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd)
1732ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1733ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1734ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1735ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1736ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1737ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.aperture_size;
1738ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1739ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory.
1743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure.
1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1752ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd)
1753ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1754ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1755ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1756ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1757ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1758ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_used;
1759ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1760ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1761d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1762d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1763d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory.
1764d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1765d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure.
1768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1770d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1771d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1773ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd)
1774ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1775ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1776ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1777ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1778ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1779ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.memory_allowed;
1780ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1781ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID.
1785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure.
1789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1794ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd)
1795ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1796ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1797ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1798ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1799ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1800ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_vendor;
1801ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1802ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID.
1806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure.
1810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
1813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure.
1814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1815ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd)
1816ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{
1817ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    drm_agp_info_t i;
1818ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
1819ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1820ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return 0;
1821ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann    return i.id_device;
1822ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann}
1823ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann
18247ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
18255d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
18265d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
18275d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18285d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = 0;
18295d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = size;
18305d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = 0;
1831ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg))
1832ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
18335d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    *handle = sg.handle;
18345d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
18355d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
18365d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18377ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle)
18385d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{
18395d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    drm_scatter_gather_t sg;
18405d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
18415d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.size   = 0;
18425d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    sg.handle = handle;
1843ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg))
1844ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
18455d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin    return 0;
18465d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin}
18475d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin
1848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK.
1850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure.
1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.
1858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
185955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl)
186055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{
186155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    int ret;
186255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
186355acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    do {
186455acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
1865c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
186655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    } while (ret && errno == EINTR);
186755acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
186855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer    return ret;
186955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer}
187055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer
1871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label)
1872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    switch (err) {
1874ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NO_DEVICE:
1875ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: no device\n", label);
1876ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1877ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NO_ACCESS:
1878ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: no access\n", label);
1879ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1880ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_NOT_ROOT:
1881ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: not root\n", label);
1882ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1883ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    case DRM_ERR_INVALID:
1884ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "%s: invalid args\n", label);
1885ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	break;
1886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    default:
1887ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (err < 0)
1888ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    err = -err;
1889b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
1890b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	break;
1891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1893b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 1;
1894b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1895b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler.
1898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number.
1901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1902d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1904d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1905d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1906d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1907d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1908b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq)
1909b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1910b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1911b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1912b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_INST_HANDLER;
1913b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = irq;
1914ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl))
1915ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1916b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1917b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1918b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
1920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler.
1922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
1926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1927d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1928d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
1929d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure.
1930d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1931b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd)
1932b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1933b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_control_t ctl;
1934b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1935b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.func  = DRM_UNINST_HANDLER;
1936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    ctl.irq   = 0;
1937ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl))
1938ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1939b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1940b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1941b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1942b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags)
1943b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1944b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_lock_t lock;
1945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1946b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.context = context;
1947b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    lock.flags   = 0;
1948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
1949b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
1950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
1951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
1952b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1953b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1954ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_FINISH, &lock))
1955ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1956b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1957b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
1960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID.
1961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
1963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number.
1964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number.
1965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number.
1966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure.
1968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
1969d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
1970d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
1971d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure.
1972d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
1973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
1974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drm_irq_busid_t p;
1976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1977b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.busnum  = busnum;
1978b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.devnum  = devnum;
1979b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    p.funcnum = funcnum;
1980ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p))
1981ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
1982b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return p.irq;
1983b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1984b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
19858696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag)
1986b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1987b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1988b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
1989b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    if (drmHashInsert(entry->tagTable, context, tag)) {
1990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashDelete(entry->tagTable, context);
1991b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss	drmHashInsert(entry->tagTable, context, tag);
1992b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    }
1993b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return 0;
1994b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
1995b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
19968696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context)
1997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
1998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
1999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return drmHashDelete(entry->tagTable, context);
2001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
20038696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context)
2004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{
2005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    drmHashEntry  *entry = drmGetEntry(fd);
2006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    void          *value;
2007360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes
2008ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (drmHashLookup(entry->tagTable, context, &value))
2009ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return NULL;
2010b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
2011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss    return value;
2012b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss}
2013b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss
201422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
201522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t handle)
201674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
201774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
201874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
201974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
202074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.handle = (void *)handle;
202174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
2022ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))
2023ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
202474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
202574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
202674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
202722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
202822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                                drm_handle_t *handle)
202974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{
203074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    drm_ctx_priv_map_t map;
203174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
203274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    map.ctx_id = ctx_id;
203374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
2034ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
2035ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
2036ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (handle)
2037ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	*handle = (drm_handle_t)map.handle;
203874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
203974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin    return 0;
204074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin}
204174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin
20428696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
20438696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl	      drmMapType *type, drmMapFlags *flags, drm_handle_t *handle,
204488dbee54ed400a3fd5594fab506518c171167805Rik Faith	      int *mtrr)
204588dbee54ed400a3fd5594fab506518c171167805Rik Faith{
204688dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_map_t map;
204788dbee54ed400a3fd5594fab506518c171167805Rik Faith
204888dbee54ed400a3fd5594fab506518c171167805Rik Faith    map.offset = idx;
2049ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_MAP, &map))
2050ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
205188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *offset = map.offset;
205288dbee54ed400a3fd5594fab506518c171167805Rik Faith    *size   = map.size;
205388dbee54ed400a3fd5594fab506518c171167805Rik Faith    *type   = map.type;
205488dbee54ed400a3fd5594fab506518c171167805Rik Faith    *flags  = map.flags;
205588dbee54ed400a3fd5594fab506518c171167805Rik Faith    *handle = (unsigned long)map.handle;
205688dbee54ed400a3fd5594fab506518c171167805Rik Faith    *mtrr   = map.mtrr;
205788dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
205888dbee54ed400a3fd5594fab506518c171167805Rik Faith}
205988dbee54ed400a3fd5594fab506518c171167805Rik Faith
206088dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
206188dbee54ed400a3fd5594fab506518c171167805Rik Faith		 unsigned long *magic, unsigned long *iocs)
206288dbee54ed400a3fd5594fab506518c171167805Rik Faith{
206388dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_client_t client;
206488dbee54ed400a3fd5594fab506518c171167805Rik Faith
206588dbee54ed400a3fd5594fab506518c171167805Rik Faith    client.idx = idx;
2066ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client))
2067ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
206888dbee54ed400a3fd5594fab506518c171167805Rik Faith    *auth      = client.auth;
206988dbee54ed400a3fd5594fab506518c171167805Rik Faith    *pid       = client.pid;
207088dbee54ed400a3fd5594fab506518c171167805Rik Faith    *uid       = client.uid;
207188dbee54ed400a3fd5594fab506518c171167805Rik Faith    *magic     = client.magic;
207288dbee54ed400a3fd5594fab506518c171167805Rik Faith    *iocs      = client.iocs;
207388dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
207488dbee54ed400a3fd5594fab506518c171167805Rik Faith}
207588dbee54ed400a3fd5594fab506518c171167805Rik Faith
207688dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats)
207788dbee54ed400a3fd5594fab506518c171167805Rik Faith{
207888dbee54ed400a3fd5594fab506518c171167805Rik Faith    drm_stats_t s;
207988dbee54ed400a3fd5594fab506518c171167805Rik Faith    int         i;
208088dbee54ed400a3fd5594fab506518c171167805Rik Faith
2081ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (ioctl(fd, DRM_IOCTL_GET_STATS, &s))
2082ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return -errno;
208388dbee54ed400a3fd5594fab506518c171167805Rik Faith
208488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = 0;
208588dbee54ed400a3fd5594fab506518c171167805Rik Faith    memset(stats, 0, sizeof(*stats));
208688dbee54ed400a3fd5594fab506518c171167805Rik Faith    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
208788dbee54ed400a3fd5594fab506518c171167805Rik Faith	return -1;
208888dbee54ed400a3fd5594fab506518c171167805Rik Faith
208988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE                              \
209088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
209188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%8.8s";      \
209288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 1;            \
209388dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
209488dbee54ed400a3fd5594fab506518c171167805Rik Faith
209588dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT                              \
209688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
209788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
209888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
209988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "kgm";        \
210088dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1000;         \
210188dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
210288dbee54ed400a3fd5594fab506518c171167805Rik Faith
210388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE                               \
210488dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].long_format = "%-20.20s";   \
210588dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].rate_format = "%5.5s";      \
210688dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].isvalue     = 0;            \
210788dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult_names  = "KGM";        \
210888dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].mult        = 1024;         \
210988dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->data[i].verbose     = 0
211088dbee54ed400a3fd5594fab506518c171167805Rik Faith
211188dbee54ed400a3fd5594fab506518c171167805Rik Faith
211288dbee54ed400a3fd5594fab506518c171167805Rik Faith    stats->count = s.count;
211388dbee54ed400a3fd5594fab506518c171167805Rik Faith    for (i = 0; i < s.count; i++) {
211488dbee54ed400a3fd5594fab506518c171167805Rik Faith	stats->data[i].value = s.data[i].value;
211588dbee54ed400a3fd5594fab506518c171167805Rik Faith	switch (s.data[i].type) {
211688dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCK:
211788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Lock";
211888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
211988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
212088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
212188dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_OPENS:
212288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Opens";
212388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "O";
212488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
212588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
212688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
212788dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_CLOSES:
212888dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Closes";
212988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lock";
213088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
213188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].verbose   = 1;
213288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
213388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IOCTLS:
213488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Ioctls";
213588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ioc/s";
213688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
213788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
213888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_LOCKS:
213988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Locks";
214088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Lck/s";
214188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
214288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
214388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_UNLOCKS:
214488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Unlocks";
214588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Unl/s";
214688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
214788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
214888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_IRQ:
214988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "IRQs";
215088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "IRQ/s";
215188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
215288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
215388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_PRIMARY:
215488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Primary Bytes";
215588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "PB/s";
215688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
215788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
215888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SECONDARY:
215988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Secondary Bytes";
216088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "SB/s";
216188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
216288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
216388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_DMA:
216488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "DMA";
216588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "DMA/s";
216688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
216788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
216888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_SPECIAL:
216988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Special DMA";
217088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "dma/s";
217188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
217288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
217388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_MISSED:
217488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Miss";
217588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Ms/s";
217688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
217788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
217888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_VALUE:
217988dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Value";
218088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Value";
218188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_VALUE;
218288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
218388dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_BYTE:
218488dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Bytes";
218588dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "B/s";
218688dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_BYTE;
218788dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
218888dbee54ed400a3fd5594fab506518c171167805Rik Faith	case _DRM_STAT_COUNT:
218988dbee54ed400a3fd5594fab506518c171167805Rik Faith	default:
219088dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].long_name = "Count";
219188dbee54ed400a3fd5594fab506518c171167805Rik Faith	    stats->data[i].rate_name = "Cnt/s";
219288dbee54ed400a3fd5594fab506518c171167805Rik Faith	    SET_COUNT;
219388dbee54ed400a3fd5594fab506518c171167805Rik Faith	    break;
219488dbee54ed400a3fd5594fab506518c171167805Rik Faith	}
219588dbee54ed400a3fd5594fab506518c171167805Rik Faith    }
219688dbee54ed400a3fd5594fab506518c171167805Rik Faith    return 0;
219788dbee54ed400a3fd5594fab506518c171167805Rik Faith}
219888dbee54ed400a3fd5594fab506518c171167805Rik Faith
2199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
220006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl.
220106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
220206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor.
220306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index
220406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written.
220506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written.
220606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
220706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure.
220806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt *
220906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal
221006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by
221106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
221206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */
221322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version)
221406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{
221506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    int retcode = 0;
221606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    drm_set_version_t sv;
221706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
221806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_major = version->drm_di_major;
221906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_di_minor = version->drm_di_minor;
222006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_major = version->drm_dd_major;
222106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    sv.drm_dd_minor = version->drm_dd_minor;
222206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
222306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    if (ioctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
222406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt	retcode = -errno;
222506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    }
222606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
222706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_major = sv.drm_di_major;
222806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_di_minor = sv.drm_di_minor;
222906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_major = sv.drm_dd_major;
223006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    version->drm_dd_minor = sv.drm_dd_minor;
223106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
223206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt    return retcode;
223306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt}
223406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt
223506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/**
2236d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command.
2237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by
2245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
22473903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex)
22483903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
22493903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    void *data = NULL; /* dummy */
22503903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
22513903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
22523903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
22533903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
22543903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
22553903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
22563903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
22573903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
22583903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
22593903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2260d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2261d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2262d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command.
2263d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2264d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2265d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2266d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read.
2267d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read.
2268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2270d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by
2273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
227522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data,
227622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                   unsigned long size)
22773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
22783903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
22793903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
228074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE,
228174ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
22823903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
22833903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
22843903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
22853903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
22863903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
22873903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
22883903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2289d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2290d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2291d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command.
2292d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2293d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2294d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2295d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written.
2296d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written.
2297d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2298d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2299d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2300d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2301d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by
2302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
230422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data,
230522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                    unsigned long size)
23063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
230974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE,
231074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
23113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
23133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
23143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
23153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
23163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
23173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
2318d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca
2319d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/**
2320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command.
2321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2322d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor.
2323d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index
2324d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written.
2325d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written.
2326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure.
2328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca *
2329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal
2330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by
2331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
2332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */
233322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,
233422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson                        unsigned long size)
23353903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{
23363903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    unsigned long request;
23373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
233874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE,
233974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane	DRM_COMMAND_BASE + drmCommandIndex, size);
23403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen
23413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    if (ioctl(fd, request, data)) {
23423903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen	return -errno;
23433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    }
23443903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen    return 0;
23453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen}
2346166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2347279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom
234849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
234949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
235049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_EMIT
235149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
235249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
235349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
235449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
235503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlieint drmFenceCreate(int fd, unsigned flags, int fence_class, unsigned type,
2356166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom		   drmFence *fence)
2357166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2358166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2359e0f53e59be4b96ed6eb28bd2df9f6a9d789d1734Thomas Hellstrom
2360bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2361e0f53e59be4b96ed6eb28bd2df9f6a9d789d1734Thomas Hellstrom    arg.flags = flags;
2362166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = type;
236303c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    arg.fence_class = fence_class;
236403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie
23656a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_CREATE, &arg))
2366166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2367166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->handle = arg.handle;
236803c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2369166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2370191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    fence->flags = arg.flags;
2371166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = 0;
2372166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2373166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2374604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom
237549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
237649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
237749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
237849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
237949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
238049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
238103c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlieint drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence)
2382604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom{
2383604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    drm_fence_arg_t arg;
2384ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2385bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
238649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
238703c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    arg.fence_class = fence_class;
23886a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
23896a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg))
2390604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom	return -errno;
2391604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->handle = arg.handle;
239203c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2393604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->type = arg.type;
2394191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    fence->flags = arg.flags;
239503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->sequence = arg.sequence;
2396604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    fence->signaled = 0;
2397604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom    return 0;
2398604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom}
2399166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2400166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceReference(int fd, unsigned handle, drmFence *fence)
2401166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2402166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2404bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2405166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = handle;
24066a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
24076a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_REFERENCE, &arg))
2408166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2409166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->handle = arg.handle;
241003c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2411166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
241249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    fence->flags = arg.flags;
2413166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2414166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2415166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2416166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2417166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceUnreference(int fd, const drmFence *fence)
2418166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2419166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2420ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2421bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2422166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
24236a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
24246a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_UNREFERENCE, &arg))
2425166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
2426166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2427166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2428166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2429166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
2430166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2431166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2432ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2433bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2434166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2435166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = flush_type;
24366a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
24376a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_FLUSH, &arg))
2438166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
243903c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2440166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2441166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2442c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return arg.error;
2443166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2444166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2445191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceUpdate(int fd, drmFence *fence)
2446166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2447ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    drm_fence_arg_t arg;
2448ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2449bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
245056563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom    arg.handle = fence->handle;
24516a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
24526a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_SIGNALED, &arg))
245356563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom	return -errno;
245403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
245556563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom    fence->type = arg.type;
245656563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom    fence->signaled = arg.signaled;
245756563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom    return 0;
2458191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom}
2459191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2460191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType,
2461191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom		     int *signaled)
2462191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom{
2463191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
2464191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	((fenceType & fence->signaled) != fenceType)) {
2465ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	int ret = drmFenceFlush(fd, fence, fenceType);
2466191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	if (ret)
2467191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	    return ret;
2468191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    }
2469191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2470191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    *signaled = ((fenceType & fence->signaled) == fenceType);
2471191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2472166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2473166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2474166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
247549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
247649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
247749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE
247849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER
247949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
2480191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2481191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
248249fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)
2483166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2484166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
24857766378d97323de375687285f2e125008b79045dThomas Hellstrom
2486bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
248703c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    arg.fence_class = fence->fence_class;
248849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
2489166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2490166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = emit_type;
24916a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
24926a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie    if (ioctl(fd, DRM_IOCTL_FENCE_EMIT, &arg))
2493166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom	return -errno;
249403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2495166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2496166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
24976abbbb2f4f5b6b280077a6c88bb643507c8ec8faBen Skeggs    fence->sequence = arg.sequence;
2498166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    return 0;
2499166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
250049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom
250149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/*
250249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are
250349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_LAZY
250449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS
250549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */
2506c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2507c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom#define DRM_IOCTL_TIMEOUT_USEC 3000000UL
2508c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2509c06808fb6521822238bca4574758f30246b71c2dThomas Hellstromstatic unsigned long
2510c06808fb6521822238bca4574758f30246b71c2dThomas HellstromdrmTimeDiff(struct timeval *now, struct timeval *then)
2511c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom{
2512c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    uint64_t val;
2513c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2514c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    val = now->tv_sec - then->tv_sec;
2515c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    val *= 1000000LL;
2516c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    val += now->tv_usec;
2517c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    val -= then->tv_usec;
2518c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2519c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return (unsigned long) val;
2520c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom}
2521c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2522c06808fb6521822238bca4574758f30246b71c2dThomas Hellstromstatic int
2523c06808fb6521822238bca4574758f30246b71c2dThomas HellstromdrmIoctlTimeout(int fd, unsigned long request, void *argp)
2524c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom{
2525c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    int haveThen = 0;
2526c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    struct timeval then, now;
2527c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    int ret;
2528c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2529c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    do {
2530c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	ret = ioctl(fd, request, argp);
2531c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	if (ret != 0 && errno == EAGAIN) {
2532c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	    if (!haveThen) {
2533c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom		gettimeofday(&then, NULL);
2534c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom		haveThen = 1;
2535c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	    }
2536c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	    gettimeofday(&now, NULL);
2537c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	}
2538c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    } while (ret != 0 && errno == EAGAIN &&
2539c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	     drmTimeDiff(&now, &then) < DRM_IOCTL_TIMEOUT_USEC);
2540c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2541c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    if (ret != 0)
2542c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	return ((errno == EAGAIN) ? -EBUSY : -errno);
2543c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2544c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return 0;
2545c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom}
2546166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2547c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2548c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
2549c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom
255049fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)
2551166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{
2552166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    drm_fence_arg_t arg;
2553166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    int ret;
2554166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2555c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    if (flush_type == 0) {
2556c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	flush_type = fence->type;
2557c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    }
2558c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2559191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) {
256049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom	if ((flush_type & fence->signaled) == flush_type) {
2561191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	    return 0;
2562191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom	}
2563191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom    }
2564191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2565bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2566166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.handle = fence->handle;
2567166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    arg.type = flush_type;
256849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom    arg.flags = flags;
25696a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie
2570166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
2571c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    ret = drmIoctlTimeout(fd, DRM_IOCTL_FENCE_WAIT, &arg);
2572166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    if (ret)
2573c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	return ret;
2574166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
257503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie    fence->fence_class = arg.fence_class;
2576166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->type = arg.type;
2577166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom    fence->signaled = arg.signaled;
2578c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return arg.error;
2579166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom}
2580166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom
25812c9e05cf4c6eb18c941321f764ed1b282a314ba9Dave Airliestatic void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf)
2582ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
2583ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->handle = rep->handle;
2584ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->flags = rep->flags;
2585ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->size = rep->size;
2586ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->offset = rep->offset;
2587ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->mapHandle = rep->arg_handle;
2588d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard    buf->proposedFlags = rep->proposed_flags;
2589ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->start = rep->buffer_start;
2590ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->fenceFlags = rep->fence_flags;
2591ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    buf->replyFlags = rep->rep_flags;
2592f6d5fecdd20b9fd9e8744d8f43fa276b73a1da78Thomas Hellstrom    buf->pageAlignment = rep->page_alignment;
2593b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    buf->tileInfo = rep->tile_info;
2594b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    buf->hwTileStride = rep->hw_tile_stride;
2595b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    buf->desiredTileStride = rep->desired_tile_stride;
2596ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
2597ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2598b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom
2599b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom
2600dccefba71a65566e7e1628b3be67621866000411Kristian Høgsbergint drmBOCreate(int fd, unsigned long size,
2601dccefba71a65566e7e1628b3be67621866000411Kristian Høgsberg		unsigned pageAlignment, void *user_buffer,
2602d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard		uint64_t flags,
2603de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom		unsigned hint, drmBO *buf)
2604de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
260525c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_create_arg arg;
260625c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_create_req *req = &arg.d.req;
260725c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_rep *rep = &arg.d.rep;
260830703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom    int ret;
260930703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom
2610bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(buf, 0, sizeof(*buf));
2611bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2612d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard    req->flags = flags;
2613de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->hint = hint;
2614de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->size = size;
2615f6d5fecdd20b9fd9e8744d8f43fa276b73a1da78Thomas Hellstrom    req->page_alignment = pageAlignment;
2616dccefba71a65566e7e1628b3be67621866000411Kristian Høgsberg    req->buffer_start = (unsigned long) user_buffer;
2617de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2618405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    buf->virtual = NULL;
2619de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2620c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_CREATE, &arg);
262130703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom    if (ret)
2622c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	return ret;
262394c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom
2624ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
262594c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom    buf->virtual = user_buffer;
262614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapCount = 0;
2627de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2628de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2629de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2630de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2631de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBOReference(int fd, unsigned handle, drmBO *buf)
2632de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
263325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_reference_info_arg arg;
263425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_handle_arg *req = &arg.d.req;
263525c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_rep *rep = &arg.d.rep;
2636de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2637bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2638de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    req->handle = handle;
2639de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
264025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    if (ioctl(fd, DRM_IOCTL_BO_REFERENCE, &arg))
2641de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2642de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2643ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
264414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapVirtual = NULL;
264514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    buf->mapCount = 0;
2646de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->virtual = NULL;
2647ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2648de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2649de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2650de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2651efc4fd7c4dabed384fa1ab67e744d38025aff47dDave Airlieint drmBOUnreference(int fd, drmBO *buf)
2652de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{
265325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_handle_arg arg;
265499acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom
265594c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom    if (buf->mapVirtual && buf->mapHandle) {
2656eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom	(void) munmap(buf->mapVirtual, buf->start + buf->size);
265799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	buf->mapVirtual = NULL;
265899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom	buf->virtual = NULL;
265999acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom    }
266099acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom
2661bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
266225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    arg.handle = buf->handle;
2663de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
266425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    if (ioctl(fd, DRM_IOCTL_BO_UNREFERENCE, &arg))
2665de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom	return -errno;
2666de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
2667de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    buf->handle = 0;
2668de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom    return 0;
2669de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom}
2670de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom
267125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie
267214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom/*
2673ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Flags can be  DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together
2674ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the
2675ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * call return an -EBUSY if it can' immediately honor the mapping request.
267614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom */
267714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2678ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
2679ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom	     void **address)
268014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{
268125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_map_wait_idle_arg arg;
268225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_req *req = &arg.d.req;
268325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_rep *rep = &arg.d.rep;
268414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    int ret = 0;
268514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
268614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    /*
268714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * Make sure we have a virtual address of the buffer.
268814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     */
268914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2690440fc5113ef1ffb1a22bff92cf34eaf23896db8d[utf-    if (!buf->virtual) {
2691405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	drmAddress virtual;
2692eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom	virtual = mmap(0, buf->size + buf->start,
2693eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom		       PROT_READ | PROT_WRITE, MAP_SHARED,
2694eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom		       fd, buf->mapHandle);
2695f2db76e2f206d2017f710eaddc4b33add4498898Thomas Hellstrom	if (virtual == MAP_FAILED) {
2696eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom	    ret = -errno;
2697f2db76e2f206d2017f710eaddc4b33add4498898Thomas Hellstrom	}
2698eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom	if (ret)
2699405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	    return ret;
2700405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->mapVirtual = virtual;
2701405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom	buf->virtual = ((char *) virtual) + buf->start;
270214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    }
270314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2704bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
270514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    req->handle = buf->handle;
2706ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->mask = mapFlags;
2707ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    req->hint = mapHint;
270814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
270914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    /*
271014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * May hang if the buffer object is busy.
271114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     * This IOCTL synchronizes the buffer.
271214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom     */
271314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2714c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_MAP, &arg);
2715c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    if (ret)
2716c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	return ret;
2717405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom
2718405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    drmBOCopyReply(rep, buf);
2719ff95ea5536d70f9bc8eac12f2c97dae71fb97066Thomas Hellstrom    buf->mapFlags = mapFlags;
2720405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom    ++buf->mapCount;
272114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    *address = buf->virtual;
272214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
272314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    return 0;
272414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom}
272514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
272625c51f539f254937d116699e66f8c382d78e71d4Dave Airlie
272714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstromint drmBOUnmap(int fd, drmBO *buf)
272814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{
272925c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_handle_arg arg;
273014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
2731bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
273225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    arg.handle = buf->handle;
273314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom
273425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    if (ioctl(fd, DRM_IOCTL_BO_UNMAP, &arg)) {
273514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom	return -errno;
273614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom    }
27373c995c2c4d2530e5bd01548764b20c4d062fd7a5Eric Anholt    buf->mapCount--;
2738ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    return 0;
2739ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
2740b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom
2741733ff568346e8fe40e9790f21f8b7efc659d5d12Thomas Hellstromint drmBOSetStatus(int fd, drmBO *buf,
2742086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom		   uint64_t flags, uint64_t mask,
2743086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom		   unsigned int hint,
2744086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom		   unsigned int desired_tile_stride,
2745086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom		   unsigned int tile_info)
2746ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{
2747d4ce4be0dad516caa43fddcd8a56c28f264c9c2aThomas Hellstrom
2748086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    struct drm_bo_map_wait_idle_arg arg;
2749086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    struct drm_bo_info_req *req = &arg.d.req;
2750086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    struct drm_bo_info_rep *rep = &arg.d.rep;
2751ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    int ret = 0;
2752ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2753bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2754086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->mask = mask;
2755086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->flags = flags;
2756086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->handle = buf->handle;
2757086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->hint = hint;
2758086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->desired_tile_stride = desired_tile_stride;
2759086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    req->tile_info = tile_info;
2760086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom
2761c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_SETSTATUS, &arg);
2762ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom    if (ret)
2763c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	    return ret;
2764ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2765086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom    drmBOCopyReply(rep, buf);
2766c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return 0;
2767ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom}
2768ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2769ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom
2770ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstromint drmBOInfo(int fd, drmBO *buf)
2771ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
277225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_reference_info_arg arg;
277325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_handle_arg *req = &arg.d.req;
277425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_rep *rep = &arg.d.rep;
2775ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    int ret = 0;
2776ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
2777bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2778ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    req->handle = buf->handle;
2779ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
278025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    ret = ioctl(fd, DRM_IOCTL_BO_INFO, &arg);
2781ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (ret)
2782e6e4946c82ab6f63143df7f49f38fa56f7e8980aThomas Hellstrom	return -errno;
278325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie
2784ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    drmBOCopyReply(rep, buf);
2785ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    return 0;
2786ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
2787c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2788c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
2789c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom{
279025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_map_wait_idle_arg arg;
279125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_req *req = &arg.d.req;
279225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie    struct drm_bo_info_rep *rep = &arg.d.rep;
2793c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    int ret = 0;
2794c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2795c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||
2796c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	(buf->replyFlags & DRM_BO_REP_BUSY)) {
2797bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom        memset(&arg, 0, sizeof(arg));
2798c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	req->handle = buf->handle;
2799c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	req->hint = hint;
2800c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom
2801c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_WAIT_IDLE, &arg);
2802c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	if (ret)
2803c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom	    return ret;
280425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie
2805c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom	drmBOCopyReply(rep, buf);
2806c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    }
2807c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom    return 0;
2808c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom}
28090d1926d36e59ddfc34d8c9c0cdef10b71a49ecf1Thomas Hellstrom
2810c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOBusy(int fd, drmBO *buf, int *busy)
2811ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{
2812ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    if (!(buf->flags & DRM_BO_FLAG_SHAREABLE) &&
2813ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	!(buf->replyFlags & DRM_BO_REP_BUSY)) {
2814ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	*busy = 0;
2815ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return 0;
2816ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    }
2817ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    else {
2818ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	int ret = drmBOInfo(fd, buf);
2819ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	if (ret)
2820ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	    return ret;
2821ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	*busy = (buf->replyFlags & DRM_BO_REP_BUSY);
2822ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom	return 0;
2823ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom    }
2824ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom}
2825ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom
28265881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstromint drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
28275881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom	      unsigned memType)
2828e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{
2829ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    struct drm_mm_init_arg arg;
2830ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2831bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2832ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie
2833b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    arg.magic = DRM_BO_INIT_MAGIC;
2834b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    arg.major = DRM_BO_INIT_MAJOR;
2835b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom    arg.minor = DRM_BO_INIT_MINOR;
2836ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.p_offset = pOffset;
2837ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.p_size = pSize;
2838ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.mem_type = memType;
2839191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom
2840e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
2841e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom	return -errno;
2842e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom    return 0;
2843e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom}
2844e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom
28455881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstromint drmMMTakedown(int fd, unsigned memType)
2846e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{
2847ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    struct drm_mm_type_arg arg;
2848bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom
2849bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2850ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.mem_type = memType;
28515881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom
2852ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    if (ioctl(fd, DRM_IOCTL_MM_TAKEDOWN, &arg))
28535881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom	return -errno;
28545881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom    return 0;
28555881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom}
28565881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom
285748b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom/*
285848b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom * If this function returns an error, and lockBM was set to 1,
285948b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom * the buffer manager is NOT locked.
286048b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom */
286148b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom
28623b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstromint drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict)
28635443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom{
2864ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    struct drm_mm_type_arg arg;
28655443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom
28665443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2867ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.mem_type = memType;
28683b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstrom    arg.lock_flags |= (lockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0;
28696420d33b02db0da900140c238bb35f13abc182e7Thomas Hellstrom    arg.lock_flags |= (ignoreNoEvict) ? DRM_BO_LOCK_IGNORE_NO_EVICT : 0;
28705443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom
2871c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return drmIoctlTimeout(fd, DRM_IOCTL_MM_LOCK, &arg);
28725443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom}
28735443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom
287448b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstromint drmMMUnlock(int fd, unsigned memType, int unlockBM)
28755443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom{
2876ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    struct drm_mm_type_arg arg;
28775443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom
28785443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom    memset(&arg, 0, sizeof(arg));
2879ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie
2880ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie    arg.mem_type = memType;
28813b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstrom    arg.lock_flags |= (unlockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0;
28825443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom
2883c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom    return drmIoctlTimeout(fd, DRM_IOCTL_MM_UNLOCK, &arg);
28845443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom}
2885d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
288611f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstromint drmBOVersion(int fd, unsigned int *major,
288711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom		 unsigned int *minor,
288811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom		 unsigned int *patchlevel)
288911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom{
289011f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    struct drm_bo_version_arg arg;
289111f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    int ret;
289211f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
289311f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    memset(&arg, 0, sizeof(arg));
289411f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    ret = ioctl(fd, DRM_IOCTL_BO_VERSION, &arg);
289511f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    if (ret)
2896a4c87d3796cac374d25e01b26bdbb9028ce03107Thomas Hellstrom	return -errno;
289711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
289811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    if (major)
289911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom	*major = arg.major;
290011f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    if (minor)
290111f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom	*minor = arg.minor;
290211f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom    if (patchlevel)
290311f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom	*patchlevel = arg.patchlevel;
290411f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
2905a4c87d3796cac374d25e01b26bdbb9028ce03107Thomas Hellstrom    return 0;
290611f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom}
290711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
290811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
290911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom
2910d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16
2911d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct {
2912ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    char *BusID;
2913ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int fd;
2914ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int refcount;
2915d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS];
2916d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2917d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0;
2918d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2919d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused,
2920d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie		const char *BusID,
2921d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie		int *newlyopened)
2922d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{
2923ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int i;
2924ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int fd;
2925d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2926ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < nr_fds; i++)
2927ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (strcmp(BusID, connection[i].BusID) == 0) {
2928ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    connection[i].refcount++;
2929ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    *newlyopened = 0;
2930ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    return connection[i].fd;
2931ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	}
2932ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian
2933ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    fd = drmOpen(unused, BusID);
2934ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (fd <= 0 || nr_fds == DRM_MAX_FDS)
2935ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	return fd;
2936d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2937ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].BusID = strdup(BusID);
2938ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].fd = fd;
2939ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    connection[nr_fds].refcount = 1;
2940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    *newlyopened = 1;
2941d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2942ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    if (0)
2943ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	fprintf(stderr, "saved connection %d for %s %d\n",
2944ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		nr_fds, connection[nr_fds].BusID,
2945ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		strcmp(BusID, connection[nr_fds].BusID));
2946d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2947ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    nr_fds++;
2948d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2949ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    return fd;
2950d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie}
2951d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2952d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd)
2953d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{
2954ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    int i;
2955d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2956ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    for (i = 0; i < nr_fds; i++) {
2957ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	if (fd == connection[i].fd) {
2958ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    if (--connection[i].refcount == 0) {
2959ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		drmClose(connection[i].fd);
2960ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		free(connection[i].BusID);
2961d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2962ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		if (i < --nr_fds)
2963ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		    connection[i] = connection[nr_fds];
2964d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie
2965ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian		return;
2966ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	    }
2967ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian	}
2968ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian    }
2969d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie}
2970