Home | History | Annotate | Line # | Download | only in include
      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