| 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 | |
|---|
| 44 | BDBG_MODULE(BREG_CLIENT); |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | void 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 | |
|---|
| 64 | void 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 | |
|---|
| 80 | uint32_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 | |
|---|
| 89 | uint16_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 | |
|---|
| 98 | uint8_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 | |
|---|
| 107 | void 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 | |
|---|
| 113 | void 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 | |
|---|
| 120 | void 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 | |
|---|
| 128 | static 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 |
|---|
| 150 | static 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 | |
|---|
| 202 | void 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 | |
|---|
| 210 | void 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 | |
|---|
| 220 | void 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 | |
|---|