diff options
author | Jay Estabrook <jay.estabrook@hp.com> | 2007-06-01 03:47:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-01 11:18:29 -0400 |
commit | 5ae0b6c704877d0c6b95dd7c3b1907770ca28b79 (patch) | |
tree | 0d11567e33f883d241697d358dd12010d5917133 /include | |
parent | 025a22151c41890e5d30a1d4fb84c547b84d7671 (diff) |
ALPHA: correct low-level I/O routines for sable-lynx
This code corrects the behavior of the t2_readX/t2_writeX routines,
and t2_ioreadNN/t2_iowriteNN routines.
The value T2_DENSE_MEM is now subtracted from the "xaddr" argument in
each of the readX/writeX routines, since those routines may be called
directly, rather than always through the ioreadNN/iowriteNN routines.
Examples of the direct calls, via the __raw_readX/writeX macros, are
the memcpy_fromio/toio, _memset_c_io, and scr_memcpyw routines.
Signed-off-by: Jay Estabrook <jay.estabrook@hp.com>
Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-alpha/core_t2.h | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h index 457c34b6eb09..90e6b5d6c214 100644 --- a/include/asm-alpha/core_t2.h +++ b/include/asm-alpha/core_t2.h | |||
@@ -437,9 +437,15 @@ static inline void t2_outl(u32 b, unsigned long addr) | |||
437 | 437 | ||
438 | static DEFINE_SPINLOCK(t2_hae_lock); | 438 | static DEFINE_SPINLOCK(t2_hae_lock); |
439 | 439 | ||
440 | /* | ||
441 | * NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since | ||
442 | * they may be called directly, rather than through the | ||
443 | * ioreadNN/iowriteNN routines. | ||
444 | */ | ||
445 | |||
440 | __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) | 446 | __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) |
441 | { | 447 | { |
442 | unsigned long addr = (unsigned long) xaddr; | 448 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
443 | unsigned long result, msb; | 449 | unsigned long result, msb; |
444 | unsigned long flags; | 450 | unsigned long flags; |
445 | spin_lock_irqsave(&t2_hae_lock, flags); | 451 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -453,7 +459,7 @@ __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) | |||
453 | 459 | ||
454 | __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) | 460 | __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) |
455 | { | 461 | { |
456 | unsigned long addr = (unsigned long) xaddr; | 462 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
457 | unsigned long result, msb; | 463 | unsigned long result, msb; |
458 | unsigned long flags; | 464 | unsigned long flags; |
459 | spin_lock_irqsave(&t2_hae_lock, flags); | 465 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -471,7 +477,7 @@ __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) | |||
471 | */ | 477 | */ |
472 | __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) | 478 | __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) |
473 | { | 479 | { |
474 | unsigned long addr = (unsigned long) xaddr; | 480 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
475 | unsigned long result, msb; | 481 | unsigned long result, msb; |
476 | unsigned long flags; | 482 | unsigned long flags; |
477 | spin_lock_irqsave(&t2_hae_lock, flags); | 483 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -485,7 +491,7 @@ __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) | |||
485 | 491 | ||
486 | __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) | 492 | __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) |
487 | { | 493 | { |
488 | unsigned long addr = (unsigned long) xaddr; | 494 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
489 | unsigned long r0, r1, work, msb; | 495 | unsigned long r0, r1, work, msb; |
490 | unsigned long flags; | 496 | unsigned long flags; |
491 | spin_lock_irqsave(&t2_hae_lock, flags); | 497 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -501,7 +507,7 @@ __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) | |||
501 | 507 | ||
502 | __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) | 508 | __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) |
503 | { | 509 | { |
504 | unsigned long addr = (unsigned long) xaddr; | 510 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
505 | unsigned long msb, w; | 511 | unsigned long msb, w; |
506 | unsigned long flags; | 512 | unsigned long flags; |
507 | spin_lock_irqsave(&t2_hae_lock, flags); | 513 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -515,7 +521,7 @@ __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) | |||
515 | 521 | ||
516 | __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) | 522 | __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) |
517 | { | 523 | { |
518 | unsigned long addr = (unsigned long) xaddr; | 524 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
519 | unsigned long msb, w; | 525 | unsigned long msb, w; |
520 | unsigned long flags; | 526 | unsigned long flags; |
521 | spin_lock_irqsave(&t2_hae_lock, flags); | 527 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -533,7 +539,7 @@ __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) | |||
533 | */ | 539 | */ |
534 | __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) | 540 | __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) |
535 | { | 541 | { |
536 | unsigned long addr = (unsigned long) xaddr; | 542 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
537 | unsigned long msb; | 543 | unsigned long msb; |
538 | unsigned long flags; | 544 | unsigned long flags; |
539 | spin_lock_irqsave(&t2_hae_lock, flags); | 545 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -546,7 +552,7 @@ __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) | |||
546 | 552 | ||
547 | __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr) | 553 | __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr) |
548 | { | 554 | { |
549 | unsigned long addr = (unsigned long) xaddr; | 555 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
550 | unsigned long msb, work; | 556 | unsigned long msb, work; |
551 | unsigned long flags; | 557 | unsigned long flags; |
552 | spin_lock_irqsave(&t2_hae_lock, flags); | 558 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -587,14 +593,14 @@ __EXTERN_INLINE int t2_is_mmio(const volatile void __iomem *addr) | |||
587 | __EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr) \ | 593 | __EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr) \ |
588 | { \ | 594 | { \ |
589 | if (t2_is_mmio(xaddr)) \ | 595 | if (t2_is_mmio(xaddr)) \ |
590 | return t2_read##OS(xaddr - T2_DENSE_MEM); \ | 596 | return t2_read##OS(xaddr); \ |
591 | else \ | 597 | else \ |
592 | return t2_in##OS((unsigned long)xaddr - T2_IO); \ | 598 | return t2_in##OS((unsigned long)xaddr - T2_IO); \ |
593 | } \ | 599 | } \ |
594 | __EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr) \ | 600 | __EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr) \ |
595 | { \ | 601 | { \ |
596 | if (t2_is_mmio(xaddr)) \ | 602 | if (t2_is_mmio(xaddr)) \ |
597 | t2_write##OS(b, xaddr - T2_DENSE_MEM); \ | 603 | t2_write##OS(b, xaddr); \ |
598 | else \ | 604 | else \ |
599 | t2_out##OS(b, (unsigned long)xaddr - T2_IO); \ | 605 | t2_out##OS(b, (unsigned long)xaddr - T2_IO); \ |
600 | } | 606 | } |