/******************************************************************************* * mvUsbWinGet - Get USB peripheral target address window. * * DESCRIPTION: * Get USB peripheral target address window. * * INPUT: * winNum - USB target address decode window number. * * OUTPUT: * pDecWin - USB target window data structure. * * RETURN: * MV_ERROR if register parameters are invalid. * *******************************************************************************/ MV_STATUS mvUsbWinGet(int dev, MV_U32 winNum, MV_DEC_WIN *pDecWin) { MV_DEC_WIN_PARAMS winParam; MV_U32 sizeReg, baseReg; /* Parameter checking */ if (winNum >= MV_USB_MAX_ADDR_DECODE_WIN) { mvOsPrintf("%s (dev=%d): ERR. Invalid winNum %d\n", __FUNCTION__, dev, winNum); return MV_NOT_SUPPORTED; } baseReg = MV_REG_READ( MV_USB_WIN_BASE_REG(dev, winNum) ); sizeReg = MV_REG_READ( MV_USB_WIN_CTRL_REG(dev, winNum) ); /* Check if window is enabled */ if(sizeReg & MV_USB_WIN_ENABLE_MASK) { pDecWin->enable = MV_TRUE; /* Extract window parameters from registers */ winParam.targetId = (sizeReg & MV_USB_WIN_TARGET_MASK) >> MV_USB_WIN_TARGET_OFFSET; winParam.attrib = (sizeReg & MV_USB_WIN_ATTR_MASK) >> MV_USB_WIN_ATTR_OFFSET; winParam.size = (sizeReg & MV_USB_WIN_SIZE_MASK) >> MV_USB_WIN_SIZE_OFFSET; winParam.baseAddr = (baseReg & MV_USB_WIN_BASE_MASK); /* Translate the decode window parameters to address decode struct */ if (MV_OK != mvCtrlParamsToAddrDec(&winParam, pDecWin)) { mvOsPrintf("Failed to translate register parameters to USB address" \ " decode window structure\n"); return MV_ERROR; } }
/******************************************************************************* * mvUsbWinRead - Get USB peripheral target address window. * * DESCRIPTION: * Get USB peripheral target address window. * * INPUT: * winNum - USB target address decode window number. * * OUTPUT: * pDecWin - USB target window data structure. * * RETURN: * MV_ERROR if register parameters are invalid. * *******************************************************************************/ MV_STATUS mvUsbWinRead(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pDecWin) { MV_U32 sizeReg, baseReg; /* Parameter checking */ if (winNum >= MV_USB_MAX_ADDR_DECODE_WIN) { mvOsPrintf("%s (dev=%d): ERR. Invalid winNum %d\n", __func__, dev, winNum); return MV_NOT_SUPPORTED; } baseReg = MV_REG_READ(MV_USB_WIN_BASE_REG(dev, winNum)); sizeReg = MV_REG_READ(MV_USB_WIN_CTRL_REG(dev, winNum)); /* Check if window is enabled */ if (sizeReg & MV_USB_WIN_ENABLE_MASK) { pDecWin->enable = MV_TRUE; /* Extract window parameters from registers */ pDecWin->targetId = (sizeReg & MV_USB_WIN_TARGET_MASK) >> MV_USB_WIN_TARGET_OFFSET; pDecWin->attrib = (sizeReg & MV_USB_WIN_ATTR_MASK) >> MV_USB_WIN_ATTR_OFFSET; pDecWin->addrWin.size = (sizeReg & MV_USB_WIN_SIZE_MASK) >> MV_USB_WIN_SIZE_OFFSET; pDecWin->addrWin.size = (pDecWin->addrWin.size + 1) * MV_USB_WIN_SIZE_ALIGN; pDecWin->addrWin.baseLow = (baseReg & MV_USB_WIN_BASE_MASK); pDecWin->addrWin.baseHigh = 0; } else {
/******************************************************************************* * mvUsbWinSet - Set USB target address window * * DESCRIPTION: * This function sets a peripheral target (e.g. SDRAM bank0, PCI_MEM0) * address window, also known as address decode window. * After setting this target window, the USB will be able to access the * target within the address window. * * INPUT: * winNum - USB target address decode window number. * pAddrDecWin - USB target window data structure. * * OUTPUT: * None. * * RETURN: * MV_ERROR if address window overlapps with other address decode windows. * MV_BAD_PARAM if base address is invalid parameter or target is * unknown. * *******************************************************************************/ MV_STATUS mvUsbWinSet(int dev, MV_U32 winNum, MV_DEC_WIN *pDecWin) { MV_DEC_WIN_PARAMS winParams; MV_U32 sizeReg, baseReg; /* Parameter checking */ if (winNum >= MV_USB_MAX_ADDR_DECODE_WIN) { mvOsPrintf("%s: ERR. Invalid win num %d\n",__FUNCTION__, winNum); return MV_BAD_PARAM; } /* Check if the requested window overlapps with current windows */ if (MV_TRUE == usbWinOverlapDetect(dev, winNum, &pDecWin->addrWin)) { mvOsPrintf("%s: ERR. Window %d overlap\n", __FUNCTION__, winNum); return MV_ERROR; } /* check if address is aligned to the size */ if(MV_IS_NOT_ALIGN(pDecWin->addrWin.baseLow, pDecWin->addrWin.size)) { mvOsPrintf("mvUsbWinSet:Error setting USB window %d to "\ "target %s.\nAddress 0x%08x is unaligned to size 0x%x.\n", winNum, mvCtrlTargetNameGet(pDecWin->target), pDecWin->addrWin.baseLow, pDecWin->addrWin.size); return MV_ERROR; } if(MV_OK != mvCtrlAddrDecToParams(pDecWin, &winParams)) { mvOsPrintf("%s: mvCtrlAddrDecToParams Failed\n", __FUNCTION__); return MV_ERROR; } /* set Size, Attributes and TargetID */ sizeReg = (((winParams.targetId << MV_USB_WIN_TARGET_OFFSET) & MV_USB_WIN_TARGET_MASK) | ((winParams.attrib << MV_USB_WIN_ATTR_OFFSET) & MV_USB_WIN_ATTR_MASK) | ((winParams.size << MV_USB_WIN_SIZE_OFFSET) & MV_USB_WIN_SIZE_MASK)); #if defined(MV645xx) || defined(MV646xx) /* If window is DRAM with HW cache coherency, make sure bit2 is set */ sizeReg &= ~MV_USB_WIN_BURST_WR_LIMIT_MASK; if((MV_TARGET_IS_DRAM(pDecWin->target)) && (pDecWin->addrWinAttr.cachePolicy != NO_COHERENCY)) { sizeReg |= MV_USB_WIN_BURST_WR_32BIT_LIMIT; } else { sizeReg |= MV_USB_WIN_BURST_WR_NO_LIMIT; } #endif /* MV645xx || MV646xx */ if (pDecWin->enable == MV_TRUE) { sizeReg |= MV_USB_WIN_ENABLE_MASK; } else { sizeReg &= ~MV_USB_WIN_ENABLE_MASK; } /* Update Base value */ baseReg = (winParams.baseAddr & MV_USB_WIN_BASE_MASK); MV_REG_WRITE( MV_USB_WIN_CTRL_REG(dev, winNum), sizeReg); MV_REG_WRITE( MV_USB_WIN_BASE_REG(dev, winNum), baseReg); return MV_OK; }
/******************************************************************************* * mvUsbWinWrite - Set USB target address window * * DESCRIPTION: * This function sets a peripheral target (e.g. SDRAM bank0, PCI_MEM0) * address window, also known as address decode window. * After setting this target window, the USB will be able to access the * target within the address window. * * INPUT: * winNum - USB target address decode window number. * pAddrDecWin - USB target window data structure. * * OUTPUT: * None. * * RETURN: * MV_ERROR if address window overlapps with other address decode windows. * MV_BAD_PARAM if base address is invalid parameter or target is * unknown. * *******************************************************************************/ MV_STATUS mvUsbWinWrite(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pDecWin) { MV_U32 sizeReg, baseReg; MV_U32 size; /* Parameter checking */ if (winNum >= MV_USB_MAX_ADDR_DECODE_WIN) { mvOsPrintf("%s: ERR. Invalid win num %d\n", __func__, winNum); return MV_BAD_PARAM; } /* Check if the requested window overlapps with current windows */ if (MV_TRUE == usbWinOverlapDetect(dev, winNum, &pDecWin->addrWin)) { mvOsPrintf("%s: ERR. Window %d overlap\n", __func__, winNum); return MV_ERROR; } /* check if address is aligned to the size */ if (MV_IS_NOT_ALIGN(pDecWin->addrWin.baseLow, pDecWin->addrWin.size)) { mvOsPrintf("mvUsbWinWrite:Error setting USB window %d.\n" "Address 0x%08x is unaligned to size 0x%x.\n", winNum, pDecWin->addrWin.baseLow, pDecWin->addrWin.size); return MV_ERROR; } if (!MV_IS_POWER_OF_2(pDecWin->addrWin.size)) { mvOsPrintf("mvUsbWinWrite: Bad windows size.\n"); return MV_BAD_PARAM; } size = pDecWin->addrWin.size / MV_USB_WIN_SIZE_ALIGN - 1; /* set Size, Attributes and TargetID */ sizeReg = (((pDecWin->targetId << MV_USB_WIN_TARGET_OFFSET) & MV_USB_WIN_TARGET_MASK) | ((pDecWin->attrib << MV_USB_WIN_ATTR_OFFSET) & MV_USB_WIN_ATTR_MASK) | ((size << MV_USB_WIN_SIZE_OFFSET) & MV_USB_WIN_SIZE_MASK)); #if defined(MV645xx) || defined(MV646xx) /* If window is DRAM with HW cache coherency, make sure bit2 is set */ sizeReg &= ~MV_USB_WIN_BURST_WR_LIMIT_MASK; if ((MV_TARGET_IS_DRAM(pDecWin->target)) && (pDecWin->addrWinAttr.cachePolicy != NO_COHERENCY)) sizeReg |= MV_USB_WIN_BURST_WR_32BIT_LIMIT; else sizeReg |= MV_USB_WIN_BURST_WR_NO_LIMIT; #endif /* MV645xx || MV646xx */ if (pDecWin->enable == MV_TRUE) sizeReg |= MV_USB_WIN_ENABLE_MASK; else sizeReg &= ~MV_USB_WIN_ENABLE_MASK; /* Update Base value */ baseReg = (pDecWin->addrWin.baseLow & MV_USB_WIN_BASE_MASK); MV_REG_WRITE(MV_USB_WIN_CTRL_REG(dev, winNum), sizeReg); MV_REG_WRITE(MV_USB_WIN_BASE_REG(dev, winNum), baseReg); return MV_OK; }