xf86drm.c revision db85ed25afc616acfaadb21facf6066354f9d490
1d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \file xf86drm.c 3d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * User-level interface to DRM device 4b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 5d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Rickard E. (Rik) Faith <faith@valinux.com> 6d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \author Kevin E. Martin <martin@valinux.com> 7d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 8d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 9d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/* 10569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 11569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 12b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * All Rights Reserved. 13b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * 14b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Permission is hereby granted, free of charge, to any person obtaining a 15b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * copy of this software and associated documentation files (the "Software"), 16b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * to deal in the Software without restriction, including without limitation 17b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * and/or sell copies of the Software, and to permit persons to whom the 19b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software is furnished to do so, subject to the following conditions: 20360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 21b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * The above copyright notice and this permission notice (including the next 22b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * paragraph) shall be included in all copies or substantial portions of the 23b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * Software. 24360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes * 25b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 28b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 29b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 30b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 31b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss * DEALINGS IN THE SOFTWARE. 32b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss */ 33b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 3479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#ifdef HAVE_CONFIG_H 3579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie# include <config.h> 36b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 3779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdio.h> 3879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdlib.h> 3979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <unistd.h> 4079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <string.h> 4179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <ctype.h> 4279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <fcntl.h> 4379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <errno.h> 4479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <signal.h> 4579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/types.h> 4679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/stat.h> 4779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#define stat_t struct stat 4879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/ioctl.h> 4979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/mman.h> 5079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <sys/time.h> 5179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie#include <stdarg.h> 52b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 53b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss/* Not all systems have MAP_FAILED defined */ 54b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#ifndef MAP_FAILED 55b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#define MAP_FAILED ((void *)-1) 56b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#endif 57b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 58b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss#include "xf86drm.h" 59b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 60ea08b613bdc496b0e1aa3b723f8462d2c40ed8e5Adam Jackson#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 61cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 145 62cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#endif 63cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt 64cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifdef __NetBSD__ 65cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 34 6688dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 6788dbee54ed400a3fd5594fab506518c171167805Rik Faith 68b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# ifdef __OpenBSD__ 69b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# define DRM_MAJOR 81 70b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane# endif 71b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 72cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#ifndef DRM_MAJOR 73cfa778af9c70faea8c13e5cb7f80029eee0d074eEric Anholt#define DRM_MAJOR 226 /* Linux */ 7488dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 7588dbee54ed400a3fd5594fab506518c171167805Rik Faith 7688dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifndef DRM_MAX_MINOR 7788dbee54ed400a3fd5594fab506518c171167805Rik Faith#define DRM_MAX_MINOR 16 7888dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 79569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 8022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson/* 8122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This definition needs to be changed on some systems if dev_t is a structure. 8222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * If there is a header file we can get it from, there would be best. 8322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 84569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#ifndef makedev 85569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#define makedev(x,y) ((dev_t)(((x) << 8) | (y))) 86569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul#endif 87569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 8856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes#define DRM_MSG_VERBOSITY 3 8956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 9073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie#define DRM_NODE_CONTROL 0 9173bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie#define DRM_NODE_RENDER 1 9273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie 9379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic drmServerInfoPtr drm_server_info; 9479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 9579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid drmSetServerInfo(drmServerInfoPtr info) 9679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 97ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info = info; 9879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 9979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 100d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 101d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Output a message to stderr. 102d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 103d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param format printf() like format string. 104d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 105d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 106d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around vfprintf(). 107d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 10879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 10979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int drmDebugPrint(const char *format, va_list ap) 11079038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 111ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return vfprintf(stderr, format, ap); 11279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 11379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airliestatic int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; 11579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 11656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawesstatic void 11756bd9c207770d41a497f3e8237a1099dd9d4cd91David DawesdrmMsg(const char *format, ...) 11856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes{ 11956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_list ap; 12056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes const char *env; 12179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info) 12256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes { 12356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_start(ap, format); 12479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 12579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_server_info->debug_print(format,ap); 12679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } else { 12779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie drm_debug_print(format, ap); 12879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 12956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes va_end(ap); 13056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 13156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes} 13256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 13379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid 13479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap)) 13579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 136ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_debug_print = debug_msg_ptr; 13779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 13879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void *drmHashTable = NULL; /* Context switch callbacks */ 140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14179038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlievoid *drmGetHashTable(void) 14279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie{ 143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return drmHashTable; 14479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie} 145b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 146b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid *drmMalloc(int size) 147b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *pt; 149ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((pt = malloc(size))) 150ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian memset(pt, 0, size); 151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return pt; 152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFree(void *pt) 155b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 156ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (pt) 157ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(pt); 158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 160569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */ 161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic char *drmStrdup(const char *s) 162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 16348198970ce449165fe1c7294108ca3afc775563dAdam Jackson char *retval; 16448198970ce449165fe1c7294108ca3afc775563dAdam Jackson 16548198970ce449165fe1c7294108ca3afc775563dAdam Jackson if (!s) 16648198970ce449165fe1c7294108ca3afc775563dAdam Jackson return NULL; 16748198970ce449165fe1c7294108ca3afc775563dAdam Jackson 16879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie retval = malloc(strlen(s)+1); 16948198970ce449165fe1c7294108ca3afc775563dAdam Jackson if (!retval) 17048198970ce449165fe1c7294108ca3afc775563dAdam Jackson return NULL; 17148198970ce449165fe1c7294108ca3afc775563dAdam Jackson 17248198970ce449165fe1c7294108ca3afc775563dAdam Jackson strcpy(retval, s); 173360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 174569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 175b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 176b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 177b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 178b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic unsigned long drmGetKeyFromFd(int fd) 179b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 180fcc21069b7019a4a93e1ceacc175ccd682353861David Dawes stat_t st; 181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss st.st_rdev = 0; 183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fstat(fd, &st); 184b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return st.st_rdev; 185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 18779038751ffe47ed1ce82766e027d98fd2f0e2c6aDave AirliedrmHashEntry *drmGetEntry(int fd) 188b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 189b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 190b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 191b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry; 192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 193ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!drmHashTable) 194ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmHashTable = drmHashCreate(); 195b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 196b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashLookup(drmHashTable, key, &value)) { 197b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = drmMalloc(sizeof(*entry)); 198b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = fd; 199b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 200b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = drmHashCreate(); 201b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(drmHashTable, key, entry); 202b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } else { 203b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry = value; 204b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 205b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return entry; 206b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 207b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 20906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Compare two busid strings 21006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param first 21206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param second 21306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return 1 if matched. 21506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 21606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 21706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * This function compares two bus ID strings. It understands the older 21806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format. In the format, o is 21906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * domain, b is bus, d is device, f is function. 22006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 22106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholtstatic int drmMatchBusID(const char *id1, const char *id2) 22206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 22306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* First, check if the IDs are exactly the same */ 22406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strcasecmp(id1, id2) == 0) 22506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 22606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 22706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Try to match old/new-style PCI bus IDs. */ 22806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (strncasecmp(id1, "pci", 3) == 0) { 22906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int o1, b1, d1, f1; 23006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int o2, b2, d2, f2; 23106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int ret; 23206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 23306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1); 23406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 23506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o1 = 0; 23606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1); 23706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 23806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 23906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 24006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2); 24206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 4) { 24306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt o2 = 0; 24406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2); 24506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ret != 3) 24606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 24706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 24806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 24906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2)) 25006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 25106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt else 25206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 1; 25306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 25406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return 0; 25506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 25606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 25706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 258d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device, creating it if necessary. 259d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 260d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param dev major and minor numbers of the device. 261d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor minor number of the device. 262d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 263d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 264d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 265d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 266d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assembles the device name from \p minor and opens it, creating the device 267d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * special file node with the major and minor numbers specified by \p dev and 268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parent directory if necessary and was called by root. 269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 27073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airliestatic int drmOpenDevice(long dev, int minor, int type) 271b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2729c775d0b2f303389c24aea5e8abc1473f0cf93e8David Dawes stat_t st; 27388dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 27488dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 27579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie mode_t devmode = DRM_DEV_MODE, serv_mode; 27688dbee54ed400a3fd5594fab506518c171167805Rik Faith int isroot = !geteuid(); 27788dbee54ed400a3fd5594fab506518c171167805Rik Faith uid_t user = DRM_DEV_UID; 27879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie gid_t group = DRM_DEV_GID, serv_group; 27979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 28073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 28106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenDevice: node name is %s\n", buf); 28256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes 28379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 284ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_server_info->get_perms(&serv_group, &serv_mode); 285ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode = serv_mode ? serv_mode : DRM_DEV_MODE; 286ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); 287ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; 28879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 289569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 29088dbee54ed400a3fd5594fab506518c171167805Rik Faith if (stat(DRM_DIR_NAME, &st)) { 291ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 292ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 293b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); 294b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane chown(DRM_DIR_NAME, 0, 0); /* root:root */ 295b3a20ce219b353aa3e2b7f3b47ffd28b279557c7Alan Hourihane chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); 296569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 29806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node exists and create it if necessary. */ 299d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (stat(buf, &st)) { 300ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 301ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 30288dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 30388dbee54ed400a3fd5594fab506518c171167805Rik Faith mknod(buf, S_IFCHR | devmode, dev); 304b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 30579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie 30679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 307ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chown(buf, user, group); 308ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 30979038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 31088dbee54ed400a3fd5594fab506518c171167805Rik Faith 31156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd = open(buf, O_RDWR, 0); 31256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: open result is %d, (%s)\n", 31356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes fd, fd < 0 ? strerror(errno) : "OK"); 314ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 315ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 316d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 31706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* Check if the device node is not what we expect it to be, and recreate it 31806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * and try again if so. 31906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 320d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt if (st.st_rdev != dev) { 321ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!isroot) 322ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return DRM_ERR_NOT_ROOT; 323d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt remove(buf); 324d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt mknod(buf, S_IFCHR | devmode, dev); 32579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (drm_server_info) { 326ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chown(buf, user, group); 327ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian chmod(buf, devmode); 32879038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie } 329d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt } 330d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd = open(buf, O_RDWR, 0); 331d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt drmMsg("drmOpenDevice: open result is %d, (%s)\n", 332d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt fd, fd < 0 ? strerror(errno) : "OK"); 333ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd >= 0) 334ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 335d2f2b42f1d206fd248ada48ce2c498e31351ab33Eric Anholt 33656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenDevice: Open failed\n"); 33788dbee54ed400a3fd5594fab506518c171167805Rik Faith remove(buf); 33888dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 339b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 340b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 343d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device 344d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 345d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param minor device minor number. 346d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param create allow to create the device if set. 347d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 349d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 350d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 351d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Calls drmOpenDevice() if \p create is set, otherwise assembles the device 352d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * name from \p minor and opens it. 353d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 35473bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airliestatic int drmOpenMinor(int minor, int create, int type) 35588dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 35688dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 35788dbee54ed400a3fd5594fab506518c171167805Rik Faith char buf[64]; 358db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 359ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (create) 36073bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie return drmOpenDevice(makedev(DRM_MAJOR, minor), minor, type); 36188dbee54ed400a3fd5594fab506518c171167805Rik Faith 36273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie sprintf(buf, type ? DRM_DEV_NAME : DRM_CONTROL_DEV_NAME, DRM_DIR_NAME, minor); 363ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if ((fd = open(buf, O_RDWR, 0)) >= 0) 364ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 36588dbee54ed400a3fd5594fab506518c171167805Rik Faith return -errno; 36688dbee54ed400a3fd5594fab506518c171167805Rik Faith} 36788dbee54ed400a3fd5594fab506518c171167805Rik Faith 368569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 369d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 370d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine whether the DRM kernel driver has been loaded. 371d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 372d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return 1 if the DRM driver is loaded, 0 otherwise. 373d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 374d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 375d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Determine the presence of the kernel driver by attempting to open the 0 376d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * minor and get version information. For backward compatibility with older 377d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Linux implementations, /proc/dri is also checked. 378d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 379569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulint drmAvailable(void) 380569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul{ 381569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul drmVersionPtr version; 382569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int retval = 0; 383569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul int fd; 384360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 38573bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) { 386b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#ifdef __linux__ 38722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Try proc for backward Linux compatibility */ 388ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!access("/proc/dri/0", R_OK)) 389ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 1; 390b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane#endif 39188dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 392569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 39388dbee54ed400a3fd5594fab506518c171167805Rik Faith 39488dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 39588dbee54ed400a3fd5594fab506518c171167805Rik Faith retval = 1; 39688dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 39788dbee54ed400a3fd5594fab506518c171167805Rik Faith } 39888dbee54ed400a3fd5594fab506518c171167805Rik Faith close(fd); 399569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 400569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul return retval; 401569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul} 402569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul 403d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 404d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 405d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by bus ID. 406d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. 408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function attempts to open every possible minor (up to DRM_MAX_MINOR), 413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * comparing the device bus ID with the one supplied. 414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor() and drmGetBusid(). 416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 417e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Straussstatic int drmOpenByBusid(const char *busid) 418e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss{ 41988dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 42088dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 42188dbee54ed400a3fd5594fab506518c171167805Rik Faith const char *buf; 42206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetVersion sv; 42306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 42406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid); 425db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie for (i = 0; i < DRM_MAX_MINOR; i++) { 42673bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie fd = drmOpenMinor(i, 1, DRM_NODE_RENDER); 42756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd); 42856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (fd >= 0) { 42906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = 1; 43006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = 1; 43106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = -1; /* Don't care */ 43226462b9aa47179e724e78f0b3b1c86fd07f61d8dEric Anholt sv.drm_dd_minor = -1; /* Don't care */ 43306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drmSetInterfaceVersion(fd, &sv); 434e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss buf = drmGetBusid(fd); 43556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); 43606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (buf && drmMatchBusID(buf, busid)) { 43788dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeBusid(buf); 43888dbee54ed400a3fd5594fab506518c171167805Rik Faith return fd; 439e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 440ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (buf) 441ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmFreeBusid(buf); 442e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss close(fd); 443e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 444e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss } 445e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss return -1; 446e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss} 447e1dba5c3a73078dec24f07a6d685435677db94a4Daryll Strauss 448d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 449d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 450d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the device by name. 451d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 452d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. 453d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 454d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 455d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 456d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 457d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function opens the first minor number that matches the driver name and 458d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * isn't already in use. If it's in use it then it will already have a bus ID 459d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * assigned. 460d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 461d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid(). 462d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 463b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussstatic int drmOpenByName(const char *name) 464b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss{ 46588dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 46688dbee54ed400a3fd5594fab506518c171167805Rik Faith int fd; 46788dbee54ed400a3fd5594fab506518c171167805Rik Faith drmVersionPtr version; 46856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes char * id; 46988dbee54ed400a3fd5594fab506518c171167805Rik Faith 470db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drmAvailable()) { 471db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drm_server_info) { 472db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie return -1; 473db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 474db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie else { 475db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie /* try to load the kernel module now */ 476db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie if (!drm_server_info->load_module(name)) { 477db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 478db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie return -1; 479db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 480db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 481db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie } 482db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie 48356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes /* 48456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * Open the first minor number that matches the driver name and isn't 48556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes * already in use. If it's in use it will have a busid assigned already. 48656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes */ 487db85ed25afc616acfaadb21facf6066354f9d490Dave Airlie for (i = 0; i < DRM_MAX_MINOR; i++) { 48873bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie if ((fd = drmOpenMinor(i, 1, DRM_NODE_RENDER)) >= 0) { 48988dbee54ed400a3fd5594fab506518c171167805Rik Faith if ((version = drmGetVersion(fd))) { 49088dbee54ed400a3fd5594fab506518c171167805Rik Faith if (!strcmp(version->name, name)) { 49188dbee54ed400a3fd5594fab506518c171167805Rik Faith drmFreeVersion(version); 49256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes id = drmGetBusid(fd); 49356bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL"); 49456bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (!id || !*id) { 49522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (id) 49656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 49756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return fd; 49856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 49956bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeBusid(id); 50056bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 50156bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } else { 50256bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes drmFreeVersion(version); 50388dbee54ed400a3fd5594fab506518c171167805Rik Faith } 50488dbee54ed400a3fd5594fab506518c171167805Rik Faith } 50556bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes close(fd); 50688dbee54ed400a3fd5594fab506518c171167805Rik Faith } 507b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 508b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 50988dbee54ed400a3fd5594fab506518c171167805Rik Faith#ifdef __linux__ 51022e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* Backward-compatibility /proc support */ 511b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (i = 0; i < 8; i++) { 51288dbee54ed400a3fd5594fab506518c171167805Rik Faith char proc_name[64], buf[512]; 51388dbee54ed400a3fd5594fab506518c171167805Rik Faith char *driver, *pt, *devstring; 51488dbee54ed400a3fd5594fab506518c171167805Rik Faith int retcode; 51588dbee54ed400a3fd5594fab506518c171167805Rik Faith 5160371c290a12f75d36c9c1e7c947bf98fe210908bDaryll Strauss sprintf(proc_name, "/proc/dri/%d/name", i); 517b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if ((fd = open(proc_name, 0, 0)) >= 0) { 518b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss retcode = read(fd, buf, sizeof(buf)-1); 519b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss close(fd); 520b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (retcode) { 521b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss buf[retcode-1] = '\0'; 522b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (driver = pt = buf; *pt && *pt != ' '; ++pt) 523b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 52422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson if (*pt) { /* Device is next */ 525b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss *pt = '\0'; 526b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (!strcmp(driver, name)) { /* Match */ 527b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss for (devstring = ++pt; *pt && *pt != ' '; ++pt) 528b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss ; 529b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss if (*pt) { /* Found busid */ 53088dbee54ed400a3fd5594fab506518c171167805Rik Faith return drmOpenByBusid(++pt); 53122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson } else { /* No busid */ 53273bf5e867089b58b2c4baaa833d15a2b1fb268a4Dave Airlie return drmOpenDevice(strtol(devstring, NULL, 0),i, DRM_NODE_RENDER); 533b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 534b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 535b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 536b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 537569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paul } 538b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss } 53988dbee54ed400a3fd5594fab506518c171167805Rik Faith#endif 54088dbee54ed400a3fd5594fab506518c171167805Rik Faith 541b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return -1; 542b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss} 543b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 544b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss 545d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 546d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Open the DRM device. 547d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 548d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Looks up the specified name and bus ID, and opens the device found. The 549d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * entry in /dev/dri is created if necessary and if called by root. 550d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 551d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param name driver name. Not referenced if bus ID is supplied. 552d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID. Zero if not known. 553d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 554d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a file descriptor on success, or a negative value on error. 555d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 556d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 557d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName() 558d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * otherwise. 559d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 560b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmOpen(const char *name, const char *busid) 561b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 56279038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drmAvailable() && name != NULL && drm_server_info) { 56306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt /* try to load the kernel */ 56479038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie if (!drm_server_info->load_module(name)) { 565ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmMsg("[drm] failed to load kernel module \"%s\"\n", name); 56606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 56706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 56806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 56906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 57006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (busid) { 571ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd = drmOpenByBusid(busid); 57206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (fd >= 0) 57306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return fd; 57406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 57522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 57606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (name) 57706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return drmOpenByName(name); 57822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 57906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return -1; 580b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 581b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 58287a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlieint drmOpenControl(int minor) 58387a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie{ 58487a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie return drmOpenMinor(minor, 0, DRM_NODE_CONTROL); 58587a32efcdde124df59656e00a402ba50a0ba1e45Dave Airlie} 586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the version information returned by drmGetVersion(). 589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It frees the memory pointed by \p %v as well as all the non-null strings 594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * pointers in it. 595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 596b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussvoid drmFreeVersion(drmVersionPtr v) 597b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 598ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 599ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 6009d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 6019d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 6029d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 603b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 604b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 605b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 606d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 607d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 608d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the non-public version information returned by the kernel. 609d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 610d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param v pointer to the version information. 611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to free the memory pointed by \p %v as well as all 614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the non-null strings pointers in it. 615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 616b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussstatic void drmFreeKernelVersion(drm_version_t *v) 617b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 618ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!v) 619ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 6209d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->name); 6219d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->date); 6229d8ba2d0d479f53b996c0a0e366acfee52daab3bJakob Bornecrantz drmFree(v->desc); 623b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(v); 624b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 625b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 626d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 627d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 628d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Copy version information. 629d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 630d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param d destination pointer. 631d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param s source pointer. 632d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 633d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 634d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by drmGetVersion() to translate the information returned by the ioctl 635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * interface in a private structure into the public structure counterpart. 636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 637569da5a42ebf10c86d6c6ba81866a888e1c708dcBrian Paulstatic void drmCopyVersion(drmVersionPtr d, const drm_version_t *s) 638b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 639b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_major = s->version_major; 640b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_minor = s->version_minor; 641b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->version_patchlevel = s->version_patchlevel; 642b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name_len = s->name_len; 643b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->name = drmStrdup(s->name); 644b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date_len = s->date_len; 645b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->date = drmStrdup(s->date); 646b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc_len = s->desc_len; 647b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss d->desc = drmStrdup(s->desc); 648b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 649b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 650b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 651d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 652d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Query the driver version information. 653d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 654d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 655d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return pointer to a drmVersion structure which should be freed with 657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * drmFreeVersion(). 658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note Similar information is available via /proc/dri. 660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It gets the version information via successive DRM_IOCTL_VERSION ioctls, 663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * first with zeros to get the string lengths, and then the actually strings. 664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It also null-terminates them since they might not be already. 665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 666b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmVersionPtr drmGetVersion(int fd) 667b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 668b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmVersionPtr retval; 669b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_version_t *version = drmMalloc(sizeof(*version)); 670b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 671b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name_len = 0; 672b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = NULL; 673b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date_len = 0; 674b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = NULL; 675b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc_len = 0; 676b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = NULL; 677360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 678b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_VERSION, version)) { 679b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 680b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 681b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 682b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 683b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) 684b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->name = drmMalloc(version->name_len + 1); 685b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) 686b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->date = drmMalloc(version->date_len + 1); 687b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) 688b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss version->desc = drmMalloc(version->desc_len + 1); 689360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 690b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_VERSION, version)) { 691b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno)); 692b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 693b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 694b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 695b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 69622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* The results might not be null-terminated strings, so terminate them. */ 697b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->name_len) version->name[version->name_len] = '\0'; 698b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->date_len) version->date[version->date_len] = '\0'; 699b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (version->desc_len) version->desc[version->desc_len] = '\0'; 700b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 701b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 702b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmCopyVersion(retval, version); 703b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFreeKernelVersion(version); 704b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 705b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 706b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 7073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get version information for the DRM user space library. 710d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 711d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This version number is driver independent. 712d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 713d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 714d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 715d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return version information. 716d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 717d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 718d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function allocates and fills a drm_version structure with a hard coded 719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * version number. 720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 7213903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens OwendrmVersionPtr drmGetLibVersion(int fd) 7223903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 7233903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen drm_version_t *version = drmMalloc(sizeof(*version)); 7243903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 7253903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen /* Version history: 72679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it 7273903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.0.x = original DRM interface with no drmGetLibVersion 7283903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * entry point and many drm<Device> extensions 7293903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * revision 1.1.x = added drmCommand entry points for device extensions 7303903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen * added drmGetLibVersion to identify libdrm.a version 73106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * revision 1.2.x = added drmSetInterfaceVersion 73206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * modified drmOpen to handle both busid and name 73379038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie * revision 1.3.x = added server + memory manager 7343903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen */ 73579038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_major = 1; 73679038751ffe47ed1ce82766e027d98fd2f0e2c6aDave Airlie version->version_minor = 3; 7373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen version->version_patchlevel = 0; 7383903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 7393903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return (drmVersionPtr)version; 7403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 7413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free the bus ID information. 745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID information string as given by drmGetBusid(). 747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is just frees the memory pointed by \p busid. 750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 751b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussvoid drmFreeBusid(const char *busid) 752b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 753b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drmFree((void *)busid); 754b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 755b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 756d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 757d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 758d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get the bus ID of the device. 759d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 760d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 761d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 762d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return bus ID string. 763d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 764d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 765d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to 766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * get the string length and data, passing the arguments in a drm_unique 767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * structure. 768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 769b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strausschar *drmGetBusid(int fd) 770b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 771b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 772b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 773b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = 0; 774b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = NULL; 775b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 776ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 777ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 778b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = drmMalloc(u.unique_len + 1); 779ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) 780ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 781b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique[u.unique_len] = '\0'; 78206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 783b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss return u.unique; 784b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 785b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the bus ID of the device. 789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busid bus ID string. 792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, negative on failure. 794d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 795d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 796d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing 797d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_unique structure. 798d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 799b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmSetBusid(int fd, const char *busid) 800b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 801b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss drm_unique_t u; 802b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 803b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique = (char *)busid; 804b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Strauss u.unique_len = strlen(busid); 805b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 80656bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) { 80756bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes return -errno; 80856bd9c207770d41a497f3e8237a1099dd9d4cd91David Dawes } 809b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 810b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 811b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8128696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMagic(int fd, drm_magic_t * magic) 813b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 814b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 815b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 816b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = 0; 817ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) 818ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 819b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *magic = auth.magic; 820b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 821b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 822b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 8238696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAuthMagic(int fd, drm_magic_t magic) 824b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 825b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_auth_t auth; 826b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 827b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss auth.magic = magic; 828ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) 829ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 830b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 831b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 832b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 833d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 834d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Specifies a range of memory that is available for mapping by a 835d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * non-root process. 836d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 837d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 838d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset usually the physical address. The actual meaning depends of 839d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the \p type parameter. See below. 840d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size of the memory in bytes. 841d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of the memory to be mapped. 842d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags combination of several flags to modify the function actions. 843d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle will be set to a value that may be used as the offset 844d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * parameter for mmap(). 845d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 846d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success or a negative value on error. 847d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the frame buffer 849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the frame buffer 850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the frame buffer, 851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the frame buffer in bytes, and 852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_FRAME_BUFFER. 853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. If MTRR support is available in the 856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel, the frame buffer area will be set to write combining. 857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the MMIO register area 859d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the MMIO register area, 860d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be the physical address of the start of the register area, 861d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the size of the register area bytes, and 862d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_REGISTERS. 863d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 864d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * The area mapped will be uncached. 865d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 866d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par Mapping the SAREA 867d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * For the SAREA, 868d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p offset will be ignored and should be set to zero, 869d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p size will be the desired size of the SAREA in bytes, 870d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * - \p type will be DRM_SHM. 871d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 872d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \par 873d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * A shared memory area of the requested size will be created and locked in 874d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * kernel memory. This area may be mapped into client-space by using the handle 875d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returned. 876d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 877d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 878d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 879d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 880d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing 881d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_map structure. 882d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 88322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type, 88422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drmMapFlags flags, drm_handle_t *handle) 885b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_map_t map; 887b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 888b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.offset = offset; 889b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.size = size; 890b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.handle = 0; 891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.type = type; 892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss map.flags = flags; 893ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) 894ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 895ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 896ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *handle = (drm_handle_t)map.handle; 897b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 898b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 899b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 9008696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmRmMap(int fd, drm_handle_t handle) 90174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 90274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_map_t map; 90374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 90474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.handle = (void *)handle; 90574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 906ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) 907ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 90874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 90974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 91074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 911d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 912d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Make buffers available for DMA transfers. 913d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 914d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 915d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers. 916d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of each buffer. 917d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags buffer allocation flags. 918d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param agp_offset offset in the AGP aperture 919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return number of buffers allocated, negative on error. 921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl. 924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \sa drm_buf_desc. 926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 927ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAddBufs(int fd, int count, int size, drmBufDescFlags flags, 928ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann int agp_offset) 929b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 930b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_desc_t request; 931360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 932b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 933b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.size = size; 934b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.low_mark = 0; 935b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.high_mark = 0; 936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.flags = flags; 937ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann request.agp_start = agp_offset; 938360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 939ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) 940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 941b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return request.count; 942b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 943b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 944b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmMarkBufs(int fd, double low, double high) 945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 946b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 947b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 949b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.count = 0; 950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list = NULL; 951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 952ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 953ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 954b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 955ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!info.count) 956ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 957360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 959b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return -ENOMEM; 960360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 961b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 962b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 963b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 964b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 965b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 966360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 967b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 968b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].low_mark = low * info.list[i].count; 969b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list[i].high_mark = high * info.list[i].count; 970b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) { 971b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int retval = -errno; 972b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 977360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 978b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 979b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 980b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 981d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 982d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free buffers. 983d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 984d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 985d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param count number of buffers to free. 986d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param list list of buffers to be freed. 987d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 988d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 989d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 990d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note This function is primarily used for debugging. 991d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 992d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 993d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing 994d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the arguments in a drm_buf_free structure. 995d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 996b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFreeBufs(int fd, int count, int *list) 997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_free_t request; 999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.count = count; 1001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss request.list = list; 1002ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) 1003ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1007d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1008d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1009d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Close the device. 1010d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1011d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1012d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1013d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1014d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function closes the file descriptor. 1015d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1016b6a28bfe98f2c89cfb91079bd3c7b63fb0144eb1Daryll Straussint drmClose(int fd) 1017b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1018b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss unsigned long key = drmGetKeyFromFd(fd); 1019b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1020b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1021b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDestroy(entry->tagTable); 1022b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->fd = 0; 1023b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->f = NULL; 1024b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss entry->tagTable = NULL; 1025b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1026b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(drmHashTable, key); 1027b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(entry); 1028b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1029b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return close(fd); 1030b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1031b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1032d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1033d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1034d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map a region of memory. 1035d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1036d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1037d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle returned by drmAddMap(). 1038d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmAddMap(). 1039d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address will contain the user-space virtual address where the mapping 1040d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * begins. 1041d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1042d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1043d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1044d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1045d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper for mmap(). 1046d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 104722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address) 1048b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1049c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane static unsigned long pagesize_mask = 0; 1050c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1051ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd < 0) 1052ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -EINVAL; 1053c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1054c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane if (!pagesize_mask) 1055c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane pagesize_mask = getpagesize() - 1; 1056c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1057c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane size = (size + pagesize_mask) & ~pagesize_mask; 1058c7558d8fa4df805b7f7ff3d631432eadac9b8a1cAlan Hourihane 1059b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); 1060ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (*address == MAP_FAILED) 1061ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1062b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1063b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1064b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1065d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1066d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1067d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap mappings obtained with drmMap(). 1068d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1069d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address address as given by drmMap(). 1070d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size in bytes. Must match the size used by drmMap(). 1071d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1072d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1073d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1074d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 107522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * This function is a wrapper for munmap(). 1076d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1077b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmap(drmAddress address, drmSize size) 1078b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1079b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return munmap(address, size); 1080b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1081b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1082b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufInfoPtr drmGetBufInfo(int fd) 1083b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1084b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_info_t info; 1085b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufInfoPtr retval; 1086b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1087b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1088b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.count = 0; 1089b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss info.list = NULL; 1090b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1091ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) 1092ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1093b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1094b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (info.count) { 1095b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1096b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1097360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1098b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 1099b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1100b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1101b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 110222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1103b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1104b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = info.count; 1105b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(info.count * sizeof(*retval->list)); 1106b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < info.count; i++) { 1107b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].count = info.list[i].count; 1108b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].size = info.list[i].size; 1109b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].low_mark = info.list[i].low_mark; 1110b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].high_mark = info.list[i].high_mark; 1111b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1112b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(info.list); 1113b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1114b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1115b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1116b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1117b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1118d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1119d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Map all DMA buffers into client-virtual space. 1120d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1121d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1122d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1123d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return a pointer to a ::drmBufMap structure. 1124d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1125d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note The client may not use these buffers until obtaining buffer indices 1126d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with drmDMA(). 1127d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1128d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1129d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned 1130d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * information about the buffers in a drm_buf_map structure into the 1131d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * client-visible data structures. 1132d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1133b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll StraussdrmBufMapPtr drmMapBufs(int fd) 1134b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1135b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_buf_map_t bufs; 1136b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmBufMapPtr retval; 1137b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1138360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1139b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss bufs.count = 0; 1140b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss bufs.list = NULL; 11418696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl bufs.virtual = NULL; 1142ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) 1143ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1144b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1145ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!bufs.count) 1146ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 11478696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1148b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) 1149b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1150b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1151b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) { 1152b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(bufs.list); 1153b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1154b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 115522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson 1156b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval = drmMalloc(sizeof(*retval)); 1157b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->count = bufs.count; 1158b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list = drmMalloc(bufs.count * sizeof(*retval->list)); 1159b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs.count; i++) { 1160b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].idx = bufs.list[i].idx; 1161b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].total = bufs.list[i].total; 1162b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].used = 0; 1163b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss retval->list[i].address = bufs.list[i].address; 1164b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 11658696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 11668696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs.list); 11678696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1168b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1169b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1170b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1171d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1172d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1173d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unmap buffers allocated with drmMapBufs(). 1174d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1175d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or negative value on failure. 1176d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1177d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 11788696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * Calls munmap() for every buffer stored in \p bufs and frees the 11798696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl * memory allocated by drmMapBufs(). 1180d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1181b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmUnmapBufs(drmBufMapPtr bufs) 1182b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1183b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1184360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1185b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss for (i = 0; i < bufs->count; i++) { 1186b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss munmap(bufs->list[i].address, bufs->list[i].total); 1187b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 11888696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 11898696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs->list); 11908696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmFree(bufs); 11918696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl 1192b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1193b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1194b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1195d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1196360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes#define DRM_DMA_RETRY 16 1197360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1198d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Reserve DMA buffers. 1200d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1201d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1202d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param request 1203d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1204d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1205d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1206d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1207d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Assemble the arguments into a drm_dma structure and keeps issuing the 1208d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * DRM_IOCTL_DMA ioctl until success or until maximum number of retries. 1209d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1210b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmDMA(int fd, drmDMAReqPtr request) 1211b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1212b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_dma_t dma; 1213360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes int ret, i = 0; 1214b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1215b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.context = request->context; 1216b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_count = request->send_count; 1217b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_indices = request->send_list; 1218b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.send_sizes = request->send_sizes; 1219b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.flags = request->flags; 1220b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_count = request->request_count; 1221b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_size = request->request_size; 1222b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_indices = request->request_list; 1223b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss dma.request_sizes = request->request_sizes; 12248696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl dma.granted_count = 0; 1225360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1226360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes do { 1227360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes ret = ioctl( fd, DRM_IOCTL_DMA, &dma ); 1228360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY ); 1229360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1230360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes if ( ret == 0 ) { 1231360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes request->granted_count = dma.granted_count; 1232360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return 0; 1233360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } else { 1234360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes return -errno; 1235360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes } 1236b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1237b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Obtain heavyweight hardware lock. 1241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param flags flags that determine the sate of the hardware when the function 1245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * returns. 1246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1247d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return always zero. 1248d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1249d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1250d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function translates the arguments into a drm_lock structure and issue 1251d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired. 1252d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 12538696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetLock(int fd, drm_context_t context, drmLockFlags flags) 1254b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1255b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1256b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1257b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1258b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1259b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 1260b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 1261b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 1262b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1263b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1264b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1265360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1266b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss while (ioctl(fd, DRM_IOCTL_LOCK, &lock)) 1267b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ; 1268b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1269b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1270b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the hardware lock. 1273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1275d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param context context. 1276d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1277d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1278d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1279d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1280d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the 1281d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_lock structure. 1282d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 12838696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmUnlock(int fd, drm_context_t context) 1284b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1285b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1286b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1287b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1288b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1289b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return ioctl(fd, DRM_IOCTL_UNLOCK, &lock); 1290b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1291b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 129222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksondrm_context_t *drmGetReservedContextList(int fd, int *count) 1293b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1294b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_res_t res; 1295b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t *list; 12968696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drm_context_t * retval; 1297b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss int i; 1298b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1299b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.count = 0; 1300b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = NULL; 1301ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) 1302ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1303b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1304ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!res.count) 1305ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1306b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1307ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (!(list = drmMalloc(res.count * sizeof(*list)))) 1308ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1309b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { 1310b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1311b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return NULL; 1312b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1313b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1314b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss res.contexts = list; 1315ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) 1316ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 1317b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1318ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < res.count; i++) 1319ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian retval[i] = list[i].handle; 1320b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(list); 1321b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1322b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *count = res.count; 1323b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return retval; 1324b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1325b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 132622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonvoid drmFreeReservedContextList(drm_context_t *pt) 1327b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1328b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmFree(pt); 1329b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1330b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Create context. 1333d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1334d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Used by the X server during GLXContext initialization. This causes 1335d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * per-context kernel-level resources to be allocated. 1336d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1337d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1338d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle is set on success. To be used by the client when requesting DMA 1339d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * dispatch with drmDMA(). 1340d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1341d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1342d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1343d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1344d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1345d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1346d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the 1347d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1348d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 134922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateContext(int fd, drm_context_t *handle) 1350b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1351b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1352b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1353b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.flags = 0; /* Modified with functions below */ 1354ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) 1355ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1356b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = ctx.handle; 1357b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1358b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1359b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 13608696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSwitchToContext(int fd, drm_context_t context) 1361b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1362b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1363b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1364b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1365ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) 1366ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1367b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1368b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1369b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 13708696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags) 1371b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1372b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1373b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 137422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson /* 137522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * Context preserving means that no context switches are done between DMA 137622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * buffers from one context and the next. This is suitable for use in the 137722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * X server (which promises to maintain hardware context), or in the 137822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson * client-side library when buffers are swapped on behalf of two threads. 137922e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson */ 1380b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1381b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.flags = 0; 1382ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_PRESERVED) 1383ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_PRESERVED; 1384ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (flags & DRM_CONTEXT_2DONLY) 1385ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian ctx.flags |= _DRM_CONTEXT_2DONLY; 1386ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) 1387ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1388b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1389b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1390b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 139122e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextFlags(int fd, drm_context_t context, 139222e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_context_tFlagsPtr flags) 1393b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1394b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1395b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1396b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = context; 1397ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) 1398ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1399b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *flags = 0; 1400ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_PRESERVED) 1401ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_PRESERVED; 1402ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ctx.flags & _DRM_CONTEXT_2DONLY) 1403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *flags |= DRM_CONTEXT_2DONLY; 1404b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1405b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1406360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 1407d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1408d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Destroy context. 1409d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1410d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free any kernel-level resources allocated with drmCreateContext() associated 1411d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * with the context. 1412d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1413d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1414d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle given by drmCreateContext(). 1415d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1416d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1417d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1418d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \note May only be called by root. 1419d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1420d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1421d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the 1422d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_ctx structure. 1423d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 14248696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyContext(int fd, drm_context_t handle) 1425b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1426b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_ctx_t ctx; 1427b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctx.handle = handle; 1428ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) 1429ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1430b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1431b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1432b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 143322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCreateDrawable(int fd, drm_drawable_t *handle) 1434b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1435b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1436ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) 1437ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1438b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss *handle = draw.handle; 1439b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1440b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1441b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14428696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDestroyDrawable(int fd, drm_drawable_t handle) 1443b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1444b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_draw_t draw; 1445b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss draw.handle = handle; 1446ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) 1447ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1448b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1449b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1450b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 14519810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzerint drmUpdateDrawableInfo(int fd, drm_drawable_t handle, 14529810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_drawable_info_type_t type, unsigned int num, 14539810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer void *data) 14549810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer{ 14559810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer drm_update_draw_t update; 14569810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 14579810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.handle = handle; 14589810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.type = type; 14599810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.num = num; 14609810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer update.data = (unsigned long long)(unsigned long)data; 14619810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1462ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) 1463ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 14649810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 14659810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer return 0; 14669810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer} 14679810ec2737de6aa81e764225f580e4ea39de437aMichel Dänzer 1468d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1469d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Acquire the AGP device. 1470d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1471d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Must be called before any of the other AGP related calls. 1472d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1473d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1474d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1475d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1476d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1477d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1478d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl. 1479d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1480ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAcquire(int fd) 1481ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1482ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) 1483ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1484ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1485ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1486ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1487d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1488d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1489d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Release the AGP device. 1490d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1491d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1492d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1493d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1494d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1495d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1496d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl. 1497d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1498ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpRelease(int fd) 1499ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1500ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) 1501ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1502ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1503ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1504ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1505d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1506d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1507d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Set the AGP mode. 1508d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1509d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1510d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param mode AGP mode. 1511d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1512d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1513d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1514d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1515d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the 1516d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_mode structure. 1517d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1518ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpEnable(int fd, unsigned long mode) 1519ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1520ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_mode_t m; 1521ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1522ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann m.mode = mode; 1523ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) 1524ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1525ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1526ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1527ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1528d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1529d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1530d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Allocate a chunk of AGP memory. 1531d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1532d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1533d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size requested memory size in bytes. Will be rounded to page boundary. 1534d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param type type of memory to allocate. 1535d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param address if not zero, will be set to the physical address of the 1536d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * allocated memory. 1537d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle on success will be set to a handle of the allocated memory. 1538d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1539d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1540d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1541d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1542d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the 1543d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_agp_buffer structure. 1544d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1545ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpAlloc(int fd, unsigned long size, unsigned long type, 15467ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlie unsigned long *address, drm_handle_t *handle) 1547ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1548ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1549b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane 1550b0a928557c91fec527f41ae8b2441174889bf32cAlan Hourihane *handle = DRM_AGP_NO_HANDLE; 1551ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = size; 1552ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = 0; 1553ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.type = type; 1554ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) 1555ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1556ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (address != 0UL) 1557ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *address = b.physical; 1558ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann *handle = b.handle; 1559ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1560ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1561ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1562d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1563d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1564d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Free a chunk of AGP memory. 1565d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1566d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1567d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1568d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1569d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1570d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1571d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1572d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the 1573d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_buffer structure. 1574d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 15757ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpFree(int fd, drm_handle_t handle) 1576ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1577ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_buffer_t b; 1578ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1579ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.size = 0; 1580ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1581ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) 1582ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1583ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1584ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1585ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1586d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1587d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1588d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Bind a chunk of AGP memory. 1589d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1590d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1591d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1592d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param offset offset in bytes. It will round to page boundary. 1593d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1594d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1595d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1596d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1597d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the 1598d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_agp_binding structure. 1599d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16007ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpBind(int fd, drm_handle_t handle, unsigned long offset) 1601ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1602ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1603ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1604ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1605ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = offset; 1606ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) 1607ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1608ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1609ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1610ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1611d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1612d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1613d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Unbind a chunk of AGP memory. 1614d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1615d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1616d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param handle handle to the allocated memory, as given by drmAgpAllocate(). 1617d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1618d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1619d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1620d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1621d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing 1622d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * the argument in a drm_agp_binding structure. 1623d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 16247ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmAgpUnbind(int fd, drm_handle_t handle) 1625ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1626ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_binding_t b; 1627ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1628ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.handle = handle; 1629ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann b.offset = 0; 1630ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) 1631ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1632ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return 0; 1633ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1634ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1635d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1636d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1637d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver major version number. 1638d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1639d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1640d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1641d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return major version number on success, or a negative value on failure.. 1642d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1643d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1644d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1645d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1646d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1647ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMajor(int fd) 1648ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1649ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1650ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1651ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1652ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1653ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_major; 1654ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1655ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1656d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1657d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1658d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP driver minor version number. 1659d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1660d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1661d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1662d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return minor version number on success, or a negative value on failure. 1663d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1664d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1665d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1666d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1667d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1668ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannint drmAgpVersionMinor(int fd) 1669ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1670ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1671ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1672ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1673ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1674ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.agp_version_minor; 1675ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1676ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1677d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1678d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1679d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP mode. 1680d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1681d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1682d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1683d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return mode on success, or zero on failure. 1684d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1685d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1686d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1687d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1688d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1689ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpGetMode(int fd) 1690ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1691ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1692ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1693ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1694ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1695ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.mode; 1696ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1697ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1698d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1699d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1700d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture base. 1701d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1702d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1703d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1704d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture base on success, zero on failure. 1705d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1706d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1707d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1708d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1709d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1710ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpBase(int fd) 1711ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1712ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1713ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1714ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1715ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1716ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_base; 1717ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1718ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1719d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1720d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1721d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get AGP aperture size. 1722d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1723d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1724d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1725d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return aperture size on success, zero on failure. 1726d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1727d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1728d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1729d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1730d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1731ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpSize(int fd) 1732ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1733ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1734ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1735ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1736ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1737ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.aperture_size; 1738ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1739ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1740d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1741d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1742d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get used AGP memory. 1743d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1744d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1745d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1746d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory used on success, or zero on failure. 1747d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1748d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1749d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1750d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1751d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1752ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryUsed(int fd) 1753ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1754ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1755ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1756ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1757ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1758ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_used; 1759ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1760ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1761d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1762d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1763d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get available AGP memory. 1764d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1765d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1766d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1767d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return memory available on success, or zero on failure. 1768d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1769d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1770d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1771d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1772d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1773ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned long drmAgpMemoryAvail(int fd) 1774ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1775ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1776ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1777ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1778ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1779ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.memory_allowed; 1780ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1781ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1782d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1783d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1784d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware vendor ID. 1785d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1786d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1787d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1788d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return vendor ID on success, or zero on failure. 1789d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1790d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1791d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1792d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1793d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1794ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpVendorId(int fd) 1795ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1796ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1797ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1798ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1799ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1800ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_vendor; 1801ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1802ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1803d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1804d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1805d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get hardware device ID. 1806d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1807d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1808d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1809d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or zero on failure. 1810d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1811d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1812d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the 1813d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * necessary information in a drm_agp_info structure. 1814d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1815ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmannunsigned int drmAgpDeviceId(int fd) 1816ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann{ 1817ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann drm_agp_info_t i; 1818ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 1819ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) 1820ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return 0; 1821ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann return i.id_device; 1822ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann} 1823ba1b1ae3806490cce16a9c8957b52cd74967f463Jeff Hartmann 18247ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle) 18255d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 18265d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 18275d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 18285d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = 0; 18295d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = size; 18305d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = 0; 1831ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) 1832ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 18335d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin *handle = sg.handle; 18345d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 18355d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 18365d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 18377ede209ce0cbbc65f79d02e2cc43cfcb3abb6e99Dave Airlieint drmScatterGatherFree(int fd, drm_handle_t handle) 18385d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin{ 18395d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin drm_scatter_gather_t sg; 18405d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 18415d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.size = 0; 18425d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin sg.handle = handle; 1843ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) 1844ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 18455d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin return 0; 18465d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin} 18475d6ddbca26d695561fb1d08d798a0cc254b805e7Kevin E Martin 1848d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1849d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Wait for VBLANK. 1850d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1851d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1852d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param vbl pointer to a drmVBlank structure. 1853d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1854d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1855d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1856d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1857d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl. 1858d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 185955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzerint drmWaitVBlank(int fd, drmVBlankPtr vbl) 186055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer{ 186155acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer int ret; 186255acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 186355acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer do { 186455acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl); 1865c7d471b6ae936127311a816a8d15b4565746af48Michel Daenzer vbl->request.type &= ~DRM_VBLANK_RELATIVE; 186655acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer } while (ret && errno == EINTR); 186755acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 186855acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer return ret; 186955acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer} 187055acd0d5a64a2ee6b0cecc75872fbf8c4bb42a0cMichel Daenzer 1871b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmError(int err, const char *label) 1872b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1873b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss switch (err) { 1874ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_DEVICE: 1875ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no device\n", label); 1876ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1877ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NO_ACCESS: 1878ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: no access\n", label); 1879ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1880ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_NOT_ROOT: 1881ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: not root\n", label); 1882ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1883ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian case DRM_ERR_INVALID: 1884ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "%s: invalid args\n", label); 1885ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian break; 1886b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss default: 1887ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (err < 0) 1888ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian err = -err; 1889b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); 1890b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss break; 1891b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1892b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1893b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 1; 1894b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1895b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1896d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1897d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Install IRQ handler. 1898d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1899d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1900d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param irq IRQ number. 1901d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1902d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1903d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1904d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1905d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 1906d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 1907d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1908b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlInstHandler(int fd, int irq) 1909b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1910b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 1911b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1912b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_INST_HANDLER; 1913b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = irq; 1914ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) 1915ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1916b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1917b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1918b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1919d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 1920d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1921d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Uninstall IRQ handler. 1922d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1923d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1924d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1925d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 1926d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1927d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1928d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the 1929d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * argument in a drm_control structure. 1930d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1931b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmCtlUninstHandler(int fd) 1932b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1933b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_control_t ctl; 1934b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1935b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.func = DRM_UNINST_HANDLER; 1936b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss ctl.irq = 0; 1937ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) 1938ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1939b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1940b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1941b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1942b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmFinish(int fd, int context, drmLockFlags flags) 1943b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1944b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_lock_t lock; 1945b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1946b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.context = context; 1947b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss lock.flags = 0; 1948b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_READY) lock.flags |= _DRM_LOCK_READY; 1949b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_QUIESCENT) lock.flags |= _DRM_LOCK_QUIESCENT; 1950b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH) lock.flags |= _DRM_LOCK_FLUSH; 1951b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1952b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1953b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1954ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) 1955ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1956b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1957b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1958b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1959d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 1960d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Get IRQ from bus ID. 1961d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1962d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 1963d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param busnum bus number. 1964d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param devnum device number. 1965d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param funcnum function number. 1966d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1967d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return IRQ number on success, or a negative value on failure. 1968d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 1969d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 1970d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the 1971d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * arguments in a drm_irq_busid structure. 1972d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 1973b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Straussint drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum) 1974b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1975b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drm_irq_busid_t p; 1976b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1977b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.busnum = busnum; 1978b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.devnum = devnum; 1979b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss p.funcnum = funcnum; 1980ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) 1981ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 1982b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return p.irq; 1983b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1984b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 19858696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmAddContextTag(int fd, drm_context_t context, void *tag) 1986b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1987b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1988b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 1989b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss if (drmHashInsert(entry->tagTable, context, tag)) { 1990b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashDelete(entry->tagTable, context); 1991b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashInsert(entry->tagTable, context, tag); 1992b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss } 1993b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return 0; 1994b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 1995b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 19968696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmDelContextTag(int fd, drm_context_t context) 1997b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 1998b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 1999b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2000b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return drmHashDelete(entry->tagTable, context); 2001b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2002b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 20038696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlvoid *drmGetContextTag(int fd, drm_context_t context) 2004b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss{ 2005b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss drmHashEntry *entry = drmGetEntry(fd); 2006b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss void *value; 2007360475376c5a597caf4a981c934a6b0d783fa94dGareth Hughes 2008ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (drmHashLookup(entry->tagTable, context, &value)) 2009ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return NULL; 2010b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 2011b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss return value; 2012b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss} 2013b3a5766992019fc5f44cc9afd01b2617b76f47aDaryll Strauss 201422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, 201522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t handle) 201674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 201774e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 201874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 201974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 202074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.handle = (void *)handle; 202174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2022ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) 2023ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 202474e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 202574e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 202674e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 202722e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 202822e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson drm_handle_t *handle) 202974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin{ 203074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin drm_ctx_priv_map_t map; 203174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 203274e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin map.ctx_id = ctx_id; 203374e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 2034ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) 2035ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 2036ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (handle) 2037ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *handle = (drm_handle_t)map.handle; 203874e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 203974e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin return 0; 204074e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin} 204174e19a40187ac3b5907922e5dc01418135a5794bKevin E Martin 20428696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirlint drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size, 20438696e71db2d79eb318c00abde625d7b61d6800a1Jon Smirl drmMapType *type, drmMapFlags *flags, drm_handle_t *handle, 204488dbee54ed400a3fd5594fab506518c171167805Rik Faith int *mtrr) 204588dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 204688dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_map_t map; 204788dbee54ed400a3fd5594fab506518c171167805Rik Faith 204888dbee54ed400a3fd5594fab506518c171167805Rik Faith map.offset = idx; 2049ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) 2050ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 205188dbee54ed400a3fd5594fab506518c171167805Rik Faith *offset = map.offset; 205288dbee54ed400a3fd5594fab506518c171167805Rik Faith *size = map.size; 205388dbee54ed400a3fd5594fab506518c171167805Rik Faith *type = map.type; 205488dbee54ed400a3fd5594fab506518c171167805Rik Faith *flags = map.flags; 205588dbee54ed400a3fd5594fab506518c171167805Rik Faith *handle = (unsigned long)map.handle; 205688dbee54ed400a3fd5594fab506518c171167805Rik Faith *mtrr = map.mtrr; 205788dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 205888dbee54ed400a3fd5594fab506518c171167805Rik Faith} 205988dbee54ed400a3fd5594fab506518c171167805Rik Faith 206088dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetClient(int fd, int idx, int *auth, int *pid, int *uid, 206188dbee54ed400a3fd5594fab506518c171167805Rik Faith unsigned long *magic, unsigned long *iocs) 206288dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 206388dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_client_t client; 206488dbee54ed400a3fd5594fab506518c171167805Rik Faith 206588dbee54ed400a3fd5594fab506518c171167805Rik Faith client.idx = idx; 2066ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) 2067ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 206888dbee54ed400a3fd5594fab506518c171167805Rik Faith *auth = client.auth; 206988dbee54ed400a3fd5594fab506518c171167805Rik Faith *pid = client.pid; 207088dbee54ed400a3fd5594fab506518c171167805Rik Faith *uid = client.uid; 207188dbee54ed400a3fd5594fab506518c171167805Rik Faith *magic = client.magic; 207288dbee54ed400a3fd5594fab506518c171167805Rik Faith *iocs = client.iocs; 207388dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 207488dbee54ed400a3fd5594fab506518c171167805Rik Faith} 207588dbee54ed400a3fd5594fab506518c171167805Rik Faith 207688dbee54ed400a3fd5594fab506518c171167805Rik Faithint drmGetStats(int fd, drmStatsT *stats) 207788dbee54ed400a3fd5594fab506518c171167805Rik Faith{ 207888dbee54ed400a3fd5594fab506518c171167805Rik Faith drm_stats_t s; 207988dbee54ed400a3fd5594fab506518c171167805Rik Faith int i; 208088dbee54ed400a3fd5594fab506518c171167805Rik Faith 2081ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) 2082ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return -errno; 208388dbee54ed400a3fd5594fab506518c171167805Rik Faith 208488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = 0; 208588dbee54ed400a3fd5594fab506518c171167805Rik Faith memset(stats, 0, sizeof(*stats)); 208688dbee54ed400a3fd5594fab506518c171167805Rik Faith if (s.count > sizeof(stats->data)/sizeof(stats->data[0])) 208788dbee54ed400a3fd5594fab506518c171167805Rik Faith return -1; 208888dbee54ed400a3fd5594fab506518c171167805Rik Faith 208988dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_VALUE \ 209088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 209188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%8.8s"; \ 209288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 1; \ 209388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 209488dbee54ed400a3fd5594fab506518c171167805Rik Faith 209588dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_COUNT \ 209688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 209788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 209888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 209988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "kgm"; \ 210088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1000; \ 210188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 210288dbee54ed400a3fd5594fab506518c171167805Rik Faith 210388dbee54ed400a3fd5594fab506518c171167805Rik Faith#define SET_BYTE \ 210488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_format = "%-20.20s"; \ 210588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_format = "%5.5s"; \ 210688dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].isvalue = 0; \ 210788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult_names = "KGM"; \ 210888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].mult = 1024; \ 210988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 0 211088dbee54ed400a3fd5594fab506518c171167805Rik Faith 211188dbee54ed400a3fd5594fab506518c171167805Rik Faith 211288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->count = s.count; 211388dbee54ed400a3fd5594fab506518c171167805Rik Faith for (i = 0; i < s.count; i++) { 211488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].value = s.data[i].value; 211588dbee54ed400a3fd5594fab506518c171167805Rik Faith switch (s.data[i].type) { 211688dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCK: 211788dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Lock"; 211888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 211988dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 212088dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 212188dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_OPENS: 212288dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Opens"; 212388dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "O"; 212488dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 212588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 212688dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 212788dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_CLOSES: 212888dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Closes"; 212988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lock"; 213088dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 213188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].verbose = 1; 213288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 213388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IOCTLS: 213488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Ioctls"; 213588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ioc/s"; 213688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 213788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 213888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_LOCKS: 213988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Locks"; 214088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Lck/s"; 214188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 214288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 214388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_UNLOCKS: 214488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Unlocks"; 214588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Unl/s"; 214688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 214788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 214888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_IRQ: 214988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "IRQs"; 215088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "IRQ/s"; 215188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 215288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 215388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_PRIMARY: 215488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Primary Bytes"; 215588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "PB/s"; 215688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 215788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 215888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SECONDARY: 215988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Secondary Bytes"; 216088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "SB/s"; 216188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 216288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 216388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_DMA: 216488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "DMA"; 216588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "DMA/s"; 216688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 216788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 216888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_SPECIAL: 216988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Special DMA"; 217088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "dma/s"; 217188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 217288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 217388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_MISSED: 217488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Miss"; 217588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Ms/s"; 217688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 217788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 217888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_VALUE: 217988dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Value"; 218088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Value"; 218188dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_VALUE; 218288dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 218388dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_BYTE: 218488dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Bytes"; 218588dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "B/s"; 218688dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_BYTE; 218788dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 218888dbee54ed400a3fd5594fab506518c171167805Rik Faith case _DRM_STAT_COUNT: 218988dbee54ed400a3fd5594fab506518c171167805Rik Faith default: 219088dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].long_name = "Count"; 219188dbee54ed400a3fd5594fab506518c171167805Rik Faith stats->data[i].rate_name = "Cnt/s"; 219288dbee54ed400a3fd5594fab506518c171167805Rik Faith SET_COUNT; 219388dbee54ed400a3fd5594fab506518c171167805Rik Faith break; 219488dbee54ed400a3fd5594fab506518c171167805Rik Faith } 219588dbee54ed400a3fd5594fab506518c171167805Rik Faith } 219688dbee54ed400a3fd5594fab506518c171167805Rik Faith return 0; 219788dbee54ed400a3fd5594fab506518c171167805Rik Faith} 219888dbee54ed400a3fd5594fab506518c171167805Rik Faith 2199d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 220006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * Issue a set-version ioctl. 220106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 220206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param fd file descriptor. 220306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param drmCommandIndex command index 220406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param data source pointer of the data to be read and written. 220506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \param size size of the data to be read and written. 220606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 220706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \return zero on success, or a negative value on failure. 220806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * 220906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \internal 221006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * It issues a read-write ioctl given by 221106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 221206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt */ 221322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmSetInterfaceVersion(int fd, drmSetVersion *version) 221406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt{ 221506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt int retcode = 0; 221606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt drm_set_version_t sv; 221706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 221806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_major = version->drm_di_major; 221906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_di_minor = version->drm_di_minor; 222006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_major = version->drm_dd_major; 222106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt sv.drm_dd_minor = version->drm_dd_minor; 222206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 222306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt if (ioctl(fd, DRM_IOCTL_SET_VERSION, &sv)) { 222406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt retcode = -errno; 222506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt } 222606cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 222706cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_major = sv.drm_di_major; 222806cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_di_minor = sv.drm_di_minor; 222906cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_major = sv.drm_dd_major; 223006cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt version->drm_dd_minor = sv.drm_dd_minor; 223106cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 223206cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt return retcode; 223306cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt} 223406cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt 223506cb132e86dc4a04044c3c76725ba3037008ab34Eric Anholt/** 2236d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific command. 2237d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2238d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2239d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2240d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2241d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2242d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2243d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2244d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a ioctl given by 2245d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2246d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 22473903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owenint drmCommandNone(int fd, unsigned long drmCommandIndex) 22483903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 22493903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen void *data = NULL; /* dummy */ 22503903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 22513903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 22523903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex); 22533903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 22543903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen if (ioctl(fd, request, data)) { 22553903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 22563903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 22573903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 22583903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 22593903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2260d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2261d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2262d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read command. 2263d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2264d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2265d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2266d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data destination pointer of the data to be read. 2267d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read. 2268d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2269d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2270d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2271d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2272d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read ioctl given by 2273d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2274d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 227522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandRead(int fd, unsigned long drmCommandIndex, void *data, 227622e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 22773903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 22783903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 22793903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 228074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 228174ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 22823903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 22833903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen if (ioctl(fd, request, data)) { 22843903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 22853903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 22863903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 22873903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 22883903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2289d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2290d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2291d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific write command. 2292d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2293d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2294d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2295d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be written. 2296d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be written. 2297d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2298d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2299d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2300d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2301d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a write ioctl given by 2302d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2303d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 230422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWrite(int fd, unsigned long drmCommandIndex, void *data, 230522e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 23063903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 23073903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 23083903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 230974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 231074ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 23113903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 23123903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen if (ioctl(fd, request, data)) { 23133903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 23143903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 23153903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 23163903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 23173903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 2318d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca 2319d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca/** 2320d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * Send a device-specific read-write command. 2321d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2322d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param fd file descriptor. 2323d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param drmCommandIndex command index 2324d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param data source pointer of the data to be read and written. 2325d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \param size size of the data to be read and written. 2326d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2327d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \return zero on success, or a negative value on failure. 2328d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * 2329d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \internal 2330d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * It issues a read-write ioctl given by 2331d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca * \code DRM_COMMAND_BASE + drmCommandIndex \endcode. 2332d2443b2186712dd7c977b47e06444396e1e493ffJose Fonseca */ 233322e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jacksonint drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data, 233422e41ef08338ae6dd59acbe6d4d8e50d83672816Adam Jackson unsigned long size) 23353903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen{ 23363903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen unsigned long request; 23373903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 233874ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 233974ef13fd009b9e37956e4207d0a5ed92f4b5e39aAlan Hourihane DRM_COMMAND_BASE + drmCommandIndex, size); 23403903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen 23413903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen if (ioctl(fd, request, data)) { 23423903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return -errno; 23433903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen } 23443903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen return 0; 23453903e5ac94c07cf31f0bc24eff5011ef8cc7afbaJens Owen} 2346166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2347279e8d26c6cf7347aa9cb6d50d025a41dff9a5beThomas Hellstrom 234849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/* 234949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are 235049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_EMIT 235149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE 235249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER 235349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */ 235449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom 235503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlieint drmFenceCreate(int fd, unsigned flags, int fence_class, unsigned type, 2356166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drmFence *fence) 2357166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2358166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 2359e0f53e59be4b96ed6eb28bd2df9f6a9d789d1734Thomas Hellstrom 2360bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2361e0f53e59be4b96ed6eb28bd2df9f6a9d789d1734Thomas Hellstrom arg.flags = flags; 2362166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.type = type; 236303c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie arg.fence_class = fence_class; 236403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie 23656a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_CREATE, &arg)) 2366166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return -errno; 2367166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->handle = arg.handle; 236803c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2369166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->type = arg.type; 2370191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom fence->flags = arg.flags; 2371166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->signaled = 0; 2372166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return 0; 2373166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2374604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom 237549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/* 237649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are 237749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE 237849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER 237949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */ 238049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom 238103c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlieint drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence) 2382604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom{ 2383604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom drm_fence_arg_t arg; 2384ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2385bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 238649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom arg.flags = flags; 238703c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie arg.fence_class = fence_class; 23886a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 23896a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg)) 2390604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom return -errno; 2391604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom fence->handle = arg.handle; 239203c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2393604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom fence->type = arg.type; 2394191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom fence->flags = arg.flags; 239503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->sequence = arg.sequence; 2396604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom fence->signaled = 0; 2397604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom return 0; 2398604215396847a7964fd7d68aa89d4f778b3bf22bThomas Hellstrom} 2399166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2400166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceReference(int fd, unsigned handle, drmFence *fence) 2401166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2402166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 2403ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2404bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2405166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.handle = handle; 24066a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 24076a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_REFERENCE, &arg)) 2408166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return -errno; 2409166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->handle = arg.handle; 241003c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2411166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->type = arg.type; 241249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom fence->flags = arg.flags; 2413166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->signaled = arg.signaled; 2414166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return 0; 2415166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2416166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2417166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceUnreference(int fd, const drmFence *fence) 2418166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2419166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 2420ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2421bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2422166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.handle = fence->handle; 24236a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 24246a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_UNREFERENCE, &arg)) 2425166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return -errno; 2426166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return 0; 2427166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2428166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2429166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstromint drmFenceFlush(int fd, drmFence *fence, unsigned flush_type) 2430166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2431166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 2432ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2433bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2434166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.handle = fence->handle; 2435166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.type = flush_type; 24366a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 24376a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_FLUSH, &arg)) 2438166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return -errno; 243903c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2440166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->type = arg.type; 2441166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->signaled = arg.signaled; 2442c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return arg.error; 2443166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2444166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2445191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceUpdate(int fd, drmFence *fence) 2446166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2447ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drm_fence_arg_t arg; 2448ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2449bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 245056563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom arg.handle = fence->handle; 24516a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 24526a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_SIGNALED, &arg)) 245356563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom return -errno; 245403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 245556563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom fence->type = arg.type; 245656563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom fence->signaled = arg.signaled; 245756563c22d658b6dcb7926fd41513618cd46c31a6Thomas Hellstrom return 0; 2458191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom} 2459191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2460191e284709ee792a32124e96e43d5876406b93dcThomas Hellstromint drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, 2461191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom int *signaled) 2462191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom{ 2463191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) || 2464191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom ((fenceType & fence->signaled) != fenceType)) { 2465ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int ret = drmFenceFlush(fd, fence, fenceType); 2466191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom if (ret) 2467191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom return ret; 2468191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom } 2469191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2470191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom *signaled = ((fenceType & fence->signaled) == fenceType); 2471191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2472166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return 0; 2473166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2474166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 247549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/* 247649fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are 247749fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_SHAREABLE 247849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_MASK_DRIVER 247949fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */ 2480191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2481191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 248249fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type) 2483166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2484166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 24857766378d97323de375687285f2e125008b79045dThomas Hellstrom 2486bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 248703c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie arg.fence_class = fence->fence_class; 248849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom arg.flags = flags; 2489166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.handle = fence->handle; 2490166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.type = emit_type; 24916a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 24926a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie if (ioctl(fd, DRM_IOCTL_FENCE_EMIT, &arg)) 2493166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return -errno; 249403c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2495166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->type = arg.type; 2496166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->signaled = arg.signaled; 24976abbbb2f4f5b6b280077a6c88bb643507c8ec8faBen Skeggs fence->sequence = arg.sequence; 2498166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom return 0; 2499166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 250049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom 250149fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom/* 250249fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * Valid flags are 250349fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_LAZY 250449fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS 250549fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom */ 2506c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2507c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom#define DRM_IOCTL_TIMEOUT_USEC 3000000UL 2508c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2509c06808fb6521822238bca4574758f30246b71c2dThomas Hellstromstatic unsigned long 2510c06808fb6521822238bca4574758f30246b71c2dThomas HellstromdrmTimeDiff(struct timeval *now, struct timeval *then) 2511c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom{ 2512c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom uint64_t val; 2513c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2514c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom val = now->tv_sec - then->tv_sec; 2515c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom val *= 1000000LL; 2516c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom val += now->tv_usec; 2517c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom val -= then->tv_usec; 2518c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2519c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return (unsigned long) val; 2520c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom} 2521c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2522c06808fb6521822238bca4574758f30246b71c2dThomas Hellstromstatic int 2523c06808fb6521822238bca4574758f30246b71c2dThomas HellstromdrmIoctlTimeout(int fd, unsigned long request, void *argp) 2524c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom{ 2525c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom int haveThen = 0; 2526c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom struct timeval then, now; 2527c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom int ret; 2528c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2529c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom do { 2530c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = ioctl(fd, request, argp); 2531c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom if (ret != 0 && errno == EAGAIN) { 2532c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom if (!haveThen) { 2533c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom gettimeofday(&then, NULL); 2534c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom haveThen = 1; 2535c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom } 2536c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom gettimeofday(&now, NULL); 2537c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom } 2538c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom } while (ret != 0 && errno == EAGAIN && 2539c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom drmTimeDiff(&now, &then) < DRM_IOCTL_TIMEOUT_USEC); 2540c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2541c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom if (ret != 0) 2542c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ((errno == EAGAIN) ? -EBUSY : -errno); 2543c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2544c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return 0; 2545c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom} 2546166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2547c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2548c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 2549c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom 255049fbeb339c232804866cd548d6023fe559597353Thomas Hellstromint drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type) 2551166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom{ 2552166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom drm_fence_arg_t arg; 2553166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom int ret; 2554166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2555c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom if (flush_type == 0) { 2556c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom flush_type = fence->type; 2557c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom } 2558c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom 2559191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) { 256049fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom if ((flush_type & fence->signaled) == flush_type) { 2561191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom return 0; 2562191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom } 2563191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom } 2564191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2565bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2566166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.handle = fence->handle; 2567166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom arg.type = flush_type; 256849fbeb339c232804866cd548d6023fe559597353Thomas Hellstrom arg.flags = flags; 25696a62941ecaa7d2b8f14b30920856bfa52aee4775Dave Airlie 2570166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 2571c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = drmIoctlTimeout(fd, DRM_IOCTL_FENCE_WAIT, &arg); 2572166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom if (ret) 2573c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ret; 2574166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 257503c47f1420bf17a1e0f2b86be500656ae5a4c95bDave Airlie fence->fence_class = arg.fence_class; 2576166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->type = arg.type; 2577166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom fence->signaled = arg.signaled; 2578c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return arg.error; 2579166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom} 2580166da9355d95affe427a6cff3525df60e80a99dfThomas Hellstrom 25812c9e05cf4c6eb18c941321f764ed1b282a314ba9Dave Airliestatic void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf) 2582ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{ 2583ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->handle = rep->handle; 2584ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->flags = rep->flags; 2585ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->size = rep->size; 2586ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->offset = rep->offset; 2587ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->mapHandle = rep->arg_handle; 2588d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard buf->proposedFlags = rep->proposed_flags; 2589ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->start = rep->buffer_start; 2590ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->fenceFlags = rep->fence_flags; 2591ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom buf->replyFlags = rep->rep_flags; 2592f6d5fecdd20b9fd9e8744d8f43fa276b73a1da78Thomas Hellstrom buf->pageAlignment = rep->page_alignment; 2593b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom buf->tileInfo = rep->tile_info; 2594b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom buf->hwTileStride = rep->hw_tile_stride; 2595b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom buf->desiredTileStride = rep->desired_tile_stride; 2596ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom} 2597ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom 2598b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom 2599b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom 2600dccefba71a65566e7e1628b3be67621866000411Kristian Høgsbergint drmBOCreate(int fd, unsigned long size, 2601dccefba71a65566e7e1628b3be67621866000411Kristian Høgsberg unsigned pageAlignment, void *user_buffer, 2602d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard uint64_t flags, 2603de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom unsigned hint, drmBO *buf) 2604de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{ 260525c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_create_arg arg; 260625c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_create_req *req = &arg.d.req; 260725c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_rep *rep = &arg.d.rep; 260830703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom int ret; 260930703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom 2610bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(buf, 0, sizeof(*buf)); 2611bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2612d1187641d64f442968a3b9ea6a19de6cdd45acd4Keith Packard req->flags = flags; 2613de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom req->hint = hint; 2614de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom req->size = size; 2615f6d5fecdd20b9fd9e8744d8f43fa276b73a1da78Thomas Hellstrom req->page_alignment = pageAlignment; 2616dccefba71a65566e7e1628b3be67621866000411Kristian Høgsberg req->buffer_start = (unsigned long) user_buffer; 2617de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2618405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom buf->virtual = NULL; 2619de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2620c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_CREATE, &arg); 262130703893674b3da5b862dee2acd6efca13424398Thomas Hellstrom if (ret) 2622c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ret; 262394c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom 2624ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom drmBOCopyReply(rep, buf); 262594c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom buf->virtual = user_buffer; 262614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom buf->mapCount = 0; 2627de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2628de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom return 0; 2629de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom} 2630de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2631de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstromint drmBOReference(int fd, unsigned handle, drmBO *buf) 2632de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{ 263325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_reference_info_arg arg; 263425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_handle_arg *req = &arg.d.req; 263525c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_rep *rep = &arg.d.rep; 2636de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2637bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2638de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom req->handle = handle; 2639de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 264025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie if (ioctl(fd, DRM_IOCTL_BO_REFERENCE, &arg)) 2641de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom return -errno; 2642de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2643ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom drmBOCopyReply(rep, buf); 264414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom buf->mapVirtual = NULL; 264514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom buf->mapCount = 0; 2646de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom buf->virtual = NULL; 2647ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom 2648de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom return 0; 2649de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom} 2650de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2651efc4fd7c4dabed384fa1ab67e744d38025aff47dDave Airlieint drmBOUnreference(int fd, drmBO *buf) 2652de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom{ 265325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_handle_arg arg; 265499acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom 265594c22c334948a49641f4a1fa84687f992e5cc5cbThomas Hellstrom if (buf->mapVirtual && buf->mapHandle) { 2656eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom (void) munmap(buf->mapVirtual, buf->start + buf->size); 265799acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom buf->mapVirtual = NULL; 265899acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom buf->virtual = NULL; 265999acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom } 266099acb7936660843090ea8a9f22d2d50d9433e0deThomas Hellstrom 2661bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 266225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie arg.handle = buf->handle; 2663de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 266425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie if (ioctl(fd, DRM_IOCTL_BO_UNREFERENCE, &arg)) 2665de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom return -errno; 2666de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 2667de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom buf->handle = 0; 2668de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom return 0; 2669de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom} 2670de144ba23c1245cf021a63cc739c7c9903568272Thomas Hellstrom 267125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie 267214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom/* 2673ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Flags can be DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together 2674ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the 2675ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom * call return an -EBUSY if it can' immediately honor the mapping request. 267614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom */ 267714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 2678ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstromint drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint, 2679ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom void **address) 268014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{ 268125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_map_wait_idle_arg arg; 268225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_req *req = &arg.d.req; 268325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_rep *rep = &arg.d.rep; 268414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom int ret = 0; 268514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 268614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom /* 268714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom * Make sure we have a virtual address of the buffer. 268814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom */ 268914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 2690440fc5113ef1ffb1a22bff92cf34eaf23896db8d[utf- if (!buf->virtual) { 2691405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom drmAddress virtual; 2692eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom virtual = mmap(0, buf->size + buf->start, 2693eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom PROT_READ | PROT_WRITE, MAP_SHARED, 2694eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom fd, buf->mapHandle); 2695f2db76e2f206d2017f710eaddc4b33add4498898Thomas Hellstrom if (virtual == MAP_FAILED) { 2696eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom ret = -errno; 2697f2db76e2f206d2017f710eaddc4b33add4498898Thomas Hellstrom } 2698eacedf41a65f135722e7bee6f1a66a803619237fThomas Hellstrom if (ret) 2699405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom return ret; 2700405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom buf->mapVirtual = virtual; 2701405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom buf->virtual = ((char *) virtual) + buf->start; 270214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom } 270314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 2704bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 270514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom req->handle = buf->handle; 2706ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom req->mask = mapFlags; 2707ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom req->hint = mapHint; 270814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 270914a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom /* 271014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom * May hang if the buffer object is busy. 271114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom * This IOCTL synchronizes the buffer. 271214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom */ 271314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 2714c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_MAP, &arg); 2715c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom if (ret) 2716c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ret; 2717405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom 2718405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom drmBOCopyReply(rep, buf); 2719ff95ea5536d70f9bc8eac12f2c97dae71fb97066Thomas Hellstrom buf->mapFlags = mapFlags; 2720405b5d9ca8cc9f6c5c7bb764c684bf74ba7660c6Thomas Hellstrom ++buf->mapCount; 272114a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom *address = buf->virtual; 272214a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 272314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom return 0; 272414a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom} 272514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 272625c51f539f254937d116699e66f8c382d78e71d4Dave Airlie 272714a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstromint drmBOUnmap(int fd, drmBO *buf) 272814a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom{ 272925c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_handle_arg arg; 273014a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 2731bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 273225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie arg.handle = buf->handle; 273314a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom 273425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie if (ioctl(fd, DRM_IOCTL_BO_UNMAP, &arg)) { 273514a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom return -errno; 273614a835be616183e733a2d6a7dcc697b8a6f46cafThomas Hellstrom } 27373c995c2c4d2530e5bd01548764b20c4d062fd7a5Eric Anholt buf->mapCount--; 2738ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom return 0; 2739ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom} 2740b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom 2741733ff568346e8fe40e9790f21f8b7efc659d5d12Thomas Hellstromint drmBOSetStatus(int fd, drmBO *buf, 2742086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom uint64_t flags, uint64_t mask, 2743086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom unsigned int hint, 2744086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom unsigned int desired_tile_stride, 2745086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom unsigned int tile_info) 2746ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom{ 2747d4ce4be0dad516caa43fddcd8a56c28f264c9c2aThomas Hellstrom 2748086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom struct drm_bo_map_wait_idle_arg arg; 2749086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom struct drm_bo_info_req *req = &arg.d.req; 2750086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom struct drm_bo_info_rep *rep = &arg.d.rep; 2751ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom int ret = 0; 2752ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom 2753bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2754086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->mask = mask; 2755086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->flags = flags; 2756086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->handle = buf->handle; 2757086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->hint = hint; 2758086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->desired_tile_stride = desired_tile_stride; 2759086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom req->tile_info = tile_info; 2760086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom 2761c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_SETSTATUS, &arg); 2762ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom if (ret) 2763c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ret; 2764ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom 2765086c058a417317491320129d2cbeb68d1cfcfefeThomas Hellstrom drmBOCopyReply(rep, buf); 2766c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return 0; 2767ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom} 2768ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom 2769ec8c79b79de6544cc09b5a2c85213a5f30e0d906Thomas Hellstrom 2770ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstromint drmBOInfo(int fd, drmBO *buf) 2771ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{ 277225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_reference_info_arg arg; 277325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_handle_arg *req = &arg.d.req; 277425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_rep *rep = &arg.d.rep; 2775ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom int ret = 0; 2776ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom 2777bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2778ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom req->handle = buf->handle; 2779ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom 278025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie ret = ioctl(fd, DRM_IOCTL_BO_INFO, &arg); 2781ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom if (ret) 2782e6e4946c82ab6f63143df7f49f38fa56f7e8980aThomas Hellstrom return -errno; 278325c51f539f254937d116699e66f8c382d78e71d4Dave Airlie 2784ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom drmBOCopyReply(rep, buf); 2785ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom return 0; 2786ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom} 2787c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom 2788c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOWaitIdle(int fd, drmBO *buf, unsigned hint) 2789c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom{ 279025c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_map_wait_idle_arg arg; 279125c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_req *req = &arg.d.req; 279225c51f539f254937d116699e66f8c382d78e71d4Dave Airlie struct drm_bo_info_rep *rep = &arg.d.rep; 2793c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom int ret = 0; 2794c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom 2795c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom if ((buf->flags & DRM_BO_FLAG_SHAREABLE) || 2796c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom (buf->replyFlags & DRM_BO_REP_BUSY)) { 2797bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2798c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom req->handle = buf->handle; 2799c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom req->hint = hint; 2800c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom 2801c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_WAIT_IDLE, &arg); 2802c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom if (ret) 2803c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return ret; 280425c51f539f254937d116699e66f8c382d78e71d4Dave Airlie 2805c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom drmBOCopyReply(rep, buf); 2806c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom } 2807c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom return 0; 2808c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstrom} 28090d1926d36e59ddfc34d8c9c0cdef10b71a49ecf1Thomas Hellstrom 2810c4fad4c96168a3dfabaa8a7e97758fefd014c8a7Thomas Hellstromint drmBOBusy(int fd, drmBO *buf, int *busy) 2811ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom{ 2812ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom if (!(buf->flags & DRM_BO_FLAG_SHAREABLE) && 2813ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom !(buf->replyFlags & DRM_BO_REP_BUSY)) { 2814ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom *busy = 0; 2815ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom return 0; 2816ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2817ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian else { 2818ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom int ret = drmBOInfo(fd, buf); 2819ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom if (ret) 2820ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom return ret; 2821ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom *busy = (buf->replyFlags & DRM_BO_REP_BUSY); 2822ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom return 0; 2823ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom } 2824ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom} 2825ef8e618cf30ab7dcbe8c7211e0c2508c5520a669Thomas Hellstrom 28265881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstromint drmMMInit(int fd, unsigned long pOffset, unsigned long pSize, 28275881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom unsigned memType) 2828e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{ 2829ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie struct drm_mm_init_arg arg; 2830ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2831bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2832ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie 2833b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom arg.magic = DRM_BO_INIT_MAGIC; 2834b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom arg.major = DRM_BO_INIT_MAJOR; 2835b6b5df24b962c94433afe4d8665b5f145bfa1ad3Thomas Hellstrom arg.minor = DRM_BO_INIT_MINOR; 2836ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.p_offset = pOffset; 2837ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.p_size = pSize; 2838ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.mem_type = memType; 2839191e284709ee792a32124e96e43d5876406b93dcThomas Hellstrom 2840e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) 2841e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom return -errno; 2842e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom return 0; 2843e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom} 2844e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom 28455881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstromint drmMMTakedown(int fd, unsigned memType) 2846e47a4fda2ef7aada45b7799ad20e8012102dc12eThomas Hellstrom{ 2847ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie struct drm_mm_type_arg arg; 2848bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom 2849bd8ca12b7baff778d5bb7b4ad1d38d16b60a4d5aThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2850ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.mem_type = memType; 28515881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom 2852ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie if (ioctl(fd, DRM_IOCTL_MM_TAKEDOWN, &arg)) 28535881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom return -errno; 28545881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom return 0; 28555881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom} 28565881ce1b91034fbdf81dda37a23215cfc1310cdfThomas Hellstrom 285748b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom/* 285848b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom * If this function returns an error, and lockBM was set to 1, 285948b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom * the buffer manager is NOT locked. 286048b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom */ 286148b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstrom 28623b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstromint drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict) 28635443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom{ 2864ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie struct drm_mm_type_arg arg; 28655443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom 28665443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2867ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.mem_type = memType; 28683b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstrom arg.lock_flags |= (lockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0; 28696420d33b02db0da900140c238bb35f13abc182e7Thomas Hellstrom arg.lock_flags |= (ignoreNoEvict) ? DRM_BO_LOCK_IGNORE_NO_EVICT : 0; 28705443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom 2871c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return drmIoctlTimeout(fd, DRM_IOCTL_MM_LOCK, &arg); 28725443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom} 28735443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom 287448b5eaf303b60077faed09db77785d7a544ac335Thomas Hellstromint drmMMUnlock(int fd, unsigned memType, int unlockBM) 28755443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom{ 2876ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie struct drm_mm_type_arg arg; 28775443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom 28785443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom memset(&arg, 0, sizeof(arg)); 2879ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie 2880ee8954cb53e4964a5565833b5a937f1cbcb60d44Dave Airlie arg.mem_type = memType; 28813b19b50cb5cd31e60eb03e99dd1109b6d0f5b8a3Thomas Hellstrom arg.lock_flags |= (unlockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0; 28825443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom 2883c06808fb6521822238bca4574758f30246b71c2dThomas Hellstrom return drmIoctlTimeout(fd, DRM_IOCTL_MM_UNLOCK, &arg); 28845443dbe35f182b9286a96d24d29037d5cb625e3dThomas Hellstrom} 2885d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 288611f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstromint drmBOVersion(int fd, unsigned int *major, 288711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom unsigned int *minor, 288811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom unsigned int *patchlevel) 288911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom{ 289011f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom struct drm_bo_version_arg arg; 289111f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom int ret; 289211f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 289311f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom memset(&arg, 0, sizeof(arg)); 289411f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom ret = ioctl(fd, DRM_IOCTL_BO_VERSION, &arg); 289511f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom if (ret) 2896a4c87d3796cac374d25e01b26bdbb9028ce03107Thomas Hellstrom return -errno; 289711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 289811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom if (major) 289911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom *major = arg.major; 290011f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom if (minor) 290111f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom *minor = arg.minor; 290211f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom if (patchlevel) 290311f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom *patchlevel = arg.patchlevel; 290411f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 2905a4c87d3796cac374d25e01b26bdbb9028ce03107Thomas Hellstrom return 0; 290611f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom} 290711f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 290811f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 290911f3e5e53f8fc4de90d1c289e0ba218ddfca23dcThomas Hellstrom 2910d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie#define DRM_MAX_FDS 16 2911d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic struct { 2912ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian char *BusID; 2913ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2914ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int refcount; 2915d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} connection[DRM_MAX_FDS]; 2916d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2917d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airliestatic int nr_fds = 0; 2918d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2919d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlieint drmOpenOnce(void *unused, 2920d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie const char *BusID, 2921d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie int *newlyopened) 2922d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2923ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2924ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int fd; 2925d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2926ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) 2927ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (strcmp(BusID, connection[i].BusID) == 0) { 2928ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i].refcount++; 2929ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 0; 2930ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return connection[i].fd; 2931ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2932ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian 2933ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fd = drmOpen(unused, BusID); 2934ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd <= 0 || nr_fds == DRM_MAX_FDS) 2935ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2936d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2937ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].BusID = strdup(BusID); 2938ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].fd = fd; 2939ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[nr_fds].refcount = 1; 2940ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian *newlyopened = 1; 2941d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2942ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (0) 2943ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian fprintf(stderr, "saved connection %d for %s %d\n", 2944ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds, connection[nr_fds].BusID, 2945ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian strcmp(BusID, connection[nr_fds].BusID)); 2946d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2947ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian nr_fds++; 2948d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2949ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return fd; 2950d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2951d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2952d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlievoid drmCloseOnce(int fd) 2953d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie{ 2954ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian int i; 2955d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2956ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian for (i = 0; i < nr_fds; i++) { 2957ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (fd == connection[i].fd) { 2958ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (--connection[i].refcount == 0) { 2959ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian drmClose(connection[i].fd); 2960ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian free(connection[i].BusID); 2961d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2962ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian if (i < --nr_fds) 2963ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian connection[i] = connection[nr_fds]; 2964d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie 2965ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian return; 2966ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2967ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2968ccd7b6e8ddeac936518f626d2326ae439931b2bfBrian } 2969d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1eDave Airlie} 2970