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