xf86drm.c revision 291b2bb92c5fc90101417b80bbdc6c994be5fff2
1d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \file xf86drm.c 3d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * User-level interface to DRM device 4b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 5d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Rickard E. (Rik) Faith <faith@valinux.com> 6d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Kevin E. Martin <martin@valinux.com> 7d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 8d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 9d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/* 10569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 11569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 12b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * All Rights Reserved. 13b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 14b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Permission is hereby granted, free of charge, to any person obtaining a 15b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * copy of this software and associated documentation files (the "Software"), 16b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * to deal in the Software without restriction, including without limitation 17b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * and/or sell copies of the Software, and to permit persons to whom the 19b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software is furnished to do so, subject to the following conditions: 20360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 21b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * The above copyright notice and this permission notice (including the next 22b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * paragraph) shall be included in all copies or substantial portions of the 23b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software. 24360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 25b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 28b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 29b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 30b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 31b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * DEALINGS IN THE SOFTWARE. 32b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss */ 33b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 3479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#ifdef HAVE_CONFIG_H 3579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie# include <config.h> 36b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 3779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdio.h> 3879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdlib.h> 3979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <unistd.h> 4079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <string.h> 41015efd1bfa72ab8b80cc45f11eb22d7f1a1085f7Ian Romanick#include <strings.h> 4279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <ctype.h> 430ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#include <dirent.h> 440ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#include <stddef.h> 4579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <fcntl.h> 4679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <errno.h> 4779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <signal.h> 48f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes#include <time.h> 4979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/types.h> 5079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/stat.h> 5179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#define stat_t struct stat 5279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/ioctl.h> 5379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/time.h> 5479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdarg.h> 550e1135de5cbb783846a4f7e9ef8a5f953f7c77aeAlan Coopersmith#ifdef HAVE_SYS_MKDEV_H 560e1135de5cbb783846a4f7e9ef8a5f953f7c77aeAlan Coopersmith# include <sys/mkdev.h> /* defines major(), minor(), and makedev() on Solaris */ 570e1135de5cbb783846a4f7e9ef8a5f953f7c77aeAlan Coopersmith#endif 58b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov#include <math.h> 59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */ 61b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED 62b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1) 63b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 64b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 65b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h" 6642465feb9759ef5a6d79d7e628510cd0a081f913Emil Velikov#include "libdrm_macros.h" 67b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 685f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov#include "util_math.h" 695f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 70fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#ifdef __OpenBSD__ 71fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_PRIMARY_MINOR_NAME "drm" 72fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_CONTROL_MINOR_NAME "drmC" 73fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_RENDER_MINOR_NAME "drmR" 74fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#else 75fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_PRIMARY_MINOR_NAME "card" 76fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_CONTROL_MINOR_NAME "controlD" 77fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#define DRM_RENDER_MINOR_NAME "renderD" 78fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray#endif 79fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray 8027c3785d3f12743a9e160238a4d00353060ec2f2Hasso Tepper#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) 81cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145 82cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif 83cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt 84cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__ 85cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34 8688dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 8788dbee54ed400a3fd5594fab506518c171167805Rik Faith 8866c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#ifdef __OpenBSD__ 8966c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#ifdef __i386__ 9066c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#define DRM_MAJOR 88 9166c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#else 9266c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#define DRM_MAJOR 87 9366c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#endif 9466c3afb75fa993f2f8b00c2dd9c2ec37a3a9dfb6Jonathan Gray#endif /* __OpenBSD__ */ 95b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 96cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR 97cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226 /* Linux */ 9888dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 9988dbee54ed400a3fd5594fab506518c171167805Rik Faith 10022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/* 10122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure. 10222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best. 10322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 104569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev 105569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y) ((dev_t)(((x) << 8) | (y))) 106569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif 107569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 10856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3 10956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 110fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter#define memclear(s) memset(&s, 0, sizeof(s)) 111fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 11279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info; 11379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info) 11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 116ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info = info; 11779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 11879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 119d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 120d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr. 121d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 122d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string. 123d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 124d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 125d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf(). 126d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 12844b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Redingstatic int DRM_PRINTFLIKE(1, 0) 12944b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry RedingdrmDebugPrint(const char *format, va_list ap) 13079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 131ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return vfprintf(stderr, format, ap); 13279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 13379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 134c4857429c716f35e1fa054d1990cae28055d96d7Eric Anholtvoid 13556bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...) 13656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{ 13756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_list ap; 13856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes const char *env; 139eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || 140eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark (drm_server_info && drm_server_info->debug_print)) 14156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes { 14256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_start(ap, format); 14379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 14479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_server_info->debug_print(format,ap); 14579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } else { 146cfbe9c9807888d24a56d9b1df28db7da669dee85Jan Vesely drmDebugPrint(format, ap); 14779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 14856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_end(ap); 14956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 15056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes} 15156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */ 153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void) 15579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 156ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return drmHashTable; 15779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size) 160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 161d0e592d4e9b59d9cc185f1d63b3c1dd818e95098Emil Velikov return calloc(1, size); 162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt) 165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 166d0e592d4e9b59d9cc185f1d63b3c1dd818e95098Emil Velikov free(pt); 167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 168b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1698b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard/** 1708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard * Call ioctl, restarting if it is interupted 1718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard */ 172731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint 17341b83a99583486ad4f8760a6537d34783769bfc3Coleman KanedrmIoctl(int fd, unsigned long request, void *arg) 1748b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard{ 1758b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard int ret; 1768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard 1778b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard do { 1788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard ret = ioctl(fd, request, arg); 1798b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 1808b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return ret; 1818b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard} 182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd) 184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 185fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes stat_t st; 186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss st.st_rdev = 0; 188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fstat(fd, &st); 189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return st.st_rdev; 190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 19279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd) 193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry; 197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 198ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!drmHashTable) 199ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmHashTable = drmHashCreate(); 200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashLookup(drmHashTable, key, &value)) { 202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = drmMalloc(sizeof(*entry)); 203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = fd; 204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = drmHashCreate(); 206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(drmHashTable, key, entry); 207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } else { 208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = value; 209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return entry; 211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 212b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 21406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings 21506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first 21706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second 21806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched. 22006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 22106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 22206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings. It understands the older 22306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format. In the format, o is 22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function. 22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 226b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidtstatic int drmMatchBusID(const char *id1, const char *id2, int pci_domain_ok) 22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* First, check if the IDs are exactly the same */ 22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strcasecmp(id1, id2) == 0) 23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Try to match old/new-style PCI bus IDs. */ 23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strncasecmp(id1, "pci", 3) == 0) { 23490ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o1, b1, d1, f1; 23590ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o2, b2, d2, f2; 23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int ret; 23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 23890ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "pci:%04x:%02x:%02x.%u", &o1, &b1, &d1, &f1); 23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o1 = 0; 24190ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "PCI:%u:%u:%u", &b1, &d1, &f1); 24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24690ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "pci:%04x:%02x:%02x.%u", &o2, &b2, &d2, &f2); 24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o2 = 0; 24990ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "PCI:%u:%u:%u", &b2, &d2, &f2); 25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 25106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 25206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 25306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 254b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt /* If domains aren't properly supported by the kernel interface, 255b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * just ignore them, which sucks less than picking a totally random 256b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * card with "open by name" 257b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt */ 258b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (!pci_domain_ok) 259b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt o1 = o2 = 0; 260b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt 26106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2)) 26206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt else 26406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 26506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 26606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 26806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 26906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 270c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Handles error checking for chown call. 271c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 272c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param path to file. 273c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new owner. 274c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new group. 275c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 276c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \return zero if success or -1 if failure. 277c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 278c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \internal 279c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Checks for failure. If failure was caused by signal call chown again. 280c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * If any other failure happened then it will output error mesage using 281c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * drmMsg() call. 282c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen */ 2836fc0e4ba1ea153ff949cba0002fc5ed544de0de0Jan Vesely#if !defined(UDEV) 284c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminenstatic int chown_check_return(const char *path, uid_t owner, gid_t group) 285c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen{ 286c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen int rv; 287c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 288c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen do { 289c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen rv = chown(path, owner, group); 290c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen } while (rv != 0 && errno == EINTR); 291c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 292c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen if (rv == 0) 293c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return 0; 294c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 295c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen drmMsg("Failed to change owner or group for file %s! %d: %s\n", 296c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen path, errno, strerror(errno)); 297c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return -1; 298c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen} 2996fc0e4ba1ea153ff949cba0002fc5ed544de0de0Jan Vesely#endif 300c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 301c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen/** 302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary. 303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 304d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device. 305d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device. 306d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 307d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 308d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 309d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 310d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device 311d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and 312d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root. 313d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 314de8532dd8359dfdaba839ff61fc9e2f05eaf57d3Jan Veselystatic int drmOpenDevice(dev_t dev, int minor, int type) 315b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 3169c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes stat_t st; 3170c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns const char *dev_name; 31888dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 31988dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 32079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie mode_t devmode = DRM_DEV_MODE, serv_mode; 3210706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely gid_t serv_group; 3220706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely#if !defined(UDEV) 32388dbee54ed400a3fd5594fab506518c171167805Rik Faith int isroot = !geteuid(); 32488dbee54ed400a3fd5594fab506518c171167805Rik Faith uid_t user = DRM_DEV_UID; 3250706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely gid_t group = DRM_DEV_GID; 3260706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely#endif 3270706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely 3280c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns switch (type) { 3290c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_PRIMARY: 3300c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_DEV_NAME; 3310c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3320c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_CONTROL: 3330c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_CONTROL_DEV_NAME; 3340c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3350c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_RENDER: 3360c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_RENDER_DEV_NAME; 3370c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3380c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns default: 3390c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return -EINVAL; 3400c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns }; 3410c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 3420c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns sprintf(buf, dev_name, DRM_DIR_NAME, minor); 34306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenDevice: node name is %s\n", buf); 34456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 345eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark if (drm_server_info && drm_server_info->get_perms) { 346ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info->get_perms(&serv_group, &serv_mode); 347ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode = serv_mode ? serv_mode : DRM_DEV_MODE; 348ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); 34979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 350569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 3519101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#if !defined(UDEV) 35288dbee54ed400a3fd5594fab506518c171167805Rik Faith if (stat(DRM_DIR_NAME, &st)) { 353ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 354ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 355b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); 356c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(DRM_DIR_NAME, 0, 0); /* root:root */ 357b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); 358569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 36006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node exists and create it if necessary. */ 361d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (stat(buf, &st)) { 362ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 363ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 36488dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 36588dbee54ed400a3fd5594fab506518c171167805Rik Faith mknod(buf, S_IFCHR | devmode, dev); 366b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 36779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 368eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark if (drm_server_info && drm_server_info->get_perms) { 369454b14949452c4e44990a8f455bcc307306181bcJammy Zhou group = ((int)serv_group >= 0) ? serv_group : DRM_DEV_GID; 370c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 371ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 37279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 3739101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#else 3749101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie /* if we modprobed then wait for udev */ 3759101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie { 3769101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie int udev_count = 0; 3779101a0205c897fea28e6a3d875111a83ad7f7732Dave Airliewait_for_udev: 3789101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(DRM_DIR_NAME, &st)) { 3799101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3809101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3819101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3829101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3839101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3849101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3859101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3869101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3879101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(buf, &st)) { 3889101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3899101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3909101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3919101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3929101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3939101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3949101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3959101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3969101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#endif 39788dbee54ed400a3fd5594fab506518c171167805Rik Faith 39856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd = open(buf, O_RDWR, 0); 39956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: open result is %d, (%s)\n", 40056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd, fd < 0 ? strerror(errno) : "OK"); 401ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 402ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 403d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 40439e5e982242cd2b611a9dfc1e9b63f857d52da61Dave Airlie#if !defined(UDEV) 40506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node is not what we expect it to be, and recreate it 40606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * and try again if so. 40706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 408d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (st.st_rdev != dev) { 409ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 410ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 411d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt remove(buf); 412d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt mknod(buf, S_IFCHR | devmode, dev); 413eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark if (drm_server_info && drm_server_info->get_perms) { 414c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 415ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 41679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 417d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt } 418d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd = open(buf, O_RDWR, 0); 419d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt drmMsg("drmOpenDevice: open result is %d, (%s)\n", 420d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd, fd < 0 ? strerror(errno) : "OK"); 421ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 422ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 423d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 42456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: Open failed\n"); 42588dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 42639e5e982242cd2b611a9dfc1e9b63f857d52da61Dave Airlie#endif 42788dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 428b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 429b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 430d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 431d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 432d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device 433d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 434d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number. 435d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set. 436d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 437d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 438d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 439d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 440d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device 441d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it. 442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 443731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenMinor(int minor, int create, int type) 44488dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 44588dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 44688dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 4470c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns const char *dev_name; 448db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 449ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (create) 450731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); 45188dbee54ed400a3fd5594fab506518c171167805Rik Faith 4520c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns switch (type) { 4530c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_PRIMARY: 4540c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_DEV_NAME; 4550c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4560c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_CONTROL: 4570c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_CONTROL_DEV_NAME; 4580c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4590c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_RENDER: 4600c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_RENDER_DEV_NAME; 4610c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4620c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns default: 4630c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return -EINVAL; 4640c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns }; 4650c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 4660c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns sprintf(buf, dev_name, DRM_DIR_NAME, minor); 467ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((fd = open(buf, O_RDWR, 0)) >= 0) 468ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 46988dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 47088dbee54ed400a3fd5594fab506518c171167805Rik Faith} 47188dbee54ed400a3fd5594fab506518c171167805Rik Faith 472569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded. 475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise. 477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0 480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information. For backward compatibility with older 481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked. 482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 483569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void) 484569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{ 485569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul drmVersionPtr version; 486569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int retval = 0; 487569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int fd; 488360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 489ad8bbfd3c74466f088be8088d2d0524bed392b71Frank Binns if ((fd = drmOpenMinor(0, 1, DRM_NODE_PRIMARY)) < 0) { 490b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__ 49122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Try proc for backward Linux compatibility */ 492ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!access("/proc/dri/0", R_OK)) 493ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 1; 494b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif 49588dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 496569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 49788dbee54ed400a3fd5594fab506518c171167805Rik Faith 49888dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 49988dbee54ed400a3fd5594fab506518c171167805Rik Faith retval = 1; 50088dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 50188dbee54ed400a3fd5594fab506518c171167805Rik Faith } 50288dbee54ed400a3fd5594fab506518c171167805Rik Faith close(fd); 503569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 504569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 505569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul} 506569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 507f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmGetMinorBase(int type) 508f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou{ 509f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou switch (type) { 510f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_PRIMARY: 511f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 0; 512f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_CONTROL: 513f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 64; 514f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_RENDER: 515f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 128; 516f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou default: 517f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 518f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou }; 519f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou} 520d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 5211f73578df32f895a678a41758f6c563f49484347Frank Binnsstatic int drmGetMinorType(int minor) 5221f73578df32f895a678a41758f6c563f49484347Frank Binns{ 5231f73578df32f895a678a41758f6c563f49484347Frank Binns int type = minor >> 6; 5241f73578df32f895a678a41758f6c563f49484347Frank Binns 5251f73578df32f895a678a41758f6c563f49484347Frank Binns if (minor < 0) 5261f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 5271f73578df32f895a678a41758f6c563f49484347Frank Binns 5281f73578df32f895a678a41758f6c563f49484347Frank Binns switch (type) { 5291f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_PRIMARY: 5301f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_CONTROL: 5311f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_RENDER: 5321f73578df32f895a678a41758f6c563f49484347Frank Binns return type; 5331f73578df32f895a678a41758f6c563f49484347Frank Binns default: 5341f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 5351f73578df32f895a678a41758f6c563f49484347Frank Binns } 5361f73578df32f895a678a41758f6c563f49484347Frank Binns} 5371f73578df32f895a678a41758f6c563f49484347Frank Binns 5380ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovstatic const char *drmGetMinorName(int type) 5390ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 5400ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov switch (type) { 5410ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_PRIMARY: 542fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray return DRM_PRIMARY_MINOR_NAME; 5430ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_CONTROL: 544fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray return DRM_CONTROL_MINOR_NAME; 5450ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_RENDER: 546fc083322b0c8a58b51976adf23a582bce8bb75f1Jonathan Gray return DRM_RENDER_MINOR_NAME; 5470ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov default: 5480ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 5490ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 5500ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 5510ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID. 554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. 556f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type device node type. 557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 561d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR), 562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied. 563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid(). 565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 566f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmOpenByBusid(const char *busid, int type) 567e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{ 568b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt int i, pci_domain_ok = 1; 56988dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 57088dbee54ed400a3fd5594fab506518c171167805Rik Faith const char *buf; 57106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetVersion sv; 572f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int base = drmGetMinorBase(type); 573f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 574f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if (base < 0) 575f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 57606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 57706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid); 578f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou for (i = base; i < base + DRM_MAX_MINOR; i++) { 579f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou fd = drmOpenMinor(i, 1, type); 58056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); 58156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (fd >= 0) { 582b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt /* We need to try for 1.4 first for proper PCI domain support 583b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * and if that fails, we know the kernel is busted 584b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt */ 58506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = 1; 586b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_minor = 4; 58706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = -1; /* Don't care */ 58826462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt sv.drm_dd_minor = -1; /* Don't care */ 589b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (drmSetInterfaceVersion(fd, &sv)) { 590b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt#ifndef __alpha__ 591b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt pci_domain_ok = 0; 592b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt#endif 593b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_major = 1; 594b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_minor = 1; 595b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_dd_major = -1; /* Don't care */ 596b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_dd_minor = -1; /* Don't care */ 597303ff26311dc5efdf28676be34d86f501699acf3Thierry Reding drmMsg("drmOpenByBusid: Interface 1.4 failed, trying 1.1\n"); 598b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt drmSetInterfaceVersion(fd, &sv); 599b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt } 600e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss buf = drmGetBusid(fd); 60156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); 602b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (buf && drmMatchBusID(buf, busid, pci_domain_ok)) { 60388dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeBusid(buf); 60488dbee54ed400a3fd5594fab506518c171167805Rik Faith return fd; 605e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 606ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (buf) 607ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmFreeBusid(buf); 608e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss close(fd); 609e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 610e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 611e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss return -1; 612e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss} 613e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss 614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name. 617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. 619f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type the device node type. 620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and 625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use. If it's in use it then it will already have a bus ID 626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned. 627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid(). 629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 630f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmOpenByName(const char *name, int type) 631b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{ 63288dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 63388dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 63488dbee54ed400a3fd5594fab506518c171167805Rik Faith drmVersionPtr version; 63556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes char * id; 636f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int base = drmGetMinorBase(type); 637f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 638f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if (base < 0) 639f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 640db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 64156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes /* 64256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * Open the first minor number that matches the driver name and isn't 64356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * already in use. If it's in use it will have a busid assigned already. 64456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes */ 645f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou for (i = base; i < base + DRM_MAX_MINOR; i++) { 646f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if ((fd = drmOpenMinor(i, 1, type)) >= 0) { 64788dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 64888dbee54ed400a3fd5594fab506518c171167805Rik Faith if (!strcmp(version->name, name)) { 64988dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 65056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes id = drmGetBusid(fd); 65156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL"); 65256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (!id || !*id) { 65322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (id) 65456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 65556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return fd; 65656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 65756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 65856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 65956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 66056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeVersion(version); 66188dbee54ed400a3fd5594fab506518c171167805Rik Faith } 66288dbee54ed400a3fd5594fab506518c171167805Rik Faith } 66356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes close(fd); 66488dbee54ed400a3fd5594fab506518c171167805Rik Faith } 665b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 666b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 66788dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__ 66822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Backward-compatibility /proc support */ 669b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (i = 0; i < 8; i++) { 67088dbee54ed400a3fd5594fab506518c171167805Rik Faith char proc_name[64], buf[512]; 67188dbee54ed400a3fd5594fab506518c171167805Rik Faith char *driver, *pt, *devstring; 67288dbee54ed400a3fd5594fab506518c171167805Rik Faith int retcode; 67388dbee54ed400a3fd5594fab506518c171167805Rik Faith 6740371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss sprintf(proc_name, "/proc/dri/%d/name", i); 675b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if ((fd = open(proc_name, 0, 0)) >= 0) { 676b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss retcode = read(fd, buf, sizeof(buf)-1); 677b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss close(fd); 678b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (retcode) { 679b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss buf[retcode-1] = '\0'; 680b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (driver = pt = buf; *pt && *pt != ' '; ++pt) 681b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 68222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (*pt) { /* Device is next */ 683b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss *pt = '\0'; 684b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (!strcmp(driver, name)) { /* Match */ 685b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (devstring = ++pt; *pt && *pt != ' '; ++pt) 686b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 687b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (*pt) { /* Found busid */ 688f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenByBusid(++pt, type); 68922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson } else { /* No busid */ 690f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenDevice(strtol(devstring, NULL, 0),i, type); 691b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 692b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 693b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 694b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 695569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 696b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 69788dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 69888dbee54ed400a3fd5594fab506518c171167805Rik Faith 699b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return -1; 700b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss} 701b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 702b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device. 705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found. The 707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root. 708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied. 710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known. 711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 713d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 714d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 715d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise. 717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 718b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid) 719b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 720f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenWithType(name, busid, DRM_NODE_PRIMARY); 721f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou} 722f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 723f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou/** 724f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * Open the DRM device with specified type. 725f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 726f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * Looks up the specified name and bus ID, and opens the device found. The 727f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * entry in /dev/dri is created if necessary and if called by root. 728f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 729f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param name driver name. Not referenced if bus ID is supplied. 730f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param busid bus ID. Zero if not known. 731f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type the device node type to open, PRIMARY, CONTROL or RENDER 732f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 733f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \return a file descriptor on success, or a negative value on error. 734f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 735f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \internal 736f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 737f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * otherwise. 738f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou */ 739f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhouint drmOpenWithType(const char *name, const char *busid, int type) 740f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou{ 741eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark if (!drmAvailable() && name != NULL && drm_server_info && 742eb7c2d5e63e0e9d133b16880e36c14676276d412Rob Clark drm_server_info->load_module) { 743f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou /* try to load the kernel module */ 74479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drm_server_info->load_module(name)) { 745ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 74606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 74706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 74806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 74906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 75006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (busid) { 751f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int fd = drmOpenByBusid(busid, type); 75206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (fd >= 0) 75306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return fd; 75406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 75522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 75606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (name) 757f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenByName(name, type); 75822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 75906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 760b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 761b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 762731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmOpenControl(int minor) 763731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 764731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); 765731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 7670c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binnsint drmOpenRender(int minor) 7680c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns{ 7690c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return drmOpenMinor(minor, 0, DRM_NODE_RENDER); 7700c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns} 7710c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 773d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion(). 774d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 775d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 776d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 777d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings 779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it. 780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 781b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v) 782b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 783ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 784ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 7859d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 7869d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 7879d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 788b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 789b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 790b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel. 794d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 795d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all 799d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it. 800d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 801b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v) 802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 803ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 804ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 8059d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 8069d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 8079d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 808b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information. 814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer. 816d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer. 817d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 818d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 819d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl 820d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart. 821d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 822569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s) 823b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_major = s->version_major; 825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_minor = s->version_minor; 826b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_patchlevel = s->version_patchlevel; 827b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name_len = s->name_len; 8280a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->name = strdup(s->name); 829b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date_len = s->date_len; 8300a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->date = strdup(s->date); 831b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc_len = s->desc_len; 8320a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->desc = strdup(s->desc); 833b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 834b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 835b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information. 838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with 842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion(). 843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri. 845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls, 848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings. 849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already. 850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 851b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd) 852b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 853b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmVersionPtr retval; 854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_version_t *version = drmMalloc(sizeof(*version)); 855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 85695f23cf894757d05a6b6c980062a46968dc069b1Daniel Vetter memclear(*version); 857360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 8588b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 859b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 860b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 861b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 862b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 863b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) 864b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = drmMalloc(version->name_len + 1); 865b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) 866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = drmMalloc(version->date_len + 1); 867b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) 868b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = drmMalloc(version->desc_len + 1); 869360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 8708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 871b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno)); 872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 874b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 875b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 87622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* The results might not be null-terminated strings, so terminate them. */ 877b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) version->name[version->name_len] = '\0'; 878b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) version->date[version->date_len] = '\0'; 879b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) version->desc[version->desc_len] = '\0'; 880b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 881b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 882b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmCopyVersion(retval, version); 883b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 884b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 885b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8873903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library. 890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 891d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent. 892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 895d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information. 896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded 899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number. 900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 9013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd) 9023903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 9033903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen drm_version_t *version = drmMalloc(sizeof(*version)); 9043903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 9053903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen /* Version history: 90679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it 9073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.0.x = original DRM interface with no drmGetLibVersion 9083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * entry point and many drm<Device> extensions 9093903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.1.x = added drmCommand entry points for device extensions 9103903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * added drmGetLibVersion to identify libdrm.a version 91106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * revision 1.2.x = added drmSetInterfaceVersion 91206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * modified drmOpen to handle both busid and name 91379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * revision 1.3.x = added server + memory manager 9143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen */ 91579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_major = 1; 91679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_minor = 3; 9173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen version->version_patchlevel = 0; 9183903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 9193903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return (drmVersionPtr)version; 9203903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 9213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 9225c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggsint drmGetCap(int fd, uint64_t capability, uint64_t *value) 9235c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs{ 924fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter struct drm_get_cap cap; 9255c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs int ret; 9265c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs 927fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(cap); 928fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.capability = capability; 929fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 9305c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap); 9315c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs if (ret) 9325c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs return ret; 9335c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs 9345c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs *value = cap.value; 9353b04c73650b5e9bbcb602fdb8cea0b16ad82d0c0Dave Airlie return 0; 9365c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs} 937d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 938ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiauint drmSetClientCap(int fd, uint64_t capability, uint64_t value) 939ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau{ 940fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter struct drm_set_client_cap cap; 941fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 942fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(cap); 943fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.capability = capability; 944fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.value = value; 945ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau 946ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau return drmIoctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap); 947ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau} 948ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau 949d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 950d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information. 951d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 952d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid(). 953d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 954d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 955d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid. 956d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 957b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid) 958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 959b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drmFree((void *)busid); 960b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 961b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device. 965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string. 969d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 970d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 971d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to 972d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique 973d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure. 974d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 975b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd) 976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 977b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 978b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 979fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(u); 980b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 9818b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 982ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 983b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = drmMalloc(u.unique_len + 1); 9848b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 985ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 986b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique[u.unique_len] = '\0'; 98706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 988b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return u.unique; 989b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device. 994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 996d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string. 997d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 998d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure. 999d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1000d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1001d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing 1002d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure. 1003d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1004b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid) 1005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1006b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 1007b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1008fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(u); 1009b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = (char *)busid; 1010b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = strlen(busid); 1011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10128b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) { 101356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return -errno; 101456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 1015b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1016b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10188696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic) 1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1020b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 1021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1022fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(auth); 1023fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = 0; 10258b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) 1026ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1027b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = auth.magic; 1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10318696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic) 1032b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 1034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1035fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(auth); 1036b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss auth.magic = magic; 10378b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) 1038ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1039b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1040b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1041b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a 1044d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process. 1045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1047d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of 1048d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below. 1049d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes. 1050d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped. 1051d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions. 1052d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset 1053d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap(). 1054d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1055d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error. 1056d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1057d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer 1058d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer 1059d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer, 1060d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and 1061d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER. 1062d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1063d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1064d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the 1065d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining. 1066d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1067d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area 1068d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area, 1069d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area, 1070d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and 1071d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS. 1072d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1073d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. 1074d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1075d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA 1076d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA, 1077d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero, 1078d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes, 1079d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM. 1080d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1081d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1082d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in 1083d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle 1084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned. 1085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1086d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1087d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1088d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1089d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing 1090d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure. 1091d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 109222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type, 109322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drmMapFlags flags, drm_handle_t *handle) 1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_map_t map; 1096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1097fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.offset = offset; 1099b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.size = size; 1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.type = type; 1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.flags = flags; 11028b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map)) 1103ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1104ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 1105961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston *handle = (drm_handle_t)(uintptr_t)map.handle; 1106b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1107b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1108b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 11098696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle) 111074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 111174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_map_t map; 111274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 1113fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 1114961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston map.handle = (void *)(uintptr_t)handle; 111574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 11168b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map)) 1117ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 111874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 111974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 112074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 1121d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1122d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers. 1123d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1124d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1125d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers. 1126d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer. 1127d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags. 1128d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture 1129d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1130d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error. 1131d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1132d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1133d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl. 1134d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1135d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc. 1136d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1137ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags, 1138ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann int agp_offset) 1139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_desc_t request; 1141360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1142fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(request); 1143b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.size = size; 1145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.flags = flags; 1146ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann request.agp_start = agp_offset; 1147360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 11488b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request)) 1149ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return request.count; 1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high) 1154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1158fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(info); 1159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 11608b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1161ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1163ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!info.count) 1164ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1165360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1166b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return -ENOMEM; 1168360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 11698b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1171b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1172b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1174360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].low_mark = low * info.list[i].count; 1177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].high_mark = high * info.list[i].count; 11788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) { 1179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1185360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1189d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1190d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers. 1191d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1192d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1193d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free. 1194d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed. 1195d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1196d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1197d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1198d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging. 1199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1200d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1201d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing 1202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure. 1203d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list) 1205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_free_t request; 1207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1208fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(request); 1209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.list = list; 12118b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request)) 1212ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1213b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1216d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1217d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1218d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device. 1219d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1220d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1221d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1222d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1223d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor. 1224d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1225b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd) 1226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1227b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 1228b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1229b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1230b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDestroy(entry->tagTable); 1231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = 0; 1232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 1233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = NULL; 1234b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1235b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(drmHashTable, key); 1236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(entry); 1237b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1238b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return close(fd); 1239b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1240b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory. 1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap(). 1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap(). 1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping 1249d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins. 1250d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1251d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1252d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1253d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1254d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap(). 1255d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 125622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address) 1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1258c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane static unsigned long pagesize_mask = 0; 1259c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1260ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd < 0) 1261ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1262c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1263c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane if (!pagesize_mask) 1264c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane pagesize_mask = getpagesize() - 1; 1265c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1266c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane size = (size + pagesize_mask) & ~pagesize_mask; 1267c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1268faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov *address = drm_mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); 1269ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (*address == MAP_FAILED) 1270ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1271b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1272b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1273b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap(). 1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap(). 1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap(). 1280d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1281d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1282d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1283d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 128422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap(). 1285d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size) 1287b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1288faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov return drm_munmap(address, size); 1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd) 1292b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1293b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1294b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufInfoPtr retval; 1295b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1296b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1297fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(info); 1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 12998b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1300ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1301b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1302b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (info.count) { 1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1304b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1305360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 13068b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1307b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1308b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 131022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = info.count; 1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(info.count * sizeof(*retval->list)); 1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1315b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].count = info.list[i].count; 1316b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].size = info.list[i].size; 1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].low_mark = info.list[i].low_mark; 1318b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].high_mark = info.list[i].high_mark; 1319b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1320b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1321b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1322b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space. 1328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure. 1332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices 1334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA(). 1335d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1336d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1337d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned 1338d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the 1339d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures. 1340d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1341b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd) 1342b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1343b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_map_t bufs; 1344b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufMapPtr retval; 1345b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1346360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1347fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(bufs); 13488b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) 1349ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1351ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!bufs.count) 1352ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 13538696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) 1355b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 13578b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) { 1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(bufs.list); 1359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1360b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 136122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = bufs.count; 1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(bufs.count * sizeof(*retval->list)); 1365b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs.count; i++) { 1366b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].idx = bufs.list[i].idx; 1367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].total = bufs.list[i].total; 1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].used = 0; 1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].address = bufs.list[i].address; 1370b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 13718696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 13728696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs.list); 13738696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1374b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1375b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1376b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1378d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1379d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs(). 1380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1381d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure. 1382d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1383d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 13848696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the 13858696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs(). 1386d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1387b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs) 1388b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1390360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1391b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs->count; i++) { 1392faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov drm_munmap(bufs->list[i].address, bufs->list[i].total); 1393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 13948696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 13958696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs->list); 13968696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs); 13978696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1398b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1400b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1401d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1402360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY 16 1403360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1404d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1405d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers. 1406d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request 1409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the 1414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries. 1415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1416b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request) 1417b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1418b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_dma_t dma; 1419360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes int ret, i = 0; 1420b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1421b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.context = request->context; 1422b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_count = request->send_count; 1423b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_indices = request->send_list; 1424b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_sizes = request->send_sizes; 1425b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.flags = request->flags; 1426b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_count = request->request_count; 1427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_size = request->request_size; 1428b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_indices = request->request_list; 1429b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_sizes = request->request_sizes; 14308696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl dma.granted_count = 0; 1431360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1432360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes do { 1433360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes ret = ioctl( fd, DRM_IOCTL_DMA, &dma ); 1434360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY ); 1435360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1436360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes if ( ret == 0 ) { 1437360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes request->granted_count = dma.granted_count; 1438360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return 0; 1439360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } else { 1440360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return -errno; 1441360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } 1442b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1443b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock. 1447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function 1451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns. 1452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero. 1454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1456d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue 1457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired. 1458d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14598696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags) 1460b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1461b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1462b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1463fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 1464b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1465b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1466b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 1467b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 1468b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 1469b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1470b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1471b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1472360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 14738b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard while (drmIoctl(fd, DRM_IOCTL_LOCK, &lock)) 1474b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ; 1475b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1476b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1477b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock. 1480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1483d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1484d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1485d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1486d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the 1488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure. 1489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14908696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context) 1491b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1492b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1493b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1494fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 1495b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 14968b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock); 1497b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1498b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 149922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count) 1500b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1501b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_res_t res; 1502b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t *list; 15038696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drm_context_t * retval; 1504b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1505b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1506fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(res); 15078b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1508ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1509b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1510ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!res.count) 1511ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1512b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1513ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!(list = drmMalloc(res.count * sizeof(*list)))) 1514ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1515b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { 1516b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1517b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1518b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1519b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1520b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = list; 15218b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1522ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1523b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1524ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < res.count; i++) 1525ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian retval[i] = list[i].handle; 1526b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1527b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1528b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *count = res.count; 1529b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1530b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1531b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 153222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt) 1533b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1534b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(pt); 1535b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1536b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context. 1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes 1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated. 1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA 1545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA(). 1546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1551d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the 1553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 155522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle) 1556b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1557b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1558b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1559fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 15608b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) 1561ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1562b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = ctx.handle; 1563b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1564b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1565b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15668696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context) 1567b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1568b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1569b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1570fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1571b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 15728b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) 1573ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1574b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1575b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1576b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15778696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags) 1578b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1579b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1580b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 158122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* 158222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * Context preserving means that no context switches are done between DMA 158322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * buffers from one context and the next. This is suitable for use in the 158422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * X server (which promises to maintain hardware context), or in the 158522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * client-side library when buffers are swapped on behalf of two threads. 158622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 1587fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1588b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1589ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_PRESERVED) 1590ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_PRESERVED; 1591ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_2DONLY) 1592ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_2DONLY; 15938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) 1594ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1595b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1596b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1597b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 159822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context, 159922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_context_tFlagsPtr flags) 1600b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1601b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1602b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1603fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1604b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 16058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx)) 1606ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1607b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *flags = 0; 1608ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_PRESERVED) 1609ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_PRESERVED; 1610ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_2DONLY) 1611ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_2DONLY; 1612b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1613b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1614360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context. 1617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated 1619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context. 1620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext(). 1623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the 1630d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1631d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16328696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle) 1633b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1634b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1635fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1636fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1637b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = handle; 16388b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx)) 1639ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1640b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1641b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1642b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 164322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle) 1644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1645b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1646fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1647fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(draw); 16488b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) 1649ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = draw.handle; 1651b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1652b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1653b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 16548696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle) 1655b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1656b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1657fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1658fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(draw); 1659b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss draw.handle = handle; 16608b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw)) 1661ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1662b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1663b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1664b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 16659810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle, 16669810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_drawable_info_type_t type, unsigned int num, 16679810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer void *data) 16689810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{ 16699810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_update_draw_t update; 16709810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1671fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(update); 16729810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.handle = handle; 16739810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.type = type; 16749810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.num = num; 16759810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.data = (unsigned long long)(unsigned long)data; 16769810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 16778b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) 1678ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 16799810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 16809810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer return 0; 16819810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer} 16829810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device. 1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls. 1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1688d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1689d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1690d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1691d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1692d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1693d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl. 1694d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd) 1696ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 16978b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) 1698ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1699ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1700ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1701ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device. 1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl. 1712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd) 1714ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 17158b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) 1716ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1717ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1718ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1719ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode. 1723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode. 1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the 1731d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure. 1732d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1733ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode) 1734ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1735ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_mode_t m; 1736ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 17371490055bc05fa941b59d10e89ef3fccd673af477Connor Behan memclear(m); 1738ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann m.mode = mode; 17398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) 1740ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1741ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1742ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1743ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory. 1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary. 1750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate. 1751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the 1752d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory. 1753d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory. 1754d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1755d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1756d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1757d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the 1759d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure. 1760d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1761ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type, 17627ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie unsigned long *address, drm_handle_t *handle) 1763ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1764ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1765b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 1766fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1767b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane *handle = DRM_AGP_NO_HANDLE; 1768ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = size; 1769ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.type = type; 17708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) 1771ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1772ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (address != 0UL) 1773ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *address = b.physical; 1774ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann *handle = b.handle; 1775ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1776ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1777ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory. 1781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the 1789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure. 1790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 17917ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle) 1792ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1793ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1794ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1795fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1796ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 17978b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b)) 1798ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1799ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1800ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1801ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1802d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory. 1805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary. 1809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the 1814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure. 1815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 18167ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset) 1817ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1818ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1819ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1820fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1821ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1822ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = offset; 18238b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b)) 1824ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1825ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1826ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1827ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory. 1831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing 1839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure. 1840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 18417ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle) 1842ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1843ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1844ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1845fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1846ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 18478b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) 1848ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1849ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1850ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1851ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number. 1855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure.. 1859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1861d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1862d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1863d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1864ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd) 1865ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1866ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1867ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1868fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1869fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 18708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1871ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1872ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_major; 1873ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1874ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number. 1878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure. 1882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1883d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1884d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1885d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1886d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1887ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd) 1888ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1889ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1890ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1891fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1892fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 18938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1894ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1895ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_minor; 1896ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1897ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode. 1901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1902d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1904d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure. 1905d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1906d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1907d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1908d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1909d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1910ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd) 1911ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1912ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1913ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1914fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1915fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19168b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1917ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1918ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.mode; 1919ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1920ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base. 1924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1927d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure. 1928d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1929d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1930d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1931d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1932d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1933ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd) 1934ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1935ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1936ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1937fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1938fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1941ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_base; 1942ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1943ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1944d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1945d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1946d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size. 1947d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1948d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1949d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1950d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure. 1951d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1952d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1953d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1954d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1955d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1956ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd) 1957ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1958ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1959ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1960fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1961fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19628b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1963ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1964ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_size; 1965ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1966ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1969d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory. 1970d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1971d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1972d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1973d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure. 1974d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1975d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1976d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1977d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1978d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1979ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd) 1980ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1981ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1982ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1983fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1984fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19858b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1986ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1987ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_used; 1988ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1989ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory. 1993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1996d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure. 1997d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1998d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1999d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 2000d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 2001d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2002ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd) 2003ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 2004ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 2005ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2006fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2007fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20088b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2009ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2010ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_allowed; 2011ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2012ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID. 2016d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2017d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2018d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2019d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure. 2020d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2021d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2022d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 2023d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 2024d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2025ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd) 2026ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 2027ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 2028ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2029fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2030fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20318b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2032ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2033ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_vendor; 2034ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2035ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID. 2039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure. 2043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2044d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 2046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 2047d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2048ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd) 2049ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 2050ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 2051ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2052fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2053fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20548b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2055ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2056ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_device; 2057ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2058ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 20597ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle) 20605d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 20615d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 20625d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2063fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sg); 2064fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20655d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = 0; 20665d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = size; 20678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) 2068ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 20695d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = sg.handle; 20705d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 20715d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 20725d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 20737ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle) 20745d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 20755d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 20765d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2077fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sg); 20785d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = handle; 20798b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg)) 2080ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 20815d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 20825d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 20835d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK. 2086d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2087d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2088d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure. 2089d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2090d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2091d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2092d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2093d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl. 2094d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 209555acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl) 209655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{ 2097f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes struct timespec timeout, cur; 209855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer int ret; 209955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2100f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = clock_gettime(CLOCK_MONOTONIC, &timeout); 2101f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes if (ret < 0) { 21021eb2860b4bd0306dddc5b2f2dc7403aa65c5e476Daniel Kurtz fprintf(stderr, "clock_gettime failed: %s\n", strerror(errno)); 2103f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes goto out; 2104f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 2105f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes timeout.tv_sec++; 2106f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes 210755acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer do { 2108f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl); 2109c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer vbl->request.type &= ~DRM_VBLANK_RELATIVE; 2110ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (ret && errno == EINTR) { 2111ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes clock_gettime(CLOCK_MONOTONIC, &cur); 2112ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes /* Timeout after 1s */ 2113ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (cur.tv_sec > timeout.tv_sec + 1 || 2114ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes (cur.tv_sec == timeout.tv_sec && cur.tv_nsec >= 2115ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes timeout.tv_nsec)) { 2116ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes errno = EBUSY; 2117ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes ret = -1; 2118ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes break; 2119ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes } 2120f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 212155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer } while (ret && errno == EINTR); 212255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2123f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnesout: 212455acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer return ret; 212555acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer} 212655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2127b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label) 2128b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2129b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss switch (err) { 2130ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_DEVICE: 2131ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no device\n", label); 2132ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2133ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_ACCESS: 2134ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no access\n", label); 2135ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2136ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NOT_ROOT: 2137ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: not root\n", label); 2138ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2139ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_INVALID: 2140ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: invalid args\n", label); 2141ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss default: 2143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (err < 0) 2144ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian err = -err; 2145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); 2146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss break; 2147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 2148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 1; 2150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2152d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2153d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler. 2154d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2155d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2156d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number. 2157d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2158d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2159d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2160d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2161d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 2162d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 2163d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq) 2165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2166b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2168fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctl); 2169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_INST_HANDLER; 2170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = irq; 21718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2172ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2174b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2176d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2177d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2178d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler. 2179d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2180d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2181d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2182d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2183d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2184d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2185d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 2186d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 2187d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd) 2189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2192fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctl); 2193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_UNINST_HANDLER; 2194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = 0; 21958b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2196ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags) 2201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 2203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2204fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 2205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 2206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 2207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 2208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 2209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 2210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 2211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 22128b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FINISH, &lock)) 2213ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2216b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2217d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2218d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID. 2219d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2220d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2221d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number. 2222d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number. 2223d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number. 2224d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2225d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure. 2226d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2227d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2228d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the 2229d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure. 2230d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum) 2232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_irq_busid_t p; 2234b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2235fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(p); 2236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.busnum = busnum; 2237b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.devnum = devnum; 2238b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.funcnum = funcnum; 22398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) 2240ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2241b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return p.irq; 2242b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2243b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22448696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag) 2245b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2246b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2247b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2248b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashInsert(entry->tagTable, context, tag)) { 2249b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(entry->tagTable, context); 2250b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(entry->tagTable, context, tag); 2251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 2252b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2253b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22558696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context) 2256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2258b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return drmHashDelete(entry->tagTable, context); 2260b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2261b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22628696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context) 2263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2265b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 2266360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 2267ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (drmHashLookup(entry->tagTable, context, &value)) 2268ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 2269b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2270b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return value; 2271b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2272b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 227322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, 227422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t handle) 227574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 227674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 227774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2278fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 227974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 2280961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston map.handle = (void *)(uintptr_t)handle; 228174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 22828b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) 2283ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 228474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 228574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 228674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 228722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 228822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t *handle) 228974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 229074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 229174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2292fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 229374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 229474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 22958b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) 2296ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2297ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 2298961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston *handle = (drm_handle_t)(uintptr_t)map.handle; 229974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 230074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 230174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 230274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 23038696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size, 23048696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmMapType *type, drmMapFlags *flags, drm_handle_t *handle, 230588dbee54ed400a3fd5594fab506518c171167805Rik Faith int *mtrr) 230688dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 230788dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_map_t map; 230888dbee54ed400a3fd5594fab506518c171167805Rik Faith 2309fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 231088dbee54ed400a3fd5594fab506518c171167805Rik Faith map.offset = idx; 23118b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map)) 2312ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 231388dbee54ed400a3fd5594fab506518c171167805Rik Faith *offset = map.offset; 231488dbee54ed400a3fd5594fab506518c171167805Rik Faith *size = map.size; 231588dbee54ed400a3fd5594fab506518c171167805Rik Faith *type = map.type; 231688dbee54ed400a3fd5594fab506518c171167805Rik Faith *flags = map.flags; 231788dbee54ed400a3fd5594fab506518c171167805Rik Faith *handle = (unsigned long)map.handle; 231888dbee54ed400a3fd5594fab506518c171167805Rik Faith *mtrr = map.mtrr; 231988dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 232088dbee54ed400a3fd5594fab506518c171167805Rik Faith} 232188dbee54ed400a3fd5594fab506518c171167805Rik Faith 232288dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid, 232388dbee54ed400a3fd5594fab506518c171167805Rik Faith unsigned long *magic, unsigned long *iocs) 232488dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 232588dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_client_t client; 232688dbee54ed400a3fd5594fab506518c171167805Rik Faith 2327fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(client); 232888dbee54ed400a3fd5594fab506518c171167805Rik Faith client.idx = idx; 23298b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client)) 2330ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 233188dbee54ed400a3fd5594fab506518c171167805Rik Faith *auth = client.auth; 233288dbee54ed400a3fd5594fab506518c171167805Rik Faith *pid = client.pid; 233388dbee54ed400a3fd5594fab506518c171167805Rik Faith *uid = client.uid; 233488dbee54ed400a3fd5594fab506518c171167805Rik Faith *magic = client.magic; 233588dbee54ed400a3fd5594fab506518c171167805Rik Faith *iocs = client.iocs; 233688dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 233788dbee54ed400a3fd5594fab506518c171167805Rik Faith} 233888dbee54ed400a3fd5594fab506518c171167805Rik Faith 233988dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats) 234088dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 234188dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_stats_t s; 2342de8532dd8359dfdaba839ff61fc9e2f05eaf57d3Jan Vesely unsigned i; 234388dbee54ed400a3fd5594fab506518c171167805Rik Faith 2344fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(s); 23458b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s)) 2346ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 234788dbee54ed400a3fd5594fab506518c171167805Rik Faith 234888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = 0; 234988dbee54ed400a3fd5594fab506518c171167805Rik Faith memset(stats, 0, sizeof(*stats)); 235088dbee54ed400a3fd5594fab506518c171167805Rik Faith if (s.count > sizeof(stats->data)/sizeof(stats->data[0])) 235188dbee54ed400a3fd5594fab506518c171167805Rik Faith return -1; 235288dbee54ed400a3fd5594fab506518c171167805Rik Faith 235388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE \ 235488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 235588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%8.8s"; \ 235688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 1; \ 235788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 235888dbee54ed400a3fd5594fab506518c171167805Rik Faith 235988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT \ 236088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 236188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 236288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 236388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "kgm"; \ 236488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1000; \ 236588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 236688dbee54ed400a3fd5594fab506518c171167805Rik Faith 236788dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE \ 236888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 236988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 237088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 237188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "KGM"; \ 237288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1024; \ 237388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 237488dbee54ed400a3fd5594fab506518c171167805Rik Faith 237588dbee54ed400a3fd5594fab506518c171167805Rik Faith 237688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = s.count; 237788dbee54ed400a3fd5594fab506518c171167805Rik Faith for (i = 0; i < s.count; i++) { 237888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].value = s.data[i].value; 237988dbee54ed400a3fd5594fab506518c171167805Rik Faith switch (s.data[i].type) { 238088dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCK: 238188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Lock"; 238288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 238388dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 238488dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 238588dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_OPENS: 238688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Opens"; 238788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "O"; 238888dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 238988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 239088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 239188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_CLOSES: 239288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Closes"; 239388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 239488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 239588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 239688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 239788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IOCTLS: 239888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Ioctls"; 239988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ioc/s"; 240088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 240188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 240288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCKS: 240388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Locks"; 240488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lck/s"; 240588dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 240688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 240788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_UNLOCKS: 240888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Unlocks"; 240988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Unl/s"; 241088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 241188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 241288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IRQ: 241388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "IRQs"; 241488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "IRQ/s"; 241588dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 241688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 241788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_PRIMARY: 241888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Primary Bytes"; 241988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "PB/s"; 242088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 242188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 242288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SECONDARY: 242388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Secondary Bytes"; 242488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "SB/s"; 242588dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 242688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 242788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_DMA: 242888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "DMA"; 242988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "DMA/s"; 243088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 243188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 243288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SPECIAL: 243388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Special DMA"; 243488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "dma/s"; 243588dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 243688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 243788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_MISSED: 243888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Miss"; 243988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ms/s"; 244088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 244188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 244288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_VALUE: 244388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Value"; 244488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Value"; 244588dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 244688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 244788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_BYTE: 244888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Bytes"; 244988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "B/s"; 245088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 245188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 245288dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_COUNT: 245388dbee54ed400a3fd5594fab506518c171167805Rik Faith default: 245488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Count"; 245588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Cnt/s"; 245688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 245788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 245888dbee54ed400a3fd5594fab506518c171167805Rik Faith } 245988dbee54ed400a3fd5594fab506518c171167805Rik Faith } 246088dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 246188dbee54ed400a3fd5594fab506518c171167805Rik Faith} 246288dbee54ed400a3fd5594fab506518c171167805Rik Faith 2463d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 246406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl. 246506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 246606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor. 246706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index 246806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written. 246906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written. 247006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 247106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure. 247206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 247306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 247406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by 247506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 247606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 247722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version) 247806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 247906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int retcode = 0; 248006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drm_set_version_t sv; 248106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 2482fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sv); 248306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = version->drm_di_major; 248406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = version->drm_di_minor; 248506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = version->drm_dd_major; 248606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_minor = version->drm_dd_minor; 248706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24888b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_VERSION, &sv)) { 248906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt retcode = -errno; 249006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 249106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 249206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_major = sv.drm_di_major; 249306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_minor = sv.drm_di_minor; 249406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_major = sv.drm_dd_major; 249506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_minor = sv.drm_dd_minor; 249606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 249706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return retcode; 249806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 249906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 250006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 2501d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command. 2502d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2503d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2504d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2505d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2506d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2507d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2508d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2509d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by 2510d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2511d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 25123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex) 25133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex); 25173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2518fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter if (drmIoctl(fd, request, NULL)) { 25193903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25203903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25223903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25233903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2524d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2525d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2526d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command. 2527d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read. 2531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read. 2532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by 2537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 253922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data, 254022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25423903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 254474ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 254574ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 25463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25478b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 25483903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25493903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25503903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25513903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25523903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command. 2556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written. 2560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written. 2561d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by 2566d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2567d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 256822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data, 256922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25703903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25713903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25723903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 257374ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 257474ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 25753903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 25773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25783903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25793903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25803903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25813903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2582d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2583d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2584d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command. 2585d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written. 2589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written. 2590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by 2595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 259722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data, 259822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25993903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 26003903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 26013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 260274ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 260374ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 26043903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 26058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) 26063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 26073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 26083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 2609166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2610d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16 2611d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct { 2612ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian char *BusID; 2613ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2614ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int refcount; 2615dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou int type; 2616d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS]; 2617d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2618d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0; 2619d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2620d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused, 2621d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie const char *BusID, 2622d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie int *newlyopened) 2623d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2624dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou return drmOpenOnceWithType(BusID, newlyopened, DRM_NODE_PRIMARY); 2625dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou} 2626dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou 2627dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhouint drmOpenOnceWithType(const char *BusID, int *newlyopened, int type) 2628dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou{ 2629ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2630ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2631d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2632ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) 2633dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou if ((strcmp(BusID, connection[i].BusID) == 0) && 2634dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou (connection[i].type == type)) { 2635ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i].refcount++; 2636ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 0; 2637ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return connection[i].fd; 2638ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2639ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2640dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou fd = drmOpenWithType(NULL, BusID, type); 2641c1cd3d93881a9b4a27f7190393ccc7a0236d28a4Emil Velikov if (fd < 0 || nr_fds == DRM_MAX_FDS) 2642ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2643d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2644ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].BusID = strdup(BusID); 2645ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].fd = fd; 2646ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].refcount = 1; 2647dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou connection[nr_fds].type = type; 2648ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 1; 2649d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2650ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (0) 2651ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "saved connection %d for %s %d\n", 2652ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds, connection[nr_fds].BusID, 2653ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian strcmp(BusID, connection[nr_fds].BusID)); 2654d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2655ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds++; 2656d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2657ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2658d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2659d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2660d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd) 2661d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2662ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2663d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2664ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) { 2665ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd == connection[i].fd) { 2666ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (--connection[i].refcount == 0) { 2667ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmClose(connection[i].fd); 2668ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(connection[i].BusID); 2669d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2670ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (i < --nr_fds) 2671ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i] = connection[nr_fds]; 2672d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2673ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 2674ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2675ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2676ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2677d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2678731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2679731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmSetMaster(int fd) 2680731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2681fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter return drmIoctl(fd, DRM_IOCTL_SET_MASTER, NULL); 2682731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 2683731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2684731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmDropMaster(int fd) 2685731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2686fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, NULL); 2687731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 268822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 268922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsbergchar *drmGetDeviceNameFromFd(int fd) 269022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg{ 269122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg char name[128]; 269222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg struct stat sbuf; 269322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg dev_t d; 269422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg int i; 269522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 269622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg /* The whole drmOpen thing is a fiasco and we need to find a way 269722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * back to just using open(2). For now, however, lets just make 269822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * things worse with even more ad hoc directory walking code to 269922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * discover the device file name. */ 270022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 270122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg fstat(fd, &sbuf); 270222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg d = sbuf.st_rdev; 270322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 270422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg for (i = 0; i < DRM_MAX_MINOR; i++) { 270522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i); 270622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d) 270722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg break; 270822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg } 270922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (i == DRM_MAX_MINOR) 271022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg return NULL; 271122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 27120a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson return strdup(name); 271322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg} 2714cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27151f73578df32f895a678a41758f6c563f49484347Frank Binnsint drmGetNodeTypeFromFd(int fd) 27161f73578df32f895a678a41758f6c563f49484347Frank Binns{ 27171f73578df32f895a678a41758f6c563f49484347Frank Binns struct stat sbuf; 27181f73578df32f895a678a41758f6c563f49484347Frank Binns int maj, min, type; 27191f73578df32f895a678a41758f6c563f49484347Frank Binns 27201f73578df32f895a678a41758f6c563f49484347Frank Binns if (fstat(fd, &sbuf)) 27211f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 27221f73578df32f895a678a41758f6c563f49484347Frank Binns 27231f73578df32f895a678a41758f6c563f49484347Frank Binns maj = major(sbuf.st_rdev); 27241f73578df32f895a678a41758f6c563f49484347Frank Binns min = minor(sbuf.st_rdev); 27251f73578df32f895a678a41758f6c563f49484347Frank Binns 27261f73578df32f895a678a41758f6c563f49484347Frank Binns if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) { 27271f73578df32f895a678a41758f6c563f49484347Frank Binns errno = EINVAL; 27281f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 27291f73578df32f895a678a41758f6c563f49484347Frank Binns } 27301f73578df32f895a678a41758f6c563f49484347Frank Binns 27311f73578df32f895a678a41758f6c563f49484347Frank Binns type = drmGetMinorType(min); 27321f73578df32f895a678a41758f6c563f49484347Frank Binns if (type == -1) 27331f73578df32f895a678a41758f6c563f49484347Frank Binns errno = ENODEV; 27341f73578df32f895a678a41758f6c563f49484347Frank Binns return type; 27351f73578df32f895a678a41758f6c563f49484347Frank Binns} 27361f73578df32f895a678a41758f6c563f49484347Frank Binns 2737cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlieint drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd) 2738cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie{ 2739cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie struct drm_prime_handle args; 2740cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie int ret; 2741cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27424bca42fc504a2051964030daaa49b5ac49bb64d3Guillaume Desmottes memclear(args); 27434bca42fc504a2051964030daaa49b5ac49bb64d3Guillaume Desmottes args.fd = -1; 2744cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.handle = handle; 2745cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.flags = flags; 2746cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie ret = drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args); 2747cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie if (ret) 2748cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return ret; 2749cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2750cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie *prime_fd = args.fd; 2751cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return 0; 2752cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie} 2753cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2754cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlieint drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle) 2755cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie{ 2756cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie struct drm_prime_handle args; 2757cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie int ret; 2758cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27594bca42fc504a2051964030daaa49b5ac49bb64d3Guillaume Desmottes memclear(args); 2760cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.fd = prime_fd; 2761cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie ret = drmIoctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &args); 2762cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie if (ret) 2763cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return ret; 2764cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2765cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie *handle = args.handle; 2766cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return 0; 2767cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie} 2768cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27690ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovstatic char *drmGetMinorNameForFD(int fd, int type) 27700ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 27710ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#ifdef __linux__ 27720ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov DIR *sysdir; 27730ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov struct dirent *pent, *ent; 27740ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov struct stat sbuf; 27750ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov const char *name = drmGetMinorName(type); 27760ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov int len; 27770ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov char dev_name[64], buf[64]; 27780ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov long name_max; 27790ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov int maj, min; 27800ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27810ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (!name) 27820ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27830ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27840ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov len = strlen(name); 27850ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27860ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (fstat(fd, &sbuf)) 27870ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27880ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27890ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov maj = major(sbuf.st_rdev); 27900ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov min = minor(sbuf.st_rdev); 27910ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27920ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) 27930ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27940ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27950ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov snprintf(buf, sizeof(buf), "/sys/dev/char/%d:%d/device/drm", maj, min); 27960ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27970ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov sysdir = opendir(buf); 27980ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (!sysdir) 27990ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 28000ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28010ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov name_max = fpathconf(dirfd(sysdir), _PC_NAME_MAX); 28020ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (name_max == -1) 28030ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov goto out_close_dir; 28040ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28050ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov pent = malloc(offsetof(struct dirent, d_name) + name_max + 1); 28060ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (pent == NULL) 28070ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov goto out_close_dir; 28080ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28090ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov while (readdir_r(sysdir, pent, &ent) == 0 && ent != NULL) { 28100ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (strncmp(ent->d_name, name, len) == 0) { 28115c42b5e36a4a02e579ec5dcdc3a95ce58538224cMathias Tillman snprintf(dev_name, sizeof(dev_name), DRM_DIR_NAME "/%s", 28125c42b5e36a4a02e579ec5dcdc3a95ce58538224cMathias Tillman ent->d_name); 28135c42b5e36a4a02e579ec5dcdc3a95ce58538224cMathias Tillman 28140ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov free(pent); 28150ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov closedir(sysdir); 28160ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28170ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return strdup(dev_name); 28180ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 28190ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 28200ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28210ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov free(pent); 28220ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28230ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovout_close_dir: 28240ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov closedir(sysdir); 28250ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#endif 28260ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 28270ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 28280ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28290ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovchar *drmGetPrimaryDeviceNameFromFd(int fd) 28300ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 28310ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return drmGetMinorNameForFD(fd, DRM_NODE_PRIMARY); 28320ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 28330ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28340ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovchar *drmGetRenderDeviceNameFromFd(int fd) 28350ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 28360ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return drmGetMinorNameForFD(fd, DRM_NODE_RENDER); 28370ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 2838b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2839a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikovstatic int drmParseSubsystemType(int maj, int min) 2840b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2841291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#ifdef __linux__ 2842a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov char path[PATH_MAX + 1]; 2843b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov char link[PATH_MAX + 1] = ""; 2844b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov char *name; 2845b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2846a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/subsystem", 2847a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov maj, min); 2848a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov 2849a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov if (readlink(path, link, PATH_MAX) < 0) 2850a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov return -errno; 2851b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2852b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov name = strrchr(link, '/'); 2853b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (!name) 2854b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return -EINVAL; 2855b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2856a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov if (strncmp(name, "/pci", 4) == 0) 2857b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return DRM_BUS_PCI; 2858b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2859b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return -EINVAL; 2860291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#else 2861291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#warning "Missing implementation of drmParseSubsystemType" 2862291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov return -EINVAL; 2863291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#endif 2864b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2865b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2866536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikovstatic int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) 2867b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2868291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#ifdef __linux__ 2869536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov char path[PATH_MAX + 1]; 2870536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov char data[128]; 2871536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov char *str; 2872b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov int domain, bus, dev, func; 2873536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov int fd, ret; 2874b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2875536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/uevent", maj, min); 2876536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov fd = open(path, O_RDONLY); 2877536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov if (fd < 0) 2878536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov return -errno; 2879b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2880536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov ret = read(fd, data, sizeof(data)); 2881536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov close(fd); 2882536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov if (ret < 0) 2883536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov return -errno; 2884b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2885536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov#define TAG "PCI_SLOT_NAME=" 2886536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov str = strstr(data, TAG); 2887536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov if (str == NULL) 2888536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov return -EINVAL; 2889b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2890536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov if (sscanf(str, TAG "%04x:%02x:%02x.%1u", 2891b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov &domain, &bus, &dev, &func) != 4) 2892b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return -EINVAL; 2893536e0deba3829e194aafda6d9a1d9e938ba8277aEmil Velikov#undef TAG 2894b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2895b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov info->domain = domain; 2896b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov info->bus = bus; 2897b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov info->dev = dev; 2898b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov info->func = func; 2899b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2900b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return 0; 2901291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#else 2902291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#warning "Missing implementation of drmParsePciBusInfo" 2903291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov return -EINVAL; 2904291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#endif 2905b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2906b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2907bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikovstatic int drmCompareBusInfo(drmDevicePtr a, drmDevicePtr b) 2908b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2909bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov if (a == NULL || b == NULL) 2910bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov return -1; 2911bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov 2912b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (a->bustype != b->bustype) 2913bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov return -1; 2914b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2915b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov switch (a->bustype) { 2916b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov case DRM_BUS_PCI: 2917bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov return memcmp(a->businfo.pci, b->businfo.pci, sizeof(drmPciBusInfo)); 2918b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov default: 2919b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov break; 2920b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 2921b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2922bc2aca9e22bf2cc82874f3e44568c684eec9c5e1Emil Velikov return -1; 2923b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2924b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2925b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikovstatic int drmGetNodeType(const char *name) 2926b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2927b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (strncmp(name, DRM_PRIMARY_MINOR_NAME, 2928b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov sizeof(DRM_PRIMARY_MINOR_NAME) - 1) == 0) 2929b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return DRM_NODE_PRIMARY; 2930b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2931b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (strncmp(name, DRM_CONTROL_MINOR_NAME, 2932b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov sizeof(DRM_CONTROL_MINOR_NAME ) - 1) == 0) 2933b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return DRM_NODE_CONTROL; 2934b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2935b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (strncmp(name, DRM_RENDER_MINOR_NAME, 2936b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov sizeof(DRM_RENDER_MINOR_NAME) - 1) == 0) 2937b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return DRM_NODE_RENDER; 2938b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2939b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return -EINVAL; 2940b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2941b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 29425f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikovstatic int drmGetMaxNodeName(void) 29435f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov{ 29445f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov return sizeof(DRM_DIR_NAME) + 29455f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov MAX3(sizeof(DRM_PRIMARY_MINOR_NAME), 29465f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov sizeof(DRM_CONTROL_MINOR_NAME), 29475f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov sizeof(DRM_RENDER_MINOR_NAME)) + 29485f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 3 /* lenght of the node number */; 29495f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov} 29505f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 2951ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikovstatic int drmParsePciDeviceInfo(const char *d_name, 2952b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov drmPciDeviceInfoPtr device) 2953b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2954291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#ifdef __linux__ 2955ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov char path[PATH_MAX + 1]; 2956ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov unsigned char config[64]; 2957ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov int fd, ret; 2958ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov 2959ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov snprintf(path, PATH_MAX, "/sys/class/drm/%s/device/config", d_name); 2960ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov fd = open(path, O_RDONLY); 2961ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov if (fd < 0) 2962ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov return -errno; 2963ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov 2964ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov ret = read(fd, config, sizeof(config)); 2965ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov close(fd); 2966ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov if (ret < 0) 2967ef5192e9c7897c82da815a2c893b2e2562997a3aEmil Velikov return -errno; 2968b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2969b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov device->vendor_id = config[0] | (config[1] << 8); 2970b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov device->device_id = config[2] | (config[3] << 8); 2971b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov device->revision_id = config[8]; 2972b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov device->subvendor_id = config[44] | (config[45] << 8); 2973b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov device->subdevice_id = config[46] | (config[47] << 8); 2974b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2975b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return 0; 2976291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#else 2977291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#warning "Missing implementation of drmParsePciDeviceInfo" 2978291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov return -EINVAL; 2979291b2bb92c5fc90101417b80bbdc6c994be5fff2Emil Velikov#endif 2980b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2981b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 29825f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikovstatic void drmFreeDevice(drmDevicePtr *device) 2983b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2984b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (device == NULL) 2985b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return; 2986b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 29875f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov free(*device); 29885f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov *device = NULL; 2989b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 2990b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2991b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikovvoid drmFreeDevices(drmDevicePtr devices[], int count) 2992b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 2993b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov int i; 2994b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 2995b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (devices == NULL) 2996b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return; 2997b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 29985f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov for (i = 0; i < count && devices[i] != NULL; i++) 29995f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmFreeDevice(&devices[i]); 3000b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 3001b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3002b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov/** 3003b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * Get drm devices on the system 3004b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * 3005b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * \param devices the array of devices with drmDevicePtr elements 3006b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * can be NULL to get the device number first 3007b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * \param max_devices the maximum number of devices for the array 3008b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * 3009b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * \return on error - negative error code, 3010b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * if devices is NULL - total number of devices available on the system, 3011b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * alternatively the number of devices stored in devices[], which is 3012b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov * capped by the max_devices. 3013b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov */ 3014b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikovint drmGetDevices(drmDevicePtr devices[], int max_devices) 3015b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov{ 30165f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmDevicePtr *local_devices; 30175f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmDevicePtr device; 30185f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov DIR *sysdir; 30195f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov struct dirent *dent; 30205f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov struct stat sbuf; 30215f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov char node[PATH_MAX + 1]; 30225f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov const int max_node_str = drmGetMaxNodeName(); 3023b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov int node_type, subsystem_type; 3024b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov int maj, min; 30255f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov int ret, i, j, node_count, device_count; 3026b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov int max_count = 16; 30275f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov void *addr; 3028b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30295f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov local_devices = calloc(max_count, sizeof(drmDevicePtr)); 30305f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (local_devices == NULL) 3031b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return -ENOMEM; 3032b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3033b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov sysdir = opendir(DRM_DIR_NAME); 3034b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (!sysdir) { 3035b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov ret = -errno; 30365f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov goto close_sysdir; 3037b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 3038b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30395f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov i = 0; 3040b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov while ((dent = readdir(sysdir))) { 3041b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov node_type = drmGetNodeType(dent->d_name); 3042b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (node_type < 0) 3043b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov continue; 3044b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3045b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, dent->d_name); 3046b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (stat(node, &sbuf)) 3047b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov continue; 3048b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3049b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov maj = major(sbuf.st_rdev); 3050b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov min = minor(sbuf.st_rdev); 3051b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3052b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) 3053b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov continue; 3054b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3055a250fceaaa150363accaf3fb71a0e42bcecc40daEmil Velikov subsystem_type = drmParseSubsystemType(maj, min); 3056b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3057b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (subsystem_type < 0) 3058b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov continue; 3059b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 3060b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov switch (subsystem_type) { 3061b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov case DRM_BUS_PCI: 30625f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov addr = device = calloc(1, sizeof(drmDevice) + 30635f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov (DRM_NODE_MAX * 30645f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov (sizeof(void *) + max_node_str)) + 30655f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov sizeof(drmPciBusInfo) + 30665f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov sizeof(drmPciDeviceInfo)); 30675f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (!device) 30685f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov goto free_devices; 30695f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 30705f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->bustype = subsystem_type; 30715f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->available_nodes = 1 << node_type; 30725f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 30735f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov addr += sizeof(drmDevice); 30745f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->nodes = addr; 30755f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 30765f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov addr += DRM_NODE_MAX * sizeof(void *); 30775f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov for (j = 0; j < DRM_NODE_MAX; j++) { 30785f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->nodes[j] = addr; 30795f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov addr += max_node_str; 3080b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 30815f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov memcpy(device->nodes[node_type], node, max_node_str); 3082b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30835f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->businfo.pci = addr; 3084b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30855f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov ret = drmParsePciBusInfo(maj, min, device->businfo.pci); 30865f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (ret) 30875f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov goto free_devices; 3088b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30895f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov // Fetch the device info if the user has requested it 3090b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (devices != NULL) { 30915f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov addr += sizeof(drmPciBusInfo); 30925f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->deviceinfo.pci = addr; 3093b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 30945f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov ret = drmParsePciDeviceInfo(dent->d_name, 30955f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device->deviceinfo.pci); 3096b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov if (ret) 30975f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov goto free_devices; 3098b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 30995f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 3100b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov break; 3101b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov default: 3102b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov fprintf(stderr, "The subsystem type is not supported yet\n"); 3103b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov break; 3104b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 3105b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31065f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (i >= max_count) { 31075f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmDevicePtr *temp; 3108b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31095f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov max_count += 16; 31105f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov temp = realloc(local_devices, max_count * sizeof(drmDevicePtr)); 31115f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (!temp) 31125f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov goto free_devices; 31135f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov local_devices = temp; 31145f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov } 31155f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 31165f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov local_devices[i] = device; 31175f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov i++; 3118b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 31195f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov node_count = i; 3120b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31215f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov /* Fold nodes into a single device if they share the same bus info */ 3122b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov for (i = 0; i < node_count; i++) { 31235f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov for (j = i + 1; j < node_count; j++) { 31245f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if (drmCompareBusInfo(local_devices[i], local_devices[j]) == 0) { 31255f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov local_devices[i]->available_nodes |= local_devices[j]->available_nodes; 31265f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov node_type = log2(local_devices[j]->available_nodes); 31275f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov memcpy(local_devices[i]->nodes[node_type], 31285f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov local_devices[j]->nodes[node_type], max_node_str); 31295f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmFreeDevice(&local_devices[j]); 3130b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 3131b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 3132b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov } 3133b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31345f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device_count = 0; 31355f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov for (i = 0; i < node_count && local_devices[i]; i++) { 31365f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov if ((devices != NULL) && (device_count < max_devices)) 31375f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov devices[device_count] = local_devices[i]; 31385f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov else 31395f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmFreeDevice(&local_devices[i]); 3140b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31415f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov device_count++; 31425f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov } 3143b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31445f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov free(local_devices); 3145b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov closedir(sysdir); 31465f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov return device_count; 31475f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov 31485f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikovfree_devices: 31495f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov drmFreeDevices(local_devices, i); 31505f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikov free(local_devices); 3151b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov 31525f68d31820315ebda9b49e8bd50d1ab605efd7faEmil Velikovclose_sysdir: 3153b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov closedir(sysdir); 3154b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov return ret; 3155b556ea127e004b734b2a7bf8e67cdcf56312171dEmil Velikov} 3156