1/******************************************************************************* 2Copyright (C) Marvell International Ltd. and its affiliates 3 4This software file (the "File") is owned and distributed by Marvell 5International Ltd. and/or its affiliates ("Marvell") under the following 6alternative licensing terms. Once you have made an election to distribute the 7File under one of the following license alternatives, please (i) delete this 8introductory statement regarding license alternatives, (ii) delete the two 9license alternatives that you have not elected to use and (iii) preserve the 10Marvell copyright notice above. 11 12******************************************************************************** 13Marvell Commercial License Option 14 15If you received this File from Marvell and you have entered into a commercial 16license agreement (a "Commercial License") with Marvell, the File is licensed 17to you under the terms of the applicable Commercial License. 18 19******************************************************************************** 20Marvell GPL License Option 21 22If you received this File from Marvell, you may opt to use, redistribute and/or 23modify this File in accordance with the terms and conditions of the General 24Public License Version 2, June 1991 (the "GPL License"), a copy of which is 25available along with the File in the license.txt file or by writing to the Free 26Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or 27on the worldwide web at http://www.gnu.org/licenses/gpl.txt. 28 29THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 30WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 31DISCLAIMED. The GPL License provides additional details about this warranty 32disclaimer. 33******************************************************************************** 34Marvell BSD License Option 35 36If you received this File from Marvell, you may opt to use, redistribute and/or 37modify this File under the following licensing terms. 38Redistribution and use in source and binary forms, with or without modification, 39are permitted provided that the following conditions are met: 40 41 * Redistributions of source code must retain the above copyright notice, 42 this list of conditions and the following disclaimer. 43 44 * Redistributions in binary form must reproduce the above copyright 45 notice, this list of conditions and the following disclaimer in the 46 documentation and/or other materials provided with the distribution. 47 48 * Neither the name of Marvell nor the names of its contributors may be 49 used to endorse or promote products derived from this software without 50 specific prior written permission. 51 52THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 53ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 54WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 55DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 56ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 57(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 58LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 59ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 60(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 61SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 63*******************************************************************************/ 64 65/******************************************************************************* 66* mvCtrlEnvAddrDec.h - Marvell controller address decode library 67* 68* DESCRIPTION: 69* 70* DEPENDENCIES: 71* None. 72* 73*******************************************************************************/ 74 75/* includes */ 76#include "ctrlEnv/mvCtrlEnvAddrDec.h" 77#include "ctrlEnv/sys/mvAhbToMbusRegs.h" 78#include "ddr2/mvDramIfRegs.h" 79#include "pex/mvPexRegs.h" 80 81#define MV_DEBUG 82 83/* defines */ 84#ifdef MV_DEBUG 85 #define DB(x) x 86#else 87 #define DB(x) 88#endif 89 90/* Default Attributes array */ 91MV_TARGET_ATTRIB mvTargetDefaultsArray[] = TARGETS_DEF_ARRAY; 92extern MV_TARGET *sampleAtResetTargetArray; 93/* Dram\AHBToMbus\PEX share regsiter */ 94 95#define CTRL_DEC_BASE_OFFS 16 96#define CTRL_DEC_BASE_MASK (0xffff << CTRL_DEC_BASE_OFFS) 97#define CTRL_DEC_BASE_ALIGNMENT 0x10000 98 99#define CTRL_DEC_SIZE_OFFS 16 100#define CTRL_DEC_SIZE_MASK (0xffff << CTRL_DEC_SIZE_OFFS) 101#define CTRL_DEC_SIZE_ALIGNMENT 0x10000 102 103#define CTRL_DEC_WIN_EN BIT0 104 105 106 107/******************************************************************************* 108* mvCtrlAddrDecToReg - Get address decode register format values 109* 110* DESCRIPTION: 111* 112* INPUT: 113* 114* OUTPUT: 115* 116* RETURN: 117* 118*******************************************************************************/ 119MV_STATUS mvCtrlAddrDecToReg(MV_ADDR_WIN *pAddrDecWin, MV_DEC_REGS *pAddrDecRegs) 120{ 121 122 MV_U32 baseToReg=0 , sizeToReg=0; 123 124 /* BaseLow[31:16] => base register [31:16] */ 125 baseToReg = pAddrDecWin->baseLow & CTRL_DEC_BASE_MASK; 126 127 /* Write to address decode Base Address Register */ 128 pAddrDecRegs->baseReg &= ~CTRL_DEC_BASE_MASK; 129 pAddrDecRegs->baseReg |= baseToReg; 130 131 /* Get size register value according to window size */ 132 sizeToReg = ctrlSizeToReg(pAddrDecWin->size, CTRL_DEC_SIZE_ALIGNMENT); 133 134 /* Size parameter validity check. */ 135 if (-1 == sizeToReg) 136 { 137 return MV_BAD_PARAM; 138 } 139 140 /* set size */ 141 pAddrDecRegs->sizeReg &= ~CTRL_DEC_SIZE_MASK; 142 pAddrDecRegs->sizeReg |= (sizeToReg << CTRL_DEC_SIZE_OFFS); 143 144 145 return MV_OK; 146 147} 148 149/******************************************************************************* 150* mvCtrlRegToAddrDec - Extract address decode struct from registers. 151* 152* DESCRIPTION: 153* This function extract address decode struct from address decode 154* registers given as parameters. 155* 156* INPUT: 157* pAddrDecRegs - Address decode register struct. 158* 159* OUTPUT: 160* pAddrDecWin - Target window data structure. 161* 162* RETURN: 163* MV_BAD_PARAM if address decode registers data is invalid. 164* 165*******************************************************************************/ 166MV_STATUS mvCtrlRegToAddrDec(MV_DEC_REGS *pAddrDecRegs, MV_ADDR_WIN *pAddrDecWin) 167{ 168 MV_U32 sizeRegVal; 169 170 sizeRegVal = (pAddrDecRegs->sizeReg & CTRL_DEC_SIZE_MASK) >> 171 CTRL_DEC_SIZE_OFFS; 172 173 pAddrDecWin->size = ctrlRegToSize(sizeRegVal, CTRL_DEC_SIZE_ALIGNMENT); 174 175 176 /* Extract base address */ 177 /* Base register [31:16] ==> baseLow[31:16] */ 178 pAddrDecWin->baseLow = pAddrDecRegs->baseReg & CTRL_DEC_BASE_MASK; 179 180 pAddrDecWin->baseHigh = 0; 181 182 return MV_OK; 183 184} 185 186/******************************************************************************* 187* mvCtrlAttribGet - 188* 189* DESCRIPTION: 190* 191* INPUT: 192* 193* OUTPUT: 194* 195* RETURN: 196* 197*******************************************************************************/ 198 199MV_STATUS mvCtrlAttribGet(MV_TARGET target, 200 MV_TARGET_ATTRIB *targetAttrib) 201{ 202 203 targetAttrib->attrib = mvTargetDefaultsArray[MV_CHANGE_BOOT_CS(target)].attrib; 204 targetAttrib->targetId = mvTargetDefaultsArray[MV_CHANGE_BOOT_CS(target)].targetId; 205 206 return MV_OK; 207 208} 209 210/******************************************************************************* 211* mvCtrlGetAttrib - 212* 213* DESCRIPTION: 214* 215* INPUT: 216* 217* OUTPUT: 218* 219* RETURN: 220* 221*******************************************************************************/ 222MV_TARGET mvCtrlTargetGet(MV_TARGET_ATTRIB *targetAttrib) 223{ 224 MV_TARGET target; 225 MV_TARGET x; 226 for (target = SDRAM_CS0; target < MAX_TARGETS ; target ++) 227 { 228 x = MV_CHANGE_BOOT_CS(target); 229 if ((mvTargetDefaultsArray[x].attrib == targetAttrib->attrib) && 230 (mvTargetDefaultsArray[MV_CHANGE_BOOT_CS(target)].targetId == targetAttrib->targetId)) 231 { 232 /* found it */ 233 break; 234 } 235 } 236 237 return target; 238} 239 240MV_STATUS mvCtrlAddrDecToParams(MV_DEC_WIN *pAddrDecWin, 241 MV_DEC_WIN_PARAMS *pWinParam) 242{ 243 MV_U32 baseToReg=0, sizeToReg=0; 244 245 /* BaseLow[31:16] => base register [31:16] */ 246 baseToReg = pAddrDecWin->addrWin.baseLow & CTRL_DEC_BASE_MASK; 247 248 /* Write to address decode Base Address Register */ 249 pWinParam->baseAddr &= ~CTRL_DEC_BASE_MASK; 250 pWinParam->baseAddr |= baseToReg; 251 252 /* Get size register value according to window size */ 253 sizeToReg = ctrlSizeToReg(pAddrDecWin->addrWin.size, CTRL_DEC_SIZE_ALIGNMENT); 254 255 /* Size parameter validity check. */ 256 if (-1 == sizeToReg) 257 { 258 mvOsPrintf("mvCtrlAddrDecToParams: ERR. ctrlSizeToReg failed.\n"); 259 return MV_BAD_PARAM; 260 } 261 pWinParam->size = sizeToReg; 262 263 pWinParam->attrib = mvTargetDefaultsArray[MV_CHANGE_BOOT_CS(pAddrDecWin->target)].attrib; 264 pWinParam->targetId = mvTargetDefaultsArray[MV_CHANGE_BOOT_CS(pAddrDecWin->target)].targetId; 265 266 return MV_OK; 267} 268 269MV_STATUS mvCtrlParamsToAddrDec(MV_DEC_WIN_PARAMS *pWinParam, 270 MV_DEC_WIN *pAddrDecWin) 271{ 272 MV_TARGET_ATTRIB targetAttrib; 273 274 pAddrDecWin->addrWin.baseLow = pWinParam->baseAddr; 275 276 /* Upper 32bit address base is supported under PCI High Address remap */ 277 pAddrDecWin->addrWin.baseHigh = 0; 278 279 /* Prepare sizeReg to ctrlRegToSize function */ 280 pAddrDecWin->addrWin.size = ctrlRegToSize(pWinParam->size, CTRL_DEC_SIZE_ALIGNMENT); 281 282 if (-1 == pAddrDecWin->addrWin.size) 283 { 284 DB(mvOsPrintf("mvCtrlParamsToAddrDec: ERR. ctrlRegToSize failed.\n")); 285 return MV_BAD_PARAM; 286 } 287 targetAttrib.targetId = pWinParam->targetId; 288 targetAttrib.attrib = pWinParam->attrib; 289 290 pAddrDecWin->target = mvCtrlTargetGet(&targetAttrib); 291 292 return MV_OK; 293} 294 295 296 297