| 
				
			 | 
			
			
				
				@@ -43,42 +43,83 @@ IOAPI_INLINE ( arm, bus_to_phys ) ( unsigned long bus_addr ) { 
			 | 
		
		
	
		
			
			| 
				43
			 | 
			
				43
			 | 
			
			
				
				  * 
			 | 
		
		
	
		
			
			| 
				44
			 | 
			
				44
			 | 
			
			
				
				  */ 
			 | 
		
		
	
		
			
			| 
				45
			 | 
			
				45
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				46
			 | 
			
				
			 | 
			
			
				
				-#define ARM_READX( _api_func, _type, _insn_suffix, _reg_prefix )	      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				
				+#define ARM_READX( _suffix, _type, _insn_suffix, _reg_prefix )		      \ 
			 | 
		
		
	
		
			
			| 
				47
			 | 
			
				47
			 | 
			
			
				
				 static inline __always_inline _type					      \ 
			 | 
		
		
	
		
			
			| 
				48
			 | 
			
				
			 | 
			
			
				
				-IOAPI_INLINE ( arm, _api_func ) ( volatile _type *io_addr ) {		      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				
				+IOAPI_INLINE ( arm, read ## _suffix ) ( volatile _type *io_addr ) {	      \ 
			 | 
		
		
	
		
			
			| 
				49
			 | 
			
				49
			 | 
			
			
				
				 	_type data;							      \ 
			 | 
		
		
	
		
			
			| 
				50
			 | 
			
				50
			 | 
			
			
				
				 	__asm__ __volatile__ ( "ldr" _insn_suffix " %" _reg_prefix "0, %1"    \ 
			 | 
		
		
	
		
			
			| 
				51
			 | 
			
				51
			 | 
			
			
				
				 			       : "=r" ( data ) : "Qo" ( *io_addr ) );	      \ 
			 | 
		
		
	
		
			
			| 
				52
			 | 
			
				52
			 | 
			
			
				
				 	return data;							      \ 
			 | 
		
		
	
		
			
			| 
				53
			 | 
			
				53
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				54
			 | 
			
				54
			 | 
			
			
				
				 #ifdef __aarch64__ 
			 | 
		
		
	
		
			
			| 
				55
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readb, uint8_t, "b", "w" ); 
			 | 
		
		
	
		
			
			| 
				56
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readw, uint16_t, "h", "w" ); 
			 | 
		
		
	
		
			
			| 
				57
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readl, uint32_t, "", "w" ); 
			 | 
		
		
	
		
			
			| 
				58
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readq, uint64_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				
				+ARM_READX ( b, uint8_t, "b", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				
				+ARM_READX ( w, uint16_t, "h", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				
				+ARM_READX ( l, uint32_t, "", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				
				+ARM_READX ( q, uint64_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				59
			 | 
			
				59
			 | 
			
			
				
				 #else 
			 | 
		
		
	
		
			
			| 
				60
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readb, uint8_t, "b", "" ); 
			 | 
		
		
	
		
			
			| 
				61
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readw, uint16_t, "h", "" ); 
			 | 
		
		
	
		
			
			| 
				62
			 | 
			
				
			 | 
			
			
				
				-ARM_READX ( readl, uint32_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				
				+ARM_READX ( b, uint8_t, "b", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				
				+ARM_READX ( w, uint16_t, "h", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				
				+ARM_READX ( l, uint32_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				63
			 | 
			
				63
			 | 
			
			
				
				 #endif 
			 | 
		
		
	
		
			
			| 
				64
			 | 
			
				64
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				65
			 | 
			
				
			 | 
			
			
				
				-#define ARM_WRITEX( _api_func, _type, _insn_suffix, _reg_prefix )			\ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				
				+#define ARM_WRITEX( _suffix, _type, _insn_suffix, _reg_prefix )		      \ 
			 | 
		
		
	
		
			
			| 
				66
			 | 
			
				66
			 | 
			
			
				
				 static inline __always_inline void					      \ 
			 | 
		
		
	
		
			
			| 
				67
			 | 
			
				
			 | 
			
			
				
				-IOAPI_INLINE ( arm, _api_func ) ( _type data, volatile _type *io_addr ) {     \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				
				+IOAPI_INLINE ( arm, write ## _suffix ) ( _type data,			      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				
				+					 volatile _type *io_addr ) {	      \ 
			 | 
		
		
	
		
			
			| 
				68
			 | 
			
				69
			 | 
			
			
				
				 	__asm__ __volatile__ ( "str" _insn_suffix " %" _reg_prefix "0, %1"    \ 
			 | 
		
		
	
		
			
			| 
				69
			 | 
			
				70
			 | 
			
			
				
				 			       : : "r" ( data ), "Qo" ( *io_addr ) );	      \ 
			 | 
		
		
	
		
			
			| 
				70
			 | 
			
				71
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				71
			 | 
			
				72
			 | 
			
			
				
				 #ifdef __aarch64__ 
			 | 
		
		
	
		
			
			| 
				72
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writeb, uint8_t, "b", "w" ); 
			 | 
		
		
	
		
			
			| 
				73
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writew, uint16_t, "h", "w" ); 
			 | 
		
		
	
		
			
			| 
				74
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writel, uint32_t, "", "w" ); 
			 | 
		
		
	
		
			
			| 
				75
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writeq, uint64_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				73
			 | 
			
			
				
				+ARM_WRITEX ( b, uint8_t, "b", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				74
			 | 
			
			
				
				+ARM_WRITEX ( w, uint16_t, "h", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				75
			 | 
			
			
				
				+ARM_WRITEX ( l, uint32_t, "", "w" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				76
			 | 
			
			
				
				+ARM_WRITEX ( q, uint64_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				76
			 | 
			
				77
			 | 
			
			
				
				 #else 
			 | 
		
		
	
		
			
			| 
				77
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writeb, uint8_t, "b", "" ); 
			 | 
		
		
	
		
			
			| 
				78
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writew, uint16_t, "h", "" ); 
			 | 
		
		
	
		
			
			| 
				79
			 | 
			
				
			 | 
			
			
				
				-ARM_WRITEX ( writel, uint32_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				78
			 | 
			
			
				
				+ARM_WRITEX ( b, uint8_t, "b", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				
				+ARM_WRITEX ( w, uint16_t, "h", "" ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				
				+ARM_WRITEX ( l, uint32_t, "", "" ); 
			 | 
		
		
	
		
			
			| 
				80
			 | 
			
				81
			 | 
			
			
				
				 #endif 
			 | 
		
		
	
		
			
			| 
				81
			 | 
			
				82
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				83
			 | 
			
			
				
				+/* 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				84
			 | 
			
			
				
				+ * Dummy PIO reads and writes up to 32 bits 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				85
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				86
			 | 
			
			
				
				+ * There is no common standard for I/O-space access for ARM, and 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				87
			 | 
			
			
				
				+ * non-MMIO peripherals are vanishingly rare.  Provide dummy 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				
				+ * implementations that will allow code to link and should cause 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				
				+ * drivers to simply fail to detect hardware at runtime. 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				90
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				91
			 | 
			
			
				
				+ */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				93
			 | 
			
			
				
				+#define ARM_INX( _suffix, _type )					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				94
			 | 
			
			
				
				+static inline __always_inline _type					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				95
			 | 
			
			
				
				+IOAPI_INLINE ( arm, in ## _suffix ) ( volatile _type *io_addr __unused) {     \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				96
			 | 
			
			
				
				+	return ~( (_type) 0 );						      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				97
			 | 
			
			
				
				+}									      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				98
			 | 
			
			
				
				+static inline __always_inline void					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				99
			 | 
			
			
				
				+IOAPI_INLINE ( arm, ins ## _suffix ) ( volatile _type *io_addr __unused,      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				
				+				       _type *data, unsigned int count ) {    \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				101
			 | 
			
			
				
				+	memset ( data, 0xff, count * sizeof ( *data ) );		      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				102
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				103
			 | 
			
			
				
				+ARM_INX ( b, uint8_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				104
			 | 
			
			
				
				+ARM_INX ( w, uint16_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				105
			 | 
			
			
				
				+ARM_INX ( l, uint32_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				106
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				107
			 | 
			
			
				
				+#define ARM_OUTX( _suffix, _type )					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				108
			 | 
			
			
				
				+static inline __always_inline void					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				109
			 | 
			
			
				
				+IOAPI_INLINE ( arm, out ## _suffix ) ( _type data __unused,		      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				110
			 | 
			
			
				
				+				       volatile _type *io_addr __unused ) {   \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				111
			 | 
			
			
				
				+	/* Do nothing */						      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				112
			 | 
			
			
				
				+}									      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				113
			 | 
			
			
				
				+static inline __always_inline void					      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				114
			 | 
			
			
				
				+IOAPI_INLINE ( arm, outs ## _suffix ) ( volatile _type *io_addr __unused,     \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				115
			 | 
			
			
				
				+					const _type *data __unused,	      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				116
			 | 
			
			
				
				+					unsigned int count __unused ) {	      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				117
			 | 
			
			
				
				+	/* Do nothing */						      \ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				118
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				119
			 | 
			
			
				
				+ARM_OUTX ( b, uint8_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				120
			 | 
			
			
				
				+ARM_OUTX ( w, uint16_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				121
			 | 
			
			
				
				+ARM_OUTX ( l, uint32_t ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				122
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				82
			 | 
			
				123
			 | 
			
			
				
				 /* 
			 | 
		
		
	
		
			
			| 
				83
			 | 
			
				124
			 | 
			
			
				
				  * Slow down I/O 
			 | 
		
		
	
		
			
			| 
				84
			 | 
			
				125
			 | 
			
			
				
				  * 
			 |