//***************************************************************************** // // Configures the VIMS. // //***************************************************************************** void VIMSConfigure(uint32_t ui32Base, bool bRoundRobin, bool bPrefetch) { uint32_t ui32Reg; // // Check the arguments. // ASSERT(VIMSBaseValid(ui32Base)); ui32Reg = HWREG(ui32Base + VIMS_O_CTL); ui32Reg &= ~(VIMS_CTL_PREF_EN | VIMS_CTL_ARB_CFG); if(bRoundRobin) { ui32Reg |= VIMS_CTL_ARB_CFG; } if(bPrefetch) { ui32Reg |= VIMS_CTL_PREF_EN; } // // Set the Arbitration and prefetch mode. // HWREG(ui32Base + VIMS_O_CTL) = ui32Reg; }
//***************************************************************************** // // Safe setting of new VIMS mode // - Function might be blocking // - Can be called for any mode change (also if actually not changing mode) // //***************************************************************************** void VIMSModeSafeSet( uint32_t ui32Base, uint32_t ui32NewMode, bool blocking ) { uint32_t currentMode; // Check the arguments. ASSERT(VIMSBaseValid(ui32Base)); ASSERT((ui32NewMode == VIMS_MODE_DISABLED) || (ui32NewMode == VIMS_MODE_ENABLED) || (ui32NewMode == VIMS_MODE_OFF)); // Make sure that only the mode bits are set in the input parameter // (done just for security since it is critical to the code flow) ui32NewMode &= VIMS_CTL_MODE_M; // Wait for any pending change to complete and get current VIMS mode // (This is a blocking point but will typically only be a blocking point // only if mode is changed multiple times with blocking=0) do { currentMode = VIMSModeGet( ui32Base ); } while ( currentMode == VIMS_MODE_CHANGING ); // First check that it actually is a mode change request if ( ui32NewMode != currentMode ) { // Due to a hw-problem it is strongly recommended to go via VIMS_MODE_OFF // when leaving VIMS_MODE_ENABLED (=VIMS_CTL_MODE_CACHE) // (And no need to go via OFF, if OFF is the final state and will be set later) if (( currentMode == VIMS_CTL_MODE_CACHE ) && ( ui32NewMode != VIMS_CTL_MODE_OFF ) ) { VIMSModeSet( ui32Base, VIMS_MODE_OFF ); while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) { // Do nothing - wait for change to complete. // (Needed blocking point but it takes only some few cycles) } } // Set new mode VIMSModeSet( ui32Base, ui32NewMode ); // Wait for final mode change to complete - if blocking is requested if ( blocking ) { while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) { // Do nothing - wait for change to complete. } } } }
//***************************************************************************** // // Get the current operational mode of the VIMS. // //***************************************************************************** uint32_t VIMSModeGet(uint32_t ui32Base) { uint32_t ui32Reg; // Check the arguments. ASSERT(VIMSBaseValid(ui32Base)); ui32Reg = HWREG(ui32Base + VIMS_O_STAT); if(ui32Reg & VIMS_STAT_MODE_CHANGING) { return (VIMS_MODE_CHANGING); } else { return (ui32Reg & VIMS_STAT_MODE_M); } }
//***************************************************************************** // // Set the operational mode of the VIMS // //***************************************************************************** void VIMSModeSet(uint32_t ui32Base, uint32_t ui32Mode) { uint32_t ui32Reg; // Check the arguments. ASSERT(VIMSBaseValid(ui32Base)); ASSERT((ui32Mode == VIMS_MODE_DISABLED) || (ui32Mode == VIMS_MODE_ENABLED) || (ui32Mode == VIMS_MODE_OFF)); // Set the mode. ui32Reg = HWREG(ui32Base + VIMS_O_CTL); ui32Reg &= ~VIMS_CTL_MODE_M; ui32Reg |= (ui32Mode & VIMS_CTL_MODE_M); HWREG(ui32Base + VIMS_O_CTL) = ui32Reg; }