source: svn/newcon3bcm2_21bu/magnum/basemodules/reg/breg_client.c @ 43

Last change on this file since 43 was 43, checked in by megakiss, 11 years ago

광주방송 OTC 주파수 369Mhz로 변경

  • Property svn:executable set to *
File size: 6.9 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_client.c $
11 * $brcm_Revision: Hydra_Software_Devel/5 $
12 * $brcm_Date: 9/2/10 5:49p $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/basemodules/reg/breg_client.c $
19 *
20 * Hydra_Software_Devel/5   9/2/10 5:49p hongtaoz
21 * SW7425-10: SUN_TOP_CTRL_SW_RESET register is renamed;
22 *
23 * Hydra_Software_Devel/4   6/5/09 2:49p jessem
24 * PR 54881: Modified BREG_SetAtomicUpdate32Callback to handle null
25 * contexts.
26 *
27 * Hydra_Software_Devel/3   4/28/09 3:05p jessem
28 * PR 54380: Changed all IKOS references to EMU instead.
29 *
30 * Hydra_Software_Devel/2   11/26/08 11:47a jessem
31 * PR 49655: Added register atomic update support.
32 *
33 * Hydra_Software_Devel/1   10/22/07 4:38p jessem
34 * PR 36129: Supercedes breg_sims.c for use with IKOS emulation platform.
35 *
36 ***************************************************************************/
37#include "bstd.h"
38
39#include "bkni.h"
40
41#include "breg_mem.h"
42//#include "client.h"
43
44BDBG_MODULE(BREG_CLIENT);
45
46
47void BREG_Open( BREG_Handle *pRegHandle, void *Address, size_t MaxRegOffset )
48{
49        *pRegHandle = (BREG_Handle)BKNI_Malloc( sizeof(BREG_Impl) );
50        BDBG_ASSERT(*pRegHandle != NULL );
51
52#if BDBG_DEBUG_BUILD
53        (*pRegHandle)->MaxRegOffset = MaxRegOffset;
54#else
55        BSTD_UNUSED(MaxRegOffset);
56#endif
57        (*pRegHandle)->BaseAddr = (uintptr_t)Address;
58
59    /* set default callback */
60    BREG_SetAtomicUpdate32Callback( *pRegHandle, NULL, NULL );
61
62}
63
64void BREG_Close( BREG_Handle RegHandle )
65{
66        BDBG_ASSERT(RegHandle != NULL );
67        BKNI_Free(RegHandle);
68}
69
70/* compile the register access functions even for the release build */
71#undef  BREG_Write32
72#undef  BREG_Write16
73#undef  BREG_Write8
74
75#undef  BREG_Read32
76#undef  BREG_Read16
77#undef  BREG_Read8
78
79
80uint32_t BREG_Read32(BREG_Handle RegHandle, uint32_t reg)
81{
82        uint32_t data ;
83
84        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
85        BEMU_Client_ReadRegister(reg, &data);
86        return data ;
87}
88
89uint16_t BREG_Read16(BREG_Handle RegHandle, uint32_t reg)
90{
91        uint32_t data ;
92
93        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
94        BEMU_Client_ReadRegister(reg, &data);
95        return (data & 0xffff) ;
96}
97
98uint8_t BREG_Read8(BREG_Handle RegHandle, uint32_t reg)
99{
100        uint32_t data ;
101
102        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
103        BEMU_Client_ReadRegister(reg, &data);
104        return (data & 0xff) ;
105}
106
107void BREG_Write32(BREG_Handle RegHandle, uint32_t reg, uint32_t data)
108{
109        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
110        BEMU_Client_WriteRegister(reg, data) ;
111}
112
113void BREG_Write16(BREG_Handle RegHandle, uint32_t reg, uint16_t data)
114{
115        BSTD_UNUSED(data);
116        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
117        BDBG_ASSERT(0);
118}
119
120void BREG_Write8(BREG_Handle RegHandle, uint32_t reg, uint8_t data)
121{
122        BSTD_UNUSED(data);
123        BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
124        BDBG_ASSERT(0);
125}
126
127
128static void BREG_P_AtomicUpdate32_Impl_isr(void *context, uint32_t addr, uint32_t mask, uint32_t value)
129{
130        uint32_t temp;
131
132#if 0
133    addr = ((BREG_Handle)context)->BaseAddr + addr;
134    temp = *(volatile uint32_t *)addr;
135    temp = (temp&~mask)|value;
136    *(volatile uint32_t *)addr = temp;
137#else
138/*    addr = ((BREG_Handle)context)->BaseAddr + addr;*/
139        temp = BREG_Read32((BREG_Handle)context, addr);
140    temp = (temp&~mask)|value;
141        BREG_Write32((BREG_Handle)context, addr, temp);
142#endif
143    return;
144}
145
146#if BDBG_DEBUG_BUILD
147#include "bchp_sun_top_ctrl.h"
148
149#define BREG_P_ATOMIC_REG(reg) case reg: name=#reg;regAtomic=true;break
150static void BREG_P_CheckAtomicRegister(uint32_t reg, const char *function, bool atomic )
151{
152    const char *name;
153    bool regAtomic;
154    switch(reg) {
155#ifdef BCHP_SUN_TOP_CTRL_SW_RESET               
156    BREG_P_ATOMIC_REG(BCHP_SUN_TOP_CTRL_SW_RESET);
157#else
158    BREG_P_ATOMIC_REG(BCHP_SUN_TOP_CTRL_SW_INIT_0_SET);
159#endif
160#if (BCHP_CHIP==7405)
161#include "bchp_decode_sd_0.h"
162#include "bchp_decode_ip_shim_0.h"
163    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
164    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
165#if BCHP_VER >= BCHP_VER_B0
166    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
167#endif
168#elif (BCHP_CHIP==3556 || BCHP_CHIP==3548)
169#include "bchp_decode_sd_0.h"
170    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
171    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_PFRI_DATA_WIDTH);
172#include "bchp_clkgen.h"
173    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_0);
174    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_1);
175    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_2);
176    BREG_P_ATOMIC_REG(BCHP_CLKGEN_PWRDN_CTRL_3);
177#include "bchp_vcxo_ctl_misc.h"
178    BREG_P_ATOMIC_REG(BCHP_VCXO_CTL_MISC_AVD_CTRL);
179#elif (BCHP_CHIP==7325 || BCHP_CHIP==7335)
180#include "bchp_decode_sd_0.h"
181#include "bchp_decode_ip_shim_0.h"
182    BREG_P_ATOMIC_REG(BCHP_DECODE_SD_0_REG_SD_STRIPE_WIDTH);
183    BREG_P_ATOMIC_REG(BCHP_DECODE_IP_SHIM_0_PFRI_REG);
184#endif
185    default:
186        name = "";
187        regAtomic = false;
188        break;
189    }
190    if(regAtomic!=atomic) {
191        if(!atomic) {
192            BDBG_ERR(("%s: register %s(%#lx) should only be used with atomic access", function, name, (unsigned long)reg));
193        } else {
194        BDBG_ERR(("%s: register %#lx shouldn't be used for atomic access", function, (unsigned long)reg));
195        }
196    }
197}
198#else
199#define BREG_P_CheckAtomicRegister(reg, function, atomic)
200#endif
201
202void BREG_AtomicUpdate32_isr(BREG_Handle RegHandle, uint32_t reg, uint32_t mask, uint32_t value)
203{
204    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
205    BREG_P_CheckAtomicRegister(reg, "BREG_AtomicUpdate32_isr", true);
206    (*RegHandle->atomicUpdate32.callback_isr)(RegHandle->atomicUpdate32.callbackContext, reg, mask, value);
207}
208
209
210void BREG_AtomicUpdate32(BREG_Handle RegHandle, uint32_t reg, uint32_t mask, uint32_t value )
211{
212    BDBG_ASSERT(reg < RegHandle->MaxRegOffset);
213    BREG_P_CheckAtomicRegister(reg, "BREG_AtomicUpdate32", true);
214    BKNI_EnterCriticalSection();
215    (*RegHandle->atomicUpdate32.callback_isr)(RegHandle->atomicUpdate32.callbackContext, reg, mask, value);
216    BKNI_LeaveCriticalSection();
217}
218
219
220void BREG_SetAtomicUpdate32Callback( BREG_Handle RegHandle, BREG_AtomicUpdate32Callback callback_isr, void *callbackContext )
221{
222    BKNI_EnterCriticalSection();
223    if (callback_isr)
224        {
225        RegHandle->atomicUpdate32.callback_isr = callback_isr;
226                if (callbackContext)
227                {
228                        RegHandle->atomicUpdate32.callbackContext = callbackContext;
229                }
230                else
231                {
232                RegHandle->atomicUpdate32.callbackContext = RegHandle;
233                }
234    }
235    else
236        {
237        /* restore default */
238        RegHandle->atomicUpdate32.callback_isr = BREG_P_AtomicUpdate32_Impl_isr;
239        RegHandle->atomicUpdate32.callbackContext = RegHandle;
240    }
241
242    BKNI_LeaveCriticalSection();
243}
244
245/* End of File */
246
Note: See TracBrowser for help on using the repository browser.