source: svn/trunk/newcon3bcm2_21bu/magnum/portinginterface/xpt/7552/bxpt_sam.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 12.7 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2011, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bxpt_sam.c $
11 * $brcm_Revision: Hydra_Software_Devel/3 $
12 * $brcm_Date: 12/15/11 2:32p $
13 *
14 * Porting interface code for the data transport core.
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/portinginterface/xpt/base2/bxpt_sam.c $
19 *
20 * Hydra_Software_Devel/3   12/15/11 2:32p gmullen
21 * SW7425-1952: Merged changes to mainline
22 *
23 * Hydra_Software_Devel/SW7425-1952/1   12/14/11 4:14p gmullen
24 * SW7425-1952: Updated SAM API to use buffer index rather than PID
25 * channel number
26 *
27 * Hydra_Software_Devel/2   10/28/10 2:08p gmullen
28 * SW7422-20: Checkin ported files
29 *
30 * Hydra_Software_Devel/2   3/31/06 4:21p gmullen
31 * PR 18998: Finished implementation.
32 *
33 * Hydra_Software_Devel/1   7/28/05 3:40p gmullen
34 * PR15309: Initial version for building.
35 *
36 *
37 ***************************************************************************/
38
39#include "bstd.h"
40#include "bxpt_priv.h"
41#include "bxpt_sam.h"
42#include "bchp_xpt_msg.h"
43
44#if( BDBG_DEBUG_BUILD == 1 )
45BDBG_MODULE( xpt_sam );
46#endif
47
48static void SetSam40BitAddr(
49        BXPT_Handle hXpt,
50        const BXPT_SAM_40BitAddr *Addr,
51        uint32_t RegHiAddr,
52        uint32_t RegLoAddr
53        );
54
55static void GetSam40BitAddr(
56        BXPT_Handle hXpt,
57        BXPT_SAM_40BitAddr *Addr,
58        uint32_t RegHiAddr,
59        uint32_t RegLoAddr
60        );
61
62
63BERR_Code BXPT_SAM_GetM16Addresss(
64        BXPT_Handle hXpt,
65        unsigned int MessageBufferNum,
66        BXPT_SAM_M16Addresses *Addresses
67        )
68{
69        BERR_Code ExitCode = BERR_SUCCESS;
70                                                                                                                                   
71        BDBG_ASSERT( hXpt );
72        BDBG_ASSERT( Addresses );
73
74        /* Sanity check on the arguments. */
75        if( MessageBufferNum > BXPT_NUM_MESG_BUFFERS )
76        {
77                /* Bad PID channel number. Complain. */
78                BDBG_ERR(( "Message buffer %lu is out of range for SAM filtering!", ( unsigned long ) MessageBufferNum ));
79                ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
80        }
81        else
82        {
83                uint32_t Reg;
84
85                /* Set the PID channels enable bit. */
86                uint32_t RegAddr = BCHP_XPT_MSG_MCAST_16_ADDR_i_ARRAY_BASE + ( 16 * MessageBufferNum );
87       
88                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
89                Addresses->Address0[ 0 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
90                Addresses->Address0[ 1 ] = ( uint8_t )(( Reg ) & 0xFF );
91       
92                Reg = BREG_Read32( hXpt->hRegister, RegAddr + 4 );
93                Addresses->Address1[ 0 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
94                Addresses->Address1[ 1 ] = ( uint8_t )(( Reg ) & 0xFF );
95       
96                Reg = BREG_Read32( hXpt->hRegister, RegAddr + 8 );
97                Addresses->Address2[ 0 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
98                Addresses->Address2[ 1 ] = ( uint8_t )(( Reg ) & 0xFF );
99       
100                Reg = BREG_Read32( hXpt->hRegister, RegAddr + 12 );
101                Addresses->Address3[ 0 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
102                Addresses->Address3[ 1 ] = ( uint8_t )(( Reg ) & 0xFF );
103        }
104
105        return( ExitCode );
106}
107 
108 
109BERR_Code BXPT_SAM_SetM16Addresss(
110        BXPT_Handle hXpt,
111        unsigned int MessageBufferNum,
112        const BXPT_SAM_M16Addresses *Addresses
113        )
114{
115        BERR_Code ExitCode = BERR_SUCCESS;
116                                                                                                                                   
117        BDBG_ASSERT( hXpt );
118        BDBG_ASSERT( Addresses );
119
120        /* Sanity check on the arguments. */
121        if( MessageBufferNum > BXPT_NUM_MESG_BUFFERS )
122        {
123                /* Bad PID channel number. Complain. */
124                BDBG_ERR(( "Message buffer %lu is out of range for SAM filtering!", ( unsigned long ) MessageBufferNum ));
125                ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
126        }
127        else
128        {
129                uint32_t Reg;
130
131                /* Set the PID channels enable bit. */
132                uint32_t RegAddr = BCHP_XPT_MSG_MCAST_16_ADDR_i_ARRAY_BASE + ( 16 * MessageBufferNum );
133
134                Reg = ( Addresses->Address0[ 0 ] << 8 | Addresses->Address0[ 1 ] );
135                BREG_Write32( hXpt->hRegister, RegAddr, Reg );
136
137                Reg = ( Addresses->Address1[ 0 ] << 8 | Addresses->Address1[ 1 ] );
138                BREG_Write32( hXpt->hRegister, RegAddr + 4, Reg );
139
140                Reg = ( Addresses->Address2[ 0 ] << 8 | Addresses->Address2[ 1 ] );
141                BREG_Write32( hXpt->hRegister, RegAddr + 8, Reg );
142
143                Reg = ( Addresses->Address3[ 0 ] << 8 | Addresses->Address3[ 1 ] );
144                BREG_Write32( hXpt->hRegister, RegAddr + 12, Reg );
145        }
146
147        return( ExitCode );
148}
149
150
151BERR_Code BXPT_SAM_GetAddresses(
152        BXPT_Handle hXpt,
153        BXPT_SAMAddresses *Addresses
154        )
155{
156        uint32_t Reg;
157
158        BERR_Code ExitCode = BERR_SUCCESS;
159
160        BDBG_ASSERT( hXpt );
161        BDBG_ASSERT( Addresses );
162
163        /* Physical (or singlecast) address. */
164        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_PHY_ADDR_HI );
165        Addresses->PhysicalAddr[ 0 ] = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_PHY_ADDR_HI, PHY_ADDR_HI );
166
167        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_PHY_ADDR_LO );
168        Addresses->PhysicalAddr[ 1 ] = ( uint8_t )(( Reg >> 24 ) & 0xFF );
169        Addresses->PhysicalAddr[ 2 ] = ( uint8_t )(( Reg >> 16 ) & 0xFF );
170        Addresses->PhysicalAddr[ 3 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
171        Addresses->PhysicalAddr[ 4 ] = ( uint8_t )(( Reg ) & 0xFF );
172
173        /* Type 0 network address */
174        GetSam40BitAddr( hXpt, &Addresses->Type0NetworkAddr, BCHP_XPT_MSG_NET_ADDR0_HI, BCHP_XPT_MSG_NET_ADDR0_LO );
175
176        /* Type 1 network address */
177        GetSam40BitAddr( hXpt, &Addresses->Type1NetworkAddr, BCHP_XPT_MSG_NET_ADDR1_HI, BCHP_XPT_MSG_NET_ADDR1_LO );
178
179        /* Type 0 multicast-40 address */
180        GetSam40BitAddr( hXpt, &Addresses->Type0M40Addr, BCHP_XPT_MSG_M40_ADDR0_HI, BCHP_XPT_MSG_M40_ADDR0_LO );
181
182        /* Type 1 multicast-40 address */
183        GetSam40BitAddr( hXpt, &Addresses->Type1M40Addr, BCHP_XPT_MSG_M40_ADDR1_HI, BCHP_XPT_MSG_M40_ADDR1_LO );
184
185        /* Multicast 24 address. */
186        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_M24_ADDR );
187        Addresses->M24Addr[ 0 ] = ( uint8_t )(( Reg >> 16 ) & 0xFF );
188        Addresses->M24Addr[ 1 ] = ( uint8_t )(( Reg >> 8 ) & 0xFF );
189        Addresses->M24Addr[ 2 ] = ( uint8_t )(( Reg ) & 0xFF );
190
191        /* Table ID rejection upper and lower limits */
192        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_ID_REJECT );
193        Addresses->IdRejectHiLimit = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_ID_REJECT, PF_ID_REJECT_HI );
194        Addresses->IdRejectLowLimit = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_ID_REJECT, PF_ID_REJECT_LO );
195
196        return( ExitCode );
197}
198
199
200BERR_Code BXPT_SAM_SetAddresses(
201        BXPT_Handle hXpt,
202        const BXPT_SAMAddresses *Addresses
203        )
204{
205        uint32_t Reg;
206
207        BERR_Code ExitCode = BERR_SUCCESS;
208
209        BDBG_ASSERT( hXpt );
210        BDBG_ASSERT( Addresses );
211
212        /* Physical (or singlecast) address. */
213        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_PHY_ADDR_HI );
214        Reg &= ~( BCHP_MASK( XPT_MSG_PHY_ADDR_HI, PHY_ADDR_HI ) );
215        Reg |= ( BCHP_FIELD_DATA( XPT_MSG_PHY_ADDR_HI, PHY_ADDR_HI, Addresses->PhysicalAddr[ 0 ] ) );
216        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_PHY_ADDR_HI, Reg );
217
218        Reg = ( Addresses->PhysicalAddr[ 1 ] << 24 ) | ( Addresses->PhysicalAddr[ 2 ] << 16 ) 
219                | ( Addresses->PhysicalAddr[ 3 ] << 8 ) | ( Addresses->PhysicalAddr[ 4 ] );
220        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_PHY_ADDR_LO, Reg );
221
222        /* Type 0 network address */
223        SetSam40BitAddr( hXpt, &Addresses->Type0NetworkAddr, BCHP_XPT_MSG_NET_ADDR0_HI, BCHP_XPT_MSG_NET_ADDR0_LO );
224
225        /* Type 1 network address */
226        SetSam40BitAddr( hXpt, &Addresses->Type1NetworkAddr, BCHP_XPT_MSG_NET_ADDR1_HI, BCHP_XPT_MSG_NET_ADDR1_LO );
227
228        /* Type 0 multicast 40 address */
229        SetSam40BitAddr( hXpt, &Addresses->Type0M40Addr, BCHP_XPT_MSG_M40_ADDR0_HI, BCHP_XPT_MSG_M40_ADDR0_LO );
230
231        /* Type 1 multicast 40 address */
232        SetSam40BitAddr( hXpt, &Addresses->Type1M40Addr, BCHP_XPT_MSG_M40_ADDR1_HI, BCHP_XPT_MSG_M40_ADDR1_LO );
233
234        /* Multicast 24 address. */
235        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_M24_ADDR );
236        Reg &= ~( BCHP_MASK( XPT_MSG_M24_ADDR, M24_ADDR ) );
237        Reg |= ( Addresses->M24Addr[ 0 ] << 16 ) | ( Addresses->M24Addr[ 1 ] << 8 ) | Addresses->M24Addr[ 2 ];
238        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_M24_ADDR, Reg );
239
240        /* Table ID rejection upper and lower limits */
241        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_ID_REJECT );
242        Reg &= ~( 
243                BCHP_MASK( XPT_MSG_ID_REJECT, PF_ID_REJECT_HI ) |
244                BCHP_MASK( XPT_MSG_ID_REJECT, PF_ID_REJECT_LO ) 
245        );
246        Reg |= ( 
247                BCHP_FIELD_DATA( XPT_MSG_ID_REJECT, PF_ID_REJECT_HI, Addresses->IdRejectHiLimit ) |
248                BCHP_FIELD_DATA( XPT_MSG_ID_REJECT, PF_ID_REJECT_LO, Addresses->IdRejectLowLimit ) 
249        );
250        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_ID_REJECT, Reg );
251
252        return( ExitCode );
253}
254
255
256void GetSam40BitAddr(
257        BXPT_Handle hXpt,
258        BXPT_SAM_40BitAddr *Addr,
259        uint32_t RegHiAddr,
260        uint32_t RegLoAddr
261        )
262{
263        uint32_t Reg;
264
265        /*
266        ** Some SAM filters use the same register layout, so we save code space by using a common
267        ** routine to store the new settings. Those filters are Type0/1 Network address, and
268        ** Type0/1 Multicast 40 addresses.
269        */
270        Reg = BREG_Read32( hXpt->hRegister, RegHiAddr );
271        Addr->Address[ 0 ] = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_NET_ADDR0_HI, NET_ADDR_HI );
272        Addr->WildCardByteMode = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_MODE ) ? true : false ;
273        Addr->WildCardEnable = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_ENABLE ) ? true : false ;
274        Addr->AddressWildcard = BCHP_GET_FIELD_DATA( Reg, XPT_MSG_NET_ADDR0_HI, NET_ADDR_WILDCARD );
275
276        Reg = BREG_Read32( hXpt->hRegister, RegLoAddr );
277        Addr->Address[ 1 ] = ( uint8_t )(( Reg >> 24 ) & 0xFF );
278        Addr->Address[ 2 ]= ( uint8_t )(( Reg >> 16 ) & 0xFF );
279        Addr->Address[ 3 ]= ( uint8_t )(( Reg >> 8 ) & 0xFF );
280        Addr->Address[ 4 ]= ( uint8_t )(( Reg ) & 0xFF );
281}
282
283
284void SetSam40BitAddr(
285        BXPT_Handle hXpt,
286        const BXPT_SAM_40BitAddr *Addr,
287        uint32_t RegHiAddr,
288        uint32_t RegLoAddr
289        )
290{
291        uint32_t Reg;
292
293        /*
294        ** Some SAM filters use the same register layout, so we save code space by using a common
295        ** routine to store the new settings. Those filters are Type0/1 Network address, and
296        ** Type0/1 Multicast 40 addresses.
297        */
298        Reg = BREG_Read32( hXpt->hRegister, RegHiAddr );
299        Reg &= ~(
300                BCHP_MASK( XPT_MSG_NET_ADDR0_HI, NET_ADDR_HI ) | 
301                BCHP_MASK( XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_MODE ) | 
302                BCHP_MASK( XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_ENABLE ) | 
303                BCHP_MASK( XPT_MSG_NET_ADDR0_HI, NET_ADDR_WILDCARD ) 
304        );
305        Reg |= (
306                BCHP_FIELD_DATA( XPT_MSG_NET_ADDR0_HI, NET_ADDR_HI, Addr->Address[ 0 ] ) |
307                BCHP_FIELD_DATA( XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_MODE, Addr->WildCardByteMode == true ? 1 : 0 ) |
308                BCHP_FIELD_DATA( XPT_MSG_NET_ADDR0_HI, NET_WILDCARD_ENABLE, Addr->WildCardEnable == true ? 1 : 0 ) |
309                BCHP_FIELD_DATA( XPT_MSG_NET_ADDR0_HI, NET_ADDR_WILDCARD, Addr->AddressWildcard ) 
310        );
311        BREG_Write32( hXpt->hRegister, RegHiAddr, Reg );
312
313        Reg = ( Addr->Address[ 1 ] << 24 ) | ( Addr->Address[ 2 ] << 16 )
314                | (     Addr->Address[ 3 ] << 8 ) | Addr->Address[ 4 ];
315        BREG_Write32( hXpt->hRegister, RegLoAddr, Reg );
316}
317
318
319BERR_Code BXPT_SAM_DoFiltering(
320        BXPT_Handle hXpt,
321        unsigned int MessageBufferNum,
322        BXPT_SAM_Enables *Enables
323        )
324{
325        uint32_t RegAddr, Reg;
326
327        uint32_t SpecialType = 0;
328        BERR_Code ExitCode = BERR_SUCCESS;
329
330        BDBG_ASSERT( hXpt );
331        BDBG_ASSERT( Enables );
332
333        /* Sanity check on the arguments. */
334        if( MessageBufferNum > BXPT_NUM_MESG_BUFFERS )
335        {
336                /* Bad PID channel number. Complain. */
337                BDBG_ERR(( "Message buffer %lu is out of range for SAM filtering!", ( unsigned long ) MessageBufferNum ));
338                ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
339        }
340        else
341        {
342        /* Set the SAM general enable if ANY of the above SAM filters is enabled. */
343        if( Enables->PhysicalEn == true || Enables->NetworkEn == true || Enables->M40En == true ||
344        Enables->M24En == true || Enables->M16En == true || Enables->IdRejectEn == true )
345                SpecialType = 1; 
346
347        RegAddr = BCHP_XPT_MSG_BUF_CTRL2_TABLE_i_ARRAY_BASE + ( MessageBufferNum * PID_CTRL2_TABLE_STEP );
348        Reg = BREG_Read32( hXpt->hRegister, RegAddr );
349        Reg &= ~(
350                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, PHY_EN ) |
351                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, NET_EN ) |
352                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, M40_EN ) |
353                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, M24_EN ) |
354                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, M16_EN ) |
355                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, ID_REJECT_EN ) |
356                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_NOT ) |
357                BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_TYPE ) 
358        );
359        Reg |= (
360                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, PHY_EN, Enables->PhysicalEn == true ? 1 : 0 ) |
361                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, NET_EN, Enables->NetworkEn == true ? 1 : 0 ) |
362                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, M40_EN, Enables->M40En == true ? 1 : 0 ) |
363                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, M24_EN, Enables->M24En == true ? 1 : 0 ) |
364                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, M16_EN, Enables->M16En == true ? 1 : 0 ) |
365                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, ID_REJECT_EN, Enables->IdRejectEn == true ? 1 : 0 ) |
366                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_NOT, Enables->SamNotEn == true ? 1 : 0 ) |
367                BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_TYPE, SpecialType ) 
368        );
369        BREG_Write32( hXpt->hRegister, RegAddr, Reg );
370    }
371        return( ExitCode );
372}
373
374
Note: See TracBrowser for help on using the repository browser.