xf86drm.c revision 0706c14e7cc5f1d996bb1c3c526f877c4f8fc215
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 58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */ 60b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED 61b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1) 62b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 63b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 64b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h" 65faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov#include "libdrm.h" 66b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 6727c3785d3f12743a9e160238a4d00353060ec2f2Hasso Tepper#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) 68cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145 69cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif 70cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt 71cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__ 72cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34 7388dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 7488dbee54ed400a3fd5594fab506518c171167805Rik Faith 75b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__ 76b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# define DRM_MAJOR 81 77b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif 78b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 79cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR 80cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226 /* Linux */ 8188dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 8288dbee54ed400a3fd5594fab506518c171167805Rik Faith 8322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/* 8422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure. 8522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best. 8622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 87569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev 88569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y) ((dev_t)(((x) << 8) | (y))) 89569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif 90569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 9156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3 9256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 93fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter#define memclear(s) memset(&s, 0, sizeof(s)) 94fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 9579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info; 9679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 9779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info) 9879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 99ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info = info; 10079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 10179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr. 104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string. 106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 108d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf(). 109d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 11079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11144b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Redingstatic int DRM_PRINTFLIKE(1, 0) 11244b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry RedingdrmDebugPrint(const char *format, va_list ap) 11379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 114ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return vfprintf(stderr, format, ap); 11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 11679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11744b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Redingtypedef int DRM_PRINTFLIKE(1, 0) (*debug_msg_func_t)(const char *format, 11844b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Reding va_list ap); 11944b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Reding 12044b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry Redingstatic debug_msg_func_t drm_debug_print = drmDebugPrint; 12179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 122c4857429c716f35e1fa054d1990cae28055d96d7Eric Anholtvoid 12356bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...) 12456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{ 12556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_list ap; 12656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes const char *env; 12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info) 12856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes { 12956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_start(ap, format); 13079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 13179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_server_info->debug_print(format,ap); 13279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } else { 13379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_debug_print(format, ap); 13479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 13556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_end(ap); 13656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 13756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes} 13856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 13979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid 14044b08c0ddf7ced99a5914421f18b269a1dcaafaeThierry RedingdrmSetDebugMsgFunction(debug_msg_func_t debug_msg_ptr) 14179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 142ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_debug_print = debug_msg_ptr; 14379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 14479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */ 146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void) 14879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 149ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return drmHashTable; 15079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size) 153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *pt; 155ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((pt = malloc(size))) 156ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian memset(pt, 0, size); 157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return pt; 158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt) 161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 162ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (pt) 163ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(pt); 164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1668b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard/** 1678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard * Call ioctl, restarting if it is interupted 1688b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard */ 169731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint 17041b83a99583486ad4f8760a6537d34783769bfc3Coleman KanedrmIoctl(int fd, unsigned long request, void *arg) 1718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard{ 1728b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard int ret; 1738b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard 1748b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard do { 1758b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard ret = ioctl(fd, request, arg); 1768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 1778b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return ret; 1788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard} 179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd) 181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 182fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes stat_t st; 183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss st.st_rdev = 0; 185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fstat(fd, &st); 186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return st.st_rdev; 187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 18979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd) 190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry; 194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 195ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!drmHashTable) 196ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmHashTable = drmHashCreate(); 197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashLookup(drmHashTable, key, &value)) { 199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = drmMalloc(sizeof(*entry)); 200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = fd; 201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = drmHashCreate(); 203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(drmHashTable, key, entry); 204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } else { 205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = value; 206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return entry; 208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 210d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 21106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings 21206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first 21406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second 21506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched. 21706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 21906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings. It understands the older 22006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format. In the format, o is 22106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function. 22206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 223b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidtstatic int drmMatchBusID(const char *id1, const char *id2, int pci_domain_ok) 22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* First, check if the IDs are exactly the same */ 22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strcasecmp(id1, id2) == 0) 22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Try to match old/new-style PCI bus IDs. */ 23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strncasecmp(id1, "pci", 3) == 0) { 23190ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o1, b1, d1, f1; 23290ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen unsigned int o2, b2, d2, f2; 23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int ret; 23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 23590ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "pci:%04x:%02x:%02x.%u", &o1, &b1, &d1, &f1); 23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o1 = 0; 23890ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id1, "PCI:%u:%u:%u", &b1, &d1, &f1); 23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24390ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "pci:%04x:%02x:%02x.%u", &o2, &b2, &d2, &f2); 24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o2 = 0; 24690ae0f2bb8d53500f5c9d06e2dc1a18d5a5d0cf5Pauli Nieminen ret = sscanf(id2, "PCI:%u:%u:%u", &b2, &d2, &f2); 24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 251b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt /* If domains aren't properly supported by the kernel interface, 252b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * just ignore them, which sucks less than picking a totally random 253b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * card with "open by name" 254b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt */ 255b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (!pci_domain_ok) 256b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt o1 = o2 = 0; 257b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt 25806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2)) 25906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt else 26106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 26206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 26306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 26406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 26506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 26606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 267c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Handles error checking for chown call. 268c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 269c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param path to file. 270c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new owner. 271c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \param id of the new group. 272c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 273c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \return zero if success or -1 if failure. 274c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * 275c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * \internal 276c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * Checks for failure. If failure was caused by signal call chown again. 277c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * If any other failure happened then it will output error mesage using 278c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen * drmMsg() call. 279c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen */ 280c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminenstatic int chown_check_return(const char *path, uid_t owner, gid_t group) 281c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen{ 282c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen int rv; 283c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 284c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen do { 285c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen rv = chown(path, owner, group); 286c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen } while (rv != 0 && errno == EINTR); 287c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 288c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen if (rv == 0) 289c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return 0; 290c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 291c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen drmMsg("Failed to change owner or group for file %s! %d: %s\n", 292c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen path, errno, strerror(errno)); 293c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen return -1; 294c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen} 295c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen 296c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen/** 297d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary. 298d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 299d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device. 300d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device. 301d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 304d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 305d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device 306d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and 307d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root. 308d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 309de8532dd8359dfdaba839ff61fc9e2f05eaf57d3Jan Veselystatic int drmOpenDevice(dev_t dev, int minor, int type) 310b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 3119c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes stat_t st; 3120c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns const char *dev_name; 31388dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 31488dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 31579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie mode_t devmode = DRM_DEV_MODE, serv_mode; 3160706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely gid_t serv_group; 3170706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely#if !defined(UDEV) 31888dbee54ed400a3fd5594fab506518c171167805Rik Faith int isroot = !geteuid(); 31988dbee54ed400a3fd5594fab506518c171167805Rik Faith uid_t user = DRM_DEV_UID; 3200706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely gid_t group = DRM_DEV_GID; 3210706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely#endif 3220706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely 3230c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns switch (type) { 3240c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_PRIMARY: 3250c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_DEV_NAME; 3260c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3270c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_CONTROL: 3280c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_CONTROL_DEV_NAME; 3290c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3300c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_RENDER: 3310c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_RENDER_DEV_NAME; 3320c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 3330c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns default: 3340c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return -EINVAL; 3350c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns }; 3360c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 3370c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns sprintf(buf, dev_name, DRM_DIR_NAME, minor); 33806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenDevice: node name is %s\n", buf); 33956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 34079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 341ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info->get_perms(&serv_group, &serv_mode); 342ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode = serv_mode ? serv_mode : DRM_DEV_MODE; 343ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); 34479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 345569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 3469101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#if !defined(UDEV) 34788dbee54ed400a3fd5594fab506518c171167805Rik Faith if (stat(DRM_DIR_NAME, &st)) { 348ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 349ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 350b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); 351c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(DRM_DIR_NAME, 0, 0); /* root:root */ 352b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); 353569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 35506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node exists and create it if necessary. */ 356d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (stat(buf, &st)) { 357ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 358ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 35988dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 36088dbee54ed400a3fd5594fab506518c171167805Rik Faith mknod(buf, S_IFCHR | devmode, dev); 361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 36279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 36379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 3640706c14e7cc5f1d996bb1c3c526f877c4f8fc215Jan Vesely group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; 365c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 366ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 36779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 3689101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#else 3699101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie /* if we modprobed then wait for udev */ 3709101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie { 3719101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie int udev_count = 0; 3729101a0205c897fea28e6a3d875111a83ad7f7732Dave Airliewait_for_udev: 3739101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(DRM_DIR_NAME, &st)) { 3749101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3759101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3769101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3779101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3789101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3799101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3809101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3819101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3829101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (stat(buf, &st)) { 3839101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie usleep(20); 3849101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie udev_count++; 3859101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie 3869101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie if (udev_count == 50) 3879101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie return -1; 3889101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie goto wait_for_udev; 3899101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3909101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie } 3919101a0205c897fea28e6a3d875111a83ad7f7732Dave Airlie#endif 39288dbee54ed400a3fd5594fab506518c171167805Rik Faith 39356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd = open(buf, O_RDWR, 0); 39456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: open result is %d, (%s)\n", 39556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd, fd < 0 ? strerror(errno) : "OK"); 396ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 397ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 398d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 39939e5e982242cd2b611a9dfc1e9b63f857d52da61Dave Airlie#if !defined(UDEV) 40006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node is not what we expect it to be, and recreate it 40106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * and try again if so. 40206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 403d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (st.st_rdev != dev) { 404ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 405ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 406d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt remove(buf); 407d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt mknod(buf, S_IFCHR | devmode, dev); 40879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 409c5a5bbbe899400642795c1d95aef78deade9241fPauli Nieminen chown_check_return(buf, user, group); 410ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 41179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 412d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt } 413d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd = open(buf, O_RDWR, 0); 414d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt drmMsg("drmOpenDevice: open result is %d, (%s)\n", 415d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd, fd < 0 ? strerror(errno) : "OK"); 416ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 417ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 418d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 41956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: Open failed\n"); 42088dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 42139e5e982242cd2b611a9dfc1e9b63f857d52da61Dave Airlie#endif 42288dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 423b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 424b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 425d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 426d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 427d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device 428d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 429d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number. 430d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set. 431d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 432d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 433d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 434d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 435d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device 436d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it. 437d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 438731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesstatic int drmOpenMinor(int minor, int create, int type) 43988dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 44088dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 44188dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 4420c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns const char *dev_name; 443db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 444ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (create) 445731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); 44688dbee54ed400a3fd5594fab506518c171167805Rik Faith 4470c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns switch (type) { 4480c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_PRIMARY: 4490c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_DEV_NAME; 4500c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4510c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_CONTROL: 4520c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_CONTROL_DEV_NAME; 4530c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4540c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns case DRM_NODE_RENDER: 4550c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns dev_name = DRM_RENDER_DEV_NAME; 4560c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns break; 4570c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns default: 4580c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return -EINVAL; 4590c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns }; 4600c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 4610c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns sprintf(buf, dev_name, DRM_DIR_NAME, minor); 462ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((fd = open(buf, O_RDWR, 0)) >= 0) 463ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 46488dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 46588dbee54ed400a3fd5594fab506518c171167805Rik Faith} 46688dbee54ed400a3fd5594fab506518c171167805Rik Faith 467569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 468d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 469d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded. 470d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 471d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise. 472d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0 475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information. For backward compatibility with older 476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked. 477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 478569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void) 479569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{ 480569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul drmVersionPtr version; 481569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int retval = 0; 482569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int fd; 483360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 484ad8bbfd3c74466f088be8088d2d0524bed392b71Frank Binns if ((fd = drmOpenMinor(0, 1, DRM_NODE_PRIMARY)) < 0) { 485b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__ 48622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Try proc for backward Linux compatibility */ 487ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!access("/proc/dri/0", R_OK)) 488ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 1; 489b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif 49088dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 491569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 49288dbee54ed400a3fd5594fab506518c171167805Rik Faith 49388dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 49488dbee54ed400a3fd5594fab506518c171167805Rik Faith retval = 1; 49588dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 49688dbee54ed400a3fd5594fab506518c171167805Rik Faith } 49788dbee54ed400a3fd5594fab506518c171167805Rik Faith close(fd); 498569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 499569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 500569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul} 501569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 502f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmGetMinorBase(int type) 503f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou{ 504f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou switch (type) { 505f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_PRIMARY: 506f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 0; 507f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_CONTROL: 508f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 64; 509f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou case DRM_NODE_RENDER: 510f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return 128; 511f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou default: 512f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 513f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou }; 514f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou} 515d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 5161f73578df32f895a678a41758f6c563f49484347Frank Binnsstatic int drmGetMinorType(int minor) 5171f73578df32f895a678a41758f6c563f49484347Frank Binns{ 5181f73578df32f895a678a41758f6c563f49484347Frank Binns int type = minor >> 6; 5191f73578df32f895a678a41758f6c563f49484347Frank Binns 5201f73578df32f895a678a41758f6c563f49484347Frank Binns if (minor < 0) 5211f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 5221f73578df32f895a678a41758f6c563f49484347Frank Binns 5231f73578df32f895a678a41758f6c563f49484347Frank Binns switch (type) { 5241f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_PRIMARY: 5251f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_CONTROL: 5261f73578df32f895a678a41758f6c563f49484347Frank Binns case DRM_NODE_RENDER: 5271f73578df32f895a678a41758f6c563f49484347Frank Binns return type; 5281f73578df32f895a678a41758f6c563f49484347Frank Binns default: 5291f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 5301f73578df32f895a678a41758f6c563f49484347Frank Binns } 5311f73578df32f895a678a41758f6c563f49484347Frank Binns} 5321f73578df32f895a678a41758f6c563f49484347Frank Binns 5330ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovstatic const char *drmGetMinorName(int type) 5340ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 5350ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov switch (type) { 5360ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_PRIMARY: 5370ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return "card"; 5380ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_CONTROL: 5390ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return "controlD"; 5400ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov case DRM_NODE_RENDER: 5410ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return "renderD"; 5420ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov default: 5430ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 5440ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 5450ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 5460ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID. 549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. 551f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type device node type. 552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR), 557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied. 558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid(). 560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 561f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmOpenByBusid(const char *busid, int type) 562e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{ 563b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt int i, pci_domain_ok = 1; 56488dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 56588dbee54ed400a3fd5594fab506518c171167805Rik Faith const char *buf; 56606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetVersion sv; 567f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int base = drmGetMinorBase(type); 568f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 569f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if (base < 0) 570f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 57106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 57206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid); 573f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou for (i = base; i < base + DRM_MAX_MINOR; i++) { 574f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou fd = drmOpenMinor(i, 1, type); 57556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); 57656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (fd >= 0) { 577b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt /* We need to try for 1.4 first for proper PCI domain support 578b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt * and if that fails, we know the kernel is busted 579b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt */ 58006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = 1; 581b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_minor = 4; 58206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = -1; /* Don't care */ 58326462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt sv.drm_dd_minor = -1; /* Don't care */ 584b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (drmSetInterfaceVersion(fd, &sv)) { 585b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt#ifndef __alpha__ 586b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt pci_domain_ok = 0; 587b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt#endif 588b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_major = 1; 589b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_di_minor = 1; 590b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_dd_major = -1; /* Don't care */ 591b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt sv.drm_dd_minor = -1; /* Don't care */ 592303ff26311dc5efdf28676be34d86f501699acf3Thierry Reding drmMsg("drmOpenByBusid: Interface 1.4 failed, trying 1.1\n"); 593b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt drmSetInterfaceVersion(fd, &sv); 594b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt } 595e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss buf = drmGetBusid(fd); 59656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); 597b04515c5d6c95f573457a94267b855cceb639105Benjamin Herrenschmidt if (buf && drmMatchBusID(buf, busid, pci_domain_ok)) { 59888dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeBusid(buf); 59988dbee54ed400a3fd5594fab506518c171167805Rik Faith return fd; 600e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 601ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (buf) 602ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmFreeBusid(buf); 603e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss close(fd); 604e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 605e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 606e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss return -1; 607e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss} 608e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss 609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name. 612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. 614f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type the device node type. 615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and 620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use. If it's in use it then it will already have a bus ID 621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned. 622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid(). 624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 625f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhoustatic int drmOpenByName(const char *name, int type) 626b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{ 62788dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 62888dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 62988dbee54ed400a3fd5594fab506518c171167805Rik Faith drmVersionPtr version; 63056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes char * id; 631f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int base = drmGetMinorBase(type); 632f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 633f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if (base < 0) 634f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return -1; 635db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 63656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes /* 63756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * Open the first minor number that matches the driver name and isn't 63856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * already in use. If it's in use it will have a busid assigned already. 63956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes */ 640f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou for (i = base; i < base + DRM_MAX_MINOR; i++) { 641f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou if ((fd = drmOpenMinor(i, 1, type)) >= 0) { 64288dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 64388dbee54ed400a3fd5594fab506518c171167805Rik Faith if (!strcmp(version->name, name)) { 64488dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 64556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes id = drmGetBusid(fd); 64656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL"); 64756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (!id || !*id) { 64822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (id) 64956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 65056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return fd; 65156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 65256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 65356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 65456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 65556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeVersion(version); 65688dbee54ed400a3fd5594fab506518c171167805Rik Faith } 65788dbee54ed400a3fd5594fab506518c171167805Rik Faith } 65856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes close(fd); 65988dbee54ed400a3fd5594fab506518c171167805Rik Faith } 660b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 661b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 66288dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__ 66322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Backward-compatibility /proc support */ 664b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (i = 0; i < 8; i++) { 66588dbee54ed400a3fd5594fab506518c171167805Rik Faith char proc_name[64], buf[512]; 66688dbee54ed400a3fd5594fab506518c171167805Rik Faith char *driver, *pt, *devstring; 66788dbee54ed400a3fd5594fab506518c171167805Rik Faith int retcode; 66888dbee54ed400a3fd5594fab506518c171167805Rik Faith 6690371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss sprintf(proc_name, "/proc/dri/%d/name", i); 670b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if ((fd = open(proc_name, 0, 0)) >= 0) { 671b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss retcode = read(fd, buf, sizeof(buf)-1); 672b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss close(fd); 673b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (retcode) { 674b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss buf[retcode-1] = '\0'; 675b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (driver = pt = buf; *pt && *pt != ' '; ++pt) 676b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 67722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (*pt) { /* Device is next */ 678b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss *pt = '\0'; 679b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (!strcmp(driver, name)) { /* Match */ 680b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (devstring = ++pt; *pt && *pt != ' '; ++pt) 681b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 682b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (*pt) { /* Found busid */ 683f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenByBusid(++pt, type); 68422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson } else { /* No busid */ 685f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenDevice(strtol(devstring, NULL, 0),i, type); 686b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 687b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 688b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 689b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 690569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 691b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 69288dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 69388dbee54ed400a3fd5594fab506518c171167805Rik Faith 694b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return -1; 695b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss} 696b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 697b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device. 700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found. The 702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root. 703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied. 705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known. 706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise. 712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 713b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid) 714b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 715f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenWithType(name, busid, DRM_NODE_PRIMARY); 716f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou} 717f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou 718f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou/** 719f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * Open the DRM device with specified type. 720f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 721f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * Looks up the specified name and bus ID, and opens the device found. The 722f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * entry in /dev/dri is created if necessary and if called by root. 723f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 724f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param name driver name. Not referenced if bus ID is supplied. 725f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param busid bus ID. Zero if not known. 726f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \param type the device node type to open, PRIMARY, CONTROL or RENDER 727f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 728f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \return a file descriptor on success, or a negative value on error. 729f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * 730f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * \internal 731f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 732f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou * otherwise. 733f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou */ 734f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhouint drmOpenWithType(const char *name, const char *busid, int type) 735f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou{ 73679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drmAvailable() && name != NULL && drm_server_info) { 737f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou /* try to load the kernel module */ 73879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drm_server_info->load_module(name)) { 739ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 74006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 74106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 74206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 74306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 74406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (busid) { 745f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou int fd = drmOpenByBusid(busid, type); 74606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (fd >= 0) 74706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return fd; 74806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 74922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 75006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (name) 751f1adc4b375a16b07f560b86a34e617984049c422Jammy Zhou return drmOpenByName(name, type); 75222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 75306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 755b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 756731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmOpenControl(int minor) 757731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 758731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); 759731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 760d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 7610c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binnsint drmOpenRender(int minor) 7620c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns{ 7630c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns return drmOpenMinor(minor, 0, DRM_NODE_RENDER); 7640c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns} 7650c5aaeef51233aec89ee1f43f03d457f278f8fa0Frank Binns 766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion(). 768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 770d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 771d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings 773d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it. 774d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 775b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v) 776b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 777ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 778ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 7799d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 7809d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 7819d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 782b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 783b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 784b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel. 788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all 793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it. 794d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 795b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v) 796b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 797ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 798ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 7999d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 8009d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 8019d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 803b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 804b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information. 808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer. 810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer. 811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl 814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart. 815d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 816569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s) 817b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 818b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_major = s->version_major; 819b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_minor = s->version_minor; 820b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_patchlevel = s->version_patchlevel; 821b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name_len = s->name_len; 8220a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->name = strdup(s->name); 823b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date_len = s->date_len; 8240a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->date = strdup(s->date); 825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc_len = s->desc_len; 8260a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson d->desc = strdup(s->desc); 827b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 828b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 829b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information. 832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with 836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion(). 837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri. 839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls, 842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings. 843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already. 844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 845b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd) 846b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 847b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmVersionPtr retval; 848b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_version_t *version = drmMalloc(sizeof(*version)); 849b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 85095f23cf894757d05a6b6c980062a46968dc069b1Daniel Vetter memclear(*version); 851360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 8528b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 853b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 854b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 855b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 856b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 857b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) 858b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = drmMalloc(version->name_len + 1); 859b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) 860b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = drmMalloc(version->date_len + 1); 861b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) 862b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = drmMalloc(version->desc_len + 1); 863360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 8648b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) { 865b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno)); 866b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 867b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 868b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 869b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 87022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* The results might not be null-terminated strings, so terminate them. */ 871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) version->name[version->name_len] = '\0'; 872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) version->date[version->date_len] = '\0'; 873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) version->desc[version->desc_len] = '\0'; 874b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 875b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 876b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmCopyVersion(retval, version); 877b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 878b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 879b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 880b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8813903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 883d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library. 884d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 885d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent. 886d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 887d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 888d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 889d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information. 890d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 891d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded 893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number. 894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 8953903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd) 8963903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 8973903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen drm_version_t *version = drmMalloc(sizeof(*version)); 8983903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 8993903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen /* Version history: 90079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it 9013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.0.x = original DRM interface with no drmGetLibVersion 9023903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * entry point and many drm<Device> extensions 9033903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.1.x = added drmCommand entry points for device extensions 9043903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * added drmGetLibVersion to identify libdrm.a version 90506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * revision 1.2.x = added drmSetInterfaceVersion 90606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * modified drmOpen to handle both busid and name 90779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * revision 1.3.x = added server + memory manager 9083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen */ 90979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_major = 1; 91079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_minor = 3; 9113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen version->version_patchlevel = 0; 9123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 9133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return (drmVersionPtr)version; 9143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 9153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 9165c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggsint drmGetCap(int fd, uint64_t capability, uint64_t *value) 9175c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs{ 918fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter struct drm_get_cap cap; 9195c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs int ret; 9205c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs 921fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(cap); 922fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.capability = capability; 923fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 9245c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap); 9255c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs if (ret) 9265c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs return ret; 9275c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs 9285c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs *value = cap.value; 9293b04c73650b5e9bbcb602fdb8cea0b16ad82d0c0Dave Airlie return 0; 9305c6c6913d1260024e5d156db7973c9e46fe1ff03Ben Skeggs} 931d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 932ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiauint drmSetClientCap(int fd, uint64_t capability, uint64_t value) 933ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau{ 934fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter struct drm_set_client_cap cap; 935fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 936fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(cap); 937fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.capability = capability; 938fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter cap.value = value; 939ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau 940ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau return drmIoctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap); 941ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau} 942ddbbdb13d80ea7f60e6f71356a444995b905366bDamien Lespiau 943d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 944d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information. 945d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 946d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid(). 947d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 948d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 949d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid. 950d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 951b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid) 952b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 953b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drmFree((void *)busid); 954b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 955b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 956d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 957d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 958d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device. 959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string. 963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to 966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique 967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure. 968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 969b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd) 970b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 971b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 973fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(u); 974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 9758b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 976ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 977b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = drmMalloc(u.unique_len + 1); 9788b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 979ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 980b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique[u.unique_len] = '\0'; 98106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 982b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return u.unique; 983b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 984b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device. 988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string. 991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure. 993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing 996d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure. 997d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 998b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid) 999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1000b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 1001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1002fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(u); 1003b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = (char *)busid; 1004b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = strlen(busid); 1005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10068b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) { 100756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return -errno; 100856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 1009b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1010b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10128696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic) 1013b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1014b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 1015b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1016fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(auth); 1017fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1018b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = 0; 10198b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) 1020ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = auth.magic; 1022b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1023b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 10258696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic) 1026b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1027b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1029fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(auth); 1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss auth.magic = magic; 10318b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) 1032ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1033b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1034b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1035b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a 1038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process. 1039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of 1042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below. 1043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes. 1044d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped. 1045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions. 1046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset 1047d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap(). 1048d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1049d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error. 1050d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1051d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer 1052d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer 1053d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer, 1054d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and 1055d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER. 1056d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1057d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1058d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the 1059d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining. 1060d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1061d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area 1062d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area, 1063d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area, 1064d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and 1065d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS. 1066d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1067d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. 1068d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1069d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA 1070d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA, 1071d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero, 1072d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes, 1073d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM. 1074d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1075d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 1076d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in 1077d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle 1078d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned. 1079d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1080d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1081d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1082d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1083d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing 1084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure. 1085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 108622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type, 108722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drmMapFlags flags, drm_handle_t *handle) 1088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_map_t map; 1090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1091fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 1092b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.offset = offset; 1093b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.size = size; 1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.type = type; 1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.flags = flags; 10968b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map)) 1097ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1098ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 1099961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston *handle = (drm_handle_t)(uintptr_t)map.handle; 1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1102b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 11038696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle) 110474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 110574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_map_t map; 110674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 1107fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 1108961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston map.handle = (void *)(uintptr_t)handle; 110974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 11108b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map)) 1111ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 111274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 111374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 111474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 1115d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1116d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers. 1117d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1118d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1119d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers. 1120d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer. 1121d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags. 1122d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture 1123d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1124d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error. 1125d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1126d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1127d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl. 1128d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1129d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc. 1130d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1131ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags, 1132ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann int agp_offset) 1133b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_desc_t request; 1135360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1136fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(request); 1137b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1138b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.size = size; 1139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.flags = flags; 1140ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann request.agp_start = agp_offset; 1141360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 11428b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request)) 1143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return request.count; 1145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high) 1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1152fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(info); 1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 11548b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1155ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1157ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!info.count) 1158ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1159360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return -ENOMEM; 1162360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 11638b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1165b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1166b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1168360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].low_mark = low * info.list[i].count; 1171b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].high_mark = high * info.list[i].count; 11728b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) { 1173b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 1174b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1179360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1180b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1183d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1184d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers. 1185d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1186d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1187d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free. 1188d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed. 1189d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1190d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1191d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1192d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging. 1193d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1194d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1195d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing 1196d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure. 1197d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list) 1199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_free_t request; 1201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1202fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(request); 1203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.list = list; 12058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request)) 1206ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1210d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1211d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1212d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device. 1213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1214d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1215d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1216d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1217d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor. 1218d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1219b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd) 1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1223b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1224b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDestroy(entry->tagTable); 1225b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = 0; 1226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 1227b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = NULL; 1228b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1229b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(drmHashTable, key); 1230b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(entry); 1231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return close(fd); 1233b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1234b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1235d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1236d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory. 1238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap(). 1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap(). 1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping 1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins. 1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap(). 1249d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 125022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address) 1251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1252c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane static unsigned long pagesize_mask = 0; 1253c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1254ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd < 0) 1255ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1256c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1257c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane if (!pagesize_mask) 1258c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane pagesize_mask = getpagesize() - 1; 1259c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1260c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane size = (size + pagesize_mask) & ~pagesize_mask; 1261c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1262faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov *address = drm_mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); 1263ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (*address == MAP_FAILED) 1264ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1265b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1266b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1267b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1270d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap(). 1271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap(). 1273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap(). 1274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 127822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap(). 1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1280b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size) 1281b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1282faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov return drm_munmap(address, size); 1283b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1284b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd) 1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1287b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1288b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufInfoPtr retval; 1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1291fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(info); 1292b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 12938b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1294ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1295b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1296b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (info.count) { 1297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1299360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 13008b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1301b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1302b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 130422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1305b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = info.count; 1307b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(info.count * sizeof(*retval->list)); 1308b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].count = info.list[i].count; 1310b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].size = info.list[i].size; 1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].low_mark = info.list[i].low_mark; 1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].high_mark = info.list[i].high_mark; 1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1315b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1316b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1318b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1319b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space. 1322d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1323d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1324d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1325d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure. 1326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices 1328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA(). 1329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned 1332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the 1333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures. 1334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1335b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd) 1336b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1337b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_map_t bufs; 1338b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufMapPtr retval; 1339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1340360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1341fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(bufs); 13428b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) 1343ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1344b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1345ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!bufs.count) 1346ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 13478696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1348b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) 1349b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 13518b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) { 1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(bufs.list); 1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1354b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 135522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = bufs.count; 1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(bufs.count * sizeof(*retval->list)); 1359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs.count; i++) { 1360b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].idx = bufs.list[i].idx; 1361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].total = bufs.list[i].total; 1362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].used = 0; 1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].address = bufs.list[i].address; 1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 13658696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 13668696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs.list); 13678696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1370b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1371d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1372d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1373d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs(). 1374d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1375d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure. 1376d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 13788696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the 13798696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs(). 1380d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs) 1382b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1383b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1384360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1385b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs->count; i++) { 1386faf51d5694e3f0ec12c7fa1fd2f87fc96a300fe3Emil Velikov drm_munmap(bufs->list[i].address, bufs->list[i].total); 1387b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 13888696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 13898696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs->list); 13908696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs); 13918696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1392b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1395d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1396360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY 16 1397360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1398d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1399d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers. 1400d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1401d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1402d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request 1403d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1404d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1405d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1406d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the 1408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries. 1409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1410b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request) 1411b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1412b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_dma_t dma; 1413360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes int ret, i = 0; 1414b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1415b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.context = request->context; 1416b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_count = request->send_count; 1417b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_indices = request->send_list; 1418b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_sizes = request->send_sizes; 1419b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.flags = request->flags; 1420b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_count = request->request_count; 1421b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_size = request->request_size; 1422b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_indices = request->request_list; 1423b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_sizes = request->request_sizes; 14248696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl dma.granted_count = 0; 1425360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1426360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes do { 1427360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes ret = ioctl( fd, DRM_IOCTL_DMA, &dma ); 1428360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY ); 1429360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1430360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes if ( ret == 0 ) { 1431360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes request->granted_count = dma.granted_count; 1432360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return 0; 1433360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } else { 1434360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return -errno; 1435360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } 1436b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1437b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1438d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1439d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1440d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock. 1441d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1442d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1443d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1444d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function 1445d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns. 1446d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1447d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero. 1448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue 1451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired. 1452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14538696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags) 1454b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1455b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1456b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1457fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 1458b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1459b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1460b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 1461b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 1462b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 1463b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1464b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1465b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1466360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 14678b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard while (drmIoctl(fd, DRM_IOCTL_LOCK, &lock)) 1468b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ; 1469b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1470b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1471b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1472d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock. 1474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1480d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1481d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the 1482d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure. 1483d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14848696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context) 1485b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1486b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1487b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1488fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 1489b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 14908b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock); 1491b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1492b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 149322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count) 1494b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1495b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_res_t res; 1496b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t *list; 14978696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drm_context_t * retval; 1498b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1499b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1500fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(res); 15018b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1502ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1503b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1504ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!res.count) 1505ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1506b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1507ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!(list = drmMalloc(res.count * sizeof(*list)))) 1508ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1509b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { 1510b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1511b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1512b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1513b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1514b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = list; 15158b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res)) 1516ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1517b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1518ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < res.count; i++) 1519ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian retval[i] = list[i].handle; 1520b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1521b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1522b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *count = res.count; 1523b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1524b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1525b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 152622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt) 1527b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1528b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(pt); 1529b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1530b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context. 1533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes 1535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated. 1536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA 1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA(). 1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the 1547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 154922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle) 1550b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1551b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1552b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1553fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 15548b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) 1555ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1556b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = ctx.handle; 1557b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1558b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1559b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15608696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context) 1561b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1562b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1563b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1564fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1565b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 15668b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) 1567ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1568b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1569b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1570b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 15718696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags) 1572b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1573b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1574b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 157522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* 157622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * Context preserving means that no context switches are done between DMA 157722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * buffers from one context and the next. This is suitable for use in the 157822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * X server (which promises to maintain hardware context), or in the 157922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * client-side library when buffers are swapped on behalf of two threads. 158022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 1581fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1582b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1583ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_PRESERVED) 1584ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_PRESERVED; 1585ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_2DONLY) 1586ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_2DONLY; 15878b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) 1588ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1589b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1590b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1591b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 159222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context, 159322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_context_tFlagsPtr flags) 1594b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1595b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1596b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1597fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1598b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 15998b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx)) 1600ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1601b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *flags = 0; 1602ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_PRESERVED) 1603ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_PRESERVED; 1604ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_2DONLY) 1605ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_2DONLY; 1606b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1607b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1608360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context. 1611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated 1613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context. 1614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext(). 1617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the 1624d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1625d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16268696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle) 1627b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1628b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1629fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1630fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctx); 1631b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = handle; 16328b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx)) 1633ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1634b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1635b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1636b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 163722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle) 1638b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1639b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1640fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1641fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(draw); 16428b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) 1643ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = draw.handle; 1645b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1646b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1647b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 16488696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle) 1649b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1651fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 1652fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(draw); 1653b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss draw.handle = handle; 16548b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw)) 1655ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1656b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1657b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1658b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 16599810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle, 16609810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_drawable_info_type_t type, unsigned int num, 16619810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer void *data) 16629810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{ 16639810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_update_draw_t update; 16649810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1665fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(update); 16669810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.handle = handle; 16679810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.type = type; 16689810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.num = num; 16699810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.data = (unsigned long long)(unsigned long)data; 16709810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 16718b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) 1672ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 16739810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 16749810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer return 0; 16759810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer} 16769810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device. 1679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls. 1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl. 1688d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1689ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd) 1690ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 16918b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) 1692ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1693ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1694ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1696d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1697d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device. 1699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl. 1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1707ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd) 1708ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 17098b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) 1710ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1711ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1712ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1714d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1715d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode. 1717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1718d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode. 1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the 1725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure. 1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1727ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode) 1728ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1729ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_mode_t m; 1730ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1731fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(mode); 1732ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann m.mode = mode; 17338b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) 1734ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1735ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1736ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1737ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1738d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1739d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory. 1741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary. 1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate. 1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the 1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory. 1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory. 1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1752d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the 1753d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure. 1754d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1755ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type, 17567ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie unsigned long *address, drm_handle_t *handle) 1757ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1758ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1759b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 1760fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1761b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane *handle = DRM_AGP_NO_HANDLE; 1762ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = size; 1763ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.type = type; 17648b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) 1765ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1766ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (address != 0UL) 1767ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *address = b.physical; 1768ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann *handle = b.handle; 1769ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1770ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1771ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1773d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1774d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory. 1775d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1776d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1777d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1778d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1779d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1780d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1781d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the 1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure. 1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 17857ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle) 1786ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1787ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1788ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1789fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1790ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 17918b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b)) 1792ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1793ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1794ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1795ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory. 1799d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1800d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1801d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1802d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary. 1803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the 1808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure. 1809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 18107ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset) 1811ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1812ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1813ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1814fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1815ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1816ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = offset; 18178b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b)) 1818ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1819ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1820ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1821ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1822d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1823d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1824d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory. 1825d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1826d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1827d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1828d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1829d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1830d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1831d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1832d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing 1833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure. 1834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 18357ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle) 1836ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1837ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1838ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1839fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(b); 1840ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 18418b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) 1842ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1843ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1844ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1845ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number. 1849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure.. 1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1858ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd) 1859ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1860ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1861ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1862fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1863fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 18648b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1865ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1866ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_major; 1867ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1868ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1869d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1870d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1871d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number. 1872d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1873d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1874d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure. 1876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1881ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd) 1882ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1883ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1884ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1885fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1886fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 18878b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1888ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1889ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_minor; 1890ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1891ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1892d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1893d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1894d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode. 1895d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure. 1899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1902d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1904ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd) 1905ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1906ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1907ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1908fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1909fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19108b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1911ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1912ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.mode; 1913ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1914ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1915d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1916d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1917d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base. 1918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure. 1922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1927ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd) 1928ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1929ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1930ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1931fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1932fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19338b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1934ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1935ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_base; 1936ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1937ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1938d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1939d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1940d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size. 1941d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1942d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1943d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1944d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure. 1945d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1946d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1947d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1948d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1949d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1950ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd) 1951ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1952ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1953ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1954fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1955fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19568b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1957ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1958ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_size; 1959ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1960ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory. 1964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure. 1968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1969d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1970d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1971d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1972d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1973ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd) 1974ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1975ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1976ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1977fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 1978fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 19798b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1980ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1981ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_used; 1982ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1983ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory. 1987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure. 1991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1996ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd) 1997ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1998ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1999ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2000fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2001fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20028b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2003ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2004ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_allowed; 2005ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2006ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2007d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2008d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2009d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID. 2010d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2011d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2012d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure. 2014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2016d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 2017d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 2018d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2019ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd) 2020ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 2021ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 2022ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2023fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2024fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20258b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2026ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2027ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_vendor; 2028ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2029ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2030d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2031d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2032d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID. 2033d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2034d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2035d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure. 2037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 2040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 2041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2042ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd) 2043ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 2044ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 2045ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 2046fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(i); 2047fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20488b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i)) 2049ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 2050ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_device; 2051ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 2052ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 20537ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle) 20545d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 20555d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 20565d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2057fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sg); 2058fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter 20595d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = 0; 20605d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = size; 20618b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) 2062ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 20635d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = sg.handle; 20645d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 20655d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 20665d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 20677ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle) 20685d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 20695d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 20705d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2071fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sg); 20725d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = handle; 20738b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg)) 2074ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 20755d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 20765d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 20775d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 2078d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2079d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK. 2080d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2081d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2082d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure. 2083d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2084d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2085d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2086d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2087d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl. 2088d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 208955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl) 209055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{ 2091f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes struct timespec timeout, cur; 209255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer int ret; 209355acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2094f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = clock_gettime(CLOCK_MONOTONIC, &timeout); 2095f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes if (ret < 0) { 20961eb2860b4bd0306dddc5b2f2dc7403aa65c5e476Daniel Kurtz fprintf(stderr, "clock_gettime failed: %s\n", strerror(errno)); 2097f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes goto out; 2098f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 2099f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes timeout.tv_sec++; 2100f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes 210155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer do { 2102f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl); 2103c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer vbl->request.type &= ~DRM_VBLANK_RELATIVE; 2104ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (ret && errno == EINTR) { 2105ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes clock_gettime(CLOCK_MONOTONIC, &cur); 2106ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes /* Timeout after 1s */ 2107ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes if (cur.tv_sec > timeout.tv_sec + 1 || 2108ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes (cur.tv_sec == timeout.tv_sec && cur.tv_nsec >= 2109ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes timeout.tv_nsec)) { 2110ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes errno = EBUSY; 2111ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes ret = -1; 2112ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes break; 2113ca37077fb78b69a00500827f1db12b70affa1514Jesse Barnes } 2114f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnes } 211555acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer } while (ret && errno == EINTR); 211655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2117f4f76a6894b40abd77f0ffbf52972127608b9bcaJesse Barnesout: 211855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer return ret; 211955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer} 212055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 2121b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label) 2122b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2123b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss switch (err) { 2124ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_DEVICE: 2125ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no device\n", label); 2126ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2127ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_ACCESS: 2128ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no access\n", label); 2129ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2130ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NOT_ROOT: 2131ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: not root\n", label); 2132ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2133ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_INVALID: 2134ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: invalid args\n", label); 2135ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 2136b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss default: 2137ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (err < 0) 2138ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian err = -err; 2139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); 2140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss break; 2141b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 2142b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2143b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 1; 2144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2146d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2147d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler. 2148d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2149d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2150d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number. 2151d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2152d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2153d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2154d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2155d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 2156d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 2157d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq) 2159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2162fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctl); 2163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_INST_HANDLER; 2164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = irq; 21658b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2166ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2167b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2168b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2170d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2172d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler. 2173d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2174d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2175d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2176d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2177d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2178d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2179d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 2180d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 2181d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd) 2183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 2185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2186fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(ctl); 2187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_UNINST_HANDLER; 2188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = 0; 21898b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl)) 2190ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags) 2195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 2197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2198fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(lock); 2199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 2200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 2201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 2202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 2203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 2204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 2205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 22068b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_FINISH, &lock)) 2207ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2208b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2209b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2211d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2212d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID. 2213d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2214d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2215d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number. 2216d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number. 2217d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number. 2218d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2219d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure. 2220d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2221d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2222d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the 2223d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure. 2224d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 2225b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum) 2226b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2227b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_irq_busid_t p; 2228b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2229fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(p); 2230b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.busnum = busnum; 2231b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.devnum = devnum; 2232b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.funcnum = funcnum; 22338b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) 2234ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2235b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return p.irq; 2236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2237b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22388696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag) 2239b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2240b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2241b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2242b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashInsert(entry->tagTable, context, tag)) { 2243b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(entry->tagTable, context); 2244b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(entry->tagTable, context, tag); 2245b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 2246b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 2247b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2248b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22498696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context) 2250b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2251b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2252b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2253b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return drmHashDelete(entry->tagTable, context); 2254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 22568696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context) 2257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2258b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 2260360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 2261ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (drmHashLookup(entry->tagTable, context, &value)) 2262ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 2263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return value; 2265b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2266b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 226722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, 226822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t handle) 226974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 227074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 227174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2272fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 227374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 2274961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston map.handle = (void *)(uintptr_t)handle; 227574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 22768b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) 2277ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 227874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 227974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 228074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 228122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 228222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t *handle) 228374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 228474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 228574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2286fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 228774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 228874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 22898b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) 2290ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2291ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 2292961bf9b5c2866ccb4fedf2b45b29fb688519d0dbJeremy Huddleston *handle = (drm_handle_t)(uintptr_t)map.handle; 229374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 229474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 229574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 229674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 22978696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size, 22988696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmMapType *type, drmMapFlags *flags, drm_handle_t *handle, 229988dbee54ed400a3fd5594fab506518c171167805Rik Faith int *mtrr) 230088dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 230188dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_map_t map; 230288dbee54ed400a3fd5594fab506518c171167805Rik Faith 2303fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(map); 230488dbee54ed400a3fd5594fab506518c171167805Rik Faith map.offset = idx; 23058b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map)) 2306ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 230788dbee54ed400a3fd5594fab506518c171167805Rik Faith *offset = map.offset; 230888dbee54ed400a3fd5594fab506518c171167805Rik Faith *size = map.size; 230988dbee54ed400a3fd5594fab506518c171167805Rik Faith *type = map.type; 231088dbee54ed400a3fd5594fab506518c171167805Rik Faith *flags = map.flags; 231188dbee54ed400a3fd5594fab506518c171167805Rik Faith *handle = (unsigned long)map.handle; 231288dbee54ed400a3fd5594fab506518c171167805Rik Faith *mtrr = map.mtrr; 231388dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 231488dbee54ed400a3fd5594fab506518c171167805Rik Faith} 231588dbee54ed400a3fd5594fab506518c171167805Rik Faith 231688dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid, 231788dbee54ed400a3fd5594fab506518c171167805Rik Faith unsigned long *magic, unsigned long *iocs) 231888dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 231988dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_client_t client; 232088dbee54ed400a3fd5594fab506518c171167805Rik Faith 2321fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(client); 232288dbee54ed400a3fd5594fab506518c171167805Rik Faith client.idx = idx; 23238b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client)) 2324ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 232588dbee54ed400a3fd5594fab506518c171167805Rik Faith *auth = client.auth; 232688dbee54ed400a3fd5594fab506518c171167805Rik Faith *pid = client.pid; 232788dbee54ed400a3fd5594fab506518c171167805Rik Faith *uid = client.uid; 232888dbee54ed400a3fd5594fab506518c171167805Rik Faith *magic = client.magic; 232988dbee54ed400a3fd5594fab506518c171167805Rik Faith *iocs = client.iocs; 233088dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 233188dbee54ed400a3fd5594fab506518c171167805Rik Faith} 233288dbee54ed400a3fd5594fab506518c171167805Rik Faith 233388dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats) 233488dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 233588dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_stats_t s; 2336de8532dd8359dfdaba839ff61fc9e2f05eaf57d3Jan Vesely unsigned i; 233788dbee54ed400a3fd5594fab506518c171167805Rik Faith 2338fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(s); 23398b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s)) 2340ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 234188dbee54ed400a3fd5594fab506518c171167805Rik Faith 234288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = 0; 234388dbee54ed400a3fd5594fab506518c171167805Rik Faith memset(stats, 0, sizeof(*stats)); 234488dbee54ed400a3fd5594fab506518c171167805Rik Faith if (s.count > sizeof(stats->data)/sizeof(stats->data[0])) 234588dbee54ed400a3fd5594fab506518c171167805Rik Faith return -1; 234688dbee54ed400a3fd5594fab506518c171167805Rik Faith 234788dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE \ 234888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 234988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%8.8s"; \ 235088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 1; \ 235188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 235288dbee54ed400a3fd5594fab506518c171167805Rik Faith 235388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT \ 235488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 235588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 235688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 235788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "kgm"; \ 235888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1000; \ 235988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 236088dbee54ed400a3fd5594fab506518c171167805Rik Faith 236188dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE \ 236288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 236388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 236488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 236588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "KGM"; \ 236688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1024; \ 236788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 236888dbee54ed400a3fd5594fab506518c171167805Rik Faith 236988dbee54ed400a3fd5594fab506518c171167805Rik Faith 237088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = s.count; 237188dbee54ed400a3fd5594fab506518c171167805Rik Faith for (i = 0; i < s.count; i++) { 237288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].value = s.data[i].value; 237388dbee54ed400a3fd5594fab506518c171167805Rik Faith switch (s.data[i].type) { 237488dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCK: 237588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Lock"; 237688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 237788dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 237888dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 237988dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_OPENS: 238088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Opens"; 238188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "O"; 238288dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 238388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 238488dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 238588dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_CLOSES: 238688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Closes"; 238788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 238888dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 238988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 239088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 239188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IOCTLS: 239288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Ioctls"; 239388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ioc/s"; 239488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 239588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 239688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCKS: 239788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Locks"; 239888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lck/s"; 239988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 240088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 240188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_UNLOCKS: 240288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Unlocks"; 240388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Unl/s"; 240488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 240588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 240688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IRQ: 240788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "IRQs"; 240888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "IRQ/s"; 240988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 241088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 241188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_PRIMARY: 241288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Primary Bytes"; 241388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "PB/s"; 241488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 241588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 241688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SECONDARY: 241788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Secondary Bytes"; 241888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "SB/s"; 241988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 242088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 242188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_DMA: 242288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "DMA"; 242388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "DMA/s"; 242488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 242588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 242688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SPECIAL: 242788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Special DMA"; 242888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "dma/s"; 242988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 243088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 243188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_MISSED: 243288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Miss"; 243388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ms/s"; 243488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 243588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 243688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_VALUE: 243788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Value"; 243888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Value"; 243988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 244088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 244188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_BYTE: 244288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Bytes"; 244388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "B/s"; 244488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 244588dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 244688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_COUNT: 244788dbee54ed400a3fd5594fab506518c171167805Rik Faith default: 244888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Count"; 244988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Cnt/s"; 245088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 245188dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 245288dbee54ed400a3fd5594fab506518c171167805Rik Faith } 245388dbee54ed400a3fd5594fab506518c171167805Rik Faith } 245488dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 245588dbee54ed400a3fd5594fab506518c171167805Rik Faith} 245688dbee54ed400a3fd5594fab506518c171167805Rik Faith 2457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 245806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl. 245906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 246006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor. 246106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index 246206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written. 246306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written. 246406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 246506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure. 246606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 246706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 246806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by 246906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 247006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 247122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version) 247206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 247306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int retcode = 0; 247406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drm_set_version_t sv; 247506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 2476fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter memclear(sv); 247706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = version->drm_di_major; 247806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = version->drm_di_minor; 247906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = version->drm_dd_major; 248006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_minor = version->drm_dd_minor; 248106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24828b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, DRM_IOCTL_SET_VERSION, &sv)) { 248306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt retcode = -errno; 248406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 248506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 248606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_major = sv.drm_di_major; 248706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_minor = sv.drm_di_minor; 248806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_major = sv.drm_dd_major; 248906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_minor = sv.drm_dd_minor; 249006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 249106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return retcode; 249206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 249306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 249406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 2495d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command. 2496d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2497d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2498d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2499d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2500d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2501d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2502d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2503d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by 2504d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2505d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 25063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex) 25073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25093903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25103903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex); 25113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2512fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter if (drmIoctl(fd, request, NULL)) { 25133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2518d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2519d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2520d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command. 2521d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2522d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2523d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2524d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read. 2525d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read. 2526d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2527d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by 2531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 253322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data, 253422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25353903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25363903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 253874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 253974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 25403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25418b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 25423903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25443903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25463903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command. 2550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2551d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written. 2554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written. 2555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by 2560d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2561d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 256222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data, 256322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25643903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25653903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25663903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 256774ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 256874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 25693903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25708b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) { 25713903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 25723903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 25733903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 25743903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 25753903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2576d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2577d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2578d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command. 2579d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2580d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2581d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2582d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written. 2583d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written. 2584d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2585d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by 2589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 259122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data, 259222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 25933903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 25943903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 25953903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 259674ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 259774ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 25983903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 25998b9ab108ec1f2ba2b503f713769c4946849b3cb2Keith Packard if (drmIoctl(fd, request, data)) 26003903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 26013903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 26023903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 2603166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2604d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16 2605d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct { 2606ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian char *BusID; 2607ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2608ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int refcount; 2609dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou int type; 2610d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS]; 2611d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2612d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0; 2613d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2614d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused, 2615d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie const char *BusID, 2616d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie int *newlyopened) 2617d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2618dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou return drmOpenOnceWithType(BusID, newlyopened, DRM_NODE_PRIMARY); 2619dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou} 2620dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou 2621dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhouint drmOpenOnceWithType(const char *BusID, int *newlyopened, int type) 2622dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou{ 2623ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2624ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2625d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2626ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) 2627dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou if ((strcmp(BusID, connection[i].BusID) == 0) && 2628dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou (connection[i].type == type)) { 2629ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i].refcount++; 2630ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 0; 2631ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return connection[i].fd; 2632ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2633ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2634dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou fd = drmOpenWithType(NULL, BusID, type); 2635ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd <= 0 || nr_fds == DRM_MAX_FDS) 2636ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2637d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2638ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].BusID = strdup(BusID); 2639ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].fd = fd; 2640ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].refcount = 1; 2641dbc8b11db6f3fcbe2a76487bb0b1930908226a17Jammy Zhou connection[nr_fds].type = type; 2642ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 1; 2643d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2644ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (0) 2645ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "saved connection %d for %s %d\n", 2646ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds, connection[nr_fds].BusID, 2647ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian strcmp(BusID, connection[nr_fds].BusID)); 2648d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2649ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds++; 2650d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2651ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2652d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2653d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2654d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd) 2655d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2656ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2657d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2658ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) { 2659ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd == connection[i].fd) { 2660ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (--connection[i].refcount == 0) { 2661ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmClose(connection[i].fd); 2662ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(connection[i].BusID); 2663d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2664ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (i < --nr_fds) 2665ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i] = connection[nr_fds]; 2666d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2667ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 2668ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2669ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2670ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2671d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2672731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2673731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmSetMaster(int fd) 2674731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2675fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter return drmIoctl(fd, DRM_IOCTL_SET_MASTER, NULL); 2676731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 2677731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes 2678731cd5526e5c732d51307b26e784f454a724a699Jesse Barnesint drmDropMaster(int fd) 2679731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes{ 2680fd38794344f7211f45cc213344d0f5b9f9f98dd8Daniel Vetter return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, NULL); 2681731cd5526e5c732d51307b26e784f454a724a699Jesse Barnes} 268222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 268322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsbergchar *drmGetDeviceNameFromFd(int fd) 268422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg{ 268522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg char name[128]; 268622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg struct stat sbuf; 268722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg dev_t d; 268822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg int i; 268922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 269022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg /* The whole drmOpen thing is a fiasco and we need to find a way 269122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * back to just using open(2). For now, however, lets just make 269222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * things worse with even more ad hoc directory walking code to 269322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg * discover the device file name. */ 269422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 269522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg fstat(fd, &sbuf); 269622d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg d = sbuf.st_rdev; 269722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 269822d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg for (i = 0; i < DRM_MAX_MINOR; i++) { 269922d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i); 270022d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d) 270122d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg break; 270222d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg } 270322d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg if (i == DRM_MAX_MINOR) 270422d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg return NULL; 270522d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg 27060a1ff35c70730160973715b82112cd97c62ac13eAdam Jackson return strdup(name); 270722d46669043d38fcd16efca773f5ed5693c0fb58Kristian Høgsberg} 2708cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27091f73578df32f895a678a41758f6c563f49484347Frank Binnsint drmGetNodeTypeFromFd(int fd) 27101f73578df32f895a678a41758f6c563f49484347Frank Binns{ 27111f73578df32f895a678a41758f6c563f49484347Frank Binns struct stat sbuf; 27121f73578df32f895a678a41758f6c563f49484347Frank Binns int maj, min, type; 27131f73578df32f895a678a41758f6c563f49484347Frank Binns 27141f73578df32f895a678a41758f6c563f49484347Frank Binns if (fstat(fd, &sbuf)) 27151f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 27161f73578df32f895a678a41758f6c563f49484347Frank Binns 27171f73578df32f895a678a41758f6c563f49484347Frank Binns maj = major(sbuf.st_rdev); 27181f73578df32f895a678a41758f6c563f49484347Frank Binns min = minor(sbuf.st_rdev); 27191f73578df32f895a678a41758f6c563f49484347Frank Binns 27201f73578df32f895a678a41758f6c563f49484347Frank Binns if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) { 27211f73578df32f895a678a41758f6c563f49484347Frank Binns errno = EINVAL; 27221f73578df32f895a678a41758f6c563f49484347Frank Binns return -1; 27231f73578df32f895a678a41758f6c563f49484347Frank Binns } 27241f73578df32f895a678a41758f6c563f49484347Frank Binns 27251f73578df32f895a678a41758f6c563f49484347Frank Binns type = drmGetMinorType(min); 27261f73578df32f895a678a41758f6c563f49484347Frank Binns if (type == -1) 27271f73578df32f895a678a41758f6c563f49484347Frank Binns errno = ENODEV; 27281f73578df32f895a678a41758f6c563f49484347Frank Binns return type; 27291f73578df32f895a678a41758f6c563f49484347Frank Binns} 27301f73578df32f895a678a41758f6c563f49484347Frank Binns 2731cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlieint drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd) 2732cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie{ 2733cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie struct drm_prime_handle args; 2734cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie int ret; 2735cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2736cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.handle = handle; 2737cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.flags = flags; 2738cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie ret = drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args); 2739cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie if (ret) 2740cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return ret; 2741cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2742cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie *prime_fd = args.fd; 2743cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return 0; 2744cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie} 2745cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2746cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlieint drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle) 2747cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie{ 2748cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie struct drm_prime_handle args; 2749cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie int ret; 2750cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2751cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.fd = prime_fd; 2752cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie args.flags = 0; 2753cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie ret = drmIoctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &args); 2754cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie if (ret) 2755cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return ret; 2756cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 2757cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie *handle = args.handle; 2758cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie return 0; 2759cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie} 2760cc0a14575d9fd0aafe73cb4aa445eaf024436114Dave Airlie 27610ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovstatic char *drmGetMinorNameForFD(int fd, int type) 27620ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 27630ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#ifdef __linux__ 27640ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov DIR *sysdir; 27650ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov struct dirent *pent, *ent; 27660ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov struct stat sbuf; 27670ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov const char *name = drmGetMinorName(type); 27680ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov int len; 27690ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov char dev_name[64], buf[64]; 27700ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov long name_max; 27710ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov int maj, min; 27720ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27730ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (!name) 27740ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27750ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27760ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov len = strlen(name); 27770ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27780ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (fstat(fd, &sbuf)) 27790ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27800ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27810ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov maj = major(sbuf.st_rdev); 27820ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov min = minor(sbuf.st_rdev); 27830ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27840ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) 27850ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27860ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27870ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov snprintf(buf, sizeof(buf), "/sys/dev/char/%d:%d/device/drm", maj, min); 27880ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27890ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov sysdir = opendir(buf); 27900ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (!sysdir) 27910ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 27920ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27930ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov name_max = fpathconf(dirfd(sysdir), _PC_NAME_MAX); 27940ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (name_max == -1) 27950ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov goto out_close_dir; 27960ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 27970ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov pent = malloc(offsetof(struct dirent, d_name) + name_max + 1); 27980ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (pent == NULL) 27990ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov goto out_close_dir; 28000ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28010ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov while (readdir_r(sysdir, pent, &ent) == 0 && ent != NULL) { 28020ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov if (strncmp(ent->d_name, name, len) == 0) { 28030ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov free(pent); 28040ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov closedir(sysdir); 28050ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28060ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov snprintf(dev_name, sizeof(dev_name), DRM_DIR_NAME "/%s", 28070ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov ent->d_name); 28080ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return strdup(dev_name); 28090ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 28100ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov } 28110ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28120ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov free(pent); 28130ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28140ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovout_close_dir: 28150ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov closedir(sysdir); 28160ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov#endif 28170ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return NULL; 28180ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 28190ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28200ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovchar *drmGetPrimaryDeviceNameFromFd(int fd) 28210ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 28220ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return drmGetMinorNameForFD(fd, DRM_NODE_PRIMARY); 28230ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 28240ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov 28250ca03a4087a550646de7f26b6b53a932e8546474Emil Velikovchar *drmGetRenderDeviceNameFromFd(int fd) 28260ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov{ 28270ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov return drmGetMinorNameForFD(fd, DRM_NODE_RENDER); 28280ca03a4087a550646de7f26b6b53a932e8546474Emil Velikov} 2829