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