3a57186be84973ac21d5a0224c0e10cd4dd83995
2 * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Thomas Roell not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Thomas Roell makes no representations
11 * about the suitability of this software for any purpose. It is provided
12 * "as is" without express or implied warranty.
14 * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
24 * Copyright (c) 1994-2003 by The XFree86 Project, Inc.
26 * Permission is hereby granted, free of charge, to any person obtaining a
27 * copy of this software and associated documentation files (the "Software"),
28 * to deal in the Software without restriction, including without limitation
29 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
30 * and/or sell copies of the Software, and to permit persons to whom the
31 * Software is furnished to do so, subject to the following conditions:
33 * The above copyright notice and this permission notice shall be included in
34 * all copies or substantial portions of the Software.
36 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
39 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
40 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
41 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
42 * OTHER DEALINGS IN THE SOFTWARE.
44 * Except as contained in this notice, the name of the copyright holder(s)
45 * and author(s) shall not be used in advertising or otherwise to promote
46 * the sale, use or other dealings in this Software without prior written
47 * authorization from the copyright holder(s) and author(s).
54 #if defined(__SUNPRO_C)
58 /* Map Sun compiler platform defines to gcc-style used in the code */
59 #if defined(__amd64) && !defined(__amd64__)
62 #if defined(__i386) && !defined(__i386__)
65 #if defined(__sparc) && !defined(__sparc__)
68 #if defined(__sparcv9) && !defined(__sparc64__)
73 #include <X11/Xfuncproto.h>
76 #include <pixman.h> /* for uint*_t types */
78 /* Allow drivers to use the GCC-supported __inline__ and/or __inline. */
81 /* gcc has __inline__ */
82 #elif defined(__HIGHC__)
83 #define __inline__ _Inline
85 #define __inline__ /**/
87 #endif /* __inline__ */
90 /* gcc has __inline */
91 #elif defined(__HIGHC__)
92 #define __inline _Inline
97 /* Support gcc's __FUNCTION__ for people using other compilers */
98 #if !defined(__GNUC__) && !defined(__FUNCTION__)
99 #define __FUNCTION__ __func__ /* C99 */
101 #if defined(NO_INLINE) || defined(DO_PROTOTYPES)
102 #if !defined(__arm__)
103 #if !defined(__sparc__) && !defined(__sparc) && !defined(__arm32__) && !defined(__nds32__) \
104 && !(defined(__alpha__) && defined(linux)) \
105 && !(defined(__ia64__) && defined(linux)) \
107 extern _X_EXPORT void outb(unsigned short, unsigned char);
108 extern _X_EXPORT
void outw(unsigned short, unsigned short);
109 extern _X_EXPORT
void outl(unsigned short, unsigned int);
110 extern _X_EXPORT
unsigned int inb(unsigned short);
111 extern _X_EXPORT
unsigned int inw(unsigned short);
112 extern _X_EXPORT
unsigned int inl(unsigned short);
114 #else /* __sparc__, __arm32__, __alpha__, __nds32__ */
115 extern _X_EXPORT
void outb(unsigned long, unsigned char);
116 extern _X_EXPORT
void outw(unsigned long, unsigned short);
117 extern _X_EXPORT
void outl(unsigned long, unsigned int);
118 extern _X_EXPORT
unsigned int inb(unsigned long);
119 extern _X_EXPORT
unsigned int inw(unsigned long);
120 extern _X_EXPORT
unsigned int inl(unsigned long);
123 extern _X_EXPORT
unsigned char xf86ReadMmio8 (void *, unsigned long);
124 extern _X_EXPORT
unsigned short xf86ReadMmio16Be (void *, unsigned long);
125 extern _X_EXPORT
unsigned short xf86ReadMmio16Le (void *, unsigned long);
126 extern _X_EXPORT
unsigned int xf86ReadMmio32Be (void *, unsigned long);
127 extern _X_EXPORT
unsigned int xf86ReadMmio32Le (void *, unsigned long);
128 extern _X_EXPORT
void xf86WriteMmio8 (void *, unsigned long, unsigned int);
129 extern _X_EXPORT
void xf86WriteMmio16Be (void *, unsigned long, unsigned int);
130 extern _X_EXPORT
void xf86WriteMmio16Le (void *, unsigned long, unsigned int);
131 extern _X_EXPORT
void xf86WriteMmio32Be (void *, unsigned long, unsigned int);
132 extern _X_EXPORT
void xf86WriteMmio32Le (void *, unsigned long, unsigned int);
133 extern _X_EXPORT
void xf86WriteMmio8NB (void *, unsigned long, unsigned int);
134 extern _X_EXPORT
void xf86WriteMmio16BeNB (void *, unsigned long, unsigned int);
135 extern _X_EXPORT
void xf86WriteMmio16LeNB (void *, unsigned long, unsigned int);
136 extern _X_EXPORT
void xf86WriteMmio32BeNB (void *, unsigned long, unsigned int);
137 extern _X_EXPORT
void xf86WriteMmio32LeNB (void *, unsigned long, unsigned int);
138 #endif /* _SUNPRO_C */
139 #endif /* __sparc__, __arm32__, __alpha__, __nds32__ */
142 #if defined(__powerpc__) && !defined(__OpenBSD__)
143 extern unsigned long ldq_u(unsigned long *);
144 extern unsigned long ldl_u(unsigned int *);
145 extern unsigned long ldw_u(unsigned short *);
146 extern void stq_u(unsigned long, unsigned long *);
147 extern void stl_u(unsigned long, unsigned int *);
148 extern void stw_u(unsigned long, unsigned short *);
149 extern void mem_barrier(void);
150 extern void write_mem_barrier(void);
151 extern void stl_brx(unsigned long, volatile unsigned char *, int);
152 extern void stw_brx(unsigned short, volatile unsigned char *, int);
153 extern unsigned long ldl_brx(volatile unsigned char *, int);
154 extern unsigned short ldw_brx(volatile unsigned char *, int);
155 #endif /* __powerpc__ && !__OpenBSD */
157 #endif /* NO_INLINE || DO_PROTOTYPES */
164 #define write_mem_barrier() __asm__ __volatile__ ("sfence" : : : "memory")
166 #define write_mem_barrier() __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
170 #define mem_barrier() __asm__ __volatile__ ("mfence" : : : "memory")
172 #define mem_barrier() __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
175 #elif defined __alpha__
177 #define mem_barrier() __asm__ __volatile__ ("mb" : : : "memory")
178 #define write_mem_barrier() __asm__ __volatile__ ("wmb" : : : "memory")
180 #elif defined __amd64__
182 #define mem_barrier() __asm__ __volatile__ ("mfence" : : : "memory")
183 #define write_mem_barrier() __asm__ __volatile__ ("sfence" : : : "memory")
185 #elif defined __ia64__
187 #ifndef __INTEL_COMPILER
188 #define mem_barrier() __asm__ __volatile__ ("mf" : : : "memory")
189 #define write_mem_barrier() __asm__ __volatile__ ("mf" : : : "memory")
191 #include "ia64intrin.h"
192 #define mem_barrier() __mf()
193 #define write_mem_barrier() __mf()
196 #elif defined __mips__
197 /* Note: sync instruction requires MIPS II instruction set */
198 #define mem_barrier() \
199 __asm__ __volatile__( \
201 ".set noreorder\n\t" \
208 #define write_mem_barrier() mem_barrier()
210 #elif defined __powerpc__
212 #if defined(linux) && defined(__powerpc64__)
213 #include <linux/version.h>
214 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
215 #include <asm/memory.h>
217 #endif /* defined(linux) && defined(__powerpc64__) */
219 #ifndef eieio /* We deal with arch-specific eieio() routines above... */
220 #define eieio() __asm__ __volatile__ ("eieio" ::: "memory")
222 #define mem_barrier() eieio()
223 #define write_mem_barrier() eieio()
225 #elif defined __sparc__
227 #define barrier() __asm__ __volatile__ (".word 0x8143e00a" : : : "memory")
228 #define mem_barrier() /* XXX: nop for now */
229 #define write_mem_barrier() /* XXX: nop for now */
231 #endif /* __GNUC__ */
232 #endif /* NO_INLINE */
235 #define mem_barrier() /* NOP */
238 #ifndef write_mem_barrier
239 #define write_mem_barrier() /* NOP */
245 /* Define some packed structures to use with unaligned accesses */
248 uint64_t x
__attribute__ ((packed
));
251 uint32_t x
__attribute__ ((packed
));
254 uint16_t x
__attribute__ ((packed
));
257 /* Elemental unaligned loads */
259 static __inline__
uint64_t
262 const struct __una_u64
*ptr
= (const struct __una_u64
*) p
;
267 static __inline__
uint32_t
270 const struct __una_u32
*ptr
= (const struct __una_u32
*) p
;
275 static __inline__
uint16_t
278 const struct __una_u16
*ptr
= (const struct __una_u16
*) p
;
283 /* Elemental unaligned stores */
285 static __inline__
void
286 stq_u(uint64_t val
, uint64_t * p
)
288 struct __una_u64
*ptr
= (struct __una_u64
*) p
;
293 static __inline__
void
294 stl_u(uint32_t val
, uint32_t * p
)
296 struct __una_u32
*ptr
= (struct __una_u32
*) p
;
301 static __inline__
void
302 stw_u(uint16_t val
, uint16_t * p
)
304 struct __una_u16
*ptr
= (struct __una_u16
*) p
;
308 #else /* !__GNUC__ */
310 #include <string.h> /* needed for memmove */
312 static __inline__
uint64_t
317 memmove(&ret
, p
, sizeof(*p
));
321 static __inline__
uint32_t
326 memmove(&ret
, p
, sizeof(*p
));
330 static __inline__
uint16_t
335 memmove(&ret
, p
, sizeof(*p
));
339 static __inline__
void
340 stq_u(uint64_t val
, uint64_t * p
)
344 memmove(p
, &tmp
, sizeof(*p
));
347 static __inline__
void
348 stl_u(uint32_t val
, uint32_t * p
)
352 memmove(p
, &tmp
, sizeof(*p
));
355 static __inline__
void
356 stw_u(uint16_t val
, uint16_t * p
)
360 memmove(p
, &tmp
, sizeof(*p
));
363 #endif /* __GNUC__ */
364 #endif /* NO_INLINE */
368 #if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && (defined(__alpha__))
371 /* for Linux on Alpha, we use the LIBC _inx/_outx routines */
372 /* note that the appropriate setup via "ioperm" needs to be done */
373 /* *before* any inx/outx is done. */
375 extern _X_EXPORT
void _outb(unsigned char val
, unsigned long port
);
376 extern _X_EXPORT
void _outw(unsigned short val
, unsigned long port
);
377 extern _X_EXPORT
void _outl(unsigned int val
, unsigned long port
);
378 extern _X_EXPORT
unsigned int _inb(unsigned long port
);
379 extern _X_EXPORT
unsigned int _inw(unsigned long port
);
380 extern _X_EXPORT
unsigned int _inl(unsigned long port
);
382 static __inline__
void
383 outb(unsigned long port
, unsigned char val
)
388 static __inline__
void
389 outw(unsigned long port
, unsigned short val
)
394 static __inline__
void
395 outl(unsigned long port
, unsigned int val
)
400 static __inline__
unsigned int
401 inb(unsigned long port
)
406 static __inline__
unsigned int
407 inw(unsigned long port
)
412 static __inline__
unsigned int
413 inl(unsigned long port
)
420 #if (defined(__FreeBSD__) || defined(__OpenBSD__)) \
421 && !defined(DO_PROTOTYPES)
423 /* for FreeBSD and OpenBSD on Alpha, we use the libio (resp. libalpha) */
424 /* inx/outx routines */
425 /* note that the appropriate setup via "ioperm" needs to be done */
426 /* *before* any inx/outx is done. */
428 extern _X_EXPORT
void outb(unsigned int port
, unsigned char val
);
429 extern _X_EXPORT
void outw(unsigned int port
, unsigned short val
);
430 extern _X_EXPORT
void outl(unsigned int port
, unsigned int val
);
431 extern _X_EXPORT
unsigned char inb(unsigned int port
);
432 extern _X_EXPORT
unsigned short inw(unsigned int port
);
433 extern _X_EXPORT
unsigned int inl(unsigned int port
);
435 #endif /* (__FreeBSD__ || __OpenBSD__ ) && !DO_PROTOTYPES */
437 #if defined(__NetBSD__)
438 #include <machine/pio.h>
439 #endif /* __NetBSD__ */
441 #elif (defined(linux) || defined(__FreeBSD__)) && defined(__amd64__)
443 #include <inttypes.h>
445 static __inline__
void
446 outb(unsigned short port
, unsigned char val
)
448 __asm__
__volatile__("outb %0,%1"::"a"(val
), "d"(port
));
451 static __inline__
void
452 outw(unsigned short port
, unsigned short val
)
454 __asm__
__volatile__("outw %0,%1"::"a"(val
), "d"(port
));
457 static __inline__
void
458 outl(unsigned short port
, unsigned int val
)
460 __asm__
__volatile__("outl %0,%1"::"a"(val
), "d"(port
));
463 static __inline__
unsigned int
464 inb(unsigned short port
)
467 __asm__
__volatile__("inb %1,%0":"=a"(ret
):"d"(port
));
472 static __inline__
unsigned int
473 inw(unsigned short port
)
476 __asm__
__volatile__("inw %1,%0":"=a"(ret
):"d"(port
));
481 static __inline__
unsigned int
482 inl(unsigned short port
)
485 __asm__
__volatile__("inl %1,%0":"=a"(ret
):"d"(port
));
490 #elif (defined(linux) || defined(sun) || defined(__OpenBSD__) || defined(__FreeBSD__)) && defined(__sparc__)
496 static __inline__
void
497 outb(unsigned long port
, unsigned char val
)
499 __asm__
__volatile__("stba %0, [%1] %2": /* No outputs */
500 :"r"(val
), "r"(port
), "i"(ASI_PL
));
505 static __inline__
void
506 outw(unsigned long port
, unsigned short val
)
508 __asm__
__volatile__("stha %0, [%1] %2": /* No outputs */
509 :"r"(val
), "r"(port
), "i"(ASI_PL
));
514 static __inline__
void
515 outl(unsigned long port
, unsigned int val
)
517 __asm__
__volatile__("sta %0, [%1] %2": /* No outputs */
518 :"r"(val
), "r"(port
), "i"(ASI_PL
));
523 static __inline__
unsigned int
524 inb(unsigned long port
)
527 __asm__
__volatile__("lduba [%1] %2, %0":"=r"(ret
)
528 :"r"(port
), "i"(ASI_PL
));
533 static __inline__
unsigned int
534 inw(unsigned long port
)
537 __asm__
__volatile__("lduha [%1] %2, %0":"=r"(ret
)
538 :"r"(port
), "i"(ASI_PL
));
543 static __inline__
unsigned int
544 inl(unsigned long port
)
547 __asm__
__volatile__("lda [%1] %2, %0":"=r"(ret
)
548 :"r"(port
), "i"(ASI_PL
));
553 static __inline__
unsigned char
554 xf86ReadMmio8(__volatile__
void *base
, const unsigned long offset
)
556 unsigned long addr
= ((unsigned long) base
) + offset
;
559 __asm__
__volatile__("lduba [%1] %2, %0":"=r"(ret
)
560 :"r"(addr
), "i"(ASI_PL
));
565 static __inline__
unsigned short
566 xf86ReadMmio16Be(__volatile__
void *base
, const unsigned long offset
)
568 unsigned long addr
= ((unsigned long) base
) + offset
;
571 __asm__
__volatile__("lduh [%1], %0":"=r"(ret
)
577 static __inline__
unsigned short
578 xf86ReadMmio16Le(__volatile__
void *base
, const unsigned long offset
)
580 unsigned long addr
= ((unsigned long) base
) + offset
;
583 __asm__
__volatile__("lduha [%1] %2, %0":"=r"(ret
)
584 :"r"(addr
), "i"(ASI_PL
));
589 static __inline__
unsigned int
590 xf86ReadMmio32Be(__volatile__
void *base
, const unsigned long offset
)
592 unsigned long addr
= ((unsigned long) base
) + offset
;
595 __asm__
__volatile__("ld [%1], %0":"=r"(ret
)
601 static __inline__
unsigned int
602 xf86ReadMmio32Le(__volatile__
void *base
, const unsigned long offset
)
604 unsigned long addr
= ((unsigned long) base
) + offset
;
607 __asm__
__volatile__("lda [%1] %2, %0":"=r"(ret
)
608 :"r"(addr
), "i"(ASI_PL
));
613 static __inline__
void
614 xf86WriteMmio8(__volatile__
void *base
, const unsigned long offset
,
615 const unsigned int val
)
617 unsigned long addr
= ((unsigned long) base
) + offset
;
619 __asm__
__volatile__("stba %0, [%1] %2": /* No outputs */
620 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
625 static __inline__
void
626 xf86WriteMmio16Be(__volatile__
void *base
, const unsigned long offset
,
627 const unsigned int val
)
629 unsigned long addr
= ((unsigned long) base
) + offset
;
631 __asm__
__volatile__("sth %0, [%1]": /* No outputs */
632 :"r"(val
), "r"(addr
));
637 static __inline__
void
638 xf86WriteMmio16Le(__volatile__
void *base
, const unsigned long offset
,
639 const unsigned int val
)
641 unsigned long addr
= ((unsigned long) base
) + offset
;
643 __asm__
__volatile__("stha %0, [%1] %2": /* No outputs */
644 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
649 static __inline__
void
650 xf86WriteMmio32Be(__volatile__
void *base
, const unsigned long offset
,
651 const unsigned int val
)
653 unsigned long addr
= ((unsigned long) base
) + offset
;
655 __asm__
__volatile__("st %0, [%1]": /* No outputs */
656 :"r"(val
), "r"(addr
));
661 static __inline__
void
662 xf86WriteMmio32Le(__volatile__
void *base
, const unsigned long offset
,
663 const unsigned int val
)
665 unsigned long addr
= ((unsigned long) base
) + offset
;
667 __asm__
__volatile__("sta %0, [%1] %2": /* No outputs */
668 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
673 static __inline__
void
674 xf86WriteMmio8NB(__volatile__
void *base
, const unsigned long offset
,
675 const unsigned int val
)
677 unsigned long addr
= ((unsigned long) base
) + offset
;
679 __asm__
__volatile__("stba %0, [%1] %2": /* No outputs */
680 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
683 static __inline__
void
684 xf86WriteMmio16BeNB(__volatile__
void *base
, const unsigned long offset
,
685 const unsigned int val
)
687 unsigned long addr
= ((unsigned long) base
) + offset
;
689 __asm__
__volatile__("sth %0, [%1]": /* No outputs */
690 :"r"(val
), "r"(addr
));
693 static __inline__
void
694 xf86WriteMmio16LeNB(__volatile__
void *base
, const unsigned long offset
,
695 const unsigned int val
)
697 unsigned long addr
= ((unsigned long) base
) + offset
;
699 __asm__
__volatile__("stha %0, [%1] %2": /* No outputs */
700 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
703 static __inline__
void
704 xf86WriteMmio32BeNB(__volatile__
void *base
, const unsigned long offset
,
705 const unsigned int val
)
707 unsigned long addr
= ((unsigned long) base
) + offset
;
709 __asm__
__volatile__("st %0, [%1]": /* No outputs */
710 :"r"(val
), "r"(addr
));
713 static __inline__
void
714 xf86WriteMmio32LeNB(__volatile__
void *base
, const unsigned long offset
,
715 const unsigned int val
)
717 unsigned long addr
= ((unsigned long) base
) + offset
;
719 __asm__
__volatile__("sta %0, [%1] %2": /* No outputs */
720 :"r"(val
), "r"(addr
), "i"(ASI_PL
));
723 #elif defined(__mips__) || (defined(__arm32__) && !defined(__linux__))
725 #define PORT_SIZE long
727 #define PORT_SIZE short
730 _X_EXPORT
unsigned int IOPortBase
; /* Memory mapped I/O port area */
732 static __inline__
void
733 outb(unsigned PORT_SIZE port
, unsigned char val
)
735 *(volatile unsigned char *) (((unsigned PORT_SIZE
) (port
)) + IOPortBase
) =
739 static __inline__
void
740 outw(unsigned PORT_SIZE port
, unsigned short val
)
742 *(volatile unsigned short *) (((unsigned PORT_SIZE
) (port
)) + IOPortBase
) =
746 static __inline__
void
747 outl(unsigned PORT_SIZE port
, unsigned int val
)
749 *(volatile unsigned int *) (((unsigned PORT_SIZE
) (port
)) + IOPortBase
) =
753 static __inline__
unsigned int
754 inb(unsigned PORT_SIZE port
)
756 return *(volatile unsigned char *) (((unsigned PORT_SIZE
) (port
)) +
760 static __inline__
unsigned int
761 inw(unsigned PORT_SIZE port
)
763 return *(volatile unsigned short *) (((unsigned PORT_SIZE
) (port
)) +
767 static __inline__
unsigned int
768 inl(unsigned PORT_SIZE port
)
770 return *(volatile unsigned int *) (((unsigned PORT_SIZE
) (port
)) +
774 #if defined(__mips__)
775 #ifdef linux /* don't mess with other OSs */
776 #if X_BYTE_ORDER == X_BIG_ENDIAN
777 static __inline__
unsigned int
778 xf86ReadMmio32Be(__volatile__
void *base
, const unsigned long offset
)
780 unsigned long addr
= ((unsigned long) base
) + offset
;
783 __asm__
__volatile__("lw %0, 0(%1)":"=r"(ret
)
789 static __inline__
void
790 xf86WriteMmio32Be(__volatile__
void *base
, const unsigned long offset
,
791 const unsigned int val
)
793 unsigned long addr
= ((unsigned long) base
) + offset
;
795 __asm__
__volatile__("sw %0, 0(%1)": /* No outputs */
796 :"r"(val
), "r"(addr
));
800 #endif /* __mips__ */
802 #elif (defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)) && defined(__powerpc__)
805 #define MAP_FAILED ((void *)-1)
808 extern _X_EXPORT
volatile unsigned char *ioBase
;
810 static __inline__
unsigned char
811 xf86ReadMmio8(__volatile__
void *base
, const unsigned long offset
)
813 register unsigned char val
;
814 __asm__
__volatile__("lbzx %0,%1,%2\n\t" "eieio":"=r"(val
)
815 :"b"(base
), "r"(offset
),
816 "m"(*((volatile unsigned char *) base
+ offset
)));
820 static __inline__
unsigned short
821 xf86ReadMmio16Be(__volatile__
void *base
, const unsigned long offset
)
823 register unsigned short val
;
824 __asm__
__volatile__("lhzx %0,%1,%2\n\t" "eieio":"=r"(val
)
825 :"b"(base
), "r"(offset
),
826 "m"(*((volatile unsigned char *) base
+ offset
)));
830 static __inline__
unsigned short
831 xf86ReadMmio16Le(__volatile__
void *base
, const unsigned long offset
)
833 register unsigned short val
;
834 __asm__
__volatile__("lhbrx %0,%1,%2\n\t" "eieio":"=r"(val
)
835 :"b"(base
), "r"(offset
),
836 "m"(*((volatile unsigned char *) base
+ offset
)));
840 static __inline__
unsigned int
841 xf86ReadMmio32Be(__volatile__
void *base
, const unsigned long offset
)
843 register unsigned int val
;
844 __asm__
__volatile__("lwzx %0,%1,%2\n\t" "eieio":"=r"(val
)
845 :"b"(base
), "r"(offset
),
846 "m"(*((volatile unsigned char *) base
+ offset
)));
850 static __inline__
unsigned int
851 xf86ReadMmio32Le(__volatile__
void *base
, const unsigned long offset
)
853 register unsigned int val
;
854 __asm__
__volatile__("lwbrx %0,%1,%2\n\t" "eieio":"=r"(val
)
855 :"b"(base
), "r"(offset
),
856 "m"(*((volatile unsigned char *) base
+ offset
)));
860 static __inline__
void
861 xf86WriteMmioNB8(__volatile__
void *base
, const unsigned long offset
,
862 const unsigned char val
)
865 __volatile__("stbx %1,%2,%3\n\t":"=m"
866 (*((volatile unsigned char *) base
+ offset
))
867 :"r"(val
), "b"(base
), "r"(offset
));
870 static __inline__
void
871 xf86WriteMmioNB16Le(__volatile__
void *base
, const unsigned long offset
,
872 const unsigned short val
)
875 __volatile__("sthbrx %1,%2,%3\n\t":"=m"
876 (*((volatile unsigned char *) base
+ offset
))
877 :"r"(val
), "b"(base
), "r"(offset
));
880 static __inline__
void
881 xf86WriteMmioNB16Be(__volatile__
void *base
, const unsigned long offset
,
882 const unsigned short val
)
885 __volatile__("sthx %1,%2,%3\n\t":"=m"
886 (*((volatile unsigned char *) base
+ offset
))
887 :"r"(val
), "b"(base
), "r"(offset
));
890 static __inline__
void
891 xf86WriteMmioNB32Le(__volatile__
void *base
, const unsigned long offset
,
892 const unsigned int val
)
895 __volatile__("stwbrx %1,%2,%3\n\t":"=m"
896 (*((volatile unsigned char *) base
+ offset
))
897 :"r"(val
), "b"(base
), "r"(offset
));
900 static __inline__
void
901 xf86WriteMmioNB32Be(__volatile__
void *base
, const unsigned long offset
,
902 const unsigned int val
)
905 __volatile__("stwx %1,%2,%3\n\t":"=m"
906 (*((volatile unsigned char *) base
+ offset
))
907 :"r"(val
), "b"(base
), "r"(offset
));
910 static __inline__
void
911 xf86WriteMmio8(__volatile__
void *base
, const unsigned long offset
,
912 const unsigned char val
)
914 xf86WriteMmioNB8(base
, offset
, val
);
918 static __inline__
void
919 xf86WriteMmio16Le(__volatile__
void *base
, const unsigned long offset
,
920 const unsigned short val
)
922 xf86WriteMmioNB16Le(base
, offset
, val
);
926 static __inline__
void
927 xf86WriteMmio16Be(__volatile__
void *base
, const unsigned long offset
,
928 const unsigned short val
)
930 xf86WriteMmioNB16Be(base
, offset
, val
);
934 static __inline__
void
935 xf86WriteMmio32Le(__volatile__
void *base
, const unsigned long offset
,
936 const unsigned int val
)
938 xf86WriteMmioNB32Le(base
, offset
, val
);
942 static __inline__
void
943 xf86WriteMmio32Be(__volatile__
void *base
, const unsigned long offset
,
944 const unsigned int val
)
946 xf86WriteMmioNB32Be(base
, offset
, val
);
950 static __inline__
void
951 outb(unsigned short port
, unsigned char value
)
953 if (ioBase
== MAP_FAILED
)
955 xf86WriteMmio8((void *) ioBase
, port
, value
);
958 static __inline__
void
959 outw(unsigned short port
, unsigned short value
)
961 if (ioBase
== MAP_FAILED
)
963 xf86WriteMmio16Le((void *) ioBase
, port
, value
);
966 static __inline__
void
967 outl(unsigned short port
, unsigned int value
)
969 if (ioBase
== MAP_FAILED
)
971 xf86WriteMmio32Le((void *) ioBase
, port
, value
);
974 static __inline__
unsigned int
975 inb(unsigned short port
)
977 if (ioBase
== MAP_FAILED
)
979 return xf86ReadMmio8((void *) ioBase
, port
);
982 static __inline__
unsigned int
983 inw(unsigned short port
)
985 if (ioBase
== MAP_FAILED
)
987 return xf86ReadMmio16Le((void *) ioBase
, port
);
990 static __inline__
unsigned int
991 inl(unsigned short port
)
993 if (ioBase
== MAP_FAILED
)
995 return xf86ReadMmio32Le((void *) ioBase
, port
);
998 #elif defined(__arm__) && defined(__linux__)
1000 /* for Linux on ARM, we use the LIBC inx/outx routines */
1001 /* note that the appropriate setup via "ioperm" needs to be done */
1002 /* *before* any inx/outx is done. */
1006 static __inline__
void
1007 xf_outb(unsigned short port
, unsigned char val
)
1012 static __inline__
void
1013 xf_outw(unsigned short port
, unsigned short val
)
1018 static __inline__
void
1019 xf_outl(unsigned short port
, unsigned int val
)
1024 #define outb xf_outb
1025 #define outw xf_outw
1026 #define outl xf_outl
1028 #elif defined(__nds32__)
1031 * Assume all port access are aligned. We need to revise this implementation
1032 * if there is unaligned port access. For ldq_u, ldl_u, ldw_u, stq_u, stl_u and
1033 * stw_u, they are assumed unaligned.
1036 #define barrier() /* no barrier */
1038 #define PORT_SIZE long
1040 static __inline__
unsigned char
1041 xf86ReadMmio8(__volatile__
void *base
, const unsigned long offset
)
1043 return *(volatile unsigned char *) ((unsigned char *) base
+ offset
);
1046 static __inline__
void
1047 xf86WriteMmio8(__volatile__
void *base
, const unsigned long offset
,
1048 const unsigned int val
)
1050 *(volatile unsigned char *) ((unsigned char *) base
+ offset
) = val
;
1054 static __inline__
void
1055 xf86WriteMmio8NB(__volatile__
void *base
, const unsigned long offset
,
1056 const unsigned int val
)
1058 *(volatile unsigned char *) ((unsigned char *) base
+ offset
) = val
;
1061 static __inline__
unsigned short
1062 xf86ReadMmio16Swap(__volatile__
void *base
, const unsigned long offset
)
1064 unsigned long addr
= ((unsigned long) base
) + offset
;
1067 __asm__
__volatile__("lhi %0, [%1];\n\t" "wsbh %0, %0;\n\t":"=r"(ret
)
1073 static __inline__
unsigned short
1074 xf86ReadMmio16(__volatile__
void *base
, const unsigned long offset
)
1076 return *(volatile unsigned short *) ((char *) base
+ offset
);
1079 static __inline__
void
1080 xf86WriteMmio16Swap(__volatile__
void *base
, const unsigned long offset
,
1081 const unsigned int val
)
1083 unsigned long addr
= ((unsigned long) base
) + offset
;
1085 __asm__
__volatile__("wsbh %0, %0;\n\t" "shi %0, [%1];\n\t": /* No outputs */
1086 :"r"(val
), "r"(addr
));
1091 static __inline__
void
1092 xf86WriteMmio16(__volatile__
void *base
, const unsigned long offset
,
1093 const unsigned int val
)
1095 *(volatile unsigned short *) ((unsigned char *) base
+ offset
) = val
;
1099 static __inline__
void
1100 xf86WriteMmio16SwapNB(__volatile__
void *base
, const unsigned long offset
,
1101 const unsigned int val
)
1103 unsigned long addr
= ((unsigned long) base
) + offset
;
1105 __asm__
__volatile__("wsbh %0, %0;\n\t" "shi %0, [%1];\n\t": /* No outputs */
1106 :"r"(val
), "r"(addr
));
1109 static __inline__
void
1110 xf86WriteMmio16NB(__volatile__
void *base
, const unsigned long offset
,
1111 const unsigned int val
)
1113 *(volatile unsigned short *) ((unsigned char *) base
+ offset
) = val
;
1116 static __inline__
unsigned int
1117 xf86ReadMmio32Swap(__volatile__
void *base
, const unsigned long offset
)
1119 unsigned long addr
= ((unsigned long) base
) + offset
;
1122 __asm__
__volatile__("lwi %0, [%1];\n\t"
1123 "wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t":"=r"(ret
)
1129 static __inline__
unsigned int
1130 xf86ReadMmio32(__volatile__
void *base
, const unsigned long offset
)
1132 return *(volatile unsigned int *) ((unsigned char *) base
+ offset
);
1135 static __inline__
void
1136 xf86WriteMmio32Swap(__volatile__
void *base
, const unsigned long offset
,
1137 const unsigned int val
)
1139 unsigned long addr
= ((unsigned long) base
) + offset
;
1141 __asm__
__volatile__("wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t" "swi %0, [%1];\n\t": /* No outputs */
1142 :"r"(val
), "r"(addr
));
1147 static __inline__
void
1148 xf86WriteMmio32(__volatile__
void *base
, const unsigned long offset
,
1149 const unsigned int val
)
1151 *(volatile unsigned int *) ((unsigned char *) base
+ offset
) = val
;
1155 static __inline__
void
1156 xf86WriteMmio32SwapNB(__volatile__
void *base
, const unsigned long offset
,
1157 const unsigned int val
)
1159 unsigned long addr
= ((unsigned long) base
) + offset
;
1161 __asm__
__volatile__("wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t" "swi %0, [%1];\n\t": /* No outputs */
1162 :"r"(val
), "r"(addr
));
1165 static __inline__
void
1166 xf86WriteMmio32NB(__volatile__
void *base
, const unsigned long offset
,
1167 const unsigned int val
)
1169 *(volatile unsigned int *) ((unsigned char *) base
+ offset
) = val
;
1172 #if defined(NDS32_MMIO_SWAP)
1173 static __inline__
void
1174 outb(unsigned PORT_SIZE port
, unsigned char val
)
1176 xf86WriteMmio8(IOPortBase
, port
, val
);
1179 static __inline__
void
1180 outw(unsigned PORT_SIZE port
, unsigned short val
)
1182 xf86WriteMmio16Swap(IOPortBase
, port
, val
);
1185 static __inline__
void
1186 outl(unsigned PORT_SIZE port
, unsigned int val
)
1188 xf86WriteMmio32Swap(IOPortBase
, port
, val
);
1191 static __inline__
unsigned int
1192 inb(unsigned PORT_SIZE port
)
1194 return xf86ReadMmio8(IOPortBase
, port
);
1197 static __inline__
unsigned int
1198 inw(unsigned PORT_SIZE port
)
1200 return xf86ReadMmio16Swap(IOPortBase
, port
);
1203 static __inline__
unsigned int
1204 inl(unsigned PORT_SIZE port
)
1206 return xf86ReadMmio32Swap(IOPortBase
, port
);
1209 static __inline__
unsigned long
1210 ldq_u(unsigned long *p
)
1212 unsigned long addr
= (unsigned long) p
;
1215 __asm__
__volatile__("lmw.bi %0, [%1], %0, 0;\n\t"
1216 "wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t":"=r"(ret
)
1222 static __inline__
unsigned long
1223 ldl_u(unsigned int *p
)
1225 unsigned long addr
= (unsigned long) p
;
1228 __asm__
__volatile__("lmw.bi %0, [%1], %0, 0;\n\t"
1229 "wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t":"=r"(ret
)
1235 static __inline__
void
1236 stq_u(unsigned long val
, unsigned long *p
)
1238 unsigned long addr
= (unsigned long) p
;
1240 __asm__
__volatile__("wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t" "smw.bi %0, [%1], %0, 0;\n\t": /* No outputs */
1241 :"r"(val
), "r"(addr
));
1244 static __inline__
void
1245 stl_u(unsigned long val
, unsigned int *p
)
1247 unsigned long addr
= (unsigned long) p
;
1249 __asm__
__volatile__("wsbh %0, %0;\n\t" "rotri %0, %0, 16;\n\t" "smw.bi %0, [%1], %0, 0;\n\t": /* No outputs */
1250 :"r"(val
), "r"(addr
));
1253 #else /* !NDS32_MMIO_SWAP */
1254 static __inline__
void
1255 outb(unsigned PORT_SIZE port
, unsigned char val
)
1257 *(volatile unsigned char *) (((unsigned PORT_SIZE
) (port
))) = val
;
1261 static __inline__
void
1262 outw(unsigned PORT_SIZE port
, unsigned short val
)
1264 *(volatile unsigned short *) (((unsigned PORT_SIZE
) (port
))) = val
;
1268 static __inline__
void
1269 outl(unsigned PORT_SIZE port
, unsigned int val
)
1271 *(volatile unsigned int *) (((unsigned PORT_SIZE
) (port
))) = val
;
1275 static __inline__
unsigned int
1276 inb(unsigned PORT_SIZE port
)
1278 return *(volatile unsigned char *) (((unsigned PORT_SIZE
) (port
)));
1281 static __inline__
unsigned int
1282 inw(unsigned PORT_SIZE port
)
1284 return *(volatile unsigned short *) (((unsigned PORT_SIZE
) (port
)));
1287 static __inline__
unsigned int
1288 inl(unsigned PORT_SIZE port
)
1290 return *(volatile unsigned int *) (((unsigned PORT_SIZE
) (port
)));
1293 static __inline__
unsigned long
1294 ldq_u(unsigned long *p
)
1296 unsigned long addr
= (unsigned long) p
;
1299 __asm__
__volatile__("lmw.bi %0, [%1], %0, 0;\n\t":"=r"(ret
)
1305 static __inline__
unsigned long
1306 ldl_u(unsigned int *p
)
1308 unsigned long addr
= (unsigned long) p
;
1311 __asm__
__volatile__("lmw.bi %0, [%1], %0, 0;\n\t":"=r"(ret
)
1317 static __inline__
void
1318 stq_u(unsigned long val
, unsigned long *p
)
1320 unsigned long addr
= (unsigned long) p
;
1322 __asm__
__volatile__("smw.bi %0, [%1], %0, 0;\n\t": /* No outputs */
1323 :"r"(val
), "r"(addr
));
1326 static __inline__
void
1327 stl_u(unsigned long val
, unsigned int *p
)
1329 unsigned long addr
= (unsigned long) p
;
1331 __asm__
__volatile__("smw.bi %0, [%1], %0, 0;\n\t": /* No outputs */
1332 :"r"(val
), "r"(addr
));
1334 #endif /* NDS32_MMIO_SWAP */
1336 #if (((X_BYTE_ORDER == X_BIG_ENDIAN) && !defined(NDS32_MMIO_SWAP)) || ((X_BYTE_ORDER != X_BIG_ENDIAN) && defined(NDS32_MMIO_SWAP)))
1337 #define ldw_u(p) ((*(unsigned char *)(p)) << 8 | \
1338 (*((unsigned char *)(p)+1)))
1339 #define stw_u(v,p) (*(unsigned char *)(p)) = ((v) >> 8); \
1340 (*((unsigned char *)(p)+1)) = (v)
1342 #define ldw_u(p) ((*(unsigned char *)(p)) | \
1343 (*((unsigned char *)(p)+1)<<8))
1344 #define stw_u(v,p) (*(unsigned char *)(p)) = (v); \
1345 (*((unsigned char *)(p)+1)) = ((v) >> 8)
1348 #define mem_barrier() /* XXX: nop for now */
1349 #define write_mem_barrier() /* XXX: nop for now */
1353 #if !defined(__SUNPRO_C)
1354 #if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__m32r__) && !defined(__aarch64__)
1358 * If gcc uses gas rather than the native assembler, the syntax of these
1359 * inlines has to be different. DHD
1362 static __inline__
void
1363 outb(unsigned short port
, unsigned char val
)
1365 __asm__
__volatile__("outb %0,%1"::"a"(val
), "d"(port
));
1368 static __inline__
void
1369 outw(unsigned short port
, unsigned short val
)
1371 __asm__
__volatile__("outw %0,%1"::"a"(val
), "d"(port
));
1374 static __inline__
void
1375 outl(unsigned short port
, unsigned int val
)
1377 __asm__
__volatile__("outl %0,%1"::"a"(val
), "d"(port
));
1380 static __inline__
unsigned int
1381 inb(unsigned short port
)
1384 __asm__
__volatile__("inb %1,%0":"=a"(ret
):"d"(port
));
1389 static __inline__
unsigned int
1390 inw(unsigned short port
)
1393 __asm__
__volatile__("inw %1,%0":"=a"(ret
):"d"(port
));
1398 static __inline__
unsigned int
1399 inl(unsigned short port
)
1402 __asm__
__volatile__("inl %1,%0":"=a"(ret
):"d"(port
));
1407 #else /* GCCUSESGAS */
1409 static __inline__
void
1410 outb(unsigned short port
, unsigned char val
)
1412 __asm__
__volatile__("out%B0 (%1)"::"a"(val
), "d"(port
));
1415 static __inline__
void
1416 outw(unsigned short port
, unsigned short val
)
1418 __asm__
__volatile__("out%W0 (%1)"::"a"(val
), "d"(port
));
1421 static __inline__
void
1422 outl(unsigned short port
, unsigned int val
)
1424 __asm__
__volatile__("out%L0 (%1)"::"a"(val
), "d"(port
));
1427 static __inline__
unsigned int
1428 inb(unsigned short port
)
1431 __asm__
__volatile__("in%B0 (%1)":"=a"(ret
):"d"(port
));
1436 static __inline__
unsigned int
1437 inw(unsigned short port
)
1440 __asm__
__volatile__("in%W0 (%1)":"=a"(ret
):"d"(port
));
1445 static __inline__
unsigned int
1446 inl(unsigned short port
)
1449 __asm__
__volatile__("in%L0 (%1)":"=a"(ret
):"d"(port
));
1454 #endif /* GCCUSESGAS */
1456 #else /* !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__m32r__) */
1458 static __inline__
void
1459 outb(unsigned short port
, unsigned char val
)
1463 static __inline__
void
1464 outw(unsigned short port
, unsigned short val
)
1468 static __inline__
void
1469 outl(unsigned short port
, unsigned int val
)
1473 static __inline__
unsigned int
1474 inb(unsigned short port
)
1479 static __inline__
unsigned int
1480 inw(unsigned short port
)
1485 static __inline__
unsigned int
1486 inl(unsigned short port
)
1492 #endif /* __SUNPRO_C */
1497 #if defined(__STDC__) && (__STDC__ == 1)
1502 #if !defined(__SUNPRO_C)
1503 #include <sys/inline.h>
1505 #if !defined(__HIGHC__) && !defined(__SUNPRO_C) || \
1507 #pragma asm partial_optimization outl
1508 #pragma asm partial_optimization outw
1509 #pragma asm partial_optimization outb
1510 #pragma asm partial_optimization inl
1511 #pragma asm partial_optimization inw
1512 #pragma asm partial_optimization inb
1514 #endif /* __GNUC__ */
1516 #endif /* NO_INLINE */
1519 /* entry points for Mmio memory access routines */
1520 extern _X_EXPORT
int (*xf86ReadMmio8
) (void *, unsigned long);
1521 extern _X_EXPORT
int (*xf86ReadMmio16
) (void *, unsigned long);
1523 #ifndef STANDALONE_MMIO
1524 extern _X_EXPORT
int (*xf86ReadMmio32
) (void *, unsigned long);
1526 /* Some DRI 3D drivers need MMIO_IN32. */
1527 static __inline__
int
1528 xf86ReadMmio32(void *Base
, unsigned long Offset
)
1531 return *(volatile unsigned int *) ((unsigned long) Base
+ (Offset
));
1534 extern _X_EXPORT
void (*xf86WriteMmio8
) (int, void *, unsigned long);
1535 extern _X_EXPORT
void (*xf86WriteMmio16
) (int, void *, unsigned long);
1536 extern _X_EXPORT
void (*xf86WriteMmio32
) (int, void *, unsigned long);
1537 extern _X_EXPORT
void (*xf86WriteMmioNB8
) (int, void *, unsigned long);
1538 extern _X_EXPORT
void (*xf86WriteMmioNB16
) (int, void *, unsigned long);
1539 extern _X_EXPORT
void (*xf86WriteMmioNB32
) (int, void *, unsigned long);
1540 extern _X_EXPORT
void xf86SlowBCopyFromBus(unsigned char *, unsigned char *,
1542 extern _X_EXPORT
void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int);
1544 /* Some macros to hide the system dependencies for MMIO accesses */
1545 /* Changed to kill noise generated by gcc's -Wcast-align */
1546 #define MMIO_IN8(base, offset) (*xf86ReadMmio8)(base, offset)
1547 #define MMIO_IN16(base, offset) (*xf86ReadMmio16)(base, offset)
1548 #ifndef STANDALONE_MMIO
1549 #define MMIO_IN32(base, offset) (*xf86ReadMmio32)(base, offset)
1551 #define MMIO_IN32(base, offset) xf86ReadMmio32(base, offset)
1554 #define MMIO_OUT32(base, offset, val) \
1556 write_mem_barrier(); \
1557 *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \
1559 #define MMIO_ONB32(base, offset, val) \
1560 *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val)
1562 #define MMIO_OUT8(base, offset, val) \
1563 (*xf86WriteMmio8)((CARD8)(val), base, offset)
1564 #define MMIO_OUT16(base, offset, val) \
1565 (*xf86WriteMmio16)((CARD16)(val), base, offset)
1566 #define MMIO_ONB8(base, offset, val) \
1567 (*xf86WriteMmioNB8)((CARD8)(val), base, offset)
1568 #define MMIO_ONB16(base, offset, val) \
1569 (*xf86WriteMmioNB16)((CARD16)(val), base, offset)
1570 #define MMIO_MOVE32(base, offset, val) \
1571 MMIO_OUT32(base, offset, val)
1573 #elif defined(__powerpc__)
1575 * we provide byteswapping and no byteswapping functions here
1576 * with byteswapping as default,
1577 * drivers that don't need byteswapping should define PPC_MMIO_IS_BE
1579 #define MMIO_IN8(base, offset) xf86ReadMmio8(base, offset)
1580 #define MMIO_OUT8(base, offset, val) \
1581 xf86WriteMmio8(base, offset, (CARD8)(val))
1582 #define MMIO_ONB8(base, offset, val) \
1583 xf86WriteMmioNB8(base, offset, (CARD8)(val))
1585 #if defined(PPC_MMIO_IS_BE) /* No byteswapping */
1586 #define MMIO_IN16(base, offset) xf86ReadMmio16Be(base, offset)
1587 #define MMIO_IN32(base, offset) xf86ReadMmio32Be(base, offset)
1588 #define MMIO_OUT16(base, offset, val) \
1589 xf86WriteMmio16Be(base, offset, (CARD16)(val))
1590 #define MMIO_OUT32(base, offset, val) \
1591 xf86WriteMmio32Be(base, offset, (CARD32)(val))
1592 #define MMIO_ONB16(base, offset, val) \
1593 xf86WriteMmioNB16Be(base, offset, (CARD16)(val))
1594 #define MMIO_ONB32(base, offset, val) \
1595 xf86WriteMmioNB32Be(base, offset, (CARD32)(val))
1596 #else /* byteswapping is the default */
1597 #define MMIO_IN16(base, offset) xf86ReadMmio16Le(base, offset)
1598 #define MMIO_IN32(base, offset) xf86ReadMmio32Le(base, offset)
1599 #define MMIO_OUT16(base, offset, val) \
1600 xf86WriteMmio16Le(base, offset, (CARD16)(val))
1601 #define MMIO_OUT32(base, offset, val) \
1602 xf86WriteMmio32Le(base, offset, (CARD32)(val))
1603 #define MMIO_ONB16(base, offset, val) \
1604 xf86WriteMmioNB16Le(base, offset, (CARD16)(val))
1605 #define MMIO_ONB32(base, offset, val) \
1606 xf86WriteMmioNB32Le(base, offset, (CARD32)(val))
1609 #define MMIO_MOVE32(base, offset, val) \
1610 xf86WriteMmio32Be(base, offset, (CARD32)(val))
1612 #elif defined(__sparc__) || defined(sparc) || defined(__sparc)
1614 * Like powerpc, we provide byteswapping and no byteswapping functions
1615 * here with byteswapping as default, drivers that don't need byteswapping
1616 * should define SPARC_MMIO_IS_BE (perhaps create a generic macro so that we
1617 * do not need to use PPC_MMIO_IS_BE and the sparc one in all the same places
1620 #define MMIO_IN8(base, offset) xf86ReadMmio8(base, offset)
1621 #define MMIO_OUT8(base, offset, val) \
1622 xf86WriteMmio8(base, offset, (CARD8)(val))
1623 #define MMIO_ONB8(base, offset, val) \
1624 xf86WriteMmio8NB(base, offset, (CARD8)(val))
1626 #if defined(SPARC_MMIO_IS_BE) /* No byteswapping */
1627 #define MMIO_IN16(base, offset) xf86ReadMmio16Be(base, offset)
1628 #define MMIO_IN32(base, offset) xf86ReadMmio32Be(base, offset)
1629 #define MMIO_OUT16(base, offset, val) \
1630 xf86WriteMmio16Be(base, offset, (CARD16)(val))
1631 #define MMIO_OUT32(base, offset, val) \
1632 xf86WriteMmio32Be(base, offset, (CARD32)(val))
1633 #define MMIO_ONB16(base, offset, val) \
1634 xf86WriteMmio16BeNB(base, offset, (CARD16)(val))
1635 #define MMIO_ONB32(base, offset, val) \
1636 xf86WriteMmio32BeNB(base, offset, (CARD32)(val))
1637 #else /* byteswapping is the default */
1638 #define MMIO_IN16(base, offset) xf86ReadMmio16Le(base, offset)
1639 #define MMIO_IN32(base, offset) xf86ReadMmio32Le(base, offset)
1640 #define MMIO_OUT16(base, offset, val) \
1641 xf86WriteMmio16Le(base, offset, (CARD16)(val))
1642 #define MMIO_OUT32(base, offset, val) \
1643 xf86WriteMmio32Le(base, offset, (CARD32)(val))
1644 #define MMIO_ONB16(base, offset, val) \
1645 xf86WriteMmio16LeNB(base, offset, (CARD16)(val))
1646 #define MMIO_ONB32(base, offset, val) \
1647 xf86WriteMmio32LeNB(base, offset, (CARD32)(val))
1650 #define MMIO_MOVE32(base, offset, val) \
1651 xf86WriteMmio32Be(base, offset, (CARD32)(val))
1653 #elif defined(__nds32__)
1655 * we provide byteswapping and no byteswapping functions here
1656 * with no byteswapping as default; when endianness of CPU core
1657 * and I/O devices don't match, byte swapping is necessary
1658 * drivers that need byteswapping should define NDS32_MMIO_SWAP
1660 #define MMIO_IN8(base, offset) xf86ReadMmio8(base, offset)
1661 #define MMIO_OUT8(base, offset, val) \
1662 xf86WriteMmio8(base, offset, (CARD8)(val))
1663 #define MMIO_ONB8(base, offset, val) \
1664 xf86WriteMmioNB8(base, offset, (CARD8)(val))
1666 #if defined(NDS32_MMIO_SWAP) /* byteswapping */
1667 #define MMIO_IN16(base, offset) xf86ReadMmio16Swap(base, offset)
1668 #define MMIO_IN32(base, offset) xf86ReadMmio32Swap(base, offset)
1669 #define MMIO_OUT16(base, offset, val) \
1670 xf86WriteMmio16Swap(base, offset, (CARD16)(val))
1671 #define MMIO_OUT32(base, offset, val) \
1672 xf86WriteMmio32Swap(base, offset, (CARD32)(val))
1673 #define MMIO_ONB16(base, offset, val) \
1674 xf86WriteMmioNB16Swap(base, offset, (CARD16)(val))
1675 #define MMIO_ONB32(base, offset, val) \
1676 xf86WriteMmioNB32Swap(base, offset, (CARD32)(val))
1677 #else /* no byteswapping is the default */
1678 #define MMIO_IN16(base, offset) xf86ReadMmio16(base, offset)
1679 #define MMIO_IN32(base, offset) xf86ReadMmio32(base, offset)
1680 #define MMIO_OUT16(base, offset, val) \
1681 xf86WriteMmio16(base, offset, (CARD16)(val))
1682 #define MMIO_OUT32(base, offset, val) \
1683 xf86WriteMmio32(base, offset, (CARD32)(val))
1684 #define MMIO_ONB16(base, offset, val) \
1685 xf86WriteMmioNB16(base, offset, (CARD16)(val))
1686 #define MMIO_ONB32(base, offset, val) \
1687 xf86WriteMmioNB32(base, offset, (CARD32)(val))
1690 #define MMIO_MOVE32(base, offset, val) \
1691 xf86WriteMmio32(base, offset, (CARD32)(val))
1693 #ifdef N1213_HC /* for NDS32 N1213 hardcore */
1694 static __inline__
void
1695 nds32_flush_icache(char *addr
)
1697 __asm__
volatile ("isync %0;"
1700 "cctl %0,L1I_VA_INVAL;" "isb;"::"r" (addr
):"memory");
1703 static __inline__
void
1704 nds32_flush_icache(char *addr
)
1706 __asm__
volatile ("isync %0;" "isb;"::"r" (addr
):"memory");
1710 #else /* !__alpha__ && !__powerpc__ && !__sparc__ */
1712 #define MMIO_IN8(base, offset) \
1713 *(volatile CARD8 *)(((CARD8*)(base)) + (offset))
1714 #define MMIO_IN16(base, offset) \
1715 *(volatile CARD16 *)(void *)(((CARD8*)(base)) + (offset))
1716 #define MMIO_IN32(base, offset) \
1717 *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset))
1718 #define MMIO_OUT8(base, offset, val) \
1719 *(volatile CARD8 *)(((CARD8*)(base)) + (offset)) = (val)
1720 #define MMIO_OUT16(base, offset, val) \
1721 *(volatile CARD16 *)(void *)(((CARD8*)(base)) + (offset)) = (val)
1722 #define MMIO_OUT32(base, offset, val) \
1723 *(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val)
1724 #define MMIO_ONB8(base, offset, val) MMIO_OUT8(base, offset, val)
1725 #define MMIO_ONB16(base, offset, val) MMIO_OUT16(base, offset, val)
1726 #define MMIO_ONB32(base, offset, val) MMIO_OUT32(base, offset, val)
1728 #define MMIO_MOVE32(base, offset, val) MMIO_OUT32(base, offset, val)
1730 #endif /* __alpha__ */
1733 * With Intel, the version in os-support/misc/SlowBcopy.s is used.
1734 * This avoids port I/O during the copy (which causes problems with
1738 #define slowbcopy_tobus(src,dst,count) xf86SlowBCopyToBus(src,dst,count)
1739 #define slowbcopy_frombus(src,dst,count) xf86SlowBCopyFromBus(src,dst,count)
1740 #else /* __alpha__ */
1741 #define slowbcopy_tobus(src,dst,count) xf86SlowBcopy(src,dst,count)
1742 #define slowbcopy_frombus(src,dst,count) xf86SlowBcopy(src,dst,count)
1743 #endif /* __alpha__ */
1745 #endif /* _COMPILER_H */