empty_project_28377D/device/driverlib/memcfg.h

1265 lines
46 KiB
C

//###########################################################################
//
// FILE: memcfg.h
//
// TITLE: C28x RAM config driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################
#ifndef MEMCFG_H
#define MEMCFG_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup memcfg_api MemCfg
//! @{
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_memcfg.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "cpu.h"
#include "debug.h"
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//
// Masks to decode memory section defines.
//
#define MEMCFG_SECT_TYPE_MASK 0xFF000000U
#define MEMCFG_SECT_TYPE_D 0x00000000U
#define MEMCFG_SECT_TYPE_LS 0x01000000U
#define MEMCFG_SECT_TYPE_GS 0x02000000U
#define MEMCFG_SECT_TYPE_MSG 0x03000000U
#define MEMCFG_SECT_NUM_MASK 0x00FFFFFFU
#define MEMCFG_XACCPROTX_M ((uint32_t)MEMCFG_GSXACCPROT0_FETCHPROT_GS0 | \
(uint32_t)MEMCFG_GSXACCPROT0_CPUWRPROT_GS0 | \
(uint32_t)MEMCFG_GSXACCPROT0_DMAWRPROT_GS0)
#define MEMCFG_XTEST_M MEMCFG_DXTEST_TEST_M0_M
//
// Used for access violation functions.
//
#define MEMCFG_NMVIOL_MASK 0x0000FFFFU
#define MEMCFG_MVIOL_MASK 0x000F0000U
#define MEMCFG_MVIOL_SHIFT 16U
#ifndef DOXYGEN_PDF_IGNORE
//*****************************************************************************
//
// Values that can be passed to MemCfg_lockConfig(), MemCfg_unlockConfig(),
// MemCfg_commitConfig(), MemCfg_setProtection(), MemCfg_initSections(),
// MemCfg_setCLAMemType(), MemCfg_setLSRAMControllerSel(),
// MemCfg_getInitStatus() as the memSection(s) or ramSection(s) parameter.
//
//*****************************************************************************
//
// DxRAM - Dedicated RAM config
//
#define MEMCFG_SECT_M0 0x00000001U //!< M0 RAM
#define MEMCFG_SECT_M1 0x00000002U //!< M1 RAM
#define MEMCFG_SECT_D0 0x00000004U //!< D0 RAM
#define MEMCFG_SECT_D1 0x00000008U //!< D1 RAM
#define MEMCFG_SECT_DX_ALL 0x0000000FU //!< All M and D RAM
//
// LSxRAM - Local shared RAM config
//
#define MEMCFG_SECT_LS0 0x01000001U //!< LS0 RAM
#define MEMCFG_SECT_LS1 0x01000002U //!< LS1 RAM
#define MEMCFG_SECT_LS2 0x01000004U //!< LS2 RAM
#define MEMCFG_SECT_LS3 0x01000008U //!< LS3 RAM
#define MEMCFG_SECT_LS4 0x01000010U //!< LS4 RAM
#define MEMCFG_SECT_LS5 0x01000020U //!< LS5 RAM
#define MEMCFG_SECT_LSX_ALL 0x0100003FU //!< All LS RAM
//
// GSxRAM - Global shared RAM config
//
#define MEMCFG_SECT_GS0 0x02000001U //!< GS0 RAM
#define MEMCFG_SECT_GS1 0x02000002U //!< GS1 RAM
#define MEMCFG_SECT_GS2 0x02000004U //!< GS2 RAM
#define MEMCFG_SECT_GS3 0x02000008U //!< GS3 RAM
#define MEMCFG_SECT_GS4 0x02000010U //!< GS4 RAM
#define MEMCFG_SECT_GS5 0x02000020U //!< GS5 RAM
#define MEMCFG_SECT_GS6 0x02000040U //!< GS6 RAM
#define MEMCFG_SECT_GS7 0x02000080U //!< GS7 RAM
#define MEMCFG_SECT_GS8 0x02000100U //!< GS8 RAM
#define MEMCFG_SECT_GS9 0x02000200U //!< GS9 RAM
#define MEMCFG_SECT_GS10 0x02000400U //!< GS10 RAM
#define MEMCFG_SECT_GS11 0x02000800U //!< GS11 RAM
#define MEMCFG_SECT_GS12 0x02001000U //!< GS12 RAM
#define MEMCFG_SECT_GS13 0x02002000U //!< GS13 RAM
#define MEMCFG_SECT_GS14 0x02004000U //!< GS14 RAM
#define MEMCFG_SECT_GS15 0x02008000U //!< GS15 RAM
#define MEMCFG_SECT_GSX_ALL 0x0200FFFFU //!< All GS RAM
//
// MSGxRAM - Message RAM config
//
#define MEMCFG_SECT_MSGCPUTOCPU 0x03000001U //!< CPU-to-CPU message RAM
#define MEMCFG_SECT_MSGCPUTOCLA1 0x03000002U //!< CPU-to-CLA1 message RAM
#define MEMCFG_SECT_MSGCLA1TOCPU 0x03000004U //!< CLA1-to-CPU message RAM
#define MEMCFG_SECT_MSGX_ALL 0x03000007U //!< All message RAM
//
// All sections
//
#define MEMCFG_SECT_ALL 0xFFFFFFFFU //!< All configurable RAM
//*****************************************************************************
//
// Values that can be passed to MemCfg_setProtection() as the protectMode
// parameter.
//
//*****************************************************************************
#define MEMCFG_PROT_ALLOWCPUFETCH 0x00000000U //!< CPU fetch allowed
#define MEMCFG_PROT_BLOCKCPUFETCH 0x00000001U //!< CPU fetch blocked
#define MEMCFG_PROT_ALLOWCPUWRITE 0x00000000U //!< CPU write allowed
#define MEMCFG_PROT_BLOCKCPUWRITE 0x00000002U //!< CPU write blocked
#define MEMCFG_PROT_ALLOWDMAWRITE 0x00000000U //!< DMA write allowed (GSxRAM)
#define MEMCFG_PROT_BLOCKDMAWRITE 0x00000004U //!< DMA write blocked (GSxRAM)
//*****************************************************************************
//
// Values that can be passed to MemCfg_enableViolationInterrupt()
// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(),
// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as
// the intFlags parameter. They also make up the return value of
// MemCfg_getViolationInterruptStatus().
//
//*****************************************************************************
#define MEMCFG_NMVIOL_CPUREAD 0x00000001U //!< Non-controller CPU read access
#define MEMCFG_NMVIOL_CPUWRITE 0x00000002U //!< Non-controller CPU write access
#define MEMCFG_NMVIOL_CPUFETCH 0x00000004U //!< Non-controller CPU fetch access
#define MEMCFG_NMVIOL_DMAWRITE 0x00000008U //!< Non-controller DMA write access
#define MEMCFG_NMVIOL_CLA1READ 0x00000010U //!< Non-controller CLA1 read access
#define MEMCFG_NMVIOL_CLA1WRITE 0x00000020U //!< Non-controller CLA1 write access
#define MEMCFG_NMVIOL_CLA1FETCH 0x00000040U //!< Non-controller CLA1 fetch access
//*****************************************************************************
//
// Values that can be passed to MemCfg_enableViolationInterrupt()
// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(),
// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as
// the intFlags parameter. They also make up the return value of
// MemCfg_getViolationInterruptStatus().
//
//*****************************************************************************
#define MEMCFG_MVIOL_CPUFETCH 0x00010000U //!< Controller CPU fetch access
#define MEMCFG_MVIOL_CPUWRITE 0x00020000U //!< Controller CPU write access
#define MEMCFG_MVIOL_DMAWRITE 0x00040000U //!< Controller DMA write access
//*****************************************************************************
//
// Values that can be passed to MemCfg_forceCorrErrorStatus(),
// MemCfg_clearCorrErrorStatus(), and MemCfg_getCorrErrorAddress() as the
// stsFlag(s) parameter and returned by MemCfg_getCorrErrorStatus().
//
// Note that MEMCFG_CERR_CPUREAD is the only value below that has a
// corresponding interrupt and may be used with the error functions that take
// an intFlag(s) parameter.
//
//*****************************************************************************
#define MEMCFG_CERR_CPUREAD 0x0001U //!< Correctable CPU read error
#define MEMCFG_CERR_DMAREAD 0x0002U //!< Correctable DMA read error
#define MEMCFG_CERR_CLA1READ 0x0004U //!< Correctable CLA1 read error
//*****************************************************************************
//
// Values that can be passed to MemCfg_forceUncorrErrorStatus(),
// MemCfg_clearUncorrErrorStatus(), and MemCfg_getUncorrErrorAddress() as the
// stsFlag(s) parameter and returned by MemCfg_getUncorrErrorStatus().
//
//*****************************************************************************
#define MEMCFG_UCERR_CPUREAD 0x0001U //!< Uncorrectable CPU read error
#define MEMCFG_UCERR_DMAREAD 0x0002U //!< Uncorrectable DMA read error
#define MEMCFG_UCERR_CLA1READ 0x0004U //!< Uncorrectable CLA1 read error
#endif
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setCLAMemType() as the \e claMemType
//! parameter.
//
//*****************************************************************************
typedef enum
{
MEMCFG_CLA_MEM_DATA, //!< Section is CLA data memory
MEMCFG_CLA_MEM_PROGRAM //!< Section is CLA program memory
} MemCfg_CLAMemoryType;
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setLSRAMControllerSel() as the
//! \e controllerSel parameter.
//
//*****************************************************************************
typedef enum
{
MEMCFG_LSRAMCONTROLLER_CPU_ONLY, //!< CPU is the owner of the section
MEMCFG_LSRAMCONTROLLER_CPU_CLA1 //!< CPU and CLA1 share this section
} MemCfg_LSRAMControllerSel;
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setGSRAMControllerSel() as the
//! \e controllerSel parameter.
//
//*****************************************************************************
typedef enum
{
MEMCFG_GSRAMCONTROLLER_CPU1, //!< CPU1 is controller of the section
MEMCFG_GSRAMCONTROLLER_CPU2 //!< CPU2 is controller of the section
} MemCfg_GSRAMControllerSel;
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setTestMode() as the \e testMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Functional mode. Test mode is disabled.
MEMCFG_TEST_FUNCTIONAL = 0,
//! Writes allowed to data only
MEMCFG_TEST_WRITE_DATA = 1,
//! Writes allowed to ECC only (for DxRAM/MxRAM)
MEMCFG_TEST_WRITE_ECC = 2,
//! Writes allowed to parity only (for LSxRAM, GSxRAM, and MSGxRAM)
MEMCFG_TEST_WRITE_PARITY = 2
} MemCfg_TestMode;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the CLA memory type of the specified RAM section.
//!
//! \param ramSections is the logical OR of the sections to be configured.
//! \param claMemType indicates data memory or program memory.
//!
//! This function sets the CLA memory type configuration of the RAM section. If
//! the \e claMemType parameter is \b MEMCFG_CLA_MEM_DATA, the RAM section will
//! be configured as CLA data memory. If \b MEMCFG_CLA_MEM_PROGRAM, the RAM
//! section will be configured as CLA program memory.
//!
//! The \e ramSections parameter is an OR of the following indicators:
//! \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx.
//!
//! \note This API only applies to LSx RAM and has no effect if the CLA isn't
//! controller of the memory section.
//!
//! \sa MemCfg_setLSRAControllerSel()
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_setCLAMemType(uint32_t ramSections, MemCfg_CLAMemoryType claMemType)
{
//
// Check the arguments.
//
ASSERT((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS);
//
// Write the CLA memory configuration to the appropriate register. Either
// set or clear the bit that determines the function of the RAM section as
// it relates to the CLA.
//
EALLOW;
if(claMemType == MEMCFG_CLA_MEM_PROGRAM)
{
//
// Program memory
//
HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) |= ramSections;
}
else
{
//
// Data memory
//
HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) &= ~ramSections;
}
EDIS;
}
//*****************************************************************************
//
//! Enables individual RAM access violation interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be enabled.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! This function enables the indicated RAM access violation interrupt sources.
//! Only the sources that are enabled can be reflected to the processor
//! interrupt; disabled sources have no effect on the processor.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableViolationInterrupt(uint32_t intFlags)
{
//
// Enable the specified interrupts.
//
EALLOW;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) |=
intFlags & MEMCFG_NMVIOL_MASK;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) |=
(intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT;
EDIS;
}
//*****************************************************************************
//
//! Disables individual RAM access violation interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be disabled.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//!
//! This function disables the indicated RAM access violation interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only non-controller violations may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableViolationInterrupt(uint32_t intFlags)
{
//
// Disable the specified interrupts.
//
EALLOW;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) &=
~(intFlags & MEMCFG_NMVIOL_MASK);
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) &=
~((intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT);
EDIS;
}
//*****************************************************************************
//
//! Gets the current RAM access violation status.
//!
//! This function returns the RAM access violation status. This function will
//! return flags for both controller and non-controller access violations
//! although only the non-controller flags have the ability to cause the
//! generation of an interrupt.
//!
//! \return Returns the current violation status, enumerated as a bit field of
//! the values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//*****************************************************************************
static inline uint32_t
MemCfg_getViolationInterruptStatus(void)
{
uint32_t status;
//
// Read and return RAM access status flags.
//
status = (HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVFLG)) |
(HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVFLG) <<
MEMCFG_MVIOL_SHIFT);
return(status);
}
//*****************************************************************************
//
//! Sets the RAM access violation status.
//!
//! \param intFlags is a bit mask of the access violation flags to be set.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//!
//! This function sets the RAM access violation status. This function will
//! set flags for both controller and non-controller access violations, and an
//! interrupt will be generated if it is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceViolationInterrupt(uint32_t intFlags)
{
//
// Shift and mask the flags appropriately and write them to the
// corresponding SET register.
//
EALLOW;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVSET) =
intFlags & MEMCFG_NMVIOL_MASK;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVSET) =
(intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT;
EDIS;
}
//*****************************************************************************
//
//! Clears RAM access violation flags.
//!
//! \param intFlags is a bit mask of the access violation flags to be cleared.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearViolationInterruptStatus(uint32_t intFlags)
{
//
// Clear the requested access violation flags.
//
EALLOW;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVCLR) |=
intFlags & MEMCFG_NMVIOL_MASK;
HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVCLR) |=
(intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT;
EDIS;
}
//*****************************************************************************
//
//! Sets the correctable error threshold value.
//!
//! \param threshold is the correctable error threshold.
//!
//! This value sets the error-count threshold at which a correctable error
//! interrupt is generated. That is when the error count register reaches the
//! value specified by the \e threshold parameter, an interrupt is
//! generated if it is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_setCorrErrorThreshold(uint32_t threshold)
{
//
// Write the threshold value to the appropriate register.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRTHRES) = threshold;
EDIS;
}
//*****************************************************************************
//
//! Gets the correctable error count.
//!
//! \return Returns the number of correctable error have occurred.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorCount(void)
{
//
// Read and return the number of errors that have occurred.
//
return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCNT));
}
//*****************************************************************************
//
//! Enables individual RAM correctable error interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be enabled. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function enables the indicated RAM correctable error interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableCorrErrorInterrupt(uint32_t intFlags)
{
//
// Enable the specified interrupts.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) |= intFlags;
EDIS;
}
//*****************************************************************************
//
//! Disables individual RAM correctable error interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be disabled. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function disables the indicated RAM correctable error interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableCorrErrorInterrupt(uint32_t intFlags)
{
//
// Disable the specified interrupts.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) &= ~(intFlags);
EDIS;
}
//*****************************************************************************
//
//! Gets the current RAM correctable error interrupt status.
//!
//! \return Returns the current error interrupt status. Will return a value of
//! \b MEMCFG_CERR_CPUREAD if an interrupt has been generated. If not, the
//! function will return 0.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorInterruptStatus(void)
{
//
// Read and return correctable error interrupt flags.
//
return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTFLG));
}
//*****************************************************************************
//
//! Sets the RAM correctable error interrupt status.
//!
//! \param intFlags is a bit mask of the interrupt sources to be set. Can take
//! the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function sets the correctable error interrupt flag.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceCorrErrorInterrupt(uint32_t intFlags)
{
//
// Write the flags to the appropriate SET register.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTSET) = intFlags;
EDIS;
}
//*****************************************************************************
//
//! Clears the RAM correctable error interrupt status.
//!
//! \param intFlags is a bit mask of the interrupt sources to be cleared. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function clears the correctable error interrupt flag.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearCorrErrorInterruptStatus(uint32_t intFlags)
{
//
// Clear the requested flags.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTCLR) |= intFlags;
EDIS;
}
//*****************************************************************************
//
//! Gets the current correctable RAM error status.
//!
//! \return Returns the current error status, enumerated as a bit field of
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorStatus(void)
{
//
// Read and return RAM error status flags.
//
return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRFLG));
}
//*****************************************************************************
//
//! Gets the current uncorrectable RAM error status.
//!
//! \return Returns the current error status, enumerated as a bit field of
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ,
//! or \b MEMCFG_UCERR_ECATMEMREAD.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getUncorrErrorStatus(void)
{
//
// Read and return RAM error status flags.
//
return(HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRFLG));
}
//*****************************************************************************
//
//! Sets the specified correctable RAM error status flag.
//!
//! \param stsFlags is a bit mask of the error sources. This parameter can be
//! any of the following values:
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//!
//! This function sets the specified correctable RAM error status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceCorrErrorStatus(uint32_t stsFlags)
{
//
// Write the flags to the appropriate SET register.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRSET) = stsFlags;
EDIS;
}
//*****************************************************************************
//
//! Sets the specified uncorrectable RAM error status flag.
//!
//! \param stsFlags is a bit mask of the error sources. This parameter can be
//! any of the following values:
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ,
//! or \b MEMCFG_UCERR_ECATMEMREAD.
//!
//! This function sets the specified uncorrectable RAM error status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceUncorrErrorStatus(uint32_t stsFlags)
{
//
// Write the flags to the appropriate SET register.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRSET) = stsFlags;
EDIS;
}
//*****************************************************************************
//
//! Clears correctable RAM error flags.
//!
//! \param stsFlags is a bit mask of the status flags to be cleared.
//! This parameter can be any of the following :
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//!
//! This function clears the specified correctable RAM error flags.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearCorrErrorStatus(uint32_t stsFlags)
{
//
// Clear the requested flags.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCLR) |= stsFlags;
EDIS;
}
//*****************************************************************************
//
//! Clears uncorrectable RAM error flags.
//!
//! \param stsFlags is a bit mask of the status flags to be cleared.
//! This parameter can be any of the following :
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ,
//! or \b MEMCFG_UCERR_ECATMEMREAD.
//!
//! This function clears the specified uncorrectable RAM error flags.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearUncorrErrorStatus(uint32_t stsFlags)
{
//
// Clear the requested flags.
//
EALLOW;
HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRCLR) |= stsFlags;
EDIS;
}
//*****************************************************************************
//
//! Enables ROM wait state.
//!
//! This function enables the ROM wait state. This mean CPU accesses to ROM are
//! 1-wait.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableROMWaitState(void)
{
//
// Clear the disable bit.
//
EALLOW;
HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) &=
~((uint32_t)MEMCFG_ROMWAITSTATE_WSDISABLE);
EDIS;
}
//*****************************************************************************
//
//! Disables ROM wait state.
//!
//! This function enables the ROM wait state. This mean CPU accesses to ROM are
//! 0-wait.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableROMWaitState(void)
{
//
// Set the disable bit.
//
EALLOW;
HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) |=
MEMCFG_ROMWAITSTATE_WSDISABLE;
EDIS;
}
//*****************************************************************************
//
//! Enables ROM prefetch.
//!
//! This function enables the ROM prefetch for both secure ROM and boot ROM.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableROMPrefetch(void)
{
//
// Set the enable bit.
//
EALLOW;
HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) |=
MEMCFG_ROMPREFETCH_PFENABLE;
EDIS;
}
//*****************************************************************************
//
//! Disables ROM prefetch.
//!
//! This function enables the ROM prefetch for both secure ROM and boot ROM.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableROMPrefetch(void)
{
//
// Clear the enable bit.
//
EALLOW;
HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) &=
~((uint32_t)MEMCFG_ROMPREFETCH_PFENABLE);
EDIS;
}
//*****************************************************************************
//
//! Locks the writes to the configuration of specified memory sections.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function locks writes to the access protection and controller select
//! configuration of a memory section.That means calling MemCfg_setProtection()
//! or MemCfg_setLSRAMControllerSel() for a locked memory section will have no
//! effect until MemCfg_unlockConfig() is called.
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_lockConfig(uint32_t memSections);
//*****************************************************************************
//
//! Unlocks the writes to the configuration of a memory section.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function unlocks writes to the access protection and controller select
//! configuration of a memory section that has been locked using
//! MemCfg_lockConfig().
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_unlockConfig(uint32_t memSections);
//*****************************************************************************
//
//! Permanently locks writes to the configuration of a memory section.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function permanently locks writes to the access protection and
//! controller select configuration of a memory section. That means calling
//! MemCfg_setProtection() or MemCfg_setLSRAMControllerSel() for a locked memory
//! section will have no effect. To lock the configuration in a nonpermanent
//! way, use MemCfg_lockConfig().
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_commitConfig(uint32_t memSections);
//*****************************************************************************
//
//! Sets the access protection mode of a single memory section.
//!
//! \param memSection is the memory section to be configured.
//! \param protectMode is the logical OR of the settings to be applied.
//!
//! This function sets the access protection mode of a specified memory section.
//! The mode is passed into the \e protectMode parameter as the logical OR of
//! the following values:
//! - \b MEMCFG_PROT_ALLOWCPUFETCH or \b MEMCFG_PROT_BLOCKCPUFETCH - CPU fetch
//! - \b MEMCFG_PROT_ALLOWCPUWRITE or \b MEMCFG_PROT_BLOCKCPUWRITE - CPU write
//! - \b MEMCFG_PROT_ALLOWDMAWRITE or \b MEMCFG_PROT_BLOCKDMAWRITE - DMA write
//!
//! The \e memSection parameter is one of the following indicators:
//! - \b MEMCFG_SECT_D0 or \b MEMCFG_SECT_D1
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx
//!
//! This function will have no effect if the associated registers have been
//! locked by MemCfg_lockConfig() or MemCfg_commitConfig() or if the memory
//! is configured as CLA program memory.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setProtection(uint32_t memSection, uint32_t protectMode);
//*****************************************************************************
//
//! Sets the controller of the specified LSxRAM section.
//!
//! \param ramSection is the LSxRAM section to be configured.
//! \param controllerSel is the sharing selection.
//!
//! This function sets the controller select configuration of the LSxRAM
//! section.
//! If the \e controllerSel parameter is \b MEMCFG_LSRAMCONTROLLER_CPU_ONLY,
//! the LSxRAM section passed into the \e ramSection parameter will be dedicated
//! to the CPU. If \b MEMCFG_LSRAMCONTROLLER_CPU_CLA1, the memory section will
//! be shared between the CPU and the CLA.
//!
//! The \e ramSection parameter should be a value from \b MEMCFG_SECT_LS0
//! through \b MEMCFG_SECT_LSx.
//!
//! This function will have no effect if the associated registers have been
//! locked by MemCfg_lockConfig() or MemCfg_commitConfig().
//!
//! \note This API only applies to LSxRAM.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setLSRAMControllerSel(uint32_t ramSection,
MemCfg_LSRAMControllerSel controllerSel);
//*****************************************************************************
//
//! Sets the controller of the specified GSxRAM section.
//!
//! \param ramSections is the logical OR of the sections to be configured.
//! \param controllerSel is the sharing selection.
//!
//! This function sets the controller select configuration of the GSxRAM
//! section.If the \e controllerSel parameter is \b MEMCFG_GSRAMCONTROLLER_CPU1,
//! the GSRAM sections passed into the \e ramSections parameter will be
//! dedicated to CPU1. If \b MEMCFG_GSRAMCONTROLLER_CPU2, the memory section
//! will be dedicated to CPU2.
//!
//! The \e ramSections parameter should be a logical OR of values from
//! \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx.
//!
//! This function will have no effect if the associated registers have been
//! locked by MemCfg_lockConfig() or MemCfg_commitConfig().
//!
//! \note This API only applies to GSxRAM.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setGSRAMControllerSel(uint32_t ramSections,
MemCfg_GSRAMControllerSel controllerSel);
//*****************************************************************************
//
//! Sets the test mode of the specified memory section.
//!
//! \param memSection is the memory section to be configured.
//! \param testMode is the test mode selected.
//!
//! This function sets the test mode configuration of the RAM section. The
//! \e testMode parameter can take one of the following values:
//! - \b MEMCFG_TEST_FUNCTIONAL
//! - \b MEMCFG_TEST_WRITE_DATA
//! - \b MEMCFG_TEST_WRITE_ECC
//! - \b MEMCFG_TEST_WRITE_PARITY
//!
//! The \e memSection parameter is one of the following indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1
//! - \b MEMCFG_SECT_D0, \b MEMCFG_SECT_D1
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx
//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or
//! \b MEMCFG_SECT_MSGCLA1TOCPU
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode);
//*****************************************************************************
//
//! Starts the initialization the specified RAM sections.
//!
//! \param ramSections is the logical OR of the sections to be initialized.
//!
//! This function starts the initialization of the specified RAM sections. Use
//! MemCfg_getInitStatus() to check if the initialization is done.
//!
//! The \e ramSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0,
//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or
//! \b MEMCFG_SECT_MSGCLA1TOCPU
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_initSections(uint32_t ramSections);
//*****************************************************************************
//
//! Get the status of initialized RAM sections.
//!
//! \param ramSections is the logical OR of the sections to be checked.
//!
//! This function gets the initialization status of the RAM sections specified
//! by the \e ramSections parameter.
//!
//! The \e ramSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0,
//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or
//! \b MEMCFG_SECT_MSGCLA1TOCPU
//! - \b OR use \b MEMCFG_SECT_ALL to get status of all possible sections.
//!
//! \note Use MemCfg_initSections() to start the initialization.
//!
//! \return Returns \b true if all the sections specified by \e ramSections
//! have been initialized and \b false if not.
//
//*****************************************************************************
extern bool
MemCfg_getInitStatus(uint32_t ramSections);
//*****************************************************************************
//
//! Get the violation address associated with a intFlag.
//!
//! \param intFlag is the type of access violation as indicated by ONE of
//! these values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//!
//! \return Returns the violation address associated with the \e intFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getViolationAddress(uint32_t intFlag);
//*****************************************************************************
//
//! Get the correctable error address associated with a stsFlag.
//!
//! \param stsFlag is the type of error to which the returned address will
//! correspond. Can currently take the value \b MEMCFG_CERR_CPUREAD only.
//! Other values are reserved.
//!
//! \return Returns the error address associated with the stsFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getCorrErrorAddress(uint32_t stsFlag);
//*****************************************************************************
//
//! Get the uncorrectable error address associated with a stsFlag.
//!
//! \param stsFlag is the type of error to which the returned address will
//! correspond. It may be passed one of these values:
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, or
//! \b MEMCFG_UCERR_CLA1READ values
//!
//! \return Returns the error address associated with the stsFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getUncorrErrorAddress(uint32_t stsFlag);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // MEMCFG_H