xref: /netbsd-src/sys/arch/mips/sibyte/include/sb1250_wid.h (revision 93bf6008f8b7982c1d1a9486e4a4a0e687fe36eb)
1 /*  *********************************************************************
2     *  SB1250 Board Support Package
3     *
4     *  Wafer ID bit definitions			File: sb1250_wid.h
5     *
6     *  Some preproduction BCM1250 samples use the wafer ID (WID) bits
7     *  in the system_revision register in the SCD to determine which
8     *  portions of the L1 and L2 caches are usable.
9     *
10     *  This file describes the WID register layout.
11     *
12     *  Author:  Mitch Lichtenberg
13     *
14     *********************************************************************
15     *
16     *  Copyright 2000,2001,2002,2003
17     *  Broadcom Corporation. All rights reserved.
18     *
19     *  This software is furnished under license and may be used and
20     *  copied only in accordance with the following terms and
21     *  conditions.  Subject to these conditions, you may download,
22     *  copy, install, use, modify and distribute modified or unmodified
23     *  copies of this software in source and/or binary form.  No title
24     *  or ownership is transferred hereby.
25     *
26     *  1) Any source code used, modified or distributed must reproduce
27     *     and retain this copyright notice and list of conditions
28     *     as they appear in the source file.
29     *
30     *  2) No right is granted to use any trade name, trademark, or
31     *     logo of Broadcom Corporation.  The "Broadcom Corporation"
32     *     name may not be used to endorse or promote products derived
33     *     from this software without the prior written permission of
34     *     Broadcom Corporation.
35     *
36     *  3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
37     *     IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
38     *     WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
39     *     PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
40     *     SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
41     *     PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
42     *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
43     *     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
44     *     GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
45     *     BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
46     *     OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
47     *     TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
48     *     THE POSSIBILITY OF SUCH DAMAGE.
49     ********************************************************************* */
50 
51 
52 #ifndef _SB1250_WID_H
53 #define _SB1250_WID_H
54 
55 #include "sb1250_defs.h"
56 
57 /*
58  * To make things easier to work with, we'll assume that the
59  * WID bits have been shifted from their normal home
60  * in scd_system_revision[63:32] to bits [31..0].
61  *
62  * That is, we've already shifted right by S_SYS_WID
63  */
64 
65 #define S_WID_BIN             0
66 #define M_WID_BIN             _SB_MAKEMASK(3,S_WID_BIN)
67 #define V_WID_BIN(x)          _SB_MAKEVALUE(x,S_WID_BIN)
68 #define G_WID_BIN(x)          _SB_GETVALUE(x,S_WID_BIN,M_WID_BIN)
69 
70                                         /* CPUs  L1I    L1D    L2   */
71 #define K_WID_BIN_2CPU_FI_1D_H2	0	/*  2    full   1/4    1/2  */
72 #define K_WID_BIN_2CPU_FI_FD_F2	1	/*  2    full   full   full */
73 #define K_WID_BIN_2CPU_FI_FD_H2 2 	/*  2    full   full   1/2  */
74 #define K_WID_BIN_2CPU_3I_3D_F2 3       /*  2    3/4    3/4    full */
75 #define K_WID_BIN_2CPU_3I_3D_H2 4	/*  2    3/4    3/4    1/2  */
76 #define K_WID_BIN_1CPU_FI_FD_F2 5	/*  1    full   full   full */
77 #define K_WID_BIN_1CPU_FI_FD_H2 6       /*  1    full   full   1/2  */
78 #define K_WID_BIN_2CPU_1I_1D_Q2 7       /*  2    1/4    1/4    1/4  */
79 
80 /*
81  * '1' bits in this mask represent bins with only one CPU
82  */
83 
84 #define M_WID_BIN_1CPU (_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_F2) | \
85                         _SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_H2))
86 
87 
88 /*
89  * '1' bits in this mask represent bins with a good L2
90  */
91 
92 #define M_WID_BIN_F2 (_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_F2) | \
93                       _SB_MAKEMASK1(K_WID_BIN_2CPU_3I_3D_F2) | \
94                       _SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_F2))
95 
96 /*
97  * '1' bits in this mask represent bins with 1/2 L2
98  */
99 
100 #define M_WID_BIN_H2   (_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_1D_H2) | \
101                         _SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_H2) | \
102                         _SB_MAKEMASK1(K_WID_BIN_2CPU_3I_3D_H2) | \
103                         _SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_H2) )
104 
105 /*
106  * '1' bits in this mask represent bins with 1/4 L2
107  */
108 
109 #define M_WID_BIN_Q2   (_SB_MAKEMASK1(K_WID_BIN_2CPU_1I_1D_Q2))
110 
111 /*
112  * '1' bits in this mask represent bins with 3/4 L1
113  */
114 
115 #define M_WID_BIN_3ID  (_SB_MAKEMASK1(K_WID_BIN_2CPU_3I_3D_F2) | \
116 			_SB_MAKEMASK1(K_WID_BIN_2CPU_3I_3D_H2))
117 
118 /*
119  * '1' bits in this mask represent bins with a full L1I
120  */
121 
122 #define M_WID_BIN_FI   (_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_1D_H2) | \
123 			_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_F2) | \
124 			_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_H2) | \
125 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_F2) | \
126 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_H2))
127 
128 /*
129  * '1' bits in this mask represent bins with a full L1D
130  */
131 
132 #define M_WID_BIN_FD   (_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_F2) | \
133 			_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_H2) | \
134 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_F2) | \
135 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_H2))
136 
137 /*
138  * '1' bits in this mask represent bins with a full L1 (both I and D)
139  */
140 
141 #define M_WID_BIN_FID  (_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_F2) | \
142 			_SB_MAKEMASK1(K_WID_BIN_2CPU_FI_FD_H2) | \
143 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_F2) | \
144 			_SB_MAKEMASK1(K_WID_BIN_1CPU_FI_FD_H2))
145 
146 #define S_WID_L2QTR           3
147 #define M_WID_L2QTR           _SB_MAKEMASK(2,S_WID_L2QTR)
148 #define V_WID_L2QTR(x)        _SB_MAKEVALUE(x,S_WID_L2QTR)
149 #define G_WID_L2QTR(x)        _SB_GETVALUE(x,S_WID_L2QTR,M_WID_L2QTR)
150 
151 #define M_WID_L2HALF	      _SB_MAKEMASK1(4)
152 
153 #define S_WID_CPU0_L1I        5
154 #define M_WID_CPU0_L1I        _SB_MAKEMASK(2,S_WID_CPU0_L1I)
155 #define V_WID_CPU0_L1I(x)     _SB_MAKEVALUE(x,S_WID_CPU0_L1I)
156 #define G_WID_CPU0_L1I(x)     _SB_GETVALUE(x,S_WID_CPU0_L1I,M_WID_CPU0_L1I)
157 
158 #define S_WID_CPU0_L1D        7
159 #define M_WID_CPU0_L1D        _SB_MAKEMASK(2,S_WID_CPU0_L1D)
160 #define V_WID_CPU0_L1D(x)     _SB_MAKEVALUE(x,S_WID_CPU0_L1D)
161 #define G_WID_CPU0_L1D(x)     _SB_GETVALUE(x,S_WID_CPU0_L1D,M_WID_CPU0_L1D)
162 
163 #define S_WID_CPU1_L1I        9
164 #define M_WID_CPU1_L1I        _SB_MAKEMASK(2,S_WID_CPU1_L1I)
165 #define V_WID_CPU1_L1I(x)     _SB_MAKEVALUE(x,S_WID_CPU1_L1I)
166 #define G_WID_CPU1_L1I(x)     _SB_GETVALUE(x,S_WID_CPU1_L1I,M_WID_CPU1_L1I)
167 
168 #define S_WID_CPU1_L1D        11
169 #define M_WID_CPU1_L1D        _SB_MAKEMASK(2,S_WID_CPU1_L1D)
170 #define V_WID_CPU1_L1D(x)     _SB_MAKEVALUE(x,S_WID_CPU1_L1D)
171 #define G_WID_CPU1_L1D(x)     _SB_GETVALUE(x,S_WID_CPU1_L1D,M_WID_CPU1_L1D)
172 
173 /*
174  * The macros below assume that the CPU bits have been shifted into the
175  * low-order 4 bits.
176  */
177 
178 #define S_WID_CPUX_L1I        0
179 #define M_WID_CPUX_L1I        _SB_MAKEMASK(2,S_WID_CPUX_L1I)
180 #define V_WID_CPUX_L1I(x)     _SB_MAKEVALUE(x,S_WID_CPUX_L1I)
181 #define G_WID_CPUX_L1I(x)     _SB_GETVALUE(x,S_WID_CPUX_L1I,M_WID_CPUX_L1I)
182 
183 #define S_WID_CPUX_L1D        2
184 #define M_WID_CPUX_L1D        _SB_MAKEMASK(2,S_WID_CPUX_L1D)
185 #define V_WID_CPUX_L1D(x)     _SB_MAKEVALUE(x,S_WID_CPUX_L1D)
186 #define G_WID_CPUX_L1D(x)     _SB_GETVALUE(x,S_WID_CPUX_L1D,M_WID_CPUX_L1D)
187 
188 #define S_WID_CPU0	      5
189 #define S_WID_CPU1	      9
190 
191 #define S_WID_WAFERID        13
192 #define M_WID_WAFERID        _SB_MAKEMASK(5,S_WID_WAFERID)
193 #define V_WID_WAFERID(x)     _SB_MAKEVALUE(x,S_WID_WAFERID)
194 #define G_WID_WAFERID(x)     _SB_GETVALUE(x,S_WID_WAFERID,M_WID_WAFERID)
195 
196 #define S_WID_LOTID        18
197 #define M_WID_LOTID        _SB_MAKEMASK(14,S_WID_LOTID)
198 #define V_WID_LOTID(x)     _SB_MAKEVALUE(x,S_WID_LOTID)
199 #define G_WID_LOTID(x)     _SB_GETVALUE(x,S_WID_LOTID,M_WID_LOTID)
200 
201 /*
202  * Now, to make things even more confusing, the fuses on the chip
203  * don't exactly correspond to the bits in the register. The mask
204  * below represents bits that need to be swapped with the ones to
205  * their left.  So, if bit 10 is set, swap bits 10 and 11
206  */
207 
208 #define M_WID_SWAPBITS	(_SB_MAKEMASK1(2) | _SB_MAKEMASK1(4) | _SB_MAKEMASK1(10) | \
209                          _SB_MAKEMASK1(20) | _SB_MAKEMASK1(18) | _SB_MAKEMASK1(26) )
210 
211 #ifdef __ASSEMBLER__
212 #define WID_UNCONVOLUTE(wid,t1,t2,t3) \
213        li    t1,M_WID_SWAPBITS ; \
214        and   t1,t1,wid ; \
215        sll   t1,t1,1 ; \
216        li    t2,(M_WID_SWAPBITS << 1); \
217        and   t2,t2,wid ; \
218        srl   t2,t2,1 ; \
219        li    t3, ~((M_WID_SWAPBITS | (M_WID_SWAPBITS << 1))) ; \
220        and   wid,wid,t3 ; \
221        or    wid,wid,t1 ; \
222        or    wid,wid,t2
223 #else
224 #define WID_UNCONVOLUTE(wid) \
225      (((wid) & ~((M_WID_SWAPBITS | (M_WID_SWAPBITS << 1)))) | \
226       (((wid) & M_WID_SWAPBITS) << 1) |  \
227       (((wid) & (M_WID_SWAPBITS<<1)) >> 1))
228 #endif
229 
230 
231 
232 #endif
233