source: svn/branches/kctv/newcon3bcm2_21bu/magnum/basemodules/reg/breg_mem_pal.c

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

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 14.6 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2010, 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: breg_mem_pal.c $
11 * $brcm_Revision: Hydra_Software_Devel/1 $
12 * $brcm_Date: 1/20/10 11:14a $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/basemodules/reg/breg_mem_pal.c $
19 *
20 * Hydra_Software_Devel/1   1/20/10 11:14a kaiz
21 * SW35230-56: adding linuxpal support for Palladium emulation environment
22 *
23 * Hydra_Software_Devel/SW35230-56/1   1/18/10 6:29p kaiz
24 * SW35230-56: adding linuxpal support for Palladium emulation environment
25 *
26 * Hydra_Software_Devel/33   12/22/09 1:22p nickh
27 * SW7420-70: Add more registers for atomic access
28 *
29 * Hydra_Software_Devel/33   12/22/09 1:21p nickh
30 * SW7420-70: Add more registers for atomic access
31 *
32 * Hydra_Software_Devel/32   10/27/09 9:35a jrubio
33 * SW7342-11: add support for 7342/7340 Atomic Registers
34 *
35 * Hydra_Software_Devel/31   8/27/09 8:09p mward
36 * SW7125-4: Specify atomic access registers for 7125.
37 *
38 * Hydra_Software_Devel/30   8/16/09 6:30p nickh
39 * PR47760: Use atomic access for 7420 Power management registers
40 *
41 * Hydra_Software_Devel/29   7/30/09 5:49p jrubio
42 * PR57226: add AVD into the register list for 7325
43 *
44 * Hydra_Software_Devel/28   7/30/09 2:48p jrubio
45 * PR56659: remove VCXO from 7325
46 *
47 * Hydra_Software_Devel/27   7/30/09 12:17a pntruong
48 * PR55856: Fixed 7325 build errors.
49 *
50 * Hydra_Software_Devel/26   7/29/09 2:38p jrubio
51 * PR56659: CLCK_MISC is not protected
52 *
53 * Hydra_Software_Devel/25   7/9/09 5:51p jrubio
54 * PR56659: include the necessary Registers for 7335 for AtomicUpdate
55 *
56 * Hydra_Software_Devel/24   7/8/09 4:50p jrubio
57 * PR55856: fix 7325 includes
58 *
59 * Hydra_Software_Devel/23   7/6/09 11:42a jrubio
60 * PR55856: add PM Register for 7335/7325
61 *
62 * Hydra_Software_Devel/22   7/1/09 5:18p katrep
63 * PR56528: atomic access should be used for CLK_PM_CTRL and
64 * SCXO_CTL_MISC_AVD registers
65 *
66 * Hydra_Software_Devel/21   6/9/09 1:53p mward
67 * PR55856 :  Add BCHP_CLK_PM_CTRL registers to atomic reg access list.
68 *
69 * Hydra_Software_Devel/20   2/9/09 4:54p erickson
70 * PR51629: add 7336 register
71 *
72 * Hydra_Software_Devel/19   2/4/09 5:22p tdo
73 * PR51627: Add support for 7336 and 7420
74 *
75 * Hydra_Software_Devel/18   11/3/08 10:21a erickson
76 * PR48615: add BCHP_VCXO_CTL_MISC_AVD_CTRL to AtomicUpdate list, remove
77 * USB
78 *
79 * Hydra_Software_Devel/17   9/26/08 11:56a erickson
80 * PR45703: fix warning
81 *
82 * Hydra_Software_Devel/16   9/24/08 7:32p vsilyaev
83 * PR 46950: Use unified declaration of BREG handle for debug and release
84 * builds
85 *
86 * Hydra_Software_Devel/15   9/23/08 3:43p erickson
87 * PR46950: added BREG_SetAtomicUpdate32Callback
88 *
89 * Hydra_Software_Devel/14   7/30/08 4:05p vishk
90 * PR45177: uintptr_t is now defined in linux 2.6.18-5.1 header files
91 *
92 * Hydra_Software_Devel/13   6/30/08 3:28p vsilyaev
93 * PR 43119: Using atomic update functions for the 7325 platform
94 *
95 * Hydra_Software_Devel/12   6/12/08 1:00p vsilyaev
96 * PR 43119: Added AVD registers for the 3548/3556 build
97 *
98 * Hydra_Software_Devel/11   6/7/08 8:22a pntruong
99 * PR43119: Fixed build errors.
100 *
101 * Hydra_Software_Devel/10   6/5/08 5:28p vsilyaev
102 * PR43119: PR 43119: Added API for atomic register access
103 *
104 * Hydra_Software_Devel/PR43119/1   5/29/08 12:14p vsilyaev
105 * PR 43119: Added API for atomic register access
106 *
107 * Hydra_Software_Devel/9   9/14/06 2:44p jgarrett
108 * PR 23982: Removing warning in release mode
109 *
110 * Hydra_Software_Devel/8   7/21/06 11:27a vsilyaev
111 * PR 22695: Changes to make BREG_MEM compatible between debug and release
112 * builds
113 *
114 * Hydra_Software_Devel/7   9/19/03 8:55a marcusk
115 * Added volatile to typecasts to ensure compiler does not optimize
116 * register reads and writes.
117 *
118 * Hydra_Software_Devel/6   9/15/03 6:08p marcusk
119 * Updated to use void * as register base address.
120 *
121 * Hydra_Software_Devel/5   5/30/03 12:03p marcusk
122 * Changed CreateRegHandle/DestroyRegHandle to Open/Close to be more
123 * consistant.
124 *
125 * Hydra_Software_Devel/4   3/10/03 6:37p vsilyaev
126 * Integrated with bstd.h .
127 *
128 * Hydra_Software_Devel/3   3/7/03 9:24a marcusk
129 * Minor cleanup.
130 *
131 * Hydra_Software_Devel/2   3/5/03 4:19p marcusk
132 * Fixed minor issues (got it to compile).
133 *
134 * Hydra_Software_Devel/1   3/5/03 3:33p marcusk
135 * Initial version.
136 *
137 ***************************************************************************/
138#include "bstd.h"
139#include "bkni.h"
140#include "breg_mem.h"
141
142BDBG_MODULE(breg_mem);
143
144
145void BREG_Open( BREG_Handle *pRegHandle, void *Address, size_t MaxRegOffset )
146{
147    *pRegHandle = (BREG_Handle)BKNI_Malloc( sizeof(BREG_Impl) );
148    BDBG_ASSERT(*pRegHandle != NULL );
149
150#if BDBG_DEBUG_BUILD
151    (*pRegHandle)->MaxRegOffset = MaxRegOffset;
152#else
153    BSTD_UNUSED(MaxRegOffset);
154#endif
155    (*pRegHandle)->BaseAddr = (uint32_t)((uintptr_t)Address);
156
157    /* set default callback */
158    BREG_SetAtomicUpdate32Callback( *pRegHandle, NULL, NULL );
159
160}
161
162void BREG_Close( BREG_Handle RegHandle )
163{
164    BDBG_ASSERT(RegHandle != NULL );
165    BKNI_Free(RegHandle);
166}
167
168/* compile the register access functions even for the release build */
169#undef  BREG_Write32
170#undef  BREG_Write16
171#undef  BREG_Write8
172
173#undef  BREG_Read32
174#undef  BREG_Read16
175#undef  BREG_Read8
176
177#if BDBG_DEBUG_BUILD
178#include "bchp_sun_top_ctrl.h"
179
180#define BREG_P_ATOMIC_REG(reg) case reg: name=#reg;regAtomic=true;break
181static void BREG_P_CheckAtomicRegister(uint32_t reg, const char *function, bool atomic )
182{
183    const char *name;
184    bool regAtomic;
185    switch(reg) {
186    BREG_P_ATOMIC_REG(BCHP_SUN_TOP_CTRL_SW_RESET);
187#if (BCHP_CHIP==7405)
188#include "bchp_decode_sd_0.h"
189#include "bchp_decode_ip_shim_0.h"
190#include "bchp_clk.h"
191#include "bchp_vcxo_ctl_misc.h"
192    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
193    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
194    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
195    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL);
196    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_1);
197    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_2);
198    BREG_P_ATOMIC_REG(BCHP_VCXO_CTL_MISC_AVD_CTRL);
199#elif (BCHP_CHIP==7400)
200#include "bchp_clk.h"
201    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL);
202    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_1);
203    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_2);
204#elif (BCHP_CHIP==3556 || BCHP_CHIP==3548)
205#include "bchp_decode_sd_0.h"
206    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
207    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
208#include "bchp_clkgen.h"
209    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_0);
210    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_1);
211    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_2);
212    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_3);
213#include "bchp_vcxo_ctl_misc.h"
214    BREG_P_ATOMIC_REG(BCHP_VCXO_CTL_MISC_AVD_CTRL);
215#elif ( BCHP_CHIP==7335 )
216#include "bchp_clk.h"
217#include "bchp_decode_sd_0.h"
218#include "bchp_decode_ip_shim_0.h"
219#include "bchp_vcxo_ctl_misc.h"
220    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
221    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
222    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL);
223    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_1);
224    BREG_P_ATOMIC_REG(BCHP_CLK_PM_CTRL_2);
225    BREG_P_ATOMIC_REG(BCHP_VCXO_CTL_MISC_AVD_CTRL);
226#elif    (BCHP_CHIP==7325 )
227#include "bchp_clkgen.h"
228#include "bchp_decode_sd_0.h"
229#include "bchp_decode_ip_shim_0.h"
230    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
231    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
232    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_0);
233    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_1);
234    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_2);
235    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_3);
236    BREG_P_ATOMIC_REG(BCHP_CLKGEN_AVD_CTRL);
237#elif    (BCHP_CHIP==7340 )
238#include "bchp_clkgen.h"
239#include "bchp_decode_sd_0.h"
240    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
241    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
242    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_0);
243    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_216_108_0);
244    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_216_108_1);
245    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_MISC_CLOCKS);
246#elif    (BCHP_CHIP==7342 )
247#include "bchp_clk.h"
248#include "bchp_decode_sd_0.h"
249    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
250    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
251#elif    (BCHP_CHIP==7125 )
252#include "bchp_clkgen.h"
253#include "bchp_decode_sd_0.h"
254#include "bchp_decode_ip_shim_0.h"
255        BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
256    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
257    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
258    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_0);
259    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_1);
260    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_2);
261#elif (BCHP_CHIP==7420)
262#include "bchp_decode_sd_0.h"
263#include "bchp_decode_sd_1.h"
264#include "bchp_clk.h"
265    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
266    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
267    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_1_REG_SD_PFRI_DATA_WIDTH);
268    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_1_REG_SD_STRIPE_WIDTH);
269    BREG_P_ATOMIC_REG(BCHP_CLK_DVP_HT_CLK_PM_CTRL);
270    BREG_P_ATOMIC_REG(BCHP_CLK_UHFR_CLK_PM_CTRL);
271    BREG_P_ATOMIC_REG(BCHP_CLK_SUN_DAA_CLK_PM_CTRL);
272    BREG_P_ATOMIC_REG(BCHP_CLK_SUN_SM_CLK_PM_CTRL);
273    BREG_P_ATOMIC_REG(BCHP_CLK_RFM_CLK_PM_CTRL);
274    BREG_P_ATOMIC_REG(BCHP_CLK_TDAC_CLK_PM_CTRL);
275    BREG_P_ATOMIC_REG(BCHP_CLK_QDAC_CLK_PM_CTRL);
276    BREG_P_ATOMIC_REG(BCHP_CLK_RPT_AIO_CLK_PM_CTRL);
277    BREG_P_ATOMIC_REG(BCHP_CLK_VEC_656_CLK_PM_CTRL);
278    BREG_P_ATOMIC_REG(BCHP_CLK_VEC_CLK_PM_CTRL);
279    BREG_P_ATOMIC_REG(BCHP_CLK_GFX_2D_PM_CTRL);
280    BREG_P_ATOMIC_REG(BCHP_CLK_GFX_3D_PM_CTRL);
281    BREG_P_ATOMIC_REG(BCHP_CLK_BVN_EDGE_PM_CTRL);
282    BREG_P_ATOMIC_REG(BCHP_CLK_BVN_MCVP_PM_CTRL);
283    BREG_P_ATOMIC_REG(BCHP_CLK_BVN_MIDDLE_PM_CTRL);
284    BREG_P_ATOMIC_REG(BCHP_CLK_AVD0_CLK_PM_CTRL);
285    BREG_P_ATOMIC_REG(BCHP_CLK_AVD1_CLK_PM_CTRL);
286    BREG_P_ATOMIC_REG(BCHP_CLK_XPT_CLK_PM_CTRL);
287    BREG_P_ATOMIC_REG(BCHP_CLK_SECTOP_DMA_PM_CTRL);
288    BREG_P_ATOMIC_REG(BCHP_CLK_TOP1394_CLK_PM_CTRL);
289    BREG_P_ATOMIC_REG(BCHP_CLK_MISC);
290#endif
291    default:
292        name = "";
293        regAtomic = false;
294        break;
295    }
296    if(regAtomic!=atomic) {
297        if(!atomic) {
298            BDBG_ERR(("%s: register %s(%#lx) should only be used with atomic access", function, name, (unsigned long)reg));
299        } else {
300        BDBG_ERR(("%s: register %#lx shouldn't be used for atomic access", function, (unsigned long)reg));
301        }
302    }
303}
304#else
305#define BREG_P_CheckAtomicRegister(reg, function, atomic)
306#endif
307
308uint32_t BREG_Read32(BREG_Handle RegHandle, uint32_t reg)
309{
310    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
311
312    return *((volatile uint32_t *)((uintptr_t)(RegHandle->BaseAddr)+reg));
313}
314
315uint16_t BREG_Read16(BREG_Handle RegHandle, uint32_t reg)
316{
317    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
318
319    return *((volatile uint16_t *)((uintptr_t)(RegHandle->BaseAddr)+reg));
320}
321
322uint8_t BREG_Read8(BREG_Handle RegHandle, uint32_t reg)
323{
324    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
325
326    return *((volatile uint8_t *)((uintptr_t)(RegHandle->BaseAddr)+reg));
327}
328
329void BREG_Write32(BREG_Handle RegHandle, uint32_t reg, uint32_t data)
330{
331    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
332    BREG_P_CheckAtomicRegister(reg, "BREG_Write32", false);
333    *((volatile uint32_t *)((uintptr_t)(RegHandle->BaseAddr)+reg)) = data;
334}
335
336void BREG_Write16(BREG_Handle RegHandle, uint32_t reg, uint16_t data)
337{
338    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
339    BREG_P_CheckAtomicRegister(reg, "BREG_Write16", false);
340
341    *((volatile uint16_t *)((uintptr_t)(RegHandle->BaseAddr)+reg)) = data;
342}
343
344void BREG_Write8(BREG_Handle RegHandle, uint32_t reg, uint8_t data)
345{
346    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
347    BREG_P_CheckAtomicRegister(reg, "BREG_Write8", false);
348
349    *((volatile uint8_t *)((uintptr_t)(RegHandle->BaseAddr)+reg)) = data;
350}
351
352
353static void BREG_P_AtomicUpdate32_Impl_isr(void *context, uint32_t addr, uint32_t mask, uint32_t value)
354{
355    uint32_t temp;
356    addr = ((BREG_Handle)context)->BaseAddr + addr;
357    temp = *(volatile uint32_t *)((uintptr_t)addr);
358    temp = (temp&~mask)|value;
359    *(volatile uint32_t *)((uintptr_t)addr) = temp;
360    return;
361}
362
363void BREG_AtomicUpdate32_isr(BREG_Handle RegHandle, uint32_t reg, uint32_t mask, uint32_t value)
364{
365    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
366    BREG_P_CheckAtomicRegister(reg, "BREG_AtomicUpdate32_isr", true);
367    (*RegHandle->atomicUpdate32.callback_isr)(RegHandle->atomicUpdate32.callbackContext, reg, mask, value);
368}
369
370
371void BREG_AtomicUpdate32(BREG_Handle RegHandle, uint32_t reg, uint32_t mask, uint32_t value )
372{
373    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
374    BREG_P_CheckAtomicRegister(reg, "BREG_AtomicUpdate32", true);
375    BKNI_EnterCriticalSection();
376    (*RegHandle->atomicUpdate32.callback_isr)(RegHandle->atomicUpdate32.callbackContext, reg, mask, value);
377    BKNI_LeaveCriticalSection();
378}
379
380static uint32_t BREG_P_CompareAndSwap32_Impl_isr(uint32_t addr, uint32_t oldValue, uint32_t newValue)
381{
382    uint32_t result = *(volatile uint32_t *)((uintptr_t)addr);
383    if(result == oldValue) {
384        *(volatile uint32_t *)((uintptr_t)addr) = newValue;
385    }
386    return result;
387}
388
389uint32_t BREG_CompareAndSwap32(BREG_Handle RegHandle, uint32_t reg, uint32_t oldValue, uint32_t newValue )
390{
391    uint32_t result;
392    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
393    BREG_P_CheckAtomicRegister(reg, "BREG_CompareAndSwap32", true);
394    BKNI_EnterCriticalSection();
395    result = BREG_P_CompareAndSwap32_Impl_isr(RegHandle->BaseAddr+reg, oldValue, newValue);
396    BKNI_LeaveCriticalSection();
397    return result;
398}
399
400uint32_t BREG_CompareAndSwap32_isr(BREG_Handle RegHandle, uint32_t reg, uint32_t oldValue, uint32_t newValue )
401{
402    uint32_t result;
403    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
404    BREG_P_CheckAtomicRegister(reg, "BREG_CompareAndSwap32_isr", true);
405    result = BREG_P_CompareAndSwap32_Impl_isr(RegHandle->BaseAddr+reg, oldValue, newValue);
406    return result;
407}
408
409void BREG_SetAtomicUpdate32Callback( BREG_Handle RegHandle, BREG_AtomicUpdate32Callback callback_isr, void *callbackContext )
410{
411    BKNI_EnterCriticalSection();
412    if (callback_isr) {
413        RegHandle->atomicUpdate32.callback_isr = callback_isr;
414        RegHandle->atomicUpdate32.callbackContext = callbackContext;
415    }
416    else {
417        /* restore default */
418        RegHandle->atomicUpdate32.callback_isr = BREG_P_AtomicUpdate32_Impl_isr;
419        RegHandle->atomicUpdate32.callbackContext = RegHandle;
420    }
421    BKNI_LeaveCriticalSection();
422}
423
424/* End of File */
425
426
427
Note: See TracBrowser for help on using the repository browser.