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 #ifndef _VIA_DRV_H_
25 #define _VIA_DRV_H_
26
27 typedef struct drm_via_private {
28 drm_via_sarea_t *sarea_priv;
29 drm_map_t *sarea;
30 drm_map_t *fb;
31 drm_map_t *mmio;
32 unsigned long agpAddr;
33 } drm_via_private_t;
34
35 extern int via_do_init_map(drm_device_t *dev, drm_via_init_t *init);
36 extern int via_do_cleanup_map(drm_device_t *dev);
37 extern int via_map_init(struct inode *inode, struct file *filp,
38 unsigned int cmd, unsigned long arg);
39
40 /*=* [DBG] For RedHat7.3 insert kernel module has unresolved symbol
41 cmpxchg() *=*/
42
43 /* Include this here so that driver can be used with older kernels. */
44 #ifndef __HAVE_ARCH_CMPXCHG
45
46 #ifdef CONFIG_SMP
47 #define LOCK_PREFIX "lock ; "
48 #else
49 #define LOCK_PREFIX ""
50 #endif
51
52 #if defined(__alpha__)
53 static __inline__ unsigned long
__cmpxchg_u32(volatile int * m,int old,int new)54 __cmpxchg_u32(volatile int *m, int old, int new)
55 {
56 unsigned long prev, cmp;
57
58 __asm__ __volatile__(
59 "1: ldl_l %0,%2\n"
60 " cmpeq %0,%3,%1\n"
61 " beq %1,2f\n"
62 " mov %4,%1\n"
63 " stl_c %1,%2\n"
64 " beq %1,3f\n"
65 "2: mb\n"
66 ".subsection 2\n"
67 "3: br 1b\n"
68 ".previous"
69 : "=&r"(prev), "=&r"(cmp), "=m"(*m)
70 : "r"((long) old), "r"(new), "m"(*m));
71
72 return prev;
73 }
74
75 static __inline__ unsigned long
__cmpxchg_u64(volatile long * m,unsigned long old,unsigned long new)76 __cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new)
77 {
78 unsigned long prev, cmp;
79
80 __asm__ __volatile__(
81 "1: ldq_l %0,%2\n"
82 " cmpeq %0,%3,%1\n"
83 " beq %1,2f\n"
84 " mov %4,%1\n"
85 " stq_c %1,%2\n"
86 " beq %1,3f\n"
87 "2: mb\n"
88 ".subsection 2\n"
89 "3: br 1b\n"
90 ".previous"
91 : "=&r"(prev), "=&r"(cmp), "=m"(*m)
92 : "r"((long) old), "r"(new), "m"(*m));
93
94 return prev;
95 }
96
97 static __inline__ unsigned long
__cmpxchg(volatile void * ptr,unsigned long old,unsigned long new,int size)98 __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
99 {
100 switch (size) {
101 case 4:
102 return __cmpxchg_u32(ptr, old, new);
103 case 8:
104 return __cmpxchg_u64(ptr, old, new);
105 }
106 return old;
107 }
108 #define cmpxchg(ptr,o,n) \
109 ({ \
110 __typeof__(*(ptr)) _o_ = (o); \
111 __typeof__(*(ptr)) _n_ = (n); \
112 (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \
113 (unsigned long)_n_, sizeof(*(ptr))); \
114 })
115
116 #elif __i386__
__cmpxchg(volatile void * ptr,unsigned long old,unsigned long new,int size)117 static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
118 unsigned long new, int size)
119 {
120 unsigned long prev;
121 switch (size) {
122 case 1:
123 __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
124 : "=a"(prev)
125 : "q"(new), "m"(*__xg(ptr)), "0"(old)
126 : "memory");
127 return prev;
128 case 2:
129 __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
130 : "=a"(prev)
131 : "q"(new), "m"(*__xg(ptr)), "0"(old)
132 : "memory");
133 return prev;
134 case 4:
135 __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
136 : "=a"(prev)
137 : "q"(new), "m"(*__xg(ptr)), "0"(old)
138 : "memory");
139 return prev;
140 }
141 return old;
142 }
143
144 #define cmpxchg(ptr,o,n) \
145 ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o), \
146 (unsigned long)(n),sizeof(*(ptr))))
147 #endif /* i386 & alpha */
148 #endif
149 #endif
150