io.h 12.8 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
/* $Id: io.h,v 1.47 2001/12/13 10:36:02 davem Exp $ */
Linus Torvalds's avatar
Linus Torvalds committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#ifndef __SPARC64_IO_H
#define __SPARC64_IO_H

#include <linux/kernel.h>
#include <linux/types.h>

#include <asm/page.h>      /* IO address mapping routines need this */
#include <asm/system.h>
#include <asm/asi.h>

/* PC crapola... */
#define __SLOW_DOWN_IO	do { } while (0)
#define SLOW_DOWN_IO	do { } while (0)

extern unsigned long virt_to_bus_not_defined_use_pci_map(volatile void *addr);
#define virt_to_bus virt_to_bus_not_defined_use_pci_map
extern unsigned long bus_to_virt_not_defined_use_pci_map(volatile void *addr);
#define bus_to_virt bus_to_virt_not_defined_use_pci_map

Linus Torvalds's avatar
Linus Torvalds committed
21
/* BIO layer definitions. */
22 23
extern unsigned long kern_base, kern_size;
#define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)
Linus Torvalds's avatar
Linus Torvalds committed
24
#define BIO_VMERGE_BOUNDARY	8192
Linus Torvalds's avatar
Linus Torvalds committed
25

Linus Torvalds's avatar
Linus Torvalds committed
26 27 28 29 30 31 32 33
/* Different PCI controllers we support have their PCI MEM space
 * mapped to an either 2GB (Psycho) or 4GB (Sabre) aligned area,
 * so need to chop off the top 33 or 32 bits.
 */
extern unsigned long pci_memspace_mask;

#define bus_dvma_to_mem(__vaddr) ((__vaddr) & pci_memspace_mask)

34
static __inline__ u8 _inb(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
35
{
Linus Torvalds's avatar
Linus Torvalds committed
36
	u8 ret;
Linus Torvalds's avatar
Linus Torvalds committed
37 38 39 40 41 42 43 44

	__asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_inb */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

45
static __inline__ u16 _inw(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
46
{
Linus Torvalds's avatar
Linus Torvalds committed
47
	u16 ret;
Linus Torvalds's avatar
Linus Torvalds committed
48 49 50 51 52 53 54 55

	__asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_inw */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

56
static __inline__ u32 _inl(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
57
{
Linus Torvalds's avatar
Linus Torvalds committed
58
	u32 ret;
Linus Torvalds's avatar
Linus Torvalds committed
59 60 61 62 63 64 65 66

	__asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_inl */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

67
static __inline__ void _outb(u8 b, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
68 69 70 71 72 73
{
	__asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_outb */"
			     : /* no outputs */
			     : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

74
static __inline__ void _outw(u16 w, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
75 76 77 78 79 80
{
	__asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_outw */"
			     : /* no outputs */
			     : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

81
static __inline__ void _outl(u32 l, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
82 83 84 85 86 87
{
	__asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_outl */"
			     : /* no outputs */
			     : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

88 89 90 91 92 93 94 95 96 97 98 99 100
#define inb(__addr)		(_inb((unsigned long)(__addr)))
#define inw(__addr)		(_inw((unsigned long)(__addr)))
#define inl(__addr)		(_inl((unsigned long)(__addr)))
#define outb(__b, __addr)	(_outb((u8)(__b), (unsigned long)(__addr)))
#define outw(__w, __addr)	(_outw((u16)(__w), (unsigned long)(__addr)))
#define outl(__l, __addr)	(_outl((u32)(__l), (unsigned long)(__addr)))

#define inb_p(__addr) 		inb(__addr)
#define outb_p(__b, __addr)	outb(__b, __addr)
#define inw_p(__addr)		inw(__addr)
#define outw_p(__w, __addr)	outw(__w, __addr)
#define inl_p(__addr)		inl(__addr)
#define outl_p(__l, __addr)	outl(__l, __addr)
Linus Torvalds's avatar
Linus Torvalds committed
101 102 103 104 105 106 107 108 109

extern void outsb(unsigned long addr, const void *src, unsigned long count);
extern void outsw(unsigned long addr, const void *src, unsigned long count);
extern void outsl(unsigned long addr, const void *src, unsigned long count);
extern void insb(unsigned long addr, void *dst, unsigned long count);
extern void insw(unsigned long addr, void *dst, unsigned long count);
extern void insl(unsigned long addr, void *dst, unsigned long count);

/* Memory functions, same as I/O accesses on Ultra. */
Linus Torvalds's avatar
Linus Torvalds committed
110
static __inline__ u8 _readb(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
111
{
Linus Torvalds's avatar
Linus Torvalds committed
112
	u8 ret;
Linus Torvalds's avatar
Linus Torvalds committed
113 114 115 116 117 118 119 120

	__asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_readb */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
121
static __inline__ u16 _readw(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
122
{
Linus Torvalds's avatar
Linus Torvalds committed
123
	u16 ret;
Linus Torvalds's avatar
Linus Torvalds committed
124 125 126 127 128 129 130 131

	__asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_readw */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
132
static __inline__ u32 _readl(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
133
{
Linus Torvalds's avatar
Linus Torvalds committed
134
	u32 ret;
Linus Torvalds's avatar
Linus Torvalds committed
135 136 137 138 139 140 141 142

	__asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_readl */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
143 144 145 146 147 148 149 150 151 152 153 154
static __inline__ u64 _readq(unsigned long addr)
{
	u64 ret;

	__asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_readq */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));

	return ret;
}

static __inline__ void _writeb(u8 b, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
155 156 157 158 159 160
{
	__asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_writeb */"
			     : /* no outputs */
			     : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

Linus Torvalds's avatar
Linus Torvalds committed
161
static __inline__ void _writew(u16 w, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
162 163 164 165 166 167
{
	__asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_writew */"
			     : /* no outputs */
			     : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

Linus Torvalds's avatar
Linus Torvalds committed
168
static __inline__ void _writel(u32 l, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
169 170 171 172 173 174
{
	__asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_writel */"
			     : /* no outputs */
			     : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

Linus Torvalds's avatar
Linus Torvalds committed
175 176 177 178 179 180 181
static __inline__ void _writeq(u64 q, unsigned long addr)
{
	__asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_writeq */"
			     : /* no outputs */
			     : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}

Linus Torvalds's avatar
Linus Torvalds committed
182 183 184
#define readb(__addr)		(_readb((unsigned long)(__addr)))
#define readw(__addr)		(_readw((unsigned long)(__addr)))
#define readl(__addr)		(_readl((unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
185
#define readq(__addr)		(_readq((unsigned long)(__addr)))
186 187 188 189
#define readb_relaxed(a)	readb(a)
#define readw_relaxed(a)	readw(a)
#define readl_relaxed(a)	readl(a)
#define readq_relaxed(a)	readq(a)
Linus Torvalds's avatar
Linus Torvalds committed
190 191 192 193
#define writeb(__b, __addr)	(_writeb((u8)(__b), (unsigned long)(__addr)))
#define writew(__w, __addr)	(_writew((u16)(__w), (unsigned long)(__addr)))
#define writel(__l, __addr)	(_writel((u32)(__l), (unsigned long)(__addr)))
#define writeq(__q, __addr)	(_writeq((u64)(__q), (unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
194 195

/* Now versions without byte-swapping. */
Linus Torvalds's avatar
Linus Torvalds committed
196
static __inline__ u8 _raw_readb(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
197
{
Linus Torvalds's avatar
Linus Torvalds committed
198
	u8 ret;
Linus Torvalds's avatar
Linus Torvalds committed
199 200 201 202 203 204 205 206

	__asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_raw_readb */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
207
static __inline__ u16 _raw_readw(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
208
{
Linus Torvalds's avatar
Linus Torvalds committed
209
	u16 ret;
Linus Torvalds's avatar
Linus Torvalds committed
210 211 212 213 214 215 216 217

	__asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_raw_readw */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
218
static __inline__ u32 _raw_readl(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
219
{
Linus Torvalds's avatar
Linus Torvalds committed
220
	u32 ret;
Linus Torvalds's avatar
Linus Torvalds committed
221 222 223 224 225 226 227 228

	__asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_raw_readl */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
229 230 231 232 233 234 235 236 237 238 239 240
static __inline__ u64 _raw_readq(unsigned long addr)
{
	u64 ret;

	__asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_raw_readq */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

static __inline__ void _raw_writeb(u8 b, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
241 242 243 244 245 246
{
	__asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_raw_writeb */"
			     : /* no outputs */
			     : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
247
static __inline__ void _raw_writew(u16 w, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
248 249 250 251 252 253
{
	__asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_raw_writew */"
			     : /* no outputs */
			     : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
254
static __inline__ void _raw_writel(u32 l, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
255 256 257 258 259 260
{
	__asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_raw_writel */"
			     : /* no outputs */
			     : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
261 262 263 264 265 266 267
static __inline__ void _raw_writeq(u64 q, unsigned long addr)
{
	__asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_raw_writeq */"
			     : /* no outputs */
			     : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
268 269 270
#define __raw_readb(__addr)		(_raw_readb((unsigned long)(__addr)))
#define __raw_readw(__addr)		(_raw_readw((unsigned long)(__addr)))
#define __raw_readl(__addr)		(_raw_readl((unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
271
#define __raw_readq(__addr)		(_raw_readq((unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
272 273 274 275
#define __raw_writeb(__b, __addr)	(_raw_writeb((u8)(__b), (unsigned long)(__addr)))
#define __raw_writew(__w, __addr)	(_raw_writew((u16)(__w), (unsigned long)(__addr)))
#define __raw_writel(__l, __addr)	(_raw_writel((u32)(__l), (unsigned long)(__addr)))
#define __raw_writeq(__q, __addr)	(_raw_writeq((u64)(__q), (unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
276 277 278 279 280 281 282 283 284

/* Valid I/O Space regions are anywhere, because each PCI bus supported
 * can live in an arbitrary area of the physical address range.
 */
#define IO_SPACE_LIMIT 0xffffffffffffffffUL

/* Now, SBUS variants, only difference from PCI is that we do
 * not use little-endian ASIs.
 */
Linus Torvalds's avatar
Linus Torvalds committed
285
static __inline__ u8 _sbus_readb(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
286
{
Linus Torvalds's avatar
Linus Torvalds committed
287
	u8 ret;
Linus Torvalds's avatar
Linus Torvalds committed
288 289 290 291 292 293 294 295

	__asm__ __volatile__("lduba\t[%1] %2, %0\t/* sbus_readb */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
296
static __inline__ u16 _sbus_readw(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
297
{
Linus Torvalds's avatar
Linus Torvalds committed
298
	u16 ret;
Linus Torvalds's avatar
Linus Torvalds committed
299 300 301 302 303 304 305 306

	__asm__ __volatile__("lduha\t[%1] %2, %0\t/* sbus_readw */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
307
static __inline__ u32 _sbus_readl(unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
308
{
Linus Torvalds's avatar
Linus Torvalds committed
309
	u32 ret;
Linus Torvalds's avatar
Linus Torvalds committed
310 311 312 313 314 315 316 317

	__asm__ __volatile__("lduwa\t[%1] %2, %0\t/* sbus_readl */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

318 319 320 321 322 323 324 325 326 327 328
static __inline__ u64 _sbus_readq(unsigned long addr)
{
	u64 ret;

	__asm__ __volatile__("ldxa\t[%1] %2, %0\t/* sbus_readq */"
			     : "=r" (ret)
			     : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));

	return ret;
}

Linus Torvalds's avatar
Linus Torvalds committed
329
static __inline__ void _sbus_writeb(u8 b, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
330 331 332 333 334 335
{
	__asm__ __volatile__("stba\t%r0, [%1] %2\t/* sbus_writeb */"
			     : /* no outputs */
			     : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
336
static __inline__ void _sbus_writew(u16 w, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
337 338 339 340 341 342
{
	__asm__ __volatile__("stha\t%r0, [%1] %2\t/* sbus_writew */"
			     : /* no outputs */
			     : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
343
static __inline__ void _sbus_writel(u32 l, unsigned long addr)
Linus Torvalds's avatar
Linus Torvalds committed
344 345 346 347 348 349
{
	__asm__ __volatile__("stwa\t%r0, [%1] %2\t/* sbus_writel */"
			     : /* no outputs */
			     : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

350 351 352 353 354 355 356
static __inline__ void _sbus_writeq(u64 l, unsigned long addr)
{
	__asm__ __volatile__("stxa\t%r0, [%1] %2\t/* sbus_writeq */"
			     : /* no outputs */
			     : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}

Linus Torvalds's avatar
Linus Torvalds committed
357 358 359
#define sbus_readb(__addr)		(_sbus_readb((unsigned long)(__addr)))
#define sbus_readw(__addr)		(_sbus_readw((unsigned long)(__addr)))
#define sbus_readl(__addr)		(_sbus_readl((unsigned long)(__addr)))
360
#define sbus_readq(__addr)		(_sbus_readq((unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
361 362 363
#define sbus_writeb(__b, __addr)	(_sbus_writeb((__b), (unsigned long)(__addr)))
#define sbus_writew(__w, __addr)	(_sbus_writew((__w), (unsigned long)(__addr)))
#define sbus_writel(__l, __addr)	(_sbus_writel((__l), (unsigned long)(__addr)))
364
#define sbus_writeq(__l, __addr)	(_sbus_writeq((__l), (unsigned long)(__addr)))
Linus Torvalds's avatar
Linus Torvalds committed
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448

static inline void *_sbus_memset_io(unsigned long dst, int c, __kernel_size_t n)
{
	while(n--) {
		sbus_writeb(c, dst);
		dst++;
	}
	return (void *) dst;
}

#define sbus_memset_io(d,c,sz)	\
	_sbus_memset_io((unsigned long)d,(int)c,(__kernel_size_t)sz)

static inline void *
_memset_io(void *dst, int c, __kernel_size_t n)
{
	char *d = dst;

	while (n--) {
		writeb(c, d);
		d++;
	}

	return dst;
}

#define memset_io(d,c,sz)	\
	_memset_io((void *)d,(int)c,(__kernel_size_t)sz)

static inline void *
_memcpy_fromio(void *dst, unsigned long src, __kernel_size_t n)
{
	char *d = dst;

	while (n--) {
		char tmp = readb(src);
		*d++ = tmp;
		src++;
	}

	return dst;
}

#define memcpy_fromio(d,s,sz)	\
	_memcpy_fromio((void *)d,(unsigned long)s,(__kernel_size_t)sz)

static inline void *
_memcpy_toio(unsigned long dst, const void *src, __kernel_size_t n)
{
	const char *s = src;
	unsigned long d = dst;

	while (n--) {
		char tmp = *s++;
		writeb(tmp, d);
		d++;
	}
	return (void *)dst;
}

#define memcpy_toio(d,s,sz)	\
	_memcpy_toio((unsigned long)d,(const void *)s,(__kernel_size_t)sz)

static inline int check_signature(unsigned long io_addr,
				  const unsigned char *signature,
				  int length)
{
	int retval = 0;
	do {
		if (readb(io_addr++) != *signature++)
			goto out;
	} while (--length);
	retval = 1;
out:
	return retval;
}

#ifdef __KERNEL__

/* On sparc64 we have the whole physical IO address space accessible
 * using physically addressed loads and stores, so this does nothing.
 */
#define ioremap(__offset, __size)	((void *)(__offset))
#define ioremap_nocache(X,Y)		ioremap((X),(Y))
Linus Torvalds's avatar
Linus Torvalds committed
449
#define iounmap(__addr)			do { (void)(__addr); } while(0)
Linus Torvalds's avatar
Linus Torvalds committed
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472

/* Similarly for SBUS. */
#define sbus_ioremap(__res, __offset, __size, __name) \
({	unsigned long __ret; \
	__ret  = (__res)->start + (((__res)->flags & 0x1ffUL) << 32UL); \
	__ret += (unsigned long) (__offset); \
	if (! request_region((__ret), (__size), (__name))) \
		__ret = 0UL; \
	__ret; \
})

#define sbus_iounmap(__addr, __size)	\
	release_region((__addr), (__size))

/* Nothing to do */

#define dma_cache_inv(_start,_size)		do { } while (0)
#define dma_cache_wback(_start,_size)		do { } while (0)
#define dma_cache_wback_inv(_start,_size)	do { } while (0)

#endif

#endif /* !(__SPARC64_IO_H) */