MV_STATUS mvCtrlParamsToAddrDec(MV_DEC_WIN_PARAMS *pWinParam, MV_DEC_WIN *pAddrDecWin) { MV_TARGET_ATTRIB targetAttrib; pAddrDecWin->addrWin.baseLow = pWinParam->baseAddr; /* Upper 32bit address base is supported under PCI High Address remap */ pAddrDecWin->addrWin.baseHigh = 0; /* Prepare sizeReg to ctrlRegToSize function */ pAddrDecWin->addrWin.size = ctrlRegToSize(pWinParam->size, CTRL_DEC_SIZE_ALIGNMENT); if (-1 == pAddrDecWin->addrWin.size) { DB(mvOsPrintf("mvCtrlParamsToAddrDec: ERR. ctrlRegToSize failed.\n")); return MV_BAD_PARAM; } targetAttrib.targetId = pWinParam->targetId; targetAttrib.attrib = pWinParam->attrib; pAddrDecWin->target = mvCtrlTargetGet(&targetAttrib); return MV_OK; }
MV_STATUS mvPexBarGet(MV_U32 pexIf, MV_U32 barNum, MV_PEX_BAR *pAddrWin) { /* check parameters */ if(pexIf >= mvCtrlPexMaxIfGet()) { mvOsPrintf("mvPexBarGet: ERR. Invalid PEX interface %d\n", pexIf); return MV_BAD_PARAM; } if(barNum >= PEX_MAX_BARS) { mvOsPrintf("mvPexBarGet: ERR. Invalid bar number %d\n", barNum); return MV_BAD_PARAM; } /* read base low */ pAddrWin->addrWin.baseLow = MV_REG_READ(PEX_CFG_DIRECT_ACCESS(pexIf,PEX_MV_BAR_BASE(barNum))); if (PEX_INTER_REGS_BAR == barNum) { pAddrWin->addrWin.baseLow &= PXBIR_BASE_MASK; } else { pAddrWin->addrWin.baseLow &= PXBR_BASE_MASK; } /* read base high */ pAddrWin->addrWin.baseHigh = MV_REG_READ(PEX_CFG_DIRECT_ACCESS(pexIf,PEX_MV_BAR_BASE_HIGH(barNum))); /* Read bar size */ if (PEX_INTER_REGS_BAR != barNum) /* internal registers have no size */ { pAddrWin->addrWin.size = MV_REG_READ(PEX_BAR_CTRL_REG(pexIf,barNum)); /* check if enable or not */ if (pAddrWin->addrWin.size & PXBCR_BAR_EN) { pAddrWin->enable = MV_TRUE; } else { pAddrWin->enable = MV_FALSE; } /* now get the size */ pAddrWin->addrWin.size &= PXBCR_BAR_SIZE_MASK; pAddrWin->addrWin.size >>= PXBCR_BAR_SIZE_OFFS; pAddrWin->addrWin.size = ctrlRegToSize(pAddrWin->addrWin.size, PXBCR_BAR_SIZE_ALIGNMENT); }
/******************************************************************************* * mvCtrlRegToAddrDec - Extract address decode struct from registers. * * DESCRIPTION: * This function extract address decode struct from address decode * registers given as parameters. * * INPUT: * pAddrDecRegs - Address decode register struct. * * OUTPUT: * pAddrDecWin - Target window data structure. * * RETURN: * MV_BAD_PARAM if address decode registers data is invalid. * *******************************************************************************/ MV_STATUS mvCtrlRegToAddrDec(MV_DEC_REGS *pAddrDecRegs, MV_ADDR_WIN *pAddrDecWin) { MV_U32 sizeRegVal; sizeRegVal = (pAddrDecRegs->sizeReg & CTRL_DEC_SIZE_MASK) >> CTRL_DEC_SIZE_OFFS; pAddrDecWin->size = ctrlRegToSize(sizeRegVal, CTRL_DEC_SIZE_ALIGNMENT); /* Extract base address */ /* Base register [31:16] ==> baseLow[31:16] */ pAddrDecWin->baseLow = pAddrDecRegs->baseReg & CTRL_DEC_BASE_MASK; pAddrDecWin->baseHigh = 0; return MV_OK; }
/******************************************************************************* * mvDramIfWinGet - Get DRAM interface address decode window * * DESCRIPTION: * This function gets DRAM interface address decode window. * * INPUT: * target - System target. Use only SDRAM targets. * * OUTPUT: * pAddrDecWin - SDRAM address window structure. * * RETURN: * MV_BAD_PARAM if parameters are invalid or window is invalid, MV_OK * otherwise. *******************************************************************************/ MV_STATUS mvDramIfWinGet(MV_TARGET target, MV_DRAM_DEC_WIN *pAddrDecWin) { MV_U32 baseReg,sizeReg; MV_U32 sizeRegVal; /* Check parameters */ if (!MV_TARGET_IS_DRAM(target)) { mvOsPrintf("mvDramIfWinGet: target %d is Illigal\n", target); return MV_ERROR; } /* Read base and size registers */ sizeReg = MV_REG_READ(SDRAM_SIZE_REG(target)); baseReg = MV_REG_READ(SDRAM_BASE_ADDR_REG(target)); sizeRegVal = (sizeReg & SCSR_SIZE_MASK) >> SCSR_SIZE_OFFS; pAddrDecWin->addrWin.size = ctrlRegToSize(sizeRegVal, SCSR_SIZE_ALIGNMENT); /* Check if ctrlRegToSize returned OK */ if (-1 == pAddrDecWin->addrWin.size) { mvOsPrintf("mvDramIfWinGet: size of target %d is Illigal\n", target); return MV_ERROR; } /* Extract base address */ /* Base register [31:16] ==> baseLow[31:16] */ pAddrDecWin->addrWin.baseLow = baseReg & SCBAR_BASE_MASK; pAddrDecWin->addrWin.baseHigh = 0; if (sizeReg & SCSR_WIN_EN) { pAddrDecWin->enable = MV_TRUE; } else { pAddrDecWin->enable = MV_FALSE; } return MV_OK; }