0001
0002 #ifndef _SPARC64_UPA_H
0003 #define _SPARC64_UPA_H
0004
0005 #include <asm/asi.h>
0006
0007
0008
0009
0010 #define UPA_CONFIG_RESV 0xffffffffc0000000
0011 #define UPA_CONFIG_PCON 0x000000003fc00000
0012 #define UPA_CONFIG_MID 0x00000000003e0000
0013 #define UPA_CONFIG_PCAP 0x000000000001ffff
0014
0015
0016 #define UPA_PORTID_FNP 0xff00000000000000
0017 #define UPA_PORTID_RESV 0x00fffff800000000
0018 #define UPA_PORTID_ECCVALID 0x0000000400000000
0019 #define UPA_PORTID_ONEREAD 0x0000000200000000
0020 #define UPA_PORTID_PINTRDQ 0x0000000180000000
0021 #define UPA_PORTID_PREQDQ 0x000000007e000000
0022 #define UPA_PORTID_PREQRD 0x0000000001e00000
0023 #define UPA_PORTID_UPACAP 0x00000000001f0000
0024 #define UPA_PORTID_ID 0x000000000000ffff
0025
0026
0027 #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
0028 static inline unsigned char _upa_readb(unsigned long addr)
0029 {
0030 unsigned char ret;
0031
0032 __asm__ __volatile__("lduba\t[%1] %2, %0\t/* upa_readb */"
0033 : "=r" (ret)
0034 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0035
0036 return ret;
0037 }
0038
0039 static inline unsigned short _upa_readw(unsigned long addr)
0040 {
0041 unsigned short ret;
0042
0043 __asm__ __volatile__("lduha\t[%1] %2, %0\t/* upa_readw */"
0044 : "=r" (ret)
0045 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0046
0047 return ret;
0048 }
0049
0050 static inline unsigned int _upa_readl(unsigned long addr)
0051 {
0052 unsigned int ret;
0053
0054 __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* upa_readl */"
0055 : "=r" (ret)
0056 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0057
0058 return ret;
0059 }
0060
0061 static inline unsigned long _upa_readq(unsigned long addr)
0062 {
0063 unsigned long ret;
0064
0065 __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* upa_readq */"
0066 : "=r" (ret)
0067 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0068
0069 return ret;
0070 }
0071
0072 static inline void _upa_writeb(unsigned char b, unsigned long addr)
0073 {
0074 __asm__ __volatile__("stba\t%0, [%1] %2\t/* upa_writeb */"
0075 :
0076 : "r" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0077 }
0078
0079 static inline void _upa_writew(unsigned short w, unsigned long addr)
0080 {
0081 __asm__ __volatile__("stha\t%0, [%1] %2\t/* upa_writew */"
0082 :
0083 : "r" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0084 }
0085
0086 static inline void _upa_writel(unsigned int l, unsigned long addr)
0087 {
0088 __asm__ __volatile__("stwa\t%0, [%1] %2\t/* upa_writel */"
0089 :
0090 : "r" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0091 }
0092
0093 static inline void _upa_writeq(unsigned long q, unsigned long addr)
0094 {
0095 __asm__ __volatile__("stxa\t%0, [%1] %2\t/* upa_writeq */"
0096 :
0097 : "r" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
0098 }
0099
0100 #define upa_readb(__addr) (_upa_readb((unsigned long)(__addr)))
0101 #define upa_readw(__addr) (_upa_readw((unsigned long)(__addr)))
0102 #define upa_readl(__addr) (_upa_readl((unsigned long)(__addr)))
0103 #define upa_readq(__addr) (_upa_readq((unsigned long)(__addr)))
0104 #define upa_writeb(__b, __addr) (_upa_writeb((__b), (unsigned long)(__addr)))
0105 #define upa_writew(__w, __addr) (_upa_writew((__w), (unsigned long)(__addr)))
0106 #define upa_writel(__l, __addr) (_upa_writel((__l), (unsigned long)(__addr)))
0107 #define upa_writeq(__q, __addr) (_upa_writeq((__q), (unsigned long)(__addr)))
0108 #endif
0109
0110 #endif