updates from Erdi Chen
[mesa.git] / src / mesa / drivers / dri / unichrome / xf86drmVIA.c
1 /*
2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25 #ifdef XFree86Server
26 # include "xf86.h"
27 # include "xf86_OSproc.h"
28 # include "xf86_ansic.h"
29 # define _DRM_MALLOC xalloc
30 # define _DRM_FREE xfree
31 # ifndef XFree86LOADER
32 # include <sys/mman.h>
33 # endif
34 #else
35 # include <stdio.h>
36 # include <stdlib.h>
37 # include <unistd.h>
38 # include <string.h>
39 # include <ctype.h>
40 # include <fcntl.h>
41 # include <errno.h>
42 # include <signal.h>
43 # include <sys/types.h>
44 # include <sys/ioctl.h>
45 # include <sys/mman.h>
46 # include <sys/time.h>
47 # ifdef DRM_USE_MALLOC
48 # define _DRM_MALLOC malloc
49 # define _DRM_FREE free
50 extern int xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *);
51 extern int xf86RemoveSIGIOHandler(int fd);
52 # else
53 # include <X11/Xlibint.h>
54 # define _DRM_MALLOC Xmalloc
55 # define _DRM_FREE Xfree
56 # endif
57 #endif
58
59 /* Not all systems have MAP_FAILED defined */
60 #ifndef MAP_FAILED
61 #define MAP_FAILED ((void *)-1)
62 #endif
63
64 #ifdef __linux__
65 #include <sys/sysmacros.h> /* for makedev() */
66 #endif
67 #include "xf86drm.h"
68 #include "xf86drmVIA.h"
69 #include "drm.h"
70 #include "via_common.h"
71 int drmVIAAgpInit(int fd, int offset, int size)
72 {
73 drm_via_agp_t agp;
74 agp.offset = offset;
75 agp.size = size;
76
77 if (ioctl(fd, DRM_IOCTL_VIA_AGP_INIT, &agp) < 0) {
78 return -errno;
79 }
80 else {
81 return 0;
82 }
83 }
84
85 int drmVIAFBInit(int fd, int offset, int size)
86 {
87 drm_via_fb_t fb;
88 fb.offset = offset;
89 fb.size = size;
90
91 if (ioctl(fd, DRM_IOCTL_VIA_FB_INIT, &fb) < 0) {
92 return -errno;
93 }
94 else
95 return 0;
96 }
97
98 int drmVIAInitMAP(int fd, drmVIAInit *info)
99 {
100 drm_via_init_t init;
101
102 memset(&init, 0, sizeof(drm_via_init_t));
103 init.func = VIA_INIT_MAP;
104 init.sarea_priv_offset = info->sarea_priv_offset;
105 init.fb_offset = info->fb_offset;
106 init.mmio_offset = info->mmio_offset;
107 init.agpAddr = info->agpAddr;
108
109 if (ioctl(fd, DRM_IOCTL_VIA_MAP_INIT, &init ) < 0) {
110 return -errno;
111 }
112 else
113 return 0;
114 }
115
116 int drmVIAAllocateDMA(int fd, drmVIADMABuf *buf)
117 {
118 if (drmAddMap(fd, 0, buf->size,
119 DRM_SHM, 0,
120 &buf->index) < 0) {
121 return -errno;
122 }
123
124 if (drmMap(fd,(drmHandle)buf->index,
125 buf->size,(drmAddressPtr)(&buf->address)) < 0) {
126 return -errno;
127 }
128
129 memset(buf->address, 0, buf->size);
130
131 return 0;
132 }
133
134 int drmVIAReleaseDMA(int fd, drmVIADMABuf *buf)
135 {
136 if (drmUnmap((drmAddress)(buf->address), buf->size) < 0)
137 return -errno;
138
139 return 0;
140 }