Commit caf81329 authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Paul Mackerras

[POWERPC] Merge iSeries i/o operations with the rest

This patch changes the io operations so that they are out of line if
CONFIG_PPC_ISERIES is set and includes a firmware feature check in
that case.
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 7da8a2e5
...@@ -22,12 +22,16 @@ ...@@ -22,12 +22,16 @@
#include <linux/module.h> #include <linux/module.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/firmware.h>
#include <asm/bug.h>
void _insb(volatile u8 __iomem *port, void *buf, long count) void _insb(volatile u8 __iomem *port, void *buf, long count)
{ {
u8 *tbuf = buf; u8 *tbuf = buf;
u8 tmp; u8 tmp;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
...@@ -44,6 +48,8 @@ void _outsb(volatile u8 __iomem *port, const void *buf, long count) ...@@ -44,6 +48,8 @@ void _outsb(volatile u8 __iomem *port, const void *buf, long count)
{ {
const u8 *tbuf = buf; const u8 *tbuf = buf;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
...@@ -59,6 +65,8 @@ void _insw_ns(volatile u16 __iomem *port, void *buf, long count) ...@@ -59,6 +65,8 @@ void _insw_ns(volatile u16 __iomem *port, void *buf, long count)
u16 *tbuf = buf; u16 *tbuf = buf;
u16 tmp; u16 tmp;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
...@@ -75,6 +83,8 @@ void _outsw_ns(volatile u16 __iomem *port, const void *buf, long count) ...@@ -75,6 +83,8 @@ void _outsw_ns(volatile u16 __iomem *port, const void *buf, long count)
{ {
const u16 *tbuf = buf; const u16 *tbuf = buf;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
...@@ -90,6 +100,8 @@ void _insl_ns(volatile u32 __iomem *port, void *buf, long count) ...@@ -90,6 +100,8 @@ void _insl_ns(volatile u32 __iomem *port, void *buf, long count)
u32 *tbuf = buf; u32 *tbuf = buf;
u32 tmp; u32 tmp;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
...@@ -106,6 +118,8 @@ void _outsl_ns(volatile u32 __iomem *port, const void *buf, long count) ...@@ -106,6 +118,8 @@ void _outsl_ns(volatile u32 __iomem *port, const void *buf, long count)
{ {
const u32 *tbuf = buf; const u32 *tbuf = buf;
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
if (unlikely(count <= 0)) if (unlikely(count <= 0))
return; return;
asm volatile("sync"); asm volatile("sync");
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/abs_addr.h> #include <asm/abs_addr.h>
#include <asm/firmware.h>
#include <asm/iseries/hv_call_xm.h> #include <asm/iseries/hv_call_xm.h>
#include <asm/iseries/mf.h> #include <asm/iseries/mf.h>
...@@ -269,46 +270,6 @@ void pcibios_fixup_resources(struct pci_dev *pdev) ...@@ -269,46 +270,6 @@ void pcibios_fixup_resources(struct pci_dev *pdev)
{ {
} }
/*
* I/0 Memory copy MUST use mmio commands on iSeries
* To do; For performance, include the hv call directly
*/
void iSeries_memset_io(volatile void __iomem *dest, char c, size_t Count)
{
u8 ByteValue = c;
long NumberOfBytes = Count;
while (NumberOfBytes > 0) {
iSeries_Write_Byte(ByteValue, dest++);
-- NumberOfBytes;
}
}
EXPORT_SYMBOL(iSeries_memset_io);
void iSeries_memcpy_toio(volatile void __iomem *dest, void *source, size_t count)
{
char *src = source;
long NumberOfBytes = count;
while (NumberOfBytes > 0) {
iSeries_Write_Byte(*src++, dest++);
-- NumberOfBytes;
}
}
EXPORT_SYMBOL(iSeries_memcpy_toio);
void iSeries_memcpy_fromio(void *dest, const volatile void __iomem *src, size_t count)
{
char *dst = dest;
long NumberOfBytes = count;
while (NumberOfBytes > 0) {
*dst++ = iSeries_Read_Byte(src++);
-- NumberOfBytes;
}
}
EXPORT_SYMBOL(iSeries_memcpy_fromio);
/* /*
* Look down the chain to find the matching Device Device * Look down the chain to find the matching Device Device
*/ */
...@@ -491,7 +452,7 @@ static inline struct device_node *xlate_iomm_address( ...@@ -491,7 +452,7 @@ static inline struct device_node *xlate_iomm_address(
* iSeries_Read_Word = Read Word (16 bit) * iSeries_Read_Word = Read Word (16 bit)
* iSeries_Read_Long = Read Long (32 bit) * iSeries_Read_Long = Read Long (32 bit)
*/ */
u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -518,9 +479,8 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) ...@@ -518,9 +479,8 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
return (u8)ret.value; return (u8)ret.value;
} }
EXPORT_SYMBOL(iSeries_Read_Byte);
u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) static u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -548,9 +508,8 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) ...@@ -548,9 +508,8 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
return swab16((u16)ret.value); return swab16((u16)ret.value);
} }
EXPORT_SYMBOL(iSeries_Read_Word);
u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) static u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -578,7 +537,6 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) ...@@ -578,7 +537,6 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
return swab32((u32)ret.value); return swab32((u32)ret.value);
} }
EXPORT_SYMBOL(iSeries_Read_Long);
/* /*
* Write MM I/O Instructions for the iSeries * Write MM I/O Instructions for the iSeries
...@@ -587,7 +545,7 @@ EXPORT_SYMBOL(iSeries_Read_Long); ...@@ -587,7 +545,7 @@ EXPORT_SYMBOL(iSeries_Read_Long);
* iSeries_Write_Word = Write Word(16 bit) * iSeries_Write_Word = Write Word(16 bit)
* iSeries_Write_Long = Write Long(32 bit) * iSeries_Write_Long = Write Long(32 bit)
*/ */
void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) static void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -612,9 +570,8 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) ...@@ -612,9 +570,8 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0); rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0);
} while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0); } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0);
} }
EXPORT_SYMBOL(iSeries_Write_Byte);
void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) static void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -639,9 +596,8 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) ...@@ -639,9 +596,8 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0); rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0);
} while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0); } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0);
} }
EXPORT_SYMBOL(iSeries_Write_Word);
void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) static void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
{ {
u64 BarOffset; u64 BarOffset;
u64 dsa; u64 dsa;
...@@ -666,4 +622,224 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) ...@@ -666,4 +622,224 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0); rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0);
} while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0); } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0);
} }
EXPORT_SYMBOL(iSeries_Write_Long);
extern unsigned char __raw_readb(const volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return *(volatile unsigned char __force *)addr;
}
EXPORT_SYMBOL(__raw_readb);
extern unsigned short __raw_readw(const volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return *(volatile unsigned short __force *)addr;
}
EXPORT_SYMBOL(__raw_readw);
extern unsigned int __raw_readl(const volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return *(volatile unsigned int __force *)addr;
}
EXPORT_SYMBOL(__raw_readl);
extern unsigned long __raw_readq(const volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return *(volatile unsigned long __force *)addr;
}
EXPORT_SYMBOL(__raw_readq);
extern void __raw_writeb(unsigned char v, volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
*(volatile unsigned char __force *)addr = v;
}
EXPORT_SYMBOL(__raw_writeb);
extern void __raw_writew(unsigned short v, volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
*(volatile unsigned short __force *)addr = v;
}
EXPORT_SYMBOL(__raw_writew);
extern void __raw_writel(unsigned int v, volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
*(volatile unsigned int __force *)addr = v;
}
EXPORT_SYMBOL(__raw_writel);
extern void __raw_writeq(unsigned long v, volatile void __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
*(volatile unsigned long __force *)addr = v;
}
EXPORT_SYMBOL(__raw_writeq);
int in_8(const volatile unsigned char __iomem *addr)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
return iSeries_Read_Byte(addr);
return __in_8(addr);
}
EXPORT_SYMBOL(in_8);
void out_8(volatile unsigned char __iomem *addr, int val)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
iSeries_Write_Byte(val, addr);
else
__out_8(addr, val);
}
EXPORT_SYMBOL(out_8);
int in_le16(const volatile unsigned short __iomem *addr)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
return iSeries_Read_Word(addr);
return __in_le16(addr);
}
EXPORT_SYMBOL(in_le16);
int in_be16(const volatile unsigned short __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return __in_be16(addr);
}
EXPORT_SYMBOL(in_be16);
void out_le16(volatile unsigned short __iomem *addr, int val)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
iSeries_Write_Word(val, addr);
else
__out_le16(addr, val);
}
EXPORT_SYMBOL(out_le16);
void out_be16(volatile unsigned short __iomem *addr, int val)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
__out_be16(addr, val);
}
EXPORT_SYMBOL(out_be16);
unsigned in_le32(const volatile unsigned __iomem *addr)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
return iSeries_Read_Long(addr);
return __in_le32(addr);
}
EXPORT_SYMBOL(in_le32);
unsigned in_be32(const volatile unsigned __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return __in_be32(addr);
}
EXPORT_SYMBOL(in_be32);
void out_le32(volatile unsigned __iomem *addr, int val)
{
if (firmware_has_feature(FW_FEATURE_ISERIES))
iSeries_Write_Long(val, addr);
else
__out_le32(addr, val);
}
EXPORT_SYMBOL(out_le32);
void out_be32(volatile unsigned __iomem *addr, int val)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
__out_be32(addr, val);
}
EXPORT_SYMBOL(out_be32);
unsigned long in_le64(const volatile unsigned long __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return __in_le64(addr);
}
EXPORT_SYMBOL(in_le64);
unsigned long in_be64(const volatile unsigned long __iomem *addr)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
return __in_be64(addr);
}
EXPORT_SYMBOL(in_be64);
void out_le64(volatile unsigned long __iomem *addr, unsigned long val)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
__out_le64(addr, val);
}
EXPORT_SYMBOL(out_le64);
void out_be64(volatile unsigned long __iomem *addr, unsigned long val)
{
BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));
__out_be64(addr, val);
}
EXPORT_SYMBOL(out_be64);
void memset_io(volatile void __iomem *addr, int c, unsigned long n)
{
if (firmware_has_feature(FW_FEATURE_ISERIES)) {
volatile char __iomem *d = addr;
while (n-- > 0) {
iSeries_Write_Byte(c, d++);
}
} else
eeh_memset_io(addr, c, n);
}
EXPORT_SYMBOL(memset_io);
void memcpy_fromio(void *dest, const volatile void __iomem *src,
unsigned long n)
{
if (firmware_has_feature(FW_FEATURE_ISERIES)) {
char *d = dest;
const volatile char __iomem *s = src;
while (n-- > 0) {
*d++ = iSeries_Read_Byte(s++);
}
} else
eeh_memcpy_fromio(dest, src, n);
}
EXPORT_SYMBOL(memcpy_fromio);
void memcpy_toio(volatile void __iomem *dest, const void *src, unsigned long n)
{
if (firmware_has_feature(FW_FEATURE_ISERIES)) {
const char *s = src;
volatile char __iomem *d = dest;
while (n-- > 0) {
iSeries_Write_Byte(*s++, d++);
}
} else
eeh_memcpy_toio(dest, src, n);
}
EXPORT_SYMBOL(memcpy_toio);
...@@ -20,9 +20,6 @@ extern int check_legacy_ioport(unsigned long base_port); ...@@ -20,9 +20,6 @@ extern int check_legacy_ioport(unsigned long base_port);
#include <asm/page.h> #include <asm/page.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/paca.h> #include <asm/paca.h>
#ifdef CONFIG_PPC_ISERIES
#include <asm/iseries/iseries_io.h>
#endif
#include <asm/synch.h> #include <asm/synch.h>
#include <asm/delay.h> #include <asm/delay.h>
...@@ -37,41 +34,53 @@ extern unsigned long isa_io_base; ...@@ -37,41 +34,53 @@ extern unsigned long isa_io_base;
extern unsigned long pci_io_base; extern unsigned long pci_io_base;
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
/* __raw_* accessors aren't supported on iSeries */
#define __raw_readb(addr) { BUG(); 0; }
#define __raw_readw(addr) { BUG(); 0; }
#define __raw_readl(addr) { BUG(); 0; }
#define __raw_readq(addr) { BUG(); 0; }
#define __raw_writeb(v, addr) { BUG(); 0; }
#define __raw_writew(v, addr) { BUG(); 0; }
#define __raw_writel(v, addr) { BUG(); 0; }
#define __raw_writeq(v, addr) { BUG(); 0; }
#define readb(addr) iSeries_Read_Byte(addr)
#define readw(addr) iSeries_Read_Word(addr)
#define readl(addr) iSeries_Read_Long(addr)
#define writeb(data, addr) iSeries_Write_Byte((data),(addr))
#define writew(data, addr) iSeries_Write_Word((data),(addr))
#define writel(data, addr) iSeries_Write_Long((data),(addr))
#define memset_io(a,b,c) iSeries_memset_io((a),(b),(c))
#define memcpy_fromio(a,b,c) iSeries_memcpy_fromio((a), (b), (c))
#define memcpy_toio(a,b,c) iSeries_memcpy_toio((a), (b), (c))
#define inb(addr) readb(((void __iomem *)(long)(addr)))
#define inw(addr) readw(((void __iomem *)(long)(addr)))
#define inl(addr) readl(((void __iomem *)(long)(addr)))
#define outb(data,addr) writeb(data,((void __iomem *)(long)(addr)))
#define outw(data,addr) writew(data,((void __iomem *)(long)(addr)))
#define outl(data,addr) writel(data,((void __iomem *)(long)(addr)))
/*
* The *_ns versions below don't do byte-swapping.
* Neither do the standard versions now, these are just here
* for older code.
*/
#define insb(port, buf, ns) _insb((u8 __iomem *)((port)+pci_io_base), (buf), (ns))
#define insw(port, buf, ns) _insw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
#define insl(port, buf, nl) _insl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
#else extern int in_8(const volatile unsigned char __iomem *addr);
extern void out_8(volatile unsigned char __iomem *addr, int val);
extern int in_le16(const volatile unsigned short __iomem *addr);
extern int in_be16(const volatile unsigned short __iomem *addr);
extern void out_le16(volatile unsigned short __iomem *addr, int val);
extern void out_be16(volatile unsigned short __iomem *addr, int val);
extern unsigned in_le32(const volatile unsigned __iomem *addr);
extern unsigned in_be32(const volatile unsigned __iomem *addr);
extern void out_le32(volatile unsigned __iomem *addr, int val);
extern void out_be32(volatile unsigned __iomem *addr, int val);
extern unsigned long in_le64(const volatile unsigned long __iomem *addr);
extern unsigned long in_be64(const volatile unsigned long __iomem *addr);
extern void out_le64(volatile unsigned long __iomem *addr, unsigned long val);
extern void out_be64(volatile unsigned long __iomem *addr, unsigned long val);
extern unsigned char __raw_readb(const volatile void __iomem *addr);
extern unsigned short __raw_readw(const volatile void __iomem *addr);
extern unsigned int __raw_readl(const volatile void __iomem *addr);
extern unsigned long __raw_readq(const volatile void __iomem *addr);
extern void __raw_writeb(unsigned char v, volatile void __iomem *addr);
extern void __raw_writew(unsigned short v, volatile void __iomem *addr);
extern void __raw_writel(unsigned int v, volatile void __iomem *addr);
extern void __raw_writeq(unsigned long v, volatile void __iomem *addr);
extern void memset_io(volatile void __iomem *addr, int c, unsigned long n);
extern void memcpy_fromio(void *dest, const volatile void __iomem *src,
unsigned long n);
extern void memcpy_toio(volatile void __iomem *dest, const void *src,
unsigned long n);
#else /* CONFIG_PPC_ISERIES */
#define in_8(addr) __in_8((addr))
#define out_8(addr, val) __out_8((addr), (val))
#define in_le16(addr) __in_le16((addr))
#define in_be16(addr) __in_be16((addr))
#define out_le16(addr, val) __out_le16((addr), (val))
#define out_be16(addr, val) __out_be16((addr), (val))
#define in_le32(addr) __in_le32((addr))
#define in_be32(addr) __in_be32((addr))
#define out_le32(addr, val) __out_le32((addr), (val))
#define out_be32(addr, val) __out_be32((addr), (val))
#define in_le64(addr) __in_le64((addr))
#define in_be64(addr) __in_be64((addr))
#define out_le64(addr, val) __out_le64((addr), (val))
#define out_be64(addr, val) __out_be64((addr), (val))
static inline unsigned char __raw_readb(const volatile void __iomem *addr) static inline unsigned char __raw_readb(const volatile void __iomem *addr)
{ {
...@@ -105,23 +114,11 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) ...@@ -105,23 +114,11 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
{ {
*(volatile unsigned long __force *)addr = v; *(volatile unsigned long __force *)addr = v;
} }
#define readb(addr) eeh_readb(addr)
#define readw(addr) eeh_readw(addr)
#define readl(addr) eeh_readl(addr)
#define readq(addr) eeh_readq(addr)
#define writeb(data, addr) eeh_writeb((data), (addr))
#define writew(data, addr) eeh_writew((data), (addr))
#define writel(data, addr) eeh_writel((data), (addr))
#define writeq(data, addr) eeh_writeq((data), (addr))
#define memset_io(a,b,c) eeh_memset_io((a),(b),(c)) #define memset_io(a,b,c) eeh_memset_io((a),(b),(c))
#define memcpy_fromio(a,b,c) eeh_memcpy_fromio((a),(b),(c)) #define memcpy_fromio(a,b,c) eeh_memcpy_fromio((a),(b),(c))
#define memcpy_toio(a,b,c) eeh_memcpy_toio((a),(b),(c)) #define memcpy_toio(a,b,c) eeh_memcpy_toio((a),(b),(c))
#define inb(port) eeh_inb((unsigned long)port)
#define outb(val, port) eeh_outb(val, (unsigned long)port) #endif /* CONFIG_PPC_ISERIES */
#define inw(port) eeh_inw((unsigned long)port)
#define outw(val, port) eeh_outw(val, (unsigned long)port)
#define inl(port) eeh_inl((unsigned long)port)
#define outl(val, port) eeh_outl(val, (unsigned long)port)
/* /*
* The insw/outsw/insl/outsl macros don't do byte-swapping. * The insw/outsw/insl/outsl macros don't do byte-swapping.
...@@ -132,12 +129,25 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) ...@@ -132,12 +129,25 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
#define insw(port, buf, ns) eeh_insw_ns((port), (buf), (ns)) #define insw(port, buf, ns) eeh_insw_ns((port), (buf), (ns))
#define insl(port, buf, nl) eeh_insl_ns((port), (buf), (nl)) #define insl(port, buf, nl) eeh_insl_ns((port), (buf), (nl))
#endif
#define outsb(port, buf, ns) _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns)) #define outsb(port, buf, ns) _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns))
#define outsw(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns)) #define outsw(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
#define outsl(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl)) #define outsl(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
#define readb(addr) eeh_readb(addr)
#define readw(addr) eeh_readw(addr)
#define readl(addr) eeh_readl(addr)
#define readq(addr) eeh_readq(addr)
#define writeb(data, addr) eeh_writeb((data), (addr))
#define writew(data, addr) eeh_writew((data), (addr))
#define writel(data, addr) eeh_writel((data), (addr))
#define writeq(data, addr) eeh_writeq((data), (addr))
#define inb(port) eeh_inb((unsigned long)port)
#define outb(val, port) eeh_outb(val, (unsigned long)port)
#define inw(port) eeh_inw((unsigned long)port)
#define outw(val, port) eeh_outw(val, (unsigned long)port)
#define inl(port) eeh_inl((unsigned long)port)
#define outl(val, port) eeh_outl(val, (unsigned long)port)
#define readb_relaxed(addr) readb(addr) #define readb_relaxed(addr) readb(addr)
#define readw_relaxed(addr) readw(addr) #define readw_relaxed(addr) readw(addr)
#define readl_relaxed(addr) readl(addr) #define readl_relaxed(addr) readl(addr)
...@@ -258,7 +268,7 @@ static inline void iosync(void) ...@@ -258,7 +268,7 @@ static inline void iosync(void)
* and should not be used directly by device drivers. Use inb/readb * and should not be used directly by device drivers. Use inb/readb
* instead. * instead.
*/ */
static inline int in_8(const volatile unsigned char __iomem *addr) static inline int __in_8(const volatile unsigned char __iomem *addr)
{ {
int ret; int ret;
...@@ -267,14 +277,14 @@ static inline int in_8(const volatile unsigned char __iomem *addr) ...@@ -267,14 +277,14 @@ static inline int in_8(const volatile unsigned char __iomem *addr)
return ret; return ret;
} }
static inline void out_8(volatile unsigned char __iomem *addr, int val) static inline void __out_8(volatile unsigned char __iomem *addr, int val)
{ {
__asm__ __volatile__("sync; stb%U0%X0 %1,%0" __asm__ __volatile__("sync; stb%U0%X0 %1,%0"
: "=m" (*addr) : "r" (val)); : "=m" (*addr) : "r" (val));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline int in_le16(const volatile unsigned short __iomem *addr) static inline int __in_le16(const volatile unsigned short __iomem *addr)
{ {
int ret; int ret;
...@@ -283,7 +293,7 @@ static inline int in_le16(const volatile unsigned short __iomem *addr) ...@@ -283,7 +293,7 @@ static inline int in_le16(const volatile unsigned short __iomem *addr)
return ret; return ret;
} }
static inline int in_be16(const volatile unsigned short __iomem *addr) static inline int __in_be16(const volatile unsigned short __iomem *addr)
{ {
int ret; int ret;
...@@ -292,21 +302,21 @@ static inline int in_be16(const volatile unsigned short __iomem *addr) ...@@ -292,21 +302,21 @@ static inline int in_be16(const volatile unsigned short __iomem *addr)
return ret; return ret;
} }
static inline void out_le16(volatile unsigned short __iomem *addr, int val) static inline void __out_le16(volatile unsigned short __iomem *addr, int val)
{ {
__asm__ __volatile__("sync; sthbrx %1,0,%2" __asm__ __volatile__("sync; sthbrx %1,0,%2"
: "=m" (*addr) : "r" (val), "r" (addr)); : "=m" (*addr) : "r" (val), "r" (addr));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline void out_be16(volatile unsigned short __iomem *addr, int val) static inline void __out_be16(volatile unsigned short __iomem *addr, int val)
{ {
__asm__ __volatile__("sync; sth%U0%X0 %1,%0" __asm__ __volatile__("sync; sth%U0%X0 %1,%0"
: "=m" (*addr) : "r" (val)); : "=m" (*addr) : "r" (val));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline unsigned in_le32(const volatile unsigned __iomem *addr) static inline unsigned __in_le32(const volatile unsigned __iomem *addr)
{ {
unsigned ret; unsigned ret;
...@@ -315,7 +325,7 @@ static inline unsigned in_le32(const volatile unsigned __iomem *addr) ...@@ -315,7 +325,7 @@ static inline unsigned in_le32(const volatile unsigned __iomem *addr)
return ret; return ret;
} }
static inline unsigned in_be32(const volatile unsigned __iomem *addr) static inline unsigned __in_be32(const volatile unsigned __iomem *addr)
{ {
unsigned ret; unsigned ret;
...@@ -324,21 +334,21 @@ static inline unsigned in_be32(const volatile unsigned __iomem *addr) ...@@ -324,21 +334,21 @@ static inline unsigned in_be32(const volatile unsigned __iomem *addr)
return ret; return ret;
} }
static inline void out_le32(volatile unsigned __iomem *addr, int val) static inline void __out_le32(volatile unsigned __iomem *addr, int val)
{ {
__asm__ __volatile__("sync; stwbrx %1,0,%2" : "=m" (*addr) __asm__ __volatile__("sync; stwbrx %1,0,%2" : "=m" (*addr)
: "r" (val), "r" (addr)); : "r" (val), "r" (addr));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline void out_be32(volatile unsigned __iomem *addr, int val) static inline void __out_be32(volatile unsigned __iomem *addr, int val)
{ {
__asm__ __volatile__("sync; stw%U0%X0 %1,%0" __asm__ __volatile__("sync; stw%U0%X0 %1,%0"
: "=m" (*addr) : "r" (val)); : "=m" (*addr) : "r" (val));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline unsigned long in_le64(const volatile unsigned long __iomem *addr) static inline unsigned long __in_le64(const volatile unsigned long __iomem *addr)
{ {
unsigned long tmp, ret; unsigned long tmp, ret;
...@@ -358,7 +368,7 @@ static inline unsigned long in_le64(const volatile unsigned long __iomem *addr) ...@@ -358,7 +368,7 @@ static inline unsigned long in_le64(const volatile unsigned long __iomem *addr)
return ret; return ret;
} }
static inline unsigned long in_be64(const volatile unsigned long __iomem *addr) static inline unsigned long __in_be64(const volatile unsigned long __iomem *addr)
{ {
unsigned long ret; unsigned long ret;
...@@ -367,7 +377,7 @@ static inline unsigned long in_be64(const volatile unsigned long __iomem *addr) ...@@ -367,7 +377,7 @@ static inline unsigned long in_be64(const volatile unsigned long __iomem *addr)
return ret; return ret;
} }
static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long val) static inline void __out_le64(volatile unsigned long __iomem *addr, unsigned long val)
{ {
unsigned long tmp; unsigned long tmp;
...@@ -385,15 +395,13 @@ static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long ...@@ -385,15 +395,13 @@ static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
static inline void out_be64(volatile unsigned long __iomem *addr, unsigned long val) static inline void __out_be64(volatile unsigned long __iomem *addr, unsigned long val)
{ {
__asm__ __volatile__("sync; std%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); __asm__ __volatile__("sync; std%U0%X0 %1,%0" : "=m" (*addr) : "r" (val));
get_paca()->io_sync = 1; get_paca()->io_sync = 1;
} }
#ifndef CONFIG_PPC_ISERIES
#include <asm/eeh.h> #include <asm/eeh.h>
#endif
/** /**
* check_signature - find BIOS signatures * check_signature - find BIOS signatures
...@@ -409,7 +417,6 @@ static inline int check_signature(const volatile void __iomem * io_addr, ...@@ -409,7 +417,6 @@ static inline int check_signature(const volatile void __iomem * io_addr,
const unsigned char *signature, int length) const unsigned char *signature, int length)
{ {
int retval = 0; int retval = 0;
#ifndef CONFIG_PPC_ISERIES
do { do {
if (readb(io_addr) != *signature) if (readb(io_addr) != *signature)
goto out; goto out;
...@@ -419,7 +426,6 @@ static inline int check_signature(const volatile void __iomem * io_addr, ...@@ -419,7 +426,6 @@ static inline int check_signature(const volatile void __iomem * io_addr,
} while (length); } while (length);
retval = 1; retval = 1;
out: out:
#endif
return retval; return retval;
} }
......
#ifndef _ASM_POWERPC_ISERIES_ISERIES_IO_H
#define _ASM_POWERPC_ISERIES_ISERIES_IO_H
#ifdef CONFIG_PPC_ISERIES
#include <linux/types.h>
/*
* Created by Allan Trautman on Thu Dec 28 2000.
*
* Remaps the io.h for the iSeries Io
* Copyright (C) 2000 Allan H Trautman, IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the:
* Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
*
* Change Activity:
* Created December 28, 2000
* End Change Activity
*/
#ifdef CONFIG_PCI
extern u8 iSeries_Read_Byte(const volatile void __iomem * IoAddress);
extern u16 iSeries_Read_Word(const volatile void __iomem * IoAddress);
extern u32 iSeries_Read_Long(const volatile void __iomem * IoAddress);
extern void iSeries_Write_Byte(u8 IoData, volatile void __iomem * IoAddress);
extern void iSeries_Write_Word(u16 IoData, volatile void __iomem * IoAddress);
extern void iSeries_Write_Long(u32 IoData, volatile void __iomem * IoAddress);
extern void iSeries_memset_io(volatile void __iomem *dest, char x, size_t n);
extern void iSeries_memcpy_toio(volatile void __iomem *dest, void *source,
size_t n);
extern void iSeries_memcpy_fromio(void *dest,
const volatile void __iomem *source, size_t n);
#else
static inline u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
{
return 0xff;
}
static inline void iSeries_Write_Byte(u8 IoData,
volatile void __iomem *IoAddress)
{
}
#endif /* CONFIG_PCI */
#endif /* CONFIG_PPC_ISERIES */
#endif /* _ASM_POWERPC_ISERIES_ISERIES_IO_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment