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