/******************************************************************************* * 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; }