2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
6
* Copyright (C) 2000-2004 Silicon Graphics, Inc. All rights reserved.
11
#include <linux/compiler.h>
12
#include <asm/intrinsics.h>
14
extern void * sn_io_addr(unsigned long port) __attribute_const__; /* Forward definition */
15
extern void __sn_mmiowb(void); /* Forward definition */
17
extern int num_cnodes;
19
#define __sn_mf_a() ia64_mfa()
21
extern void sn_dma_flush(unsigned long);
23
#define __sn_inb ___sn_inb
24
#define __sn_inw ___sn_inw
25
#define __sn_inl ___sn_inl
26
#define __sn_outb ___sn_outb
27
#define __sn_outw ___sn_outw
28
#define __sn_outl ___sn_outl
29
#define __sn_readb ___sn_readb
30
#define __sn_readw ___sn_readw
31
#define __sn_readl ___sn_readl
32
#define __sn_readq ___sn_readq
33
#define __sn_readb_relaxed ___sn_readb_relaxed
34
#define __sn_readw_relaxed ___sn_readw_relaxed
35
#define __sn_readl_relaxed ___sn_readl_relaxed
36
#define __sn_readq_relaxed ___sn_readq_relaxed
39
* Convenience macros for setting/clearing bits using the above accessors
42
#define __sn_setq_relaxed(addr, val) \
43
writeq((__sn_readq_relaxed(addr) | (val)), (addr))
44
#define __sn_clrq_relaxed(addr, val) \
45
writeq((__sn_readq_relaxed(addr) & ~(val)), (addr))
48
* The following routines are SN Platform specific, called when
49
* a reference is made to inX/outX set macros. SN Platform
50
* inX set of macros ensures that Posted DMA writes on the
53
* The routines should be self explainatory.
56
static inline unsigned int
57
___sn_inb (unsigned long port)
59
volatile unsigned char *addr;
60
unsigned char ret = -1;
62
if ((addr = sn_io_addr(port))) {
65
sn_dma_flush((unsigned long)addr);
70
static inline unsigned int
71
___sn_inw (unsigned long port)
73
volatile unsigned short *addr;
74
unsigned short ret = -1;
76
if ((addr = sn_io_addr(port))) {
79
sn_dma_flush((unsigned long)addr);
84
static inline unsigned int
85
___sn_inl (unsigned long port)
87
volatile unsigned int *addr;
88
unsigned int ret = -1;
90
if ((addr = sn_io_addr(port))) {
93
sn_dma_flush((unsigned long)addr);
99
___sn_outb (unsigned char val, unsigned long port)
101
volatile unsigned char *addr;
103
if ((addr = sn_io_addr(port))) {
110
___sn_outw (unsigned short val, unsigned long port)
112
volatile unsigned short *addr;
114
if ((addr = sn_io_addr(port))) {
121
___sn_outl (unsigned int val, unsigned long port)
123
volatile unsigned int *addr;
125
if ((addr = sn_io_addr(port))) {
132
* The following routines are SN Platform specific, called when
133
* a reference is made to readX/writeX set macros. SN Platform
134
* readX set of macros ensures that Posted DMA writes on the
137
* The routines should be self explainatory.
140
static inline unsigned char
141
___sn_readb (const volatile void __iomem *addr)
145
val = *(volatile unsigned char __force *)addr;
147
sn_dma_flush((unsigned long)addr);
151
static inline unsigned short
152
___sn_readw (const volatile void __iomem *addr)
156
val = *(volatile unsigned short __force *)addr;
158
sn_dma_flush((unsigned long)addr);
162
static inline unsigned int
163
___sn_readl (const volatile void __iomem *addr)
167
val = *(volatile unsigned int __force *)addr;
169
sn_dma_flush((unsigned long)addr);
173
static inline unsigned long
174
___sn_readq (const volatile void __iomem *addr)
178
val = *(volatile unsigned long __force *)addr;
180
sn_dma_flush((unsigned long)addr);
185
* For generic and SN2 kernels, we have a set of fast access
186
* PIO macros. These macros are provided on SN Platform
187
* because the normal inX and readX macros perform an
188
* additional task of flushing Post DMA request on the Bridge.
190
* These routines should be self explainatory.
193
static inline unsigned int
194
sn_inb_fast (unsigned long port)
196
volatile unsigned char *addr = (unsigned char *)port;
204
static inline unsigned int
205
sn_inw_fast (unsigned long port)
207
volatile unsigned short *addr = (unsigned short *)port;
215
static inline unsigned int
216
sn_inl_fast (unsigned long port)
218
volatile unsigned int *addr = (unsigned int *)port;
226
static inline unsigned char
227
___sn_readb_relaxed (const volatile void __iomem *addr)
229
return *(volatile unsigned char __force *)addr;
232
static inline unsigned short
233
___sn_readw_relaxed (const volatile void __iomem *addr)
235
return *(volatile unsigned short __force *)addr;
238
static inline unsigned int
239
___sn_readl_relaxed (const volatile void __iomem *addr)
241
return *(volatile unsigned int __force *) addr;
244
static inline unsigned long
245
___sn_readq_relaxed (const volatile void __iomem *addr)
247
return *(volatile unsigned long __force *) addr;
253
sn_pci_set_vchan(struct pci_dev *pci_dev, unsigned long *addr, int vchan)
260
if (!(*addr >> 32)) /* Using a mask here would be cleaner */
261
return 0; /* but this generates better code */
265
*addr |= (1UL << 57);
268
*addr &= ~(1UL << 57);
274
#endif /* _ASM_SN_IO_H */