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