Home | History | Annotate | Line # | Download | only in rmi
rmixl_fmnvar.h revision 1.1.2.2
      1  1.1.2.2  cliff /*	$Id: rmixl_fmnvar.h,v 1.1.2.2 2010/03/29 23:34:09 cliff Exp $	*/
      2  1.1.2.1  cliff 
      3  1.1.2.1  cliff #ifndef _ARCH_MIPS_RMIXL_RMIXL_FMNVAR_H_
      4  1.1.2.1  cliff #define _ARCH_MIPS_RMIXL_RMIXL_FMNVAR_H_
      5  1.1.2.1  cliff 
      6  1.1.2.1  cliff #include <mips/cpuregs.h>
      7  1.1.2.1  cliff 
      8  1.1.2.1  cliff #define RMIXL_FMN_CODE_PSB_WAKEUP	200	/* firmware MSGRNG_CODE_BOOT_WAKEUP */
      9  1.1.2.1  cliff #define RMIXL_FMN_CODE_HELLO_REQ	201
     10  1.1.2.1  cliff #define RMIXL_FMN_CODE_HELLO_ACK	202
     11  1.1.2.1  cliff 
     12  1.1.2.1  cliff #define RMIXL_FMN_HELLO_REQ_SZ		4
     13  1.1.2.1  cliff #define RMIXL_FMN_HELLO_ACK_SZ		4
     14  1.1.2.1  cliff 
     15  1.1.2.1  cliff typedef struct rmixl_fmn_msg {
     16  1.1.2.1  cliff 	uint64_t data[4];
     17  1.1.2.1  cliff } rmixl_fmn_msg_t;
     18  1.1.2.1  cliff 
     19  1.1.2.1  cliff typedef struct rmixl_fmn_rxmsg {
     20  1.1.2.1  cliff 	u_int rxsid;
     21  1.1.2.1  cliff 	u_int code;
     22  1.1.2.1  cliff 	u_int size;
     23  1.1.2.1  cliff 	rmixl_fmn_msg_t msg;
     24  1.1.2.1  cliff } rmixl_fmn_rxmsg_t;
     25  1.1.2.1  cliff 
     26  1.1.2.1  cliff 
     27  1.1.2.1  cliff /*
     28  1.1.2.1  cliff  * compute FMN dest_id from MIPS cpuid
     29  1.1.2.1  cliff  * - each Core FMN sation has 8 buckets
     30  1.1.2.1  cliff  * - each Core has 4 threads
     31  1.1.2.1  cliff  * - here we use 1 bucket per thread
     32  1.1.2.1  cliff  *   (the first four buckets)
     33  1.1.2.1  cliff  * - if we need { hi, lo } priority buckets per thread
     34  1.1.2.1  cliff  *   need to adjust the RMIXL_FMN_DESTID macro
     35  1.1.2.1  cliff  *   and use the 'pri' parameter
     36  1.1.2.1  cliff  * - i.e. for now there is only one priority
     37  1.1.2.1  cliff  */
     38  1.1.2.1  cliff #define RMIXL_CPU_CORE(cpuid)	((uint32_t)((cpuid) & __BITS(9,0)) >> 2)
     39  1.1.2.1  cliff #define RMIXL_CPU_THREAD(cpuid)	((uint32_t)((cpuid) & __BITS(1,0)))
     40  1.1.2.1  cliff #define RMIXL_FMN_CORE_DESTID(core, bucket)	\
     41  1.1.2.1  cliff 		 (((core) << 3) | (bucket))
     42  1.1.2.1  cliff 
     43  1.1.2.1  cliff 
     44  1.1.2.1  cliff #define RMIXL_DMFC2(regnum, sel, rv)					\
     45  1.1.2.1  cliff do {									\
     46  1.1.2.1  cliff 	uint64_t __val;							\
     47  1.1.2.1  cliff 									\
     48  1.1.2.1  cliff 	__asm volatile(							\
     49  1.1.2.1  cliff 		".set push" 			"\n\t"			\
     50  1.1.2.1  cliff 		".set mips64"			"\n\t"			\
     51  1.1.2.1  cliff 		".set noat"			"\n\t"			\
     52  1.1.2.1  cliff 		"dmfc2 %0,$%1,%2"		"\n\t"			\
     53  1.1.2.1  cliff 		".set pop"			"\n\t"			\
     54  1.1.2.1  cliff 	    : "=r"(__val) : "n"(regnum), "n"(sel));			\
     55  1.1.2.1  cliff 	rv = __val;							\
     56  1.1.2.1  cliff } while (0)
     57  1.1.2.1  cliff 
     58  1.1.2.1  cliff #define RMIXL_DMTC2(regnum, sel, val)					\
     59  1.1.2.1  cliff do {									\
     60  1.1.2.1  cliff 	uint64_t __val = val;						\
     61  1.1.2.1  cliff 									\
     62  1.1.2.1  cliff 	__asm volatile(							\
     63  1.1.2.1  cliff 		".set push" 			"\n\t"			\
     64  1.1.2.1  cliff 		".set mips64"			"\n\t"			\
     65  1.1.2.1  cliff 		".set noat"			"\n\t"			\
     66  1.1.2.1  cliff 		"dmtc2 %0,$%1,%2"		"\n\t"			\
     67  1.1.2.1  cliff 		".set pop"			"\n\t"			\
     68  1.1.2.1  cliff 	    :: "r"(__val), "n"(regnum), "n"(sel));			\
     69  1.1.2.1  cliff } while (0)
     70  1.1.2.1  cliff 
     71  1.1.2.1  cliff #define RMIXL_MFC2(regnum, sel, rv)					\
     72  1.1.2.1  cliff do {									\
     73  1.1.2.1  cliff 	uint32_t __val;							\
     74  1.1.2.1  cliff 									\
     75  1.1.2.1  cliff 	__asm volatile(							\
     76  1.1.2.1  cliff 		".set push"			"\n\t"			\
     77  1.1.2.1  cliff 		".set mips64"			"\n\t"			\
     78  1.1.2.1  cliff 		"mfc2 %0,$%1,%2"		"\n\t"			\
     79  1.1.2.1  cliff 		".set pop"			"\n\t"			\
     80  1.1.2.1  cliff 	    : "=r"(__val) : "n"(regnum), "n"(sel));			\
     81  1.1.2.1  cliff 	rv = __val;							\
     82  1.1.2.1  cliff } while (0)
     83  1.1.2.1  cliff 
     84  1.1.2.1  cliff #define RMIXL_MTC2(regnum, sel, val)					\
     85  1.1.2.1  cliff do {									\
     86  1.1.2.1  cliff 	uint32_t __val = val;						\
     87  1.1.2.1  cliff 									\
     88  1.1.2.1  cliff 	__asm volatile(							\
     89  1.1.2.1  cliff 		".set push"			"\n\t"			\
     90  1.1.2.1  cliff 		".set mips64"			"\n\t"			\
     91  1.1.2.1  cliff 		"mtc2 %0,$%1,%2"		"\n\t"			\
     92  1.1.2.1  cliff 		".set pop"			"\n\t"			\
     93  1.1.2.1  cliff 	    :: "r"(__val), "n"(regnum), "n"(sel));			\
     94  1.1.2.1  cliff } while (0)
     95  1.1.2.1  cliff 
     96  1.1.2.1  cliff #define CPU2_PRINT_8(regno, sel)					\
     97  1.1.2.1  cliff do {									\
     98  1.1.2.1  cliff 	uint64_t r;							\
     99  1.1.2.1  cliff 	RMIXL_DMFC2(regno, sel, r);					\
    100  1.1.2.1  cliff 	printf("%s: CP2(%d,%d) = %#"PRIx64"\n",				\
    101  1.1.2.1  cliff 		__func__, regno, sel, r);				\
    102  1.1.2.1  cliff } while (0)
    103  1.1.2.1  cliff 
    104  1.1.2.1  cliff #define CPU2_PRINT_4(regno, sel)					\
    105  1.1.2.1  cliff do {									\
    106  1.1.2.1  cliff 	uint32_t r;							\
    107  1.1.2.1  cliff 	RMIXL_MFC2(regno, sel, r);					\
    108  1.1.2.1  cliff 	printf("%s: CP2(%d,%d) = %#x\n",				\
    109  1.1.2.1  cliff 		__func__, regno, sel, r);				\
    110  1.1.2.1  cliff } while (0)
    111  1.1.2.1  cliff 
    112  1.1.2.1  cliff 
    113  1.1.2.1  cliff /*
    114  1.1.2.1  cliff  * encode 'dest' for msgsnd op 'rt'
    115  1.1.2.1  cliff  */
    116  1.1.2.1  cliff #define RMIXL_MSGSND_DESC(size, code, dest_id)	\
    117  1.1.2.1  cliff 		((((size) - 1) << 16) | ((code) << 8) | (dest_id))
    118  1.1.2.1  cliff 
    119  1.1.2.1  cliff static inline void
    120  1.1.2.1  cliff rmixl_msgsnd(uint32_t desc)
    121  1.1.2.1  cliff {
    122  1.1.2.1  cliff 	__asm__ volatile (
    123  1.1.2.1  cliff 		".set push"		"\n\t"
    124  1.1.2.1  cliff 		".set noreorder"	"\n\t"
    125  1.1.2.1  cliff 		".set mips64"		"\n\t"
    126  1.1.2.1  cliff 		"sync"			"\n\t"
    127  1.1.2.1  cliff 		"msgsnd %0"		"\n\t"
    128  1.1.2.1  cliff 		".set pop"		"\n\t"
    129  1.1.2.1  cliff 			:: "r"(desc));
    130  1.1.2.1  cliff }
    131  1.1.2.1  cliff 
    132  1.1.2.1  cliff static inline void
    133  1.1.2.1  cliff rmixl_msgld(uint32_t bucket)
    134  1.1.2.1  cliff {
    135  1.1.2.1  cliff 	__asm__ volatile (
    136  1.1.2.1  cliff 		".set push"		"\n\t"
    137  1.1.2.1  cliff 		".set noreorder"	"\n\t"
    138  1.1.2.1  cliff 		".set mips64"		"\n\t"
    139  1.1.2.1  cliff 		"msgld %0"		"\n\t"
    140  1.1.2.1  cliff 		".set pop"		"\n\t"
    141  1.1.2.1  cliff 			:: "r"(bucket));
    142  1.1.2.1  cliff }
    143  1.1.2.1  cliff 
    144  1.1.2.1  cliff /*
    145  1.1.2.1  cliff  * the seemingly-spurious add is recommended by RMI
    146  1.1.2.1  cliff  * see XLS PRM (rev. 3.21) 5.3.9
    147  1.1.2.1  cliff  */
    148  1.1.2.1  cliff static inline void
    149  1.1.2.1  cliff rmixl_fmn_msgwait(u_int mask)
    150  1.1.2.1  cliff {
    151  1.1.2.1  cliff 	__asm__ volatile (
    152  1.1.2.1  cliff 		".set push"		"\n\t"
    153  1.1.2.1  cliff 		".set noreorder"	"\n\t"
    154  1.1.2.1  cliff 		".set mips64"		"\n\t"
    155  1.1.2.1  cliff 		"addu %0,%0,0"		"\n\t"
    156  1.1.2.1  cliff 		"msgwait %0"		"\n\t"
    157  1.1.2.1  cliff 		".set pop"		"\n\t"
    158  1.1.2.1  cliff 			:: "r"(mask));
    159  1.1.2.1  cliff }
    160  1.1.2.1  cliff 
    161  1.1.2.1  cliff static inline uint32_t
    162  1.1.2.1  cliff rmixl_cp2_enable(void)
    163  1.1.2.1  cliff {
    164  1.1.2.1  cliff 	uint32_t rv;
    165  1.1.2.1  cliff 	uint32_t cu2;
    166  1.1.2.1  cliff 
    167  1.1.2.1  cliff 	KASSERT(curcpu()->ci_cpl == IPL_HIGH);
    168  1.1.2.1  cliff 	__asm volatile(
    169  1.1.2.1  cliff 		".set push"		"\n\t"
    170  1.1.2.1  cliff 		".set noreorder"	"\n\t"
    171  1.1.2.1  cliff 		"li	%1,%3"		"\n\t"
    172  1.1.2.1  cliff 		"mfc0	%0,$%2"		"\n\t"
    173  1.1.2.1  cliff 		"or	%1,%1,%0"	"\n\t"
    174  1.1.2.1  cliff 		"mtc0	%1,$%2"		"\n\t"
    175  1.1.2.1  cliff 		".set pop"		"\n\t"
    176  1.1.2.1  cliff 			: "=r"(rv), "=r"(cu2)
    177  1.1.2.1  cliff 			: "n"(MIPS_COP_0_STATUS), "n"(1 << 30));
    178  1.1.2.1  cliff 
    179  1.1.2.1  cliff 	return (rv & (1 << 30));
    180  1.1.2.1  cliff }
    181  1.1.2.1  cliff 
    182  1.1.2.1  cliff static inline void
    183  1.1.2.1  cliff rmixl_cp2_restore(uint32_t ocu)
    184  1.1.2.1  cliff {
    185  1.1.2.1  cliff 	uint32_t cu2;
    186  1.1.2.1  cliff 	uint32_t mask = ~(1 << 30);
    187  1.1.2.1  cliff 
    188  1.1.2.1  cliff 	KASSERT(curcpu()->ci_cpl == IPL_HIGH);
    189  1.1.2.1  cliff 	__asm volatile(
    190  1.1.2.1  cliff 		".set push"		"\n\t"
    191  1.1.2.1  cliff 		".set noreorder"	"\n\t"
    192  1.1.2.1  cliff 		"mfc0	%0,$%1"		"\n\t"
    193  1.1.2.1  cliff 		"and	%0,%2,%0"	"\n\t"
    194  1.1.2.1  cliff 		"or	%0,%3,%0"	"\n\t"
    195  1.1.2.1  cliff 		"mtc0	%0,$%1"		"\n\t"
    196  1.1.2.1  cliff 		".set pop"		"\n\t"
    197  1.1.2.1  cliff 			: "=r"(cu2)
    198  1.1.2.1  cliff 			: "n"(MIPS_COP_0_STATUS), "r"(mask), "r"(ocu));
    199  1.1.2.1  cliff }
    200  1.1.2.1  cliff 
    201  1.1.2.1  cliff /*
    202  1.1.2.2  cliff  * logical station IDs for RMI XLR
    203  1.1.2.2  cliff  * see Table 13.2 "Addressable Buckets" in the XLR PRM
    204  1.1.2.1  cliff  */
    205  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE0			0
    206  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE1			1
    207  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE2			2
    208  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE3			3
    209  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE4			4
    210  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE5			5
    211  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE6			6
    212  1.1.2.2  cliff #define RMIXLR_FMN_STID_CORE7			7
    213  1.1.2.2  cliff #define RMIXLR_FMN_STID_TXRX_0			8
    214  1.1.2.2  cliff #define RMIXLR_FMN_STID_TXRX_1			9
    215  1.1.2.2  cliff #define RMIXLR_FMN_STID_RGMII			10
    216  1.1.2.2  cliff #define RMIXLR_FMN_STID_DMA			11
    217  1.1.2.2  cliff #define RMIXLR_FMN_STID_FREE_0			12
    218  1.1.2.2  cliff #define RMIXLR_FMN_STID_FREE_1			13
    219  1.1.2.2  cliff #define RMIXLR_FMN_STID_SAE			14
    220  1.1.2.2  cliff #define RMIXLR_FMN_NSTID			(RMIXLR_FMN_STID_SAE+1)
    221  1.1.2.2  cliff #define RMIXLR_FMN_STID_RESERVED		-1
    222  1.1.2.2  cliff 
    223  1.1.2.2  cliff /*
    224  1.1.2.2  cliff  * logical station IDs for RMI XLS
    225  1.1.2.2  cliff  * see Table 12.1 "Stations and Addressable Buckets ..." in the XLS PRM
    226  1.1.2.2  cliff  */
    227  1.1.2.2  cliff #define RMIXLS_FMN_STID_CORE0			0
    228  1.1.2.2  cliff #define RMIXLS_FMN_STID_CORE1			1
    229  1.1.2.2  cliff #define RMIXLS_FMN_STID_CORE2			2
    230  1.1.2.2  cliff #define RMIXLS_FMN_STID_CORE3			3
    231  1.1.2.2  cliff #define RMIXLS_FMN_STID_GMAC_Q0			4
    232  1.1.2.2  cliff #define RMIXLS_FMN_STID_GMAC_Q1			5
    233  1.1.2.2  cliff #define RMIXLS_FMN_STID_DMA			6
    234  1.1.2.2  cliff #define RMIXLS_FMN_STID_CDE			7
    235  1.1.2.2  cliff #define RMIXLS_FMN_STID_PCIE			8
    236  1.1.2.2  cliff #define RMIXLS_FMN_STID_SAE			9
    237  1.1.2.2  cliff #define RMIXLS_FMN_NSTID			(RMIXLS_FMN_STID_SAE+1)
    238  1.1.2.2  cliff #define RMIXLS_FMN_STID_RESERVED		-1
    239  1.1.2.2  cliff 
    240  1.1.2.2  cliff /*
    241  1.1.2.2  cliff  * logical station IDs for RMI XLP
    242  1.1.2.2  cliff  * TBD!
    243  1.1.2.2  cliff  */
    244  1.1.2.2  cliff #define RMIXLP_FMN_NSTID			0	/* XXX */
    245  1.1.2.2  cliff 
    246  1.1.2.2  cliff 
    247  1.1.2.2  cliff #define RMIXL_FMN_NSTID		\
    248  1.1.2.2  cliff 		MAX(MAX(RMIXLR_FMN_NSTID, RMIXLS_FMN_NSTID), RMIXLP_FMN_NSTID)
    249  1.1.2.2  cliff 
    250  1.1.2.1  cliff 
    251  1.1.2.1  cliff #define RMIXL_FMN_INTR_IPL	IPL_HIGH
    252  1.1.2.1  cliff 
    253  1.1.2.1  cliff void	rmixl_fmn_init(void);
    254  1.1.2.1  cliff void	rmixl_fmn_init_core(void);
    255  1.1.2.1  cliff void	rmixl_fmn_init_cpu_intr(void);
    256  1.1.2.1  cliff void   *rmixl_fmn_intr_establish(int, int (*)(void *, rmixl_fmn_rxmsg_t *), void *);
    257  1.1.2.1  cliff void	rmixl_fmn_intr_disestablish(void *);
    258  1.1.2.1  cliff void	rmixl_fmn_intr_poll(u_int, rmixl_fmn_rxmsg_t *);
    259  1.1.2.1  cliff int	rmixl_fmn_msg_send(u_int, u_int, u_int, rmixl_fmn_msg_t *);
    260  1.1.2.1  cliff int	rmixl_fmn_msg_recv(u_int, rmixl_fmn_rxmsg_t *);
    261  1.1.2.1  cliff 
    262  1.1.2.1  cliff 
    263  1.1.2.1  cliff 
    264  1.1.2.1  cliff #endif	/* _ARCH_MIPS_RMIXL_RMIXL_FMNVAR_H_ */
    265