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