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) \ 11PREFIX##_read_##BYTES(void *, bus_space_handle_t, bus_size_t); \ 12__TYPENAME(BITS) \ 13PREFIX##_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) \ 21void \ 22PREFIX##_read_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 23 __TYPENAME(BITS) *, bus_size_t); \ 24void \ 25PREFIX##_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) \ 36void \ 37PREFIX##_read_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 38 __TYPENAME(BITS) *, bus_size_t); \ 39void \ 40PREFIX##_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) \ 51void \ 52PREFIX##_write_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 53 __TYPENAME(BITS)); \ 54void \ 55PREFIX##_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) \ 63void \ 64PREFIX##_write_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 65 const __TYPENAME(BITS) *, bus_size_t); \ 66void \ 67PREFIX##_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) \ 79void \ 80PREFIX##_write_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 81 const __TYPENAME(BITS) *, bus_size_t); \ 82void \ 83PREFIX##_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) \ 95void \ 96PREFIX##_set_multi_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 97 __TYPENAME(BITS), bus_size_t); \ 98void \ 99PREFIX##_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) \ 110void \ 111PREFIX##_copy_region_##BYTES(void *, bus_space_handle_t, bus_size_t, \ 112 bus_space_handle_t, bus_size_t, \ 113 bus_size_t); \ 114void \ 115PREFIX##_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