XORG_NV/sun-src/xc/extras/drm/libdrm/xf86drm.c
author Daniel Zhu <Daniel.Zhu@Sun.COM>
Tue, 24 Oct 2006 18:42:11 -0700
changeset 75 64e817c4a743
permissions -rw-r--r--
PSARC 2004/801 DRI porting 6418052 Direct Rendering Infrastructure (DRI) should be supported by Xorg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     1
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     2
 * \file xf86drm.c
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     3
 * User-level interface to DRM device
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     4
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     5
 * \author Rickard E. (Rik) Faith <[email protected]>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     6
 * \author Kevin E. Martin <[email protected]>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     7
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     8
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
     9
/*
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    10
 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    11
 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    12
 * All Rights Reserved.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    13
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    14
 * Permission is hereby granted, free of charge, to any person obtaining a
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    15
 * copy of this software and associated documentation files (the "Software"),
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    16
 * to deal in the Software without restriction, including without limitation
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    17
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    18
 * and/or sell copies of the Software, and to permit persons to whom the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    19
 * Software is furnished to do so, subject to the following conditions:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    20
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    21
 * The above copyright notice and this permission notice (including the next
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    22
 * paragraph) shall be included in all copies or substantial portions of the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    23
 * Software.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    24
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    25
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    26
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    27
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    28
 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    29
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    30
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    31
 * DEALINGS IN THE SOFTWARE.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    32
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    33
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    34
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.36 2003/08/24 17:35:35 tsi Exp $ */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    35
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    36
#ifdef HAVE_XORG_CONFIG_H
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    37
#include <xorg-config.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    38
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    39
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    40
#ifdef XFree86Server
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    41
# include "xf86.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    42
# include "xf86_OSproc.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    43
# include "drm.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    44
# include "xf86_ansic.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    45
# define _DRM_MALLOC xalloc
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    46
# define _DRM_FREE   xfree
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    47
# ifndef XFree86LOADER
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    48
#  include <sys/mman.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    49
# endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    50
#else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    51
# include <stdio.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    52
# include <stdlib.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    53
# include <unistd.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    54
# include <string.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    55
# include <ctype.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    56
# include <fcntl.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    57
# include <errno.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    58
# include <signal.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    59
# include <sys/types.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    60
# include <sys/stat.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    61
# define stat_t struct stat
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    62
# include <sys/ioctl.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    63
# include <sys/mman.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    64
# include <sys/time.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    65
# include <stdarg.h>
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    66
# ifdef DRM_USE_MALLOC
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    67
#  define _DRM_MALLOC malloc
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    68
#  define _DRM_FREE   free
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    69
# else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    70
#  define _DRM_MALLOC malloc
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    71
#  define _DRM_FREE   free
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    72
# endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    73
# include "drm.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    74
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    75
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    76
/* No longer needed with CVS kernel modules on alpha
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    77
#if defined(__alpha__) && defined(__linux__)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    78
extern unsigned long _bus_base(void);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    79
#define BUS_BASE _bus_base()
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    80
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    81
*/
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    82
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    83
/* Not all systems have MAP_FAILED defined */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    84
#ifndef MAP_FAILED
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    85
#define MAP_FAILED ((void *)-1)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    86
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    87
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    88
#include "xf86drm.h"
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    89
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    90
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    91
#define DRM_MAJOR 145
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    92
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    93
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    94
#ifdef __NetBSD__
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    95
#define DRM_MAJOR 34
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    96
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    97
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    98
# ifdef __OpenBSD__
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
    99
#  define DRM_MAJOR 81
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   100
# endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   101
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   102
#ifndef DRM_MAJOR
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   103
#define DRM_MAJOR 226		/* Linux */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   104
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   105
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   106
#ifndef DRM_MAX_MINOR
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   107
#define DRM_MAX_MINOR 16
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   108
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   109
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   110
#ifndef makedev
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   111
				/* This definition needs to be changed on
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   112
                                   some systems if dev_t is a structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   113
                                   If there is a header file we can get it
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   114
                                   from, there would be best. */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   115
#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   116
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   117
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   118
#define DRM_MSG_VERBOSITY 3
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   119
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   120
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   121
 * Output a message to stderr.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   122
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   123
 * \param format printf() like format string.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   124
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   125
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   126
 * This function is a wrapper around vfprintf().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   127
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   128
static void
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   129
drmMsg(const char *format, ...)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   130
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   131
    va_list	ap;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   132
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   133
#ifndef XFree86Server
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   134
    const char *env;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   135
    if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose"))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   136
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   137
    {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   138
	va_start(ap, format);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   139
#ifdef XFree86Server
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   140
	xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   141
#else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   142
	vfprintf(stderr, format, ap);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   143
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   144
	va_end(ap);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   145
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   146
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   147
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   148
static void *drmHashTable = NULL; /* Context switch callbacks */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   149
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   150
typedef struct drmHashEntry {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   151
    int      fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   152
    void     (*f)(int, void *, void *);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   153
    void     *tagTable;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   154
} drmHashEntry;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   155
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   156
void *drmMalloc(int size)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   157
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   158
    void *pt;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   159
    if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   160
    return pt;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   161
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   162
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   163
void drmFree(void *pt)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   164
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   165
    if (pt) _DRM_FREE(pt);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   166
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   167
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   168
/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   169
static char *drmStrdup(const char *s)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   170
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   171
    char *retval = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   172
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   173
    if (s) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   174
	retval = _DRM_MALLOC(strlen(s)+1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   175
	strcpy(retval, s);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   176
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   177
    return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   178
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   179
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   180
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   181
static unsigned long drmGetKeyFromFd(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   182
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   183
    stat_t     st;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   184
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   185
    st.st_rdev = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   186
    fstat(fd, &st);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   187
    return st.st_rdev;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   188
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   189
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   190
static drmHashEntry *drmGetEntry(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   191
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   192
    unsigned long key = drmGetKeyFromFd(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   193
    void          *value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   194
    drmHashEntry  *entry;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   195
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   196
    if (!drmHashTable) drmHashTable = drmHashCreate();
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   197
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   198
    if (drmHashLookup(drmHashTable, key, &value)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   199
	entry           = drmMalloc(sizeof(*entry));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   200
	entry->fd       = fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   201
	entry->f        = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   202
	entry->tagTable = drmHashCreate();
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   203
	drmHashInsert(drmHashTable, key, entry);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   204
    } else {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   205
	entry = value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   206
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   207
    return entry;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   208
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   209
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   210
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   211
 * Compare two busid strings
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   212
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   213
 * \param first
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   214
 * \param second
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   215
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   216
 * \return 1 if matched.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   217
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   218
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   219
 * This function compares two bus ID strings.  It understands the older
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   220
 * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format.  In the format, o is
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   221
 * domain, b is bus, d is device, f is function.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   222
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   223
static int drmMatchBusID(const char *id1, const char *id2)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   224
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   225
    /* First, check if the IDs are exactly the same */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   226
    if (strcasecmp(id1, id2) == 0)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   227
	return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   228
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   229
    /* Try to match old/new-style PCI bus IDs. */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   230
    if (strncasecmp(id1, "pci", 3) == 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   231
	int o1, b1, d1, f1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   232
	int o2, b2, d2, f2;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   233
	int ret;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   234
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   235
	ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   236
	if (ret != 4) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   237
	    o1 = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   238
	    ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   239
	    if (ret != 3)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   240
		return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   241
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   242
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   243
	ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   244
	if (ret != 4) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   245
	    o2 = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   246
	    ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   247
	    if (ret != 3)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   248
		return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   249
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   250
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   251
	if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   252
	    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   253
	else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   254
	    return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   255
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   256
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   257
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   258
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   259
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   260
 * Open the DRM device, creating it if necessary.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   261
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   262
 * \param dev major and minor numbers of the device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   263
 * \param minor minor number of the device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   264
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   265
 * \return a file descriptor on success, or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   266
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   267
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   268
 * Assembles the device name from \p minor and opens it, creating the device
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   269
 * special file node with the major and minor numbers specified by \p dev and
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   270
 * parent directory if necessary and was called by root.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   271
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   272
static int drmOpenDevice(long dev, int minor)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   273
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   274
    stat_t          st;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   275
    char            buf[64];
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   276
    int             fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   277
    mode_t          devmode = DRM_DEV_MODE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   278
    int             isroot  = !geteuid();
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   279
#if defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   280
    uid_t           user    = DRM_DEV_UID;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   281
    gid_t           group   = DRM_DEV_GID;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   282
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   283
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   284
    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   285
    drmMsg("drmOpenDevice: node name is %s\n", buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   286
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   287
#if defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   288
    devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   289
    devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   290
    group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   291
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   292
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   293
    if (stat(DRM_DIR_NAME, &st)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   294
	if (!isroot) return DRM_ERR_NOT_ROOT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   295
	mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   296
	chown(DRM_DIR_NAME, 0, 0); /* root:root */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   297
	chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   298
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   299
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   300
    /* Check if the device node exists and create it if necessary. */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   301
    if (stat(buf, &st)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   302
	if (!isroot) return DRM_ERR_NOT_ROOT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   303
	remove(buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   304
	mknod(buf, S_IFCHR | devmode, dev);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   305
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   306
#if defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   307
    chown(buf, user, group);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   308
    chmod(buf, devmode);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   309
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   310
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   311
    fd = open(buf, O_RDWR, 0);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   312
    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   313
		fd, fd < 0 ? strerror(errno) : "OK");
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   314
    if (fd >= 0) return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   315
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   316
    /* Check if the device node is not what we expect it to be, and recreate it
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   317
     * and try again if so.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   318
     */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   319
    if (st.st_rdev != dev) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   320
	if (!isroot) return DRM_ERR_NOT_ROOT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   321
	remove(buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   322
	mknod(buf, S_IFCHR | devmode, dev);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   323
#if defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   324
	chown(buf, user, group);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   325
	chmod(buf, devmode);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   326
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   327
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   328
    fd = open(buf, O_RDWR, 0);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   329
    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   330
		fd, fd < 0 ? strerror(errno) : "OK");
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   331
    if (fd >= 0) return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   332
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   333
    drmMsg("drmOpenDevice: Open failed\n");
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   334
    remove(buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   335
    return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   336
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   337
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   338
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   339
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   340
 * Open the DRM device
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   341
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   342
 * \param minor device minor number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   343
 * \param create allow to create the device if set.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   344
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   345
 * \return a file descriptor on success, or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   346
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   347
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   348
 * Calls drmOpenDevice() if \p create is set, otherwise assembles the device
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   349
 * name from \p minor and opens it.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   350
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   351
static int drmOpenMinor(int minor, int create)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   352
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   353
    int  fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   354
    char buf[64];
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   355
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   356
    if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   357
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   358
    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   359
    if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   360
    return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   361
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   362
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   363
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   364
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   365
 * Determine whether the DRM kernel driver has been loaded.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   366
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   367
 * \return 1 if the DRM driver is loaded, 0 otherwise.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   368
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   369
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   370
 * Determine the presence of the kernel driver by attempting to open the 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   371
 * minor and get version information.  For backward compatibility with older
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   372
 * Linux implementations, /proc/dri is also checked.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   373
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   374
int drmAvailable(void)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   375
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   376
    drmVersionPtr version;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   377
    int           retval = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   378
    int           fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   379
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   380
    if ((fd = drmOpenMinor(0, 1)) < 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   381
#ifdef __linux__
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   382
				/* Try proc for backward Linux compatibility */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   383
	if (!access("/proc/dri/0", R_OK)) return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   384
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   385
	return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   386
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   387
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   388
    if ((version = drmGetVersion(fd))) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   389
	retval = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   390
	drmFreeVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   391
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   392
    close(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   393
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   394
    return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   395
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   396
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   397
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   398
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   399
 * Open the device by bus ID.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   400
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   401
 * \param busid bus ID.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   402
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   403
 * \return a file descriptor on success, or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   404
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   405
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   406
 * This function attempts to open every possible minor (up to DRM_MAX_MINOR),
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   407
 * comparing the device bus ID with the one supplied.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   408
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   409
 * \sa drmOpenMinor() and drmGetBusid().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   410
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   411
static int drmOpenByBusid(const char *busid)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   412
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   413
    int        i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   414
    int        fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   415
    const char *buf;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   416
    drmSetVersion sv;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   417
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   418
    drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   419
    for (i = 0; i < DRM_MAX_MINOR; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   420
	fd = drmOpenMinor(i, 1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   421
	drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   422
	if (fd >= 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   423
	    sv.drm_di_major = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   424
	    sv.drm_di_minor = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   425
	    sv.drm_dd_major = -1;	/* Don't care */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   426
	    drmSetInterfaceVersion(fd, &sv);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   427
	    buf = drmGetBusid(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   428
	    drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   429
	    if (buf && drmMatchBusID(buf, busid)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   430
		drmFreeBusid(buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   431
		return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   432
	    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   433
	    if (buf) drmFreeBusid(buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   434
	    close(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   435
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   436
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   437
    return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   438
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   439
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   440
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   441
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   442
 * Open the device by name.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   443
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   444
 * \param name driver name.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   445
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   446
 * \return a file descriptor on success, or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   447
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   448
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   449
 * This function opens the first minor number that matches the driver name and
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   450
 * isn't already in use.  If it's in use it then it will already have a bus ID
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   451
 * assigned.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   452
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   453
 * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   454
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   455
static int drmOpenByName(const char *name)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   456
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   457
    int           i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   458
    int           fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   459
    drmVersionPtr version;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   460
    char *        id;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   461
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   462
    if (!drmAvailable()) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   463
#if !defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   464
	return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   465
#else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   466
        /* try to load the kernel module now */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   467
        if (!xf86LoadKernelModule(name)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   468
            ErrorF("[drm] failed to load kernel module \"%s\"\n",
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   469
		   name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   470
            return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   471
        }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   472
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   473
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   474
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   475
    /*
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   476
     * Open the first minor number that matches the driver name and isn't
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   477
     * already in use.  If it's in use it will have a busid assigned already.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   478
     */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   479
    for (i = 0; i < DRM_MAX_MINOR; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   480
	if ((fd = drmOpenMinor(i, 1)) >= 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   481
	    if ((version = drmGetVersion(fd))) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   482
		if (!strcmp(version->name, name)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   483
		    drmFreeVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   484
		    id = drmGetBusid(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   485
		    drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   486
		    if (!id || !*id) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   487
			if (id) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   488
			    drmFreeBusid(id);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   489
			}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   490
			return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   491
		    } else {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   492
			drmFreeBusid(id);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   493
		    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   494
		} else {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   495
		    drmFreeVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   496
		}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   497
	    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   498
	    close(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   499
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   500
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   501
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   502
#ifdef __linux__
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   503
				/* Backward-compatibility /proc support */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   504
    for (i = 0; i < 8; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   505
	char proc_name[64], buf[512];
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   506
	char *driver, *pt, *devstring;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   507
	int  retcode;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   508
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   509
	sprintf(proc_name, "/proc/dri/%d/name", i);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   510
	if ((fd = open(proc_name, 0, 0)) >= 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   511
	    retcode = read(fd, buf, sizeof(buf)-1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   512
	    close(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   513
	    if (retcode) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   514
		buf[retcode-1] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   515
		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   516
		    ;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   517
		if (*pt) {	/* Device is next */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   518
		    *pt = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   519
		    if (!strcmp(driver, name)) { /* Match */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   520
			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   521
			    ;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   522
			if (*pt) { /* Found busid */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   523
			    return drmOpenByBusid(++pt);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   524
			} else {	/* No busid */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   525
			    return drmOpenDevice(strtol(devstring, NULL, 0),i);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   526
			}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   527
		    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   528
		}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   529
	    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   530
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   531
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   532
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   533
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   534
    return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   535
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   536
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   537
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   538
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   539
 * Open the DRM device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   540
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   541
 * Looks up the specified name and bus ID, and opens the device found.  The
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   542
 * entry in /dev/dri is created if necessary and if called by root.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   543
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   544
 * \param name driver name. Not referenced if bus ID is supplied.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   545
 * \param busid bus ID. Zero if not known.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   546
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   547
 * \return a file descriptor on success, or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   548
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   549
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   550
 * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName()
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   551
 * otherwise.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   552
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   553
int drmOpen(const char *name, const char *busid)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   554
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   555
#ifdef XFree86Server
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   556
    if (!drmAvailable() && name != NULL) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   557
	/* try to load the kernel */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   558
	if (!xf86LoadKernelModule(name)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   559
	    ErrorF("[drm] failed to load kernel module \"%s\"\n",
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   560
	           name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   561
	    return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   562
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   563
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   564
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   565
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   566
    if (busid) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   567
	int fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   568
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   569
	fd = drmOpenByBusid(busid);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   570
	if (fd >= 0)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   571
	    return fd;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   572
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   573
    if (name)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   574
	return drmOpenByName(name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   575
    return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   576
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   577
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   578
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   579
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   580
 * Free the version information returned by drmGetVersion().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   581
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   582
 * \param v pointer to the version information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   583
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   584
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   585
 * It frees the memory pointed by \p %v as well as all the non-null strings
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   586
 * pointers in it.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   587
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   588
void drmFreeVersion(drmVersionPtr v)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   589
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   590
    if (!v) return;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   591
    if (v->name) drmFree(v->name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   592
    if (v->date) drmFree(v->date);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   593
    if (v->desc) drmFree(v->desc);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   594
    drmFree(v);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   595
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   596
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   597
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   598
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   599
 * Free the non-public version information returned by the kernel.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   600
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   601
 * \param v pointer to the version information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   602
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   603
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   604
 * Used by drmGetVersion() to free the memory pointed by \p %v as well as all
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   605
 * the non-null strings pointers in it.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   606
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   607
static void drmFreeKernelVersion(drm_version_t *v)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   608
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   609
    if (!v) return;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   610
    if (v->name) drmFree(v->name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   611
    if (v->date) drmFree(v->date);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   612
    if (v->desc) drmFree(v->desc);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   613
    drmFree(v);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   614
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   615
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   616
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   617
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   618
 * Copy version information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   619
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   620
 * \param d destination pointer.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   621
 * \param s source pointer.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   622
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   623
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   624
 * Used by drmGetVersion() to translate the information returned by the ioctl
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   625
 * interface in a private structure into the public structure counterpart.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   626
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   627
static void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   628
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   629
    d->version_major      = s->version_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   630
    d->version_minor      = s->version_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   631
    d->version_patchlevel = s->version_patchlevel;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   632
    d->name_len           = s->name_len;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   633
    d->name               = drmStrdup(s->name);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   634
    d->date_len           = s->date_len;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   635
    d->date               = drmStrdup(s->date);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   636
    d->desc_len           = s->desc_len;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   637
    d->desc               = drmStrdup(s->desc);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   638
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   639
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   640
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   641
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   642
 * Query the driver version information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   643
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   644
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   645
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   646
 * \return pointer to a drmVersion structure which should be freed with
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   647
 * drmFreeVersion().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   648
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   649
 * \note Similar information is available via /proc/dri.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   650
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   651
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   652
 * It gets the version information via successive DRM_IOCTL_VERSION ioctls,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   653
 * first with zeros to get the string lengths, and then the actually strings.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   654
 * It also null-terminates them since they might not be already.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   655
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   656
drmVersionPtr drmGetVersion(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   657
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   658
    drmVersionPtr retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   659
    drm_version_t *version = drmMalloc(sizeof(*version));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   660
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   661
				/* First, get the lengths */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   662
    version->name_len    = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   663
    version->name        = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   664
    version->date_len    = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   665
    version->date        = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   666
    version->desc_len    = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   667
    version->desc        = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   668
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   669
    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   670
	drmFreeKernelVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   671
	return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   672
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   673
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   674
				/* Now, allocate space and get the data */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   675
    if (version->name_len)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   676
	version->name    = drmMalloc(version->name_len + 1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   677
    if (version->date_len)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   678
	version->date    = drmMalloc(version->date_len + 1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   679
    if (version->desc_len)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   680
	version->desc    = drmMalloc(version->desc_len + 1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   681
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   682
    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   683
	drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   684
	drmFreeKernelVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   685
	return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   686
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   687
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   688
				/* The results might not be null-terminated
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   689
                                   strings, so terminate them. */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   690
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   691
    if (version->name_len) version->name[version->name_len] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   692
    if (version->date_len) version->date[version->date_len] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   693
    if (version->desc_len) version->desc[version->desc_len] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   694
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   695
				/* Now, copy it all back into the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   696
                                   client-visible data structure... */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   697
    retval = drmMalloc(sizeof(*retval));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   698
    drmCopyVersion(retval, version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   699
    drmFreeKernelVersion(version);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   700
    return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   701
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   702
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   703
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   704
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   705
 * Get version information for the DRM user space library.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   706
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   707
 * This version number is driver independent.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   708
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   709
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   710
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   711
 * \return version information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   712
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   713
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   714
 * This function allocates and fills a drm_version structure with a hard coded
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   715
 * version number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   716
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   717
drmVersionPtr drmGetLibVersion(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   718
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   719
    drm_version_t *version = drmMalloc(sizeof(*version));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   720
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   721
    /* Version history:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   722
     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   723
     *                    entry point and many drm<Device> extensions
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   724
     *   revision 1.1.x = added drmCommand entry points for device extensions
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   725
     *                    added drmGetLibVersion to identify libdrm.a version
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   726
     *   revision 1.2.x = added drmSetInterfaceVersion
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   727
     *                    modified drmOpen to handle both busid and name
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   728
     */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   729
    version->version_major      = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   730
    version->version_minor      = 2;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   731
    version->version_patchlevel = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   732
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   733
    return (drmVersionPtr)version;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   734
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   735
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   736
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   737
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   738
 * Free the bus ID information.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   739
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   740
 * \param busid bus ID information string as given by drmGetBusid().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   741
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   742
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   743
 * This function is just frees the memory pointed by \p busid.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   744
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   745
void drmFreeBusid(const char *busid)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   746
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   747
    drmFree((void *)busid);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   748
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   749
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   750
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   751
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   752
 * Get the bus ID of the device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   753
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   754
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   755
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   756
 * \return bus ID string.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   757
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   758
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   759
 * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   760
 * get the string length and data, passing the arguments in a drm_unique
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   761
 * structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   762
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   763
char *drmGetBusid(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   764
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   765
    drm_unique_t u;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   766
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   767
    u.unique_len = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   768
    u.unique     = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   769
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   770
    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   771
    u.unique = drmMalloc(u.unique_len + 1);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   772
    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   773
    u.unique[u.unique_len] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   774
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   775
    return u.unique;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   776
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   777
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   778
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   779
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   780
 * Set the bus ID of the device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   781
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   782
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   783
 * \param busid bus ID string.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   784
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   785
 * \return zero on success, negative on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   786
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   787
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   788
 * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   789
 * the arguments in a drm_unique structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   790
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   791
int drmSetBusid(int fd, const char *busid)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   792
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   793
    drm_unique_t u;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   794
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   795
    u.unique     = (char *)busid;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   796
    u.unique_len = strlen(busid);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   797
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   798
    if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   799
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   800
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   801
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   802
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   803
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   804
int drmGetMagic(int fd, drm_magic_t * magic)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   805
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   806
    drm_auth_t auth;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   807
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   808
    *magic = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   809
    if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   810
    *magic = auth.magic;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   811
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   812
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   813
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   814
int drmAuthMagic(int fd, drm_magic_t magic)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   815
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   816
    drm_auth_t auth;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   817
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   818
    auth.magic = magic;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   819
    if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   820
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   821
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   822
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   823
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   824
 * Specifies a range of memory that is available for mapping by a
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   825
 * non-root process.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   826
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   827
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   828
 * \param offset usually the physical address. The actual meaning depends of
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   829
 * the \p type parameter. See below.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   830
 * \param size of the memory in bytes.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   831
 * \param type type of the memory to be mapped.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   832
 * \param flags combination of several flags to modify the function actions.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   833
 * \param handle will be set to a value that may be used as the offset
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   834
 * parameter for mmap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   835
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   836
 * \return zero on success or a negative value on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   837
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   838
 * \par Mapping the frame buffer
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   839
 * For the frame buffer
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   840
 * - \p offset will be the physical address of the start of the frame buffer,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   841
 * - \p size will be the size of the frame buffer in bytes, and
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   842
 * - \p type will be DRM_FRAME_BUFFER.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   843
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   844
 * \par
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   845
 * The area mapped will be uncached. If MTRR support is available in the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   846
 * kernel, the frame buffer area will be set to write combining.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   847
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   848
 * \par Mapping the MMIO register area
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   849
 * For the MMIO register area,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   850
 * - \p offset will be the physical address of the start of the register area,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   851
 * - \p size will be the size of the register area bytes, and
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   852
 * - \p type will be DRM_REGISTERS.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   853
 * \par
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   854
 * The area mapped will be uncached.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   855
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   856
 * \par Mapping the SAREA
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   857
 * For the SAREA,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   858
 * - \p offset will be ignored and should be set to zero,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   859
 * - \p size will be the desired size of the SAREA in bytes,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   860
 * - \p type will be DRM_SHM.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   861
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   862
 * \par
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   863
 * A shared memory area of the requested size will be created and locked in
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   864
 * kernel memory. This area may be mapped into client-space by using the handle
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   865
 * returned.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   866
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   867
 * \note May only be called by root.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   868
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   869
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   870
 * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   871
 * the arguments in a drm_map structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   872
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   873
int drmAddMap(int fd,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   874
	      drm_handle_t offset,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   875
	      drmSize size,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   876
	      drmMapType type,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   877
	      drmMapFlags flags,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   878
	      drm_handle_t * handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   879
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   880
    drm_map_t map;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   881
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   882
    map.offset  = offset;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   883
/* No longer needed with CVS kernel modules on alpha
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   884
#ifdef __alpha__
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   885
    if (type != DRM_SHM)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   886
	map.offset += BUS_BASE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   887
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   888
*/
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   889
    map.size    = size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   890
    map.handle  = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   891
    map.type    = type;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   892
    map.flags   = flags;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   893
    if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   894
    if (handle) *handle = (drm_handle_t)map.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   895
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   896
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   897
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   898
int drmRmMap(int fd, drm_handle_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   899
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   900
    drm_map_t map;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   901
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   902
    map.handle = (drm_handle_t)handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   903
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   904
    if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   905
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   906
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   907
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   908
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   909
 * Make buffers available for DMA transfers.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   910
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   911
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   912
 * \param count number of buffers.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   913
 * \param size size of each buffer.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   914
 * \param flags buffer allocation flags.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   915
 * \param agp_offset offset in the AGP aperture
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   916
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   917
 * \return number of buffers allocated, negative on error.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   918
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   919
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   920
 * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   921
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   922
 * \sa drm_buf_desc.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   923
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   924
int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   925
	       int agp_offset)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   926
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   927
    drm_buf_desc_t request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   928
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   929
    request.count     = count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   930
    request.size      = size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   931
    request.low_mark  = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   932
    request.high_mark = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   933
    request.flags     = flags;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   934
    request.agp_start = agp_offset;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   935
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   936
    if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   937
    return request.count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   938
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   939
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   940
int drmMarkBufs(int fd, double low, double high)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   941
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   942
    drm_buf_info_t info;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   943
    int            i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   944
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   945
    info.count = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   946
    info.list  = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   947
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   948
    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   949
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   950
    if (!info.count) return -EINVAL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   951
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   952
    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   953
	return -ENOMEM;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   954
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   955
    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   956
	int retval = -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   957
	drmFree(info.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   958
	return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   959
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   960
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   961
    for (i = 0; i < info.count; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   962
	info.list[i].low_mark  = low  * info.list[i].count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   963
	info.list[i].high_mark = high * info.list[i].count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   964
	if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   965
	    int retval = -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   966
	    drmFree(info.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   967
	    return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   968
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   969
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   970
    drmFree(info.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   971
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   972
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   973
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   974
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   975
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   976
 * Free buffers.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   977
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   978
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   979
 * \param count number of buffers to free.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   980
 * \param list list of buffers to be freed.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   981
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   982
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   983
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   984
 * \note This function is primarily used for debugging.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   985
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   986
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   987
 * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   988
 * the arguments in a drm_buf_free structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   989
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   990
int drmFreeBufs(int fd, int count, int *list)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   991
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   992
    drm_buf_free_t request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   993
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   994
    request.count = count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   995
    request.list  = list;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   996
    if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   997
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   998
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
   999
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1000
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1001
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1002
 * Close the device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1003
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1004
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1005
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1006
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1007
 * This function closes the file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1008
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1009
int drmClose(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1010
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1011
    unsigned long key    = drmGetKeyFromFd(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1012
    drmHashEntry  *entry = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1013
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1014
    drmHashDestroy(entry->tagTable);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1015
    entry->fd       = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1016
    entry->f        = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1017
    entry->tagTable = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1018
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1019
    drmHashDelete(drmHashTable, key);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1020
    drmFree(entry);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1021
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1022
    return close(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1023
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1024
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1025
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1026
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1027
 * Map a region of memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1028
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1029
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1030
 * \param handle handle returned by drmAddMap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1031
 * \param size size in bytes. Must match the size used by drmAddMap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1032
 * \param address will contain the user-space virtual address where the mapping
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1033
 * begins.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1034
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1035
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1036
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1037
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1038
 * This function is a wrapper for mmap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1039
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1040
int drmMap(int fd,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1041
	   drm_handle_t handle,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1042
	   drmSize size,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1043
	   drmAddressPtr address)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1044
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1045
    static unsigned long pagesize_mask = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1046
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1047
    if (fd < 0) return -EINVAL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1048
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1049
    if (!pagesize_mask)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1050
	pagesize_mask = getpagesize() - 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1051
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1052
    size = (size + pagesize_mask) & ~pagesize_mask;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1053
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1054
    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1055
    if (*address == MAP_FAILED) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1056
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1057
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1058
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1059
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1060
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1061
 * Unmap mappings obtained with drmMap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1062
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1063
 * \param address address as given by drmMap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1064
 * \param size size in bytes. Must match the size used by drmMap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1065
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1066
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1067
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1068
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1069
 * This function is a wrapper for unmap().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1070
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1071
int drmUnmap(drmAddress address, drmSize size)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1072
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1073
    return munmap(address, size);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1074
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1075
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1076
drmBufInfoPtr drmGetBufInfo(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1077
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1078
    drm_buf_info_t info;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1079
    drmBufInfoPtr  retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1080
    int            i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1081
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1082
    info.count = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1083
    info.list  = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1084
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1085
    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1086
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1087
    if (info.count) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1088
	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1089
	    return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1090
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1091
	if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1092
	    drmFree(info.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1093
	    return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1094
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1095
				/* Now, copy it all back into the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1096
                                   client-visible data structure... */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1097
	retval = drmMalloc(sizeof(*retval));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1098
	retval->count = info.count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1099
	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1100
	for (i = 0; i < info.count; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1101
	    retval->list[i].count     = info.list[i].count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1102
	    retval->list[i].size      = info.list[i].size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1103
	    retval->list[i].low_mark  = info.list[i].low_mark;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1104
	    retval->list[i].high_mark = info.list[i].high_mark;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1105
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1106
	drmFree(info.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1107
	return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1108
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1109
    return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1110
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1111
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1112
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1113
 * Map all DMA buffers into client-virtual space.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1114
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1115
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1116
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1117
 * \return a pointer to a ::drmBufMap structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1118
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1119
 * \note The client may not use these buffers until obtaining buffer indices
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1120
 * with drmDMA().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1121
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1122
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1123
 * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1124
 * information about the buffers in a drm_buf_map structure into the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1125
 * client-visible data structures.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1126
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1127
drmBufMapPtr drmMapBufs(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1128
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1129
    drm_buf_map_t bufs;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1130
    drmBufMapPtr  retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1131
    int           i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1132
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1133
    bufs.count = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1134
    bufs.list  = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1135
    bufs.virtual = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1136
    if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1137
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1138
    if (!bufs.count) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1139
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1140
	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1141
	    return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1142
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1143
	if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1144
	    drmFree(bufs.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1145
	    return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1146
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1147
				/* Now, copy it all back into the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1148
                                   client-visible data structure... */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1149
	retval = drmMalloc(sizeof(*retval));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1150
	retval->count = bufs.count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1151
	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1152
	for (i = 0; i < bufs.count; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1153
	    retval->list[i].idx     = bufs.list[i].idx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1154
	    retval->list[i].total   = bufs.list[i].total;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1155
	    retval->list[i].used    = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1156
	    retval->list[i].address = bufs.list[i].address;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1157
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1158
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1159
	drmFree(bufs.list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1160
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1161
	return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1162
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1163
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1164
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1165
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1166
 * Unmap buffers allocated with drmMapBufs().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1167
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1168
 * \return zero on success, or negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1169
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1170
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1171
 * Calls munmap() for every buffer stored in \p bufs and frees the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1172
 * memory allocated by drmMapBufs().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1173
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1174
int drmUnmapBufs(drmBufMapPtr bufs)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1175
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1176
    int i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1177
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1178
    for (i = 0; i < bufs->count; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1179
	munmap(bufs->list[i].address, bufs->list[i].total);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1180
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1181
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1182
    drmFree(bufs->list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1183
    drmFree(bufs);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1184
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1185
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1186
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1187
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1188
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1189
#define DRM_DMA_RETRY		16
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1190
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1191
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1192
 * Reserve DMA buffers.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1193
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1194
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1195
 * \param request
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1196
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1197
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1198
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1199
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1200
 * Assemble the arguments into a drm_dma structure and keeps issuing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1201
 * DRM_IOCTL_DMA ioctl until success or until maximum number of retries.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1202
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1203
int drmDMA(int fd, drmDMAReqPtr request)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1204
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1205
    drm_dma_t dma;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1206
    int ret, i = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1207
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1208
				/* Copy to hidden structure */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1209
    dma.context         = request->context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1210
    dma.send_count      = request->send_count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1211
    dma.send_indices    = request->send_list;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1212
    dma.send_sizes      = request->send_sizes;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1213
    dma.flags           = request->flags;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1214
    dma.request_count   = request->request_count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1215
    dma.request_size    = request->request_size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1216
    dma.request_indices = request->request_list;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1217
    dma.request_sizes   = request->request_sizes;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1218
    dma.granted_count   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1219
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1220
    do {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1221
	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1222
    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1223
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1224
    if ( ret == 0 ) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1225
	request->granted_count = dma.granted_count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1226
	return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1227
    } else {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1228
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1229
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1230
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1231
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1232
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1233
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1234
 * Obtain heavyweight hardware lock.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1235
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1236
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1237
 * \param context context.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1238
 * \param flags flags that determine the sate of the hardware when the function
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1239
 * returns.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1240
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1241
 * \return always zero.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1242
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1243
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1244
 * This function translates the arguments into a drm_lock structure and issue
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1245
 * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1246
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1247
int drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1248
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1249
    drm_lock_t lock;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1250
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1251
    lock.context = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1252
    lock.flags   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1253
    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1254
    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1255
    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1256
    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1257
    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1258
    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1259
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1260
    while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1261
	;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1262
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1263
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1264
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1265
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1266
 * Release the hardware lock.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1267
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1268
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1269
 * \param context context.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1270
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1271
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1272
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1273
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1274
 * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1275
 * argument in a drm_lock structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1276
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1277
int drmUnlock(int fd, drm_context_t context)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1278
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1279
    drm_lock_t lock;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1280
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1281
    lock.context = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1282
    lock.flags   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1283
    return ioctl(fd, DRM_IOCTL_UNLOCK, &lock);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1284
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1285
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1286
drm_context_t * drmGetReservedContextList(int fd, int *count)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1287
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1288
    drm_ctx_res_t res;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1289
    drm_ctx_t     *list;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1290
    drm_context_t * retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1291
    int           i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1292
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1293
    res.count    = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1294
    res.contexts = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1295
    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1296
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1297
    if (!res.count) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1298
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1299
    if (!(list   = drmMalloc(res.count * sizeof(*list)))) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1300
    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1301
	drmFree(list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1302
	return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1303
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1304
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1305
    res.contexts = list;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1306
    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1307
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1308
    for (i = 0; i < res.count; i++) retval[i] = list[i].handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1309
    drmFree(list);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1310
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1311
    *count = res.count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1312
    return retval;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1313
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1314
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1315
void drmFreeReservedContextList(drm_context_t * pt)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1316
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1317
    drmFree(pt);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1318
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1319
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1320
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1321
 * Create context.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1322
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1323
 * Used by the X server during GLXContext initialization. This causes
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1324
 * per-context kernel-level resources to be allocated.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1325
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1326
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1327
 * \param handle is set on success. To be used by the client when requesting DMA
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1328
 * dispatch with drmDMA().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1329
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1330
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1331
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1332
 * \note May only be called by root.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1333
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1334
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1335
 * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1336
 * argument in a drm_ctx structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1337
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1338
int drmCreateContext(int fd, drm_context_t * handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1339
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1340
    drm_ctx_t ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1341
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1342
    ctx.flags = 0;	/* Modified with functions below */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1343
    if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1344
    *handle = ctx.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1345
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1346
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1347
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1348
int drmSwitchToContext(int fd, drm_context_t context)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1349
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1350
    drm_ctx_t ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1351
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1352
    ctx.handle = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1353
    if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1354
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1355
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1356
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1357
int drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1358
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1359
    drm_ctx_t ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1360
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1361
				/* Context preserving means that no context
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1362
                                   switched are done between DMA buffers
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1363
                                   from one context and the next.  This is
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1364
                                   suitable for use in the X server (which
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1365
                                   promises to maintain hardware context,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1366
                                   or in the client-side library when
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1367
                                   buffers are swapped on behalf of two
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1368
                                   threads. */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1369
    ctx.handle = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1370
    ctx.flags  = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1371
    if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1372
    if (flags & DRM_CONTEXT_2DONLY)    ctx.flags |= _DRM_CONTEXT_2DONLY;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1373
    if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1374
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1375
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1376
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1377
int drmGetContextFlags(int fd, drm_context_t context, drm_context_tFlagsPtr flags)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1378
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1379
    drm_ctx_t ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1380
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1381
    ctx.handle = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1382
    if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1383
    *flags = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1384
    if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1385
    if (ctx.flags & _DRM_CONTEXT_2DONLY)    *flags |= DRM_CONTEXT_2DONLY;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1386
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1387
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1388
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1389
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1390
 * Destroy context.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1391
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1392
 * Free any kernel-level resources allocated with drmCreateContext() associated
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1393
 * with the context.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1394
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1395
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1396
 * \param handle handle given by drmCreateContext().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1397
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1398
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1399
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1400
 * \note May only be called by root.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1401
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1402
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1403
 * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1404
 * argument in a drm_ctx structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1405
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1406
int drmDestroyContext(int fd, drm_context_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1407
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1408
    drm_ctx_t ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1409
    ctx.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1410
    if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1411
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1412
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1413
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1414
int drmCreateDrawable(int fd, drm_drawable_t * handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1415
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1416
    drm_draw_t draw;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1417
    if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1418
    *handle = draw.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1419
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1420
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1421
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1422
int drmDestroyDrawable(int fd, drm_drawable_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1423
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1424
    drm_draw_t draw;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1425
    draw.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1426
    if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1427
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1428
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1429
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1430
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1431
 * Acquire the AGP device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1432
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1433
 * Must be called before any of the other AGP related calls.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1434
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1435
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1436
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1437
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1438
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1439
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1440
 * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1441
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1442
int drmAgpAcquire(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1443
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1444
    if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1445
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1446
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1447
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1448
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1449
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1450
 * Release the AGP device.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1451
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1452
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1453
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1454
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1455
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1456
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1457
 * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1458
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1459
int drmAgpRelease(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1460
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1461
    if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1462
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1463
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1464
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1465
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1466
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1467
 * Set the AGP mode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1468
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1469
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1470
 * \param mode AGP mode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1471
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1472
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1473
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1474
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1475
 * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1476
 * argument in a drm_agp_mode structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1477
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1478
int drmAgpEnable(int fd, unsigned long mode)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1479
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1480
    drm_agp_mode_t m;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1481
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1482
    m.mode = mode;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1483
    if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1484
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1485
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1486
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1487
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1488
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1489
 * Allocate a chunk of AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1490
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1491
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1492
 * \param size requested memory size in bytes. Will be rounded to page boundary.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1493
 * \param type type of memory to allocate.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1494
 * \param address if not zero, will be set to the physical address of the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1495
 * allocated memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1496
 * \param handle on success will be set to a handle of the allocated memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1497
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1498
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1499
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1500
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1501
 * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1502
 * arguments in a drm_agp_buffer structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1503
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1504
int drmAgpAlloc(int fd, unsigned long size, unsigned long type,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1505
		unsigned long *address, drm_handle_t *handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1506
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1507
    drm_agp_buffer_t b;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1508
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1509
    *handle = DRM_AGP_NO_HANDLE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1510
    b.size   = size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1511
    b.handle = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1512
    b.type   = type;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1513
    if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1514
    if (address != 0UL) *address = b.physical;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1515
    *handle = b.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1516
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1517
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1518
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1519
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1520
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1521
 * Free a chunk of AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1522
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1523
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1524
 * \param handle handle to the allocated memory, as given by drmAgpAllocate().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1525
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1526
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1527
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1528
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1529
 * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1530
 * argument in a drm_agp_buffer structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1531
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1532
int drmAgpFree(int fd, drm_handle_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1533
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1534
    drm_agp_buffer_t b;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1535
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1536
    b.size   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1537
    b.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1538
    if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1539
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1540
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1541
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1542
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1543
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1544
 * Bind a chunk of AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1545
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1546
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1547
 * \param handle handle to the allocated memory, as given by drmAgpAllocate().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1548
 * \param offset offset in bytes. It will round to page boundary.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1549
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1550
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1551
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1552
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1553
 * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1554
 * argument in a drm_agp_binding structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1555
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1556
int drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1557
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1558
    drm_agp_binding_t b;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1559
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1560
    b.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1561
    b.offset = offset;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1562
    if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1563
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1564
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1565
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1566
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1567
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1568
 * Unbind a chunk of AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1569
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1570
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1571
 * \param handle handle to the allocated memory, as given by drmAgpAllocate().
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1572
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1573
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1574
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1575
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1576
 * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1577
 * the argument in a drm_agp_binding structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1578
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1579
int drmAgpUnbind(int fd, drm_handle_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1580
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1581
    drm_agp_binding_t b;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1582
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1583
    b.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1584
    b.offset = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1585
    if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1586
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1587
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1588
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1589
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1590
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1591
 * Get AGP driver major version number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1592
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1593
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1594
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1595
 * \return major version number on success, or a negative value on failure..
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1596
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1597
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1598
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1599
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1600
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1601
int drmAgpVersionMajor(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1602
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1603
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1604
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1605
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1606
    return i.agp_version_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1607
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1608
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1609
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1610
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1611
 * Get AGP driver minor version number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1612
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1613
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1614
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1615
 * \return minor version number on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1616
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1617
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1618
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1619
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1620
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1621
int drmAgpVersionMinor(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1622
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1623
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1624
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1625
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1626
    return i.agp_version_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1627
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1628
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1629
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1630
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1631
 * Get AGP mode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1632
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1633
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1634
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1635
 * \return mode on success, or zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1636
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1637
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1638
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1639
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1640
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1641
unsigned long drmAgpGetMode(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1642
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1643
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1644
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1645
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1646
    return i.mode;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1647
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1648
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1649
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1650
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1651
 * Get AGP aperture base.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1652
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1653
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1654
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1655
 * \return aperture base on success, zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1656
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1657
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1658
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1659
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1660
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1661
unsigned long drmAgpBase(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1662
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1663
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1664
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1665
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1666
    return i.aperture_base;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1667
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1668
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1669
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1670
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1671
 * Get AGP aperture size.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1672
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1673
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1674
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1675
 * \return aperture size on success, zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1676
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1677
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1678
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1679
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1680
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1681
unsigned long drmAgpSize(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1682
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1683
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1684
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1685
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1686
    return i.aperture_size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1687
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1688
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1689
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1690
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1691
 * Get used AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1692
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1693
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1694
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1695
 * \return memory used on success, or zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1696
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1697
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1698
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1699
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1700
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1701
unsigned long drmAgpMemoryUsed(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1702
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1703
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1704
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1705
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1706
    return i.memory_used;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1707
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1708
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1709
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1710
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1711
 * Get available AGP memory.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1712
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1713
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1714
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1715
 * \return memory available on success, or zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1716
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1717
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1718
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1719
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1720
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1721
unsigned long drmAgpMemoryAvail(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1722
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1723
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1724
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1725
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1726
    return i.memory_allowed;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1727
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1728
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1729
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1730
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1731
 * Get hardware vendor ID.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1732
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1733
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1734
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1735
 * \return vendor ID on success, or zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1736
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1737
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1738
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1739
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1740
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1741
unsigned int drmAgpVendorId(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1742
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1743
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1744
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1745
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1746
    return i.id_vendor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1747
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1748
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1749
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1750
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1751
 * Get hardware device ID.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1752
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1753
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1754
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1755
 * \return zero on success, or zero on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1756
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1757
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1758
 * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1759
 * necessary information in a drm_agp_info structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1760
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1761
unsigned int drmAgpDeviceId(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1762
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1763
    drm_agp_info_t i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1764
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1765
    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1766
    return i.id_device;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1767
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1768
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1769
int drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1770
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1771
    drm_scatter_gather_t sg;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1772
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1773
    *handle = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1774
    sg.size   = size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1775
    sg.handle = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1776
    if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1777
    *handle = sg.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1778
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1779
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1780
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1781
int drmScatterGatherFree(int fd, drm_handle_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1782
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1783
    drm_scatter_gather_t sg;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1784
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1785
    sg.size   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1786
    sg.handle = handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1787
    if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1788
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1789
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1790
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1791
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1792
 * Wait for VBLANK.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1793
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1794
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1795
 * \param vbl pointer to a drmVBlank structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1796
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1797
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1798
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1799
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1800
 * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1801
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1802
int drmWaitVBlank(int fd, drmVBlankPtr vbl)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1803
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1804
    int ret;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1805
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1806
    do {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1807
       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1808
       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1809
    } while (ret && errno == EINTR);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1810
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1811
    return ret;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1812
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1813
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1814
int drmError(int err, const char *label)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1815
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1816
    switch (err) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1817
    case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label);   break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1818
    case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label);   break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1819
    case DRM_ERR_NOT_ROOT:  fprintf(stderr, "%s: not root\n", label);    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1820
    case DRM_ERR_INVALID:   fprintf(stderr, "%s: invalid args\n", label);break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1821
    default:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1822
	if (err < 0) err = -err;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1823
	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1824
	break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1825
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1826
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1827
    return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1828
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1829
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1830
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1831
 * Install IRQ handler.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1832
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1833
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1834
 * \param irq IRQ number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1835
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1836
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1837
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1838
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1839
 * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1840
 * argument in a drm_control structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1841
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1842
int drmCtlInstHandler(int fd, int irq)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1843
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1844
    drm_control_t ctl;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1845
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1846
    ctl.func  = DRM_INST_HANDLER;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1847
    ctl.irq   = irq;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1848
    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1849
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1850
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1851
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1852
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1853
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1854
 * Uninstall IRQ handler.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1855
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1856
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1857
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1858
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1859
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1860
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1861
 * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1862
 * argument in a drm_control structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1863
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1864
int drmCtlUninstHandler(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1865
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1866
    drm_control_t ctl;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1867
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1868
    ctl.func  = DRM_UNINST_HANDLER;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1869
    ctl.irq   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1870
    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1871
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1872
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1873
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1874
int drmFinish(int fd, int context, drmLockFlags flags)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1875
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1876
    drm_lock_t lock;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1877
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1878
    lock.context = context;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1879
    lock.flags   = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1880
    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1881
    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1882
    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1883
    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1884
    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1885
    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1886
    if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1887
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1888
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1889
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1890
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1891
 * Get IRQ from bus ID.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1892
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1893
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1894
 * \param busnum bus number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1895
 * \param devnum device number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1896
 * \param funcnum function number.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1897
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1898
 * \return IRQ number on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1899
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1900
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1901
 * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1902
 * arguments in a drm_irq_busid structure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1903
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1904
int drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1905
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1906
    drm_irq_busid_t p;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1907
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1908
    p.busnum  = busnum;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1909
    p.devnum  = devnum;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1910
    p.funcnum = funcnum;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1911
    if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1912
    return p.irq;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1913
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1914
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1915
int drmAddContextTag(int fd, drm_context_t context, void *tag)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1916
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1917
    drmHashEntry  *entry = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1918
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1919
    if (drmHashInsert(entry->tagTable, context, tag)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1920
	drmHashDelete(entry->tagTable, context);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1921
	drmHashInsert(entry->tagTable, context, tag);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1922
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1923
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1924
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1925
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1926
int drmDelContextTag(int fd, drm_context_t context)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1927
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1928
    drmHashEntry  *entry = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1929
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1930
    return drmHashDelete(entry->tagTable, context);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1931
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1932
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1933
void *drmGetContextTag(int fd, drm_context_t context)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1934
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1935
    drmHashEntry  *entry = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1936
    void          *value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1937
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1938
    if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1939
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1940
    return value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1941
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1942
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1943
int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, drm_handle_t handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1944
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1945
    drm_ctx_priv_map_t map;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1946
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1947
    map.ctx_id = ctx_id;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1948
    map.handle = (void *)(unsigned long)handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1949
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1950
    if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1951
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1952
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1953
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1954
int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, drm_handle_t * handle)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1955
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1956
    drm_ctx_priv_map_t map;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1957
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1958
    map.ctx_id = ctx_id;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1959
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1960
    if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1961
    if (handle) *handle = (drm_handle_t)(unsigned long)map.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1962
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1963
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1964
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1965
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1966
int drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1967
	      drmMapType *type, drmMapFlags *flags, drm_handle_t *handle,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1968
	      int *mtrr)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1969
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1970
    drm_map_t map;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1971
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1972
    map.offset = idx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1973
    if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1974
    *offset = map.offset;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1975
    *size   = map.size;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1976
    *type   = map.type;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1977
    *flags  = map.flags;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1978
    *handle = (drm_handle_t)(unsigned long)map.handle;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1979
    *mtrr   = map.mtrr;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1980
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1981
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1982
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1983
int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1984
		 unsigned long *magic, unsigned long *iocs)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1985
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1986
    drm_client_t client;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1987
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1988
    client.idx = idx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1989
    if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1990
    *auth      = client.auth;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1991
    *pid       = client.pid;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1992
    *uid       = client.uid;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1993
    *magic     = client.magic;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1994
    *iocs      = client.iocs;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1995
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1996
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1997
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1998
int drmGetStats(int fd, drmStatsT *stats)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  1999
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2000
    drm_stats_t s;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2001
    unsigned int i;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2002
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2003
    if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2004
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2005
    stats->count = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2006
    memset(stats, 0, sizeof(*stats));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2007
    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2008
	return -1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2009
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2010
#define SET_VALUE                              \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2011
    stats->data[i].long_format = "%-20.20s";   \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2012
    stats->data[i].rate_format = "%8.8s";      \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2013
    stats->data[i].isvalue     = 1;            \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2014
    stats->data[i].verbose     = 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2015
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2016
#define SET_COUNT                              \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2017
    stats->data[i].long_format = "%-20.20s";   \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2018
    stats->data[i].rate_format = "%5.5s";      \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2019
    stats->data[i].isvalue     = 0;            \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2020
    stats->data[i].mult_names  = "kgm";        \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2021
    stats->data[i].mult        = 1000;         \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2022
    stats->data[i].verbose     = 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2023
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2024
#define SET_BYTE                               \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2025
    stats->data[i].long_format = "%-20.20s";   \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2026
    stats->data[i].rate_format = "%5.5s";      \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2027
    stats->data[i].isvalue     = 0;            \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2028
    stats->data[i].mult_names  = "KGM";        \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2029
    stats->data[i].mult        = 1024;         \
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2030
    stats->data[i].verbose     = 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2031
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2032
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2033
    stats->count = s.count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2034
    for (i = 0; i < s.count; i++) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2035
	stats->data[i].value = s.data[i].value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2036
	switch (s.data[i].type) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2037
	case _DRM_STAT_LOCK:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2038
	    stats->data[i].long_name = "Lock";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2039
	    stats->data[i].rate_name = "Lock";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2040
	    SET_VALUE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2041
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2042
	case _DRM_STAT_OPENS:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2043
	    stats->data[i].long_name = "Opens";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2044
	    stats->data[i].rate_name = "O";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2045
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2046
	    stats->data[i].verbose   = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2047
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2048
	case _DRM_STAT_CLOSES:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2049
	    stats->data[i].long_name = "Closes";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2050
	    stats->data[i].rate_name = "Lock";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2051
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2052
	    stats->data[i].verbose   = 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2053
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2054
	case _DRM_STAT_IOCTLS:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2055
	    stats->data[i].long_name = "Ioctls";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2056
	    stats->data[i].rate_name = "Ioc/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2057
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2058
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2059
	case _DRM_STAT_LOCKS:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2060
	    stats->data[i].long_name = "Locks";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2061
	    stats->data[i].rate_name = "Lck/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2062
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2063
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2064
	case _DRM_STAT_UNLOCKS:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2065
	    stats->data[i].long_name = "Unlocks";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2066
	    stats->data[i].rate_name = "Unl/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2067
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2068
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2069
	case _DRM_STAT_IRQ:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2070
	    stats->data[i].long_name = "IRQs";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2071
	    stats->data[i].rate_name = "IRQ/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2072
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2073
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2074
	case _DRM_STAT_PRIMARY:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2075
	    stats->data[i].long_name = "Primary Bytes";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2076
	    stats->data[i].rate_name = "PB/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2077
	    SET_BYTE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2078
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2079
	case _DRM_STAT_SECONDARY:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2080
	    stats->data[i].long_name = "Secondary Bytes";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2081
	    stats->data[i].rate_name = "SB/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2082
	    SET_BYTE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2083
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2084
	case _DRM_STAT_DMA:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2085
	    stats->data[i].long_name = "DMA";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2086
	    stats->data[i].rate_name = "DMA/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2087
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2088
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2089
	case _DRM_STAT_SPECIAL:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2090
	    stats->data[i].long_name = "Special DMA";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2091
	    stats->data[i].rate_name = "dma/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2092
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2093
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2094
	case _DRM_STAT_MISSED:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2095
	    stats->data[i].long_name = "Miss";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2096
	    stats->data[i].rate_name = "Ms/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2097
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2098
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2099
	case _DRM_STAT_VALUE:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2100
	    stats->data[i].long_name = "Value";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2101
	    stats->data[i].rate_name = "Value";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2102
	    SET_VALUE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2103
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2104
	case _DRM_STAT_BYTE:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2105
	    stats->data[i].long_name = "Bytes";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2106
	    stats->data[i].rate_name = "B/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2107
	    SET_BYTE;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2108
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2109
	case _DRM_STAT_COUNT:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2110
	default:
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2111
	    stats->data[i].long_name = "Count";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2112
	    stats->data[i].rate_name = "Cnt/s";
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2113
	    SET_COUNT;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2114
	    break;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2115
	}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2116
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2117
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2118
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2119
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2120
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2121
 * Issue a set-version ioctl.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2122
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2123
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2124
 * \param drmCommandIndex command index
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2125
 * \param data source pointer of the data to be read and written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2126
 * \param size size of the data to be read and written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2127
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2128
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2129
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2130
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2131
 * It issues a read-write ioctl given by
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2132
 * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2133
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2134
int drmSetInterfaceVersion(int fd, drmSetVersion *version )
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2135
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2136
    int retcode = 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2137
    drm_set_version_t sv;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2138
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2139
    sv.drm_di_major = version->drm_di_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2140
    sv.drm_di_minor = version->drm_di_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2141
    sv.drm_dd_major = version->drm_dd_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2142
    sv.drm_dd_minor = version->drm_dd_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2143
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2144
    if (ioctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2145
	retcode = -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2146
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2147
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2148
    version->drm_di_major = sv.drm_di_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2149
    version->drm_di_minor = sv.drm_di_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2150
    version->drm_dd_major = sv.drm_dd_major;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2151
    version->drm_dd_minor = sv.drm_dd_minor;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2152
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2153
    return retcode;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2154
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2155
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2156
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2157
 * Send a device-specific command.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2158
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2159
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2160
 * \param drmCommandIndex command index
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2161
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2162
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2163
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2164
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2165
 * It issues a ioctl given by
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2166
 * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2167
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2168
int drmCommandNone(int fd, unsigned long drmCommandIndex)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2169
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2170
    void *data = NULL; /* dummy */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2171
    unsigned long request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2172
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2173
    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2174
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2175
    if (ioctl(fd, request, data)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2176
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2177
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2178
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2179
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2180
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2181
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2182
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2183
 * Send a device-specific read command.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2184
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2185
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2186
 * \param drmCommandIndex command index
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2187
 * \param data destination pointer of the data to be read.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2188
 * \param size size of the data to be read.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2189
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2190
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2191
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2192
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2193
 * It issues a read ioctl given by
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2194
 * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2195
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2196
int drmCommandRead(int fd, unsigned long drmCommandIndex,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2197
                   void *data, unsigned long size )
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2198
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2199
    unsigned long request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2200
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2201
    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2202
	DRM_COMMAND_BASE + drmCommandIndex, size);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2203
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2204
    if (ioctl(fd, request, data)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2205
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2206
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2207
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2208
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2209
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2210
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2211
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2212
 * Send a device-specific write command.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2213
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2214
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2215
 * \param drmCommandIndex command index
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2216
 * \param data source pointer of the data to be written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2217
 * \param size size of the data to be written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2218
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2219
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2220
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2221
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2222
 * It issues a write ioctl given by
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2223
 * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2224
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2225
int drmCommandWrite(int fd, unsigned long drmCommandIndex,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2226
                   void *data, unsigned long size )
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2227
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2228
    unsigned long request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2229
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2230
    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2231
	DRM_COMMAND_BASE + drmCommandIndex, size);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2232
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2233
    if (ioctl(fd, request, data)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2234
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2235
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2236
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2237
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2238
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2239
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2240
/**
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2241
 * Send a device-specific read-write command.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2242
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2243
 * \param fd file descriptor.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2244
 * \param drmCommandIndex command index
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2245
 * \param data source pointer of the data to be read and written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2246
 * \param size size of the data to be read and written.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2247
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2248
 * \return zero on success, or a negative value on failure.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2249
 *
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2250
 * \internal
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2251
 * It issues a read-write ioctl given by
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2252
 * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2253
 */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2254
int drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2255
                   void *data, unsigned long size )
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2256
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2257
    unsigned long request;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2258
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2259
    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE,
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2260
	DRM_COMMAND_BASE + drmCommandIndex, size);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2261
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2262
    if (ioctl(fd, request, data)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2263
	return -errno;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2264
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2265
    return 0;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2266
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2267
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2268
#if defined(XFree86Server)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2269
static void drmSIGIOHandler(int interrupt, void *closure)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2270
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2271
    unsigned long key;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2272
    void          *value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2273
    ssize_t       count;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2274
    drm_ctx_t     ctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2275
    typedef void  (*_drmCallback)(int, void *, void *);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2276
    char          buf[256];
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2277
    drm_context_t    old;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2278
    drm_context_t    new;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2279
    void          *oldctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2280
    void          *newctx;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2281
    char          *pt;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2282
    drmHashEntry  *entry;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2283
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2284
    if (!drmHashTable) return;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2285
    if (drmHashFirst(drmHashTable, &key, &value)) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2286
	entry = value;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2287
	do {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2288
#if 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2289
	    fprintf(stderr, "Trying %d\n", entry->fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2290
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2291
	    if ((count = read(entry->fd, buf, sizeof(buf))) > 0) {
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2292
		buf[count] = '\0';
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2293
#if 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2294
		fprintf(stderr, "Got %s\n", buf);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2295
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2296
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2297
		for (pt = buf; *pt != ' '; ++pt); /* Find first space */
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2298
		++pt;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2299
		old    = strtol(pt, &pt, 0);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2300
		new    = strtol(pt, NULL, 0);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2301
		oldctx = drmGetContextTag(entry->fd, old);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2302
		newctx = drmGetContextTag(entry->fd, new);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2303
#if 0
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2304
		fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2305
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2306
		((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2307
		ctx.handle = new;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2308
		ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2309
	    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2310
	} while (drmHashNext(drmHashTable, &key, &value));
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2311
    }
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2312
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2313
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2314
int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2315
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2316
    drmHashEntry     *entry;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2317
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2318
    entry     = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2319
    entry->f  = f;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2320
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2321
#if defined(sun)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2322
    return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2323
#else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2324
    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2325
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2326
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2327
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2328
int drmRemoveSIGIOHandler(int fd)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2329
{
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2330
    drmHashEntry     *entry = drmGetEntry(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2331
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2332
    entry->f = NULL;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2333
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2334
#if defined(sun)
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2335
    return 1;
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2336
#else
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2337
    return xf86RemoveSIGIOHandler(fd);
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2338
#endif
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2339
}
64e817c4a743 PSARC 2004/801 DRI porting
Daniel Zhu <Daniel.Zhu@Sun.COM>
parents:
diff changeset
  2340
#endif