1 #ifndef _SH3_BUS_UTIL_H_ 2 #define _SH3_BUS_UTIL_H_ 3 /* 4 * Utility macros; INTERNAL USE ONLY. 5 */ 6 7 #define __TYPENAME(BITS) u_int##BITS##_t 8 9 #define _BUS_SPACE_READ(PREFIX, BYTES, BITS) \ 10 __TYPENAME(BITS) \ 11 PREFIX##_read_##BYTES(void *, bus_space_handle_t, bus_size_t); \ 12 __TYPENAME(BITS) \ 13 PREFIX##_read_##BYTES(void *tag, bus_space_handle_t bsh, \ 14 bus_size_t offset) \ 15 { \ 16 _BUS_SPACE_ACCESS_HOOK(); \ 17 return *(volatile __TYPENAME(BITS) *)(bsh + offset); \ 18 } 19 20 #define _BUS_SPACE_READ_MULTI(PREFIX, BYTES, BITS) \ 21 void \ 22 PREFIX##_read_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 23 __TYPENAME(BITS) *, bus_size_t); \ 24 void \ 25 PREFIX##_read_multi_##BYTES(void *tag, bus_space_handle_t bsh, \ 26 bus_size_t offset, __TYPENAME(BITS) *addr, \ 27 bus_size_t count) \ 28 { \ 29 volatile __TYPENAME(BITS) *p = (void *)(bsh + offset); \ 30 _BUS_SPACE_ACCESS_HOOK(); \ 31 while (count--) \ 32 *addr++ = *p; \ 33 } 34 35 #define _BUS_SPACE_READ_REGION(PREFIX, BYTES, BITS) \ 36 void \ 37 PREFIX##_read_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 38 __TYPENAME(BITS) *, bus_size_t); \ 39 void \ 40 PREFIX##_read_region_##BYTES(void *tag, bus_space_handle_t bsh, \ 41 bus_size_t offset, __TYPENAME(BITS) *addr, \ 42 bus_size_t count) \ 43 { \ 44 volatile __TYPENAME(BITS) *p = (void *)(bsh + offset); \ 45 _BUS_SPACE_ACCESS_HOOK(); \ 46 while (count--) \ 47 *addr++ = *p++; \ 48 } 49 50 #define _BUS_SPACE_WRITE(PREFIX, BYTES, BITS) \ 51 void \ 52 PREFIX##_write_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 53 __TYPENAME(BITS)); \ 54 void \ 55 PREFIX##_write_##BYTES(void *tag, bus_space_handle_t bsh, \ 56 bus_size_t offset, __TYPENAME(BITS) value) \ 57 { \ 58 _BUS_SPACE_ACCESS_HOOK(); \ 59 *(volatile __TYPENAME(BITS) *)(bsh + offset) = value; \ 60 } 61 62 #define _BUS_SPACE_WRITE_MULTI(PREFIX, BYTES, BITS) \ 63 void \ 64 PREFIX##_write_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 65 const __TYPENAME(BITS) *, bus_size_t); \ 66 void \ 67 PREFIX##_write_multi_##BYTES(void *tag, bus_space_handle_t bsh, \ 68 bus_size_t offset, \ 69 const __TYPENAME(BITS) *addr, \ 70 bus_size_t count) \ 71 { \ 72 volatile __TYPENAME(BITS) *p = (void *)(bsh + offset); \ 73 _BUS_SPACE_ACCESS_HOOK(); \ 74 while (count--) \ 75 *p = *addr++; \ 76 } 77 78 #define _BUS_SPACE_WRITE_REGION(PREFIX, BYTES, BITS) \ 79 void \ 80 PREFIX##_write_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 81 const __TYPENAME(BITS) *, bus_size_t); \ 82 void \ 83 PREFIX##_write_region_##BYTES(void *tag, bus_space_handle_t bsh, \ 84 bus_size_t offset, \ 85 const __TYPENAME(BITS) *addr, \ 86 bus_size_t count) \ 87 { \ 88 volatile __TYPENAME(BITS) *p = (void *)(bsh + offset); \ 89 _BUS_SPACE_ACCESS_HOOK(); \ 90 while (count--) \ 91 *p++ = *addr++; \ 92 } 93 94 #define _BUS_SPACE_SET_MULTI(PREFIX, BYTES, BITS) \ 95 void \ 96 PREFIX##_set_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 97 __TYPENAME(BITS), bus_size_t); \ 98 void \ 99 PREFIX##_set_multi_##BYTES(void *tag, bus_space_handle_t bsh, \ 100 bus_size_t offset, __TYPENAME(BITS) value, \ 101 bus_size_t count) \ 102 { \ 103 volatile __TYPENAME(BITS) *p = (void *)(bsh + offset); \ 104 _BUS_SPACE_ACCESS_HOOK(); \ 105 while (count--) \ 106 *p = value; \ 107 } 108 109 #define _BUS_SPACE_COPY_REGION(PREFIX, BYTES, BITS) \ 110 void \ 111 PREFIX##_copy_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 112 bus_space_handle_t, bus_size_t, \ 113 bus_size_t); \ 114 void \ 115 PREFIX##_copy_region_##BYTES(void *t, bus_space_handle_t h1, \ 116 bus_size_t o1, bus_space_handle_t h2, \ 117 bus_size_t o2, bus_size_t c) \ 118 { \ 119 volatile __TYPENAME(BITS) *addr1 = (void *)(h1 + o1); \ 120 volatile __TYPENAME(BITS) *addr2 = (void *)(h2 + o2); \ 121 _BUS_SPACE_ACCESS_HOOK(); \ 122 \ 123 if (addr1 >= addr2) { /* src after dest: copy forward */ \ 124 while (c--) \ 125 *addr2++ = *addr1++; \ 126 } else { /* dest after src: copy backwards */ \ 127 addr1 += c - 1; \ 128 addr2 += c - 1; \ 129 while (c--) \ 130 *addr2-- = *addr1--; \ 131 } \ 132 } 133 #endif /* _SH3_BUS_UTIL_H_ */ 134