xf86drm.c revision 22d46669043d38fcd16efca773f5ed5693c0fb58
1d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \file xf86drm.c 3d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * User-level interface to DRM device 4b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 5d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Rickard E. (Rik) Faith <faith@valinux.com> 6d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Kevin E. Martin <martin@valinux.com> 7d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 8d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 9d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/* 10569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 11569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 12b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * All Rights Reserved. 13b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 14b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Permission is hereby granted, free of charge, to any person obtaining a 15b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * copy of this software and associated documentation files (the "Software"), 16b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * to deal in the Software without restriction, including without limitation 17b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * and/or sell copies of the Software, and to permit persons to whom the 19b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software is furnished to do so, subject to the following conditions: 20360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 21b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * The above copyright notice and this permission notice (including the next 22b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * paragraph) shall be included in all copies or substantial portions of the 23b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software. 24360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 25b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 28b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 29b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 30b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 31b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * DEALINGS IN THE SOFTWARE. 32b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss */ 33b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 3479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#ifdef HAVE_CONFIG_H 3579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie# include <config.h> 36b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 3779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdio.h> 3879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdlib.h> 3979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <unistd.h> 4079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <string.h> 41015efd1bfa72ab8b80cc45f11eb22d7f1a1085f7Ian Romanick#include <strings.h> 4279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <ctype.h> 4379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <fcntl.h> 4479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <errno.h> 4579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <signal.h> 46f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes#include <time.h> 4779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/types.h> 4879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/stat.h> 4979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#define stat_t struct stat 5079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/ioctl.h> 5179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/mman.h> 5279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/time.h> 5379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdarg.h> 54b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */ 56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED 57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1) 58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h" 61b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 6227c3785d3f12743a9e160238a4d00353060ec2f2Hasso Tepper#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) 63cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145 64cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif 65cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt 66cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__ 67cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34 6888dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 6988dbee54ed400a3fd5594fab506518c171167805Rik Faith 70b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__ 71b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# define DRM_MAJOR 81 72b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif 73b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 74cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR 75cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226 /* Linux */ 7688dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 7788dbee54ed400a3fd5594fab506518c171167805Rik Faith 7888dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR 7988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16 8088dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 81569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 8222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/* 8322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure. 8422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best. 8522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 86569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev 87569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y) ((dev_t)(((x) << 8) | (y))) 88569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif 89569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 9056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3 9156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 92731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define DRM_NODE_CONTROL 0 93731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes#define DRM_NODE_RENDER 1 94731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 9579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info; 9679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 9779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info) 9879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 99ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info = info; 10079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 10179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr. 104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string. 106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf(). 109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 11079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int drmDebugPrint(const char *format, va_list ap) 11279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 113ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return vfprintf(stderr, format, ap); 11479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; 11779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 118c4857429c716f35e1fa054d1990cae28055d96d7Eric Anholtvoid 11956bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...) 12056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{ 12156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_list ap; 12256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes const char *env; 12379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info) 12456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes { 12556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_start(ap, format); 12679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_server_info->debug_print(format,ap); 12879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } else { 12979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_debug_print(format, ap); 13079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 13156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_end(ap); 13256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 13356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes} 13456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 13579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid 13679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap)) 13779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 138ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_debug_print = debug_msg_ptr; 13979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 14079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 141b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */ 142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void) 14479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 145ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return drmHashTable; 14679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size) 149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *pt; 151ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((pt = malloc(size))) 152ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian memset(pt, 0, size); 153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return pt; 154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt) 157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 158ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (pt) 159ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(pt); 160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 162569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */ 163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s) 164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 16548198970ce449165fe1c7294108ca3afc775563dAdam Jackson char *retval; 16648198970ce449165fe1c7294108ca3afc775563dAdam Jackson 16748198970ce449165fe1c7294108ca3afc775563dAdam Jackson if (!s) 16848198970ce449165fe1c7294108ca3afc775563dAdam Jackson return NULL; 16948198970ce449165fe1c7294108ca3afc775563dAdam Jackson 17079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie retval = malloc(strlen(s)+1); 17148198970ce449165fe1c7294108ca3afc775563dAdam Jackson if (!retval) 17248198970ce449165fe1c7294108ca3afc775563dAdam Jackson return NULL; 17348198970ce449165fe1c7294108ca3afc775563dAdam Jackson 17448198970ce449165fe1c7294108ca3afc775563dAdam Jackson strcpy(retval, s); 175360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 176569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1798b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard/** 1808b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard * Call ioctl, restarting if it is interupted 1818b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard */ 182731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint 18341b83a99583486ad4f8760a6537d34783769bfc3Coleman KanedrmIoctl(int fd, unsigned long request, void *arg) 1848b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard{ 1858b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard int ret; 1868b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard 1878b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard do { 1888b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard ret = ioctl(fd, request, arg); 1898b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 1908b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return ret; 1918b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard} 192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd) 194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 195fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes stat_t st; 196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss st.st_rdev = 0; 198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fstat(fd, &st); 199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return st.st_rdev; 200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 20279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd) 203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry; 207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 208ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!drmHashTable) 209ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmHashTable = drmHashCreate(); 210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashLookup(drmHashTable, key, &value)) { 212b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = drmMalloc(sizeof(*entry)); 213b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = fd; 214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = drmHashCreate(); 216b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(drmHashTable, key, entry); 217b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } else { 218b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = value; 219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return entry; 221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 223d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings 22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first 22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second 22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched. 23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings. It understands the older 23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format. In the format, o is 23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function. 23506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholtstatic int drmMatchBusID(const char *id1, const char *id2) 23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 23806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* First, check if the IDs are exactly the same */ 23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strcasecmp(id1, id2) == 0) 24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Try to match old/new-style PCI bus IDs. */ 24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strncasecmp(id1, "pci", 3) == 0) { 24490ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o1, b1, d1, f1; 24590ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o2, b2, d2, f2; 24606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int ret; 24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24890ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "pci:%04x:%02x:%02x.%u", &o1, &b1, &d1, &f1); 24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o1 = 0; 25190ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "PCI:%u:%u:%u", &b1, &d1, &f1); 25206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 25306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 25406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 25506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 25690ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "pci:%04x:%02x:%02x.%u", &o2, &b2, &d2, &f2); 25706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 25806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o2 = 0; 25990ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "PCI:%u:%u:%u", &b2, &d2, &f2); 26006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 26106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 26306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 26406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2)) 26506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt else 26706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 26806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 26906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 27006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 27106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 27206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 273c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Handles error checking for chown call. 274c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 275c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param path to file. 276c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new owner. 277c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new group. 278c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 279c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \return zero if success or -1 if failure. 280c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 281c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \internal 282c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Checks for failure. If failure was caused by signal call chown again. 283c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * If any other failure happened then it will output error mesage using 284c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * drmMsg() call. 285c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen */ 286c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminenstatic int chown_check_return(const char *path, uid_t owner, gid_t group) 287c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen{ 288c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen int rv; 289c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 290c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen do { 291c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen rv = chown(path, owner, group); 292c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen } while (rv != 0 && errno == EINTR); 293c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 294c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen if (rv == 0) 295c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return 0; 296c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 297c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen drmMsg("Failed to change owner or group for file %s! %d: %s\n", 298c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen path, errno, strerror(errno)); 299c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return -1; 300c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen} 301c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 302c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen/** 303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary. 304d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 305d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device. 306d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device. 307d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 308d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 309d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 310d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 311d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device 312d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and 313d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root. 314d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 315731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenDevice(long dev, int minor, int type) 316b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 3179c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes stat_t st; 31888dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 31988dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 32079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie mode_t devmode = DRM_DEV_MODE, serv_mode; 32188dbee54ed400a3fd5594fab506518c171167805Rik Faith int isroot = !geteuid(); 32288dbee54ed400a3fd5594fab506518c171167805Rik Faith uid_t user = DRM_DEV_UID; 32379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie gid_t group = DRM_DEV_GID, serv_group; 32479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 325731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 32606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenDevice: node name is %s\n", buf); 32756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 32879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 329ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info->get_perms(&serv_group, &serv_mode); 330ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode = serv_mode ? serv_mode : DRM_DEV_MODE; 331ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); 332ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; 33379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 334569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 3359101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#if !defined(UDEV) 33688dbee54ed400a3fd5594fab506518c171167805Rik Faith if (stat(DRM_DIR_NAME, &st)) { 337ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 338ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 339b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); 340c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(DRM_DIR_NAME, 0, 0); /* root:root */ 341b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); 342569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 343b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 34406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node exists and create it if necessary. */ 345d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (stat(buf, &st)) { 346ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 347ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 34888dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 34988dbee54ed400a3fd5594fab506518c171167805Rik Faith mknod(buf, S_IFCHR | devmode, dev); 350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 35179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 35279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 353c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 354ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 35579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 3569101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#else 3579101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie /* if we modprobed then wait for udev */ 3589101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie { 3599101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie int udev_count = 0; 3609101a0205c897fea28e6a3d875111a83ad7f7732Dave Airliewait_for_udev: 3619101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(DRM_DIR_NAME, &st)) { 3629101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3639101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3649101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3659101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3669101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3679101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3689101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3699101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3709101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(buf, &st)) { 3719101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3729101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3739101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3749101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3759101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3769101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3779101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3789101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3799101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#endif 38088dbee54ed400a3fd5594fab506518c171167805Rik Faith 38156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd = open(buf, O_RDWR, 0); 38256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: open result is %d, (%s)\n", 38356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd, fd < 0 ? strerror(errno) : "OK"); 384ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 385ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 386d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 38706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node is not what we expect it to be, and recreate it 38806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * and try again if so. 38906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 390d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (st.st_rdev != dev) { 391ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 392ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 393d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt remove(buf); 394d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt mknod(buf, S_IFCHR | devmode, dev); 39579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 396c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 397ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 39879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 399d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt } 400d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd = open(buf, O_RDWR, 0); 401d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt drmMsg("drmOpenDevice: open result is %d, (%s)\n", 402d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd, fd < 0 ? strerror(errno) : "OK"); 403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 404ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 405d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 40656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: Open failed\n"); 40788dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 40888dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 409b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 410b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device 414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number. 416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set. 417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 419d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 420d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 421d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device 422d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it. 423d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 424731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenMinor(int minor, int create, int type) 42588dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 42688dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 42788dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 428db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 429ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (create) 430731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); 43188dbee54ed400a3fd5594fab506518c171167805Rik Faith 432731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 433ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((fd = open(buf, O_RDWR, 0)) >= 0) 434ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 43588dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 43688dbee54ed400a3fd5594fab506518c171167805Rik Faith} 43788dbee54ed400a3fd5594fab506518c171167805Rik Faith 438569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 439d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 440d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded. 441d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise. 443d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0 446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information. For backward compatibility with older 447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked. 448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 449569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void) 450569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{ 451569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul drmVersionPtr version; 452569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int retval = 0; 453569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int fd; 454360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 455731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) { 456b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__ 45722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Try proc for backward Linux compatibility */ 458ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!access("/proc/dri/0", R_OK)) 459ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 1; 460b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif 46188dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 462569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 46388dbee54ed400a3fd5594fab506518c171167805Rik Faith 46488dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 46588dbee54ed400a3fd5594fab506518c171167805Rik Faith retval = 1; 46688dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 46788dbee54ed400a3fd5594fab506518c171167805Rik Faith } 46888dbee54ed400a3fd5594fab506518c171167805Rik Faith close(fd); 469569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 470569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 471569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul} 472569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID. 476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. 478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR), 483d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied. 484d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 485d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid(). 486d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 487e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid) 488e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{ 48988dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 49088dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 49188dbee54ed400a3fd5594fab506518c171167805Rik Faith const char *buf; 49206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetVersion sv; 49306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 49406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid); 495db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie for (i = 0; i < DRM_MAX_MINOR; i++) { 496731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fd = drmOpenMinor(i, 1, DRM_NODE_RENDER); 49756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); 49856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (fd >= 0) { 49906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = 1; 50006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = 1; 50106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = -1; /* Don't care */ 50226462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt sv.drm_dd_minor = -1; /* Don't care */ 50306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetInterfaceVersion(fd, &sv); 504e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss buf = drmGetBusid(fd); 50556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); 50606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (buf && drmMatchBusID(buf, busid)) { 50788dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeBusid(buf); 50888dbee54ed400a3fd5594fab506518c171167805Rik Faith return fd; 509e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 510ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (buf) 511ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmFreeBusid(buf); 512e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss close(fd); 513e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 514e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 515e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss return -1; 516e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss} 517e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss 518d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 519d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 520d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name. 521d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 522d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. 523d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 524d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 525d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 526d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 527d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and 528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use. If it's in use it then it will already have a bus ID 529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned. 530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid(). 532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 533b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name) 534b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{ 53588dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 53688dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 53788dbee54ed400a3fd5594fab506518c171167805Rik Faith drmVersionPtr version; 53856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes char * id; 53988dbee54ed400a3fd5594fab506518c171167805Rik Faith 540db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drmAvailable()) { 541db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drm_server_info) { 542db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie return -1; 543db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 544db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie else { 545db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie /* try to load the kernel module now */ 546db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drm_server_info->load_module(name)) { 547db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 548db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie return -1; 549db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 550db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 551db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 552db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 55356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes /* 55456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * Open the first minor number that matches the driver name and isn't 55556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * already in use. If it's in use it will have a busid assigned already. 55656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes */ 557db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie for (i = 0; i < DRM_MAX_MINOR; i++) { 558731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes if ((fd = drmOpenMinor(i, 1, DRM_NODE_RENDER)) >= 0) { 55988dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 56088dbee54ed400a3fd5594fab506518c171167805Rik Faith if (!strcmp(version->name, name)) { 56188dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 56256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes id = drmGetBusid(fd); 56356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL"); 56456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (!id || !*id) { 56522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (id) 56656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 56756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return fd; 56856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 56956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 57056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 57156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 57256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeVersion(version); 57388dbee54ed400a3fd5594fab506518c171167805Rik Faith } 57488dbee54ed400a3fd5594fab506518c171167805Rik Faith } 57556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes close(fd); 57688dbee54ed400a3fd5594fab506518c171167805Rik Faith } 577b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 578b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 57988dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__ 58022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Backward-compatibility /proc support */ 581b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (i = 0; i < 8; i++) { 58288dbee54ed400a3fd5594fab506518c171167805Rik Faith char proc_name[64], buf[512]; 58388dbee54ed400a3fd5594fab506518c171167805Rik Faith char *driver, *pt, *devstring; 58488dbee54ed400a3fd5594fab506518c171167805Rik Faith int retcode; 58588dbee54ed400a3fd5594fab506518c171167805Rik Faith 5860371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss sprintf(proc_name, "/proc/dri/%d/name", i); 587b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if ((fd = open(proc_name, 0, 0)) >= 0) { 588b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss retcode = read(fd, buf, sizeof(buf)-1); 589b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss close(fd); 590b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (retcode) { 591b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss buf[retcode-1] = '\0'; 592b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (driver = pt = buf; *pt && *pt != ' '; ++pt) 593b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 59422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (*pt) { /* Device is next */ 595b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss *pt = '\0'; 596b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (!strcmp(driver, name)) { /* Match */ 597b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (devstring = ++pt; *pt && *pt != ' '; ++pt) 598b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 599b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (*pt) { /* Found busid */ 60088dbee54ed400a3fd5594fab506518c171167805Rik Faith return drmOpenByBusid(++pt); 60122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson } else { /* No busid */ 602731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenDevice(strtol(devstring, NULL, 0),i, DRM_NODE_RENDER); 603b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 604b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 605b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 606b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 607569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 608b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 60988dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 61088dbee54ed400a3fd5594fab506518c171167805Rik Faith 611b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return -1; 612b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss} 613b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 614b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device. 617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found. The 619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root. 620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied. 622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known. 623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise. 629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 630b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid) 631b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 63279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drmAvailable() && name != NULL && drm_server_info) { 63306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* try to load the kernel */ 63479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drm_server_info->load_module(name)) { 635ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 63606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 63706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 63806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 63906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 64006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (busid) { 641ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd = drmOpenByBusid(busid); 64206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (fd >= 0) 64306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return fd; 64406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 64522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 64606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (name) 64706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return drmOpenByName(name); 64822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 64906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 651b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 652731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmOpenControl(int minor) 653731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 654731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); 655731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion(). 659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings 664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it. 665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 666b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v) 667b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 668ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 669ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 6709d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 6719d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 6729d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 673b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 674b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 675b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 676d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel. 679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all 684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it. 685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v) 687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 688ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 689ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 6909d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 6919d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 6929d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 693b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 694b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 695b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information. 699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer. 701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer. 702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl 705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart. 706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 707569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s) 708b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 709b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_major = s->version_major; 710b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_minor = s->version_minor; 711b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_patchlevel = s->version_patchlevel; 712b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name_len = s->name_len; 713b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name = drmStrdup(s->name); 714b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date_len = s->date_len; 715b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date = drmStrdup(s->date); 716b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc_len = s->desc_len; 717b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc = drmStrdup(s->desc); 718b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 719b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 720b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information. 723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with 727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion(). 728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri. 730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 731d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 732d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls, 733d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings. 734d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already. 735d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 736b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd) 737b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 738b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmVersionPtr retval; 739b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_version_t *version = drmMalloc(sizeof(*version)); 740b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 741b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name_len = 0; 742b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = NULL; 743b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date_len = 0; 744b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = NULL; 745b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc_len = 0; 746b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = NULL; 747360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 7488b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 749b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 750b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 751b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 752b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 753b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) 754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = drmMalloc(version->name_len + 1); 755b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) 756b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = drmMalloc(version->date_len + 1); 757b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) 758b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = drmMalloc(version->desc_len + 1); 759360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 7608b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 761b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno)); 762b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 763b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 764b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 765b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 76622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* The results might not be null-terminated strings, so terminate them. */ 767b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) version->name[version->name_len] = '\0'; 768b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) version->date[version->date_len] = '\0'; 769b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) version->desc[version->desc_len] = '\0'; 770b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 771b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 772b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmCopyVersion(retval, version); 773b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 774b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 775b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 776b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 7773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library. 780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent. 782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information. 786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded 789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number. 790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 7913903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd) 7923903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 7933903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen drm_version_t *version = drmMalloc(sizeof(*version)); 7943903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 7953903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen /* Version history: 79679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it 7973903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.0.x = original DRM interface with no drmGetLibVersion 7983903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * entry point and many drm<Device> extensions 7993903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.1.x = added drmCommand entry points for device extensions 8003903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * added drmGetLibVersion to identify libdrm.a version 80106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * revision 1.2.x = added drmSetInterfaceVersion 80206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * modified drmOpen to handle both busid and name 80379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * revision 1.3.x = added server + memory manager 8043903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen */ 80579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_major = 1; 80679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_minor = 3; 8073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen version->version_patchlevel = 0; 8083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 8093903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return (drmVersionPtr)version; 8103903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 8113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information. 815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 816d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid(). 817d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 818d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 819d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid. 820d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 821b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid) 822b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 823b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drmFree((void *)busid); 824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device. 829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string. 833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to 836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique 837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure. 838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 839b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd) 840b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 841b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 842b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 843b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = 0; 844b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = NULL; 845b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8468b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 847ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 848b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = drmMalloc(u.unique_len + 1); 8498b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 850ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 851b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique[u.unique_len] = '\0'; 85206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 853b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return u.unique; 854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device. 859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 861d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string. 862d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 863d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure. 864d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 865d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 866d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing 867d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure. 868d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 869b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid) 870b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 871b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 873b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = (char *)busid; 874b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = strlen(busid); 875b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) { 87756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return -errno; 87856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 879b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 880b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 881b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8828696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic) 883b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 884b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 885b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = 0; 8878b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) 888ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 889b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = auth.magic; 890b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8938696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic) 894b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 895b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 896b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 897b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss auth.magic = magic; 8988b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) 899ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 900b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 901b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 902b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 904d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a 905d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process. 906d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 907d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 908d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of 909d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below. 910d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes. 911d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped. 912d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions. 913d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset 914d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap(). 915d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 916d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error. 917d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer 919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer 920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer, 921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and 922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER. 923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the 926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining. 927d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 928d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area 929d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area, 930d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area, 931d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and 932d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS. 933d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 934d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. 935d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 936d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA 937d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA, 938d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero, 939d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes, 940d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM. 941d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 942d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 943d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in 944d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle 945d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned. 946d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 947d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 948d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 949d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 950d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing 951d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure. 952d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 95322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type, 95422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drmMapFlags flags, drm_handle_t *handle) 955b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 956b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_map_t map; 957b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.offset = offset; 959b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.size = size; 960b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.handle = 0; 961b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.type = type; 962b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.flags = flags; 9638b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map)) 964ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 965ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 966ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *handle = (drm_handle_t)map.handle; 967b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 9708696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle) 97174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 97274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_map_t map; 97374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 97474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.handle = (void *)handle; 97574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 9768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map)) 977ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 97874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 97974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 98074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 981d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 982d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers. 983d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers. 986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer. 987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags. 988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture 989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error. 991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl. 994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc. 996d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 997ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags, 998ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann int agp_offset) 999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_desc_t request; 1001360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1003b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.size = size; 1004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.low_mark = 0; 1005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.high_mark = 0; 1006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.flags = flags; 1007ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann request.agp_start = agp_offset; 1008360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 10098b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request)) 1010ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return request.count; 1012b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1013b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1014b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high) 1015b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1016b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1018b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.count = 0; 1020b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list = NULL; 1021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10228b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1023ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1025ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!info.count) 1026ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1027360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return -ENOMEM; 1030360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 10318b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1036360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1037b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1038b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].low_mark = low * info.list[i].count; 1039b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].high_mark = high * info.list[i].count; 10408b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) { 1041b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1042b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1043b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1044b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1045b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1046b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1047360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1049b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1050b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1051d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1052d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers. 1053d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1054d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1055d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free. 1056d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed. 1057d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1058d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1059d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1060d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging. 1061d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1062d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1063d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing 1064d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure. 1065d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1066b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list) 1067b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1068b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_free_t request; 1069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1070b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1071b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.list = list; 10728b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request)) 1073ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1074b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1075b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1076b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1077d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1078d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1079d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device. 1080d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1081d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1082d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1083d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor. 1085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1086b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd) 1087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 1089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1091b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDestroy(entry->tagTable); 1092b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = 0; 1093b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = NULL; 1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(drmHashTable, key); 1097b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(entry); 1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1099b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return close(fd); 1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory. 1105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap(). 1108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap(). 1109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping 1110d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins. 1111d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1112d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1113d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1114d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1115d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap(). 1116d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 111722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address) 1118b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1119c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane static unsigned long pagesize_mask = 0; 1120c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1121ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd < 0) 1122ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1123c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1124c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane if (!pagesize_mask) 1125c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane pagesize_mask = getpagesize() - 1; 1126c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1127c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane size = (size + pagesize_mask) & ~pagesize_mask; 1128c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1129b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); 1130ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (*address == MAP_FAILED) 1131ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1132b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1133b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1135d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1136d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1137d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap(). 1138d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1139d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap(). 1140d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap(). 1141d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1142d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1143d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1144d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 114522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap(). 1146d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size) 1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return munmap(address, size); 1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd) 1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufInfoPtr retval; 1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.count = 0; 1159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list = NULL; 1160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 11618b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1162ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (info.count) { 1165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1166b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1167360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 11688b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1171b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 117222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1174b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = info.count; 1175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(info.count * sizeof(*retval->list)); 1176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].count = info.list[i].count; 1178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].size = info.list[i].size; 1179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].low_mark = info.list[i].low_mark; 1180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].high_mark = info.list[i].high_mark; 1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1188d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1189d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space. 1190d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1191d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1192d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1193d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure. 1194d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1195d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices 1196d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA(). 1197d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1198d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned 1200d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the 1201d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures. 1202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd) 1204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_map_t bufs; 1206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufMapPtr retval; 1207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1208360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss bufs.count = 0; 1210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss bufs.list = NULL; 12118696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl bufs.virtual = NULL; 12128b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) 1213ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1215ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!bufs.count) 1216ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 12178696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1218b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) 1219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 12218b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) { 1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(bufs.list); 1223b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1224b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 122522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1227b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = bufs.count; 1228b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(bufs.count * sizeof(*retval->list)); 1229b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs.count; i++) { 1230b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].idx = bufs.list[i].idx; 1231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].total = bufs.list[i].total; 1232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].used = 0; 1233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].address = bufs.list[i].address; 1234b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 12358696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 12368696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs.list); 12378696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1238b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1239b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1240b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs(). 1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure. 1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 12488696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the 12498696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs(). 1250d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs) 1252b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1253b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1254360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs->count; i++) { 1256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss munmap(bufs->list[i].address, bufs->list[i].total); 1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 12588696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 12598696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs->list); 12608696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs); 12618696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1262b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1265d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1266360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY 16 1267360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers. 1270d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request 1273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the 1278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries. 1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1280b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request) 1281b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1282b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_dma_t dma; 1283360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes int ret, i = 0; 1284b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.context = request->context; 1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_count = request->send_count; 1287b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_indices = request->send_list; 1288b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_sizes = request->send_sizes; 1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.flags = request->flags; 1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_count = request->request_count; 1291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_size = request->request_size; 1292b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_indices = request->request_list; 1293b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_sizes = request->request_sizes; 12948696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl dma.granted_count = 0; 1295360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1296360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes do { 1297360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes ret = ioctl( fd, DRM_IOCTL_DMA, &dma ); 1298360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY ); 1299360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1300360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes if ( ret == 0 ) { 1301360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes request->granted_count = dma.granted_count; 1302360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return 0; 1303360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } else { 1304360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return -errno; 1305360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } 1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1307b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1308d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1309d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1310d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock. 1311d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1312d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1313d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1314d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function 1315d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns. 1316d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1317d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero. 1318d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1319d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue 1321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired. 1322d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 13238696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags) 1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1326b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 1331b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 1332b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1333b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1334b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1335360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 13368b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard while (drmIoctl(fd, DRM_IOCTL_LOCK, &lock)) 1337b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ; 1338b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1340b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock. 1343d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1344d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1345d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1346d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1347d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1349d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1350d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the 1351d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure. 1352d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 13538696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context) 1354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1355b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 13598b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock); 1360b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 136222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count) 1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_res_t res; 1365b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t *list; 13668696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drm_context_t * retval; 1367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.count = 0; 1370b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = NULL; 13718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1372ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1373b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1374ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!res.count) 1375ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1376b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1377ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!(list = drmMalloc(res.count * sizeof(*list)))) 1378ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1379b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { 1380b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1382b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1383b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1384b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = list; 13858b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1386ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1387b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1388ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < res.count; i++) 1389ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian retval[i] = list[i].handle; 1390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1391b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1392b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *count = res.count; 1393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 139622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt) 1397b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1398b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(pt); 1399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1400b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1401d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1402d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context. 1403d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1404d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes 1405d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated. 1406d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA 1409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA(). 1410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the 1417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 141922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle) 1420b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1421b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1422b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1423b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.flags = 0; /* Modified with functions below */ 14248b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) 1425ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1426b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = ctx.handle; 1427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1428b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1429b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14308696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context) 1431b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1432b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1433b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1434b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 14358b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) 1436ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1437b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1438b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1439b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14408696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags) 1441b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1442b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1443b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 144422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* 144522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * Context preserving means that no context switches are done between DMA 144622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * buffers from one context and the next. This is suitable for use in the 144722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * X server (which promises to maintain hardware context), or in the 144822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * client-side library when buffers are swapped on behalf of two threads. 144922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 1450b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1451b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.flags = 0; 1452ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_PRESERVED) 1453ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_PRESERVED; 1454ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_2DONLY) 1455ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_2DONLY; 14568b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) 1457ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1458b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1459b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1460b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 146122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context, 146222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_context_tFlagsPtr flags) 1463b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1464b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1465b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1466b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 14678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx)) 1468ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1469b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *flags = 0; 1470ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_PRESERVED) 1471ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_PRESERVED; 1472ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_2DONLY) 1473ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_2DONLY; 1474b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1475b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1476360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context. 1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated 1481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context. 1482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1483d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1484d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext(). 1485d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1486d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1490d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1491d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the 1492d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1493d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14948696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle) 1495b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1496b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1497b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = handle; 14988b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx)) 1499ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1500b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1501b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1502b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 150322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle) 1504b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1505b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 15068b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) 1507ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1508b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = draw.handle; 1509b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1510b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1511b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15128696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle) 1513b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1514b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1515b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss draw.handle = handle; 15168b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw)) 1517ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1518b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1519b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1520b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15219810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle, 15229810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_drawable_info_type_t type, unsigned int num, 15239810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer void *data) 15249810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{ 15259810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_update_draw_t update; 15269810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 15279810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.handle = handle; 15289810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.type = type; 15299810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.num = num; 15309810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.data = (unsigned long long)(unsigned long)data; 15319810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 15328b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) 1533ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 15349810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 15359810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer return 0; 15369810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer} 15379810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device. 1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls. 1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl. 1549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1550ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd) 1551ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 15528b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) 1553ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1554ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1555ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1556ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device. 1560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1561d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1566d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl. 1567d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1568ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd) 1569ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 15708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) 1571ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1572ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1573ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1574ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1575d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1576d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1577d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode. 1578d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1579d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1580d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode. 1581d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1582d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero 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_ENABLE ioctl, passing the 1586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure. 1587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1588ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode) 1589ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1590ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_mode_t m; 1591ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1592ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann m.mode = mode; 15938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) 1594ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1595ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1596ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1597ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1599d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1600d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory. 1601d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1602d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1603d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary. 1604d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate. 1605d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the 1606d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory. 1607d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory. 1608d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the 1613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure. 1614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1615ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type, 16167ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie unsigned long *address, drm_handle_t *handle) 1617ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1618ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1619b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 1620b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane *handle = DRM_AGP_NO_HANDLE; 1621ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = size; 1622ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = 0; 1623ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.type = type; 16248b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) 1625ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1626ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (address != 0UL) 1627ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *address = b.physical; 1628ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann *handle = b.handle; 1629ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1630ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1631ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1632d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1633d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1634d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory. 1635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1639d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1640d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1641d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1642d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the 1643d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure. 1644d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16457ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle) 1646ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1647ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1648ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1649ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = 0; 1650ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 16518b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b)) 1652ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1653ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1654ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1655ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory. 1659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary. 1663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1666d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1667d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the 1668d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure. 1669d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16707ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset) 1671ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1672ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1673ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1674ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1675ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = offset; 16768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b)) 1677ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1678ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1679ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1680ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory. 1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1688d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1689d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1690d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1691d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing 1692d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure. 1693d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16947ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle) 1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1696ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1697ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1698ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1699ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = 0; 17008b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) 1701ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1702ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1703ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1704ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number. 1708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure.. 1712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1713d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1714d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1715d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1717ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd) 1718ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1719ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1720ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 17218b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1722ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1723ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_major; 1724ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1725ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number. 1729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1731d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1732d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure. 1733d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1734d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1735d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1736d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1737d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1738ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd) 1739ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1740ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1741ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 17428b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1743ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1744ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_minor; 1745ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1746ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode. 1750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1752d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1753d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure. 1754d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1755d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1756d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1757d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1759ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd) 1760ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1761ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1762ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 17638b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1764ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1765ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.mode; 1766ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1767ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1770d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base. 1771d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1773d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1774d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure. 1775d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1776d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1777d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1780ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd) 1781ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1782ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1783ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 17848b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1785ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1786ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_base; 1787ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1788ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size. 1792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1794d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1795d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure. 1796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1799d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1800d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1801ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd) 1802ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1803ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1804ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1806ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1807ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_size; 1808ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1809ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory. 1813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1816d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure. 1817d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1818d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1819d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1820d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1821d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1822ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd) 1823ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1824ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1825ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18268b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1827ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1828ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_used; 1829ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1830ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory. 1834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure. 1838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1843ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd) 1844ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1845ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1846ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18478b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1848ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1849ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_allowed; 1850ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1851ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID. 1855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure. 1859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1861d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1862d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1863d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1864ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd) 1865ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1866ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1867ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18688b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1869ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1870ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_vendor; 1871ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1872ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1873d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1874d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID. 1876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure. 1880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1883d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1884d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1885ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd) 1886ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1887ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1888ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18898b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1890ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1891ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_device; 1892ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1893ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18947ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle) 18955d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 18965d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 18975d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 18985d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = 0; 18995d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = size; 19005d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = 0; 19018b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) 1902ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 19035d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = sg.handle; 19045d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 19055d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 19065d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 19077ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle) 19085d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 19095d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 19105d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 19115d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = 0; 19125d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = handle; 19138b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg)) 1914ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 19155d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 19165d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 19175d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 1918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK. 1920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure. 1923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1927d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl. 1928d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 192955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl) 193055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{ 1931f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes struct timespec timeout, cur; 193255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer int ret; 193355acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 1934f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = clock_gettime(CLOCK_MONOTONIC, &timeout); 1935f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes if (ret < 0) { 1936f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes fprintf(stderr, "clock_gettime failed: %s\n", strerror(ret)); 1937f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes goto out; 1938f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 1939f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes timeout.tv_sec++; 1940f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes 194155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer do { 1942f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl); 1943c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer vbl->request.type &= ~DRM_VBLANK_RELATIVE; 1944ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (ret && errno == EINTR) { 1945ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes clock_gettime(CLOCK_MONOTONIC, &cur); 1946ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes /* Timeout after 1s */ 1947ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (cur.tv_sec > timeout.tv_sec + 1 || 1948ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes (cur.tv_sec == timeout.tv_sec && cur.tv_nsec >= 1949ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes timeout.tv_nsec)) { 1950ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes errno = EBUSY; 1951ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes ret = -1; 1952ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes break; 1953ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes } 1954f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 195555acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer } while (ret && errno == EINTR); 195655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 1957f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnesout: 195855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer return ret; 195955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer} 196055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 1961b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label) 1962b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1963b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss switch (err) { 1964ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_DEVICE: 1965ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no device\n", label); 1966ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1967ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_ACCESS: 1968ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no access\n", label); 1969ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1970ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NOT_ROOT: 1971ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: not root\n", label); 1972ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1973ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_INVALID: 1974ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: invalid args\n", label); 1975ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss default: 1977ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (err < 0) 1978ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian err = -err; 1979b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); 1980b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss break; 1981b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1982b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1983b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 1; 1984b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1985b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler. 1988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number. 1991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 1996d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 1997d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq) 1999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_INST_HANDLER; 2003b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = irq; 20048b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2005ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2007b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2008b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2009d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2010d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2011d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler. 2012d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2016d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2017d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2018d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 2019d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 2020d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd) 2022b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2023b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2025b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_UNINST_HANDLER; 2026b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = 0; 20278b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2028ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2031b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags) 2033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 2035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2036b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 2037b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 2038b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 2039b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 2040b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 2041b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 2042b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 2043b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 20448b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FINISH, &lock)) 2045ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2046b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2047b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2049d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2050d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID. 2051d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2052d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2053d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number. 2054d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number. 2055d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number. 2056d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2057d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure. 2058d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2059d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2060d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the 2061d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure. 2062d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum) 2064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2065b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_irq_busid_t p; 2066b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2067b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.busnum = busnum; 2068b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.devnum = devnum; 2069b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.funcnum = funcnum; 20708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) 2071ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2072b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return p.irq; 2073b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2074b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 20758696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag) 2076b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2077b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2078b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2079b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashInsert(entry->tagTable, context, tag)) { 2080b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(entry->tagTable, context); 2081b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(entry->tagTable, context, tag); 2082b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 2083b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2084b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2085b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 20868696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context) 2087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return drmHashDelete(entry->tagTable, context); 2091b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2092b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 20938696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context) 2094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 2097360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 2098ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (drmHashLookup(entry->tagTable, context, &value)) 2099ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 2100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return value; 2102b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 210422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, 210522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t handle) 210674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 210774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 210874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 210974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 211074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.handle = (void *)handle; 211174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 21128b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) 2113ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 211474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 211574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 211674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 211722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 211822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t *handle) 211974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 212074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 212174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 212274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 212374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 21248b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) 2125ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2126ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 2127ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *handle = (drm_handle_t)map.handle; 212874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 212974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 213074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 213174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 21328696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size, 21338696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmMapType *type, drmMapFlags *flags, drm_handle_t *handle, 213488dbee54ed400a3fd5594fab506518c171167805Rik Faith int *mtrr) 213588dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 213688dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_map_t map; 213788dbee54ed400a3fd5594fab506518c171167805Rik Faith 213888dbee54ed400a3fd5594fab506518c171167805Rik Faith map.offset = idx; 21398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map)) 2140ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 214188dbee54ed400a3fd5594fab506518c171167805Rik Faith *offset = map.offset; 214288dbee54ed400a3fd5594fab506518c171167805Rik Faith *size = map.size; 214388dbee54ed400a3fd5594fab506518c171167805Rik Faith *type = map.type; 214488dbee54ed400a3fd5594fab506518c171167805Rik Faith *flags = map.flags; 214588dbee54ed400a3fd5594fab506518c171167805Rik Faith *handle = (unsigned long)map.handle; 214688dbee54ed400a3fd5594fab506518c171167805Rik Faith *mtrr = map.mtrr; 214788dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 214888dbee54ed400a3fd5594fab506518c171167805Rik Faith} 214988dbee54ed400a3fd5594fab506518c171167805Rik Faith 215088dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid, 215188dbee54ed400a3fd5594fab506518c171167805Rik Faith unsigned long *magic, unsigned long *iocs) 215288dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 215388dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_client_t client; 215488dbee54ed400a3fd5594fab506518c171167805Rik Faith 215588dbee54ed400a3fd5594fab506518c171167805Rik Faith client.idx = idx; 21568b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client)) 2157ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 215888dbee54ed400a3fd5594fab506518c171167805Rik Faith *auth = client.auth; 215988dbee54ed400a3fd5594fab506518c171167805Rik Faith *pid = client.pid; 216088dbee54ed400a3fd5594fab506518c171167805Rik Faith *uid = client.uid; 216188dbee54ed400a3fd5594fab506518c171167805Rik Faith *magic = client.magic; 216288dbee54ed400a3fd5594fab506518c171167805Rik Faith *iocs = client.iocs; 216388dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 216488dbee54ed400a3fd5594fab506518c171167805Rik Faith} 216588dbee54ed400a3fd5594fab506518c171167805Rik Faith 216688dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats) 216788dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 216888dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_stats_t s; 216988dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 217088dbee54ed400a3fd5594fab506518c171167805Rik Faith 21718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s)) 2172ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 217388dbee54ed400a3fd5594fab506518c171167805Rik Faith 217488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = 0; 217588dbee54ed400a3fd5594fab506518c171167805Rik Faith memset(stats, 0, sizeof(*stats)); 217688dbee54ed400a3fd5594fab506518c171167805Rik Faith if (s.count > sizeof(stats->data)/sizeof(stats->data[0])) 217788dbee54ed400a3fd5594fab506518c171167805Rik Faith return -1; 217888dbee54ed400a3fd5594fab506518c171167805Rik Faith 217988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE \ 218088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 218188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%8.8s"; \ 218288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 1; \ 218388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 218488dbee54ed400a3fd5594fab506518c171167805Rik Faith 218588dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT \ 218688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 218788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 218888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 218988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "kgm"; \ 219088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1000; \ 219188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 219288dbee54ed400a3fd5594fab506518c171167805Rik Faith 219388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE \ 219488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 219588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 219688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 219788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "KGM"; \ 219888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1024; \ 219988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 220088dbee54ed400a3fd5594fab506518c171167805Rik Faith 220188dbee54ed400a3fd5594fab506518c171167805Rik Faith 220288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = s.count; 220388dbee54ed400a3fd5594fab506518c171167805Rik Faith for (i = 0; i < s.count; i++) { 220488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].value = s.data[i].value; 220588dbee54ed400a3fd5594fab506518c171167805Rik Faith switch (s.data[i].type) { 220688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCK: 220788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Lock"; 220888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 220988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 221088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 221188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_OPENS: 221288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Opens"; 221388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "O"; 221488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 221588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 221688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 221788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_CLOSES: 221888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Closes"; 221988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 222088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 222188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 222288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 222388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IOCTLS: 222488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Ioctls"; 222588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ioc/s"; 222688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 222788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 222888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCKS: 222988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Locks"; 223088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lck/s"; 223188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 223288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 223388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_UNLOCKS: 223488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Unlocks"; 223588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Unl/s"; 223688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 223788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 223888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IRQ: 223988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "IRQs"; 224088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "IRQ/s"; 224188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 224288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 224388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_PRIMARY: 224488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Primary Bytes"; 224588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "PB/s"; 224688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 224788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 224888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SECONDARY: 224988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Secondary Bytes"; 225088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "SB/s"; 225188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 225288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 225388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_DMA: 225488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "DMA"; 225588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "DMA/s"; 225688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 225788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 225888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SPECIAL: 225988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Special DMA"; 226088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "dma/s"; 226188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 226288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 226388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_MISSED: 226488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Miss"; 226588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ms/s"; 226688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 226788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 226888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_VALUE: 226988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Value"; 227088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Value"; 227188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 227288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 227388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_BYTE: 227488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Bytes"; 227588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "B/s"; 227688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 227788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 227888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_COUNT: 227988dbee54ed400a3fd5594fab506518c171167805Rik Faith default: 228088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Count"; 228188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Cnt/s"; 228288dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 228388dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 228488dbee54ed400a3fd5594fab506518c171167805Rik Faith } 228588dbee54ed400a3fd5594fab506518c171167805Rik Faith } 228688dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 228788dbee54ed400a3fd5594fab506518c171167805Rik Faith} 228888dbee54ed400a3fd5594fab506518c171167805Rik Faith 2289d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 229006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl. 229106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 229206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor. 229306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index 229406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written. 229506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written. 229606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 229706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure. 229806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 229906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 230006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by 230106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 230206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 230322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version) 230406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 230506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int retcode = 0; 230606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drm_set_version_t sv; 230706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 230806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = version->drm_di_major; 230906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = version->drm_di_minor; 231006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = version->drm_dd_major; 231106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_minor = version->drm_dd_minor; 231206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 23138b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_VERSION, &sv)) { 231406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt retcode = -errno; 231506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 231606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 231706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_major = sv.drm_di_major; 231806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_minor = sv.drm_di_minor; 231906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_major = sv.drm_dd_major; 232006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_minor = sv.drm_dd_minor; 232106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 232206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return retcode; 232306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 232406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 232506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 2326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command. 2327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by 2335d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2336d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 23373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex) 23383903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 23393903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen void *data = NULL; /* dummy */ 23403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 23413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 23423903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex); 23433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 23448b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 23453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 23463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 23473903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 23483903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 23493903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2350d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2351d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2352d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command. 2353d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2354d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2355d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2356d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read. 2357d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read. 2358d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2359d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2360d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2361d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2362d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by 2363d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2364d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 236522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data, 236622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 23673903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 23683903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 23693903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 237074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 237174ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 23723903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 23738b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 23743903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 23753903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 23763903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 23773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 23783903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2379d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2381d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command. 2382d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2383d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2384d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2385d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written. 2386d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written. 2387d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2388d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2389d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2390d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2391d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by 2392d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2393d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 239422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data, 239522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 23963903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 23973903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 23983903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 239974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 240074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 24013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 24028b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 24033903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 24043903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 24053903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 24063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 24073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command. 2411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written. 2415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written. 2416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2419d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2420d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by 2421d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2422d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 242322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data, 242422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 24253903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 24263903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 24273903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 242874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 242974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 24303903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 24318b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) 24323903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 24333903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 24343903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 2435166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2436d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16 2437d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct { 2438ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian char *BusID; 2439ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2440ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int refcount; 2441d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS]; 2442d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2443d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0; 2444d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2445d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused, 2446d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie const char *BusID, 2447d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie int *newlyopened) 2448d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2449ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2450ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2451d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2452ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) 2453ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (strcmp(BusID, connection[i].BusID) == 0) { 2454ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i].refcount++; 2455ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 0; 2456ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return connection[i].fd; 2457ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2458ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2459ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fd = drmOpen(unused, BusID); 2460ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd <= 0 || nr_fds == DRM_MAX_FDS) 2461ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2462d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2463ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].BusID = strdup(BusID); 2464ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].fd = fd; 2465ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].refcount = 1; 2466ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 1; 2467d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2468ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (0) 2469ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "saved connection %d for %s %d\n", 2470ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds, connection[nr_fds].BusID, 2471ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian strcmp(BusID, connection[nr_fds].BusID)); 2472d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2473ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds++; 2474d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2475ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2476d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2477d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2478d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd) 2479d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2480ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2481d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2482ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) { 2483ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd == connection[i].fd) { 2484ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (--connection[i].refcount == 0) { 2485ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmClose(connection[i].fd); 2486ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(connection[i].BusID); 2487d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2488ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (i < --nr_fds) 2489ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i] = connection[nr_fds]; 2490d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2491ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 2492ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2493ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2494ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2495d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2496731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2497731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmSetMaster(int fd) 2498731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2499731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int ret; 2500731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2501731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fprintf(stderr,"Setting master \n"); 2502731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes ret = ioctl(fd, DRM_IOCTL_SET_MASTER, 0); 2503731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return ret; 2504731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 2505731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2506731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmDropMaster(int fd) 2507731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2508731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes int ret; 2509731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes fprintf(stderr,"Dropping master \n"); 2510731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes ret = ioctl(fd, DRM_IOCTL_DROP_MASTER, 0); 2511731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return ret; 2512731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 251322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 251422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsbergchar *drmGetDeviceNameFromFd(int fd) 251522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg{ 251622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg char name[128]; 251722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg struct stat sbuf; 251822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg dev_t d; 251922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg int i; 252022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 252122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg /* The whole drmOpen thing is a fiasco and we need to find a way 252222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * back to just using open(2). For now, however, lets just make 252322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * things worse with even more ad hoc directory walking code to 252422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * discover the device file name. */ 252522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 252622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg fstat(fd, &sbuf); 252722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg d = sbuf.st_rdev; 252822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 252922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg for (i = 0; i < DRM_MAX_MINOR; i++) { 253022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i); 253122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d) 253222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg break; 253322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg } 253422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (i == DRM_MAX_MINOR) 253522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg return NULL; 253622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 253722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg return drmStrdup(name); 253822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg} 2539