1 /******************************************************************************
2 *  Filename:       vims.h
3 *  Revised:        2016-10-06 17:21:09 +0200 (Thu, 06 Oct 2016)
4 *  Revision:       47343
5 *
6 *  Description:    Defines and prototypes for the VIMS.
7 *
8 *  Copyright (c) 2015 - 2020, Texas Instruments Incorporated
9 *  All rights reserved.
10 *
11 *  Redistribution and use in source and binary forms, with or without
12 *  modification, are permitted provided that the following conditions are met:
13 *
14 *  1) Redistributions of source code must retain the above copyright notice,
15 *     this list of conditions and the following disclaimer.
16 *
17 *  2) Redistributions in binary form must reproduce the above copyright notice,
18 *     this list of conditions and the following disclaimer in the documentation
19 *     and/or other materials provided with the distribution.
20 *
21 *  3) Neither the name of the ORGANIZATION nor the names of its contributors may
22 *     be used to endorse or promote products derived from this software without
23 *     specific prior written permission.
24 *
25 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
29 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 *  POSSIBILITY OF SUCH DAMAGE.
36 *
37 ******************************************************************************/
38 
39 //*****************************************************************************
40 //
41 //! \addtogroup system_control_group
42 //! @{
43 //! \addtogroup vims_api
44 //! @{
45 //
46 //*****************************************************************************
47 
48 #ifndef __VIMS_H__
49 #define __VIMS_H__
50 
51 //*****************************************************************************
52 //
53 // If building with a C++ compiler, make all of the definitions in this header
54 // have a C binding.
55 //
56 //*****************************************************************************
57 #ifdef __cplusplus
58 extern "C"
59 {
60 #endif
61 
62 #include <stdbool.h>
63 #include <stdint.h>
64 #include "../inc/hw_types.h"
65 #include "../inc/hw_memmap.h"
66 #include "../inc/hw_vims.h"
67 #include "debug.h"
68 
69 //*****************************************************************************
70 //
71 // Support for DriverLib in ROM:
72 // This section renames all functions that are not "static inline", so that
73 // calling these functions will default to implementation in flash. At the end
74 // of this file a second renaming will change the defaults to implementation in
75 // ROM for available functions.
76 //
77 // To force use of the implementation in flash, e.g. for debugging:
78 // - Globally: Define DRIVERLIB_NOROM at project level
79 // - Per function: Use prefix "NOROM_" when calling the function
80 //
81 //*****************************************************************************
82 #if !defined(DOXYGEN)
83     #define VIMSConfigure                   NOROM_VIMSConfigure
84     #define VIMSModeSet                     NOROM_VIMSModeSet
85     #define VIMSModeGet                     NOROM_VIMSModeGet
86     #define VIMSModeSafeSet                 NOROM_VIMSModeSafeSet
87 #endif
88 
89 //*****************************************************************************
90 //
91 // Values that can be passed to VIMSModeSet() as the ui32IntFlags parameter,
92 // and returned from VIMSModeGet().
93 //
94 //*****************************************************************************
95 #define VIMS_MODE_CHANGING 0x4                   // VIMS mode is changing now and VIMS_MODE
96                                                  // can not be changed at moment.
97 #define VIMS_MODE_DISABLED (VIMS_CTL_MODE_GPRAM) // Disabled mode (GPRAM enabled).
98 #define VIMS_MODE_ENABLED  (VIMS_CTL_MODE_CACHE) // Enabled mode, only USERCODE is cached.
99 #define VIMS_MODE_OFF      (VIMS_CTL_MODE_OFF)   // VIMS Cache RAM is off
100 
101 //*****************************************************************************
102 //
103 // API Functions and prototypes
104 //
105 //*****************************************************************************
106 
107 #ifdef DRIVERLIB_DEBUG
108 //*****************************************************************************
109 //
110 //! \brief Checks a VIMS base address.
111 //!
112 //! This function determines if the VIMS base address is valid.
113 //!
114 //! \param ui32Base is the base address of the VIMS.
115 //!
116 //! \return Returns \c true if the base address is valid and \c false
117 //! otherwise.
118 //
119 //*****************************************************************************
120 static bool
VIMSBaseValid(uint32_t ui32Base)121 VIMSBaseValid(uint32_t ui32Base)
122 {
123     return(ui32Base == VIMS_BASE);
124 }
125 #endif
126 
127 //*****************************************************************************
128 //
129 //! \brief Configures the VIMS.
130 //!
131 //! This function sets general control settings of the VIMS system.
132 //!
133 //! \note The VIMS mode must be set using the \ref VIMSModeSet() call.
134 //!
135 //! \param ui32Base is the base address of the VIMS.
136 //! \param bRoundRobin specifies the arbitration method.
137 //! - \c true  : Round Robin arbitration between the two available read/write interfaces
138 //! (i.e. Icode/Dcode and Sysbus) is to be used.
139 //! - \c false : Strict arbitration will be used, where Icode/Dcode
140 //! is preferred over the Sysbus.
141 //! \param bPrefetch specifies if prefetching is to be used.
142 //! - \c true  : Cache is to prefetch tag data for the following address.
143 //! - \c false : No prefetch.
144 //!
145 //! \return None
146 //!
147 //! \sa \ref VIMSModeSet()
148 //
149 //*****************************************************************************
150 extern void VIMSConfigure(uint32_t ui32Base, bool bRoundRobin,
151                           bool bPrefetch);
152 
153 //*****************************************************************************
154 //
155 //! \brief Set the operational mode of the VIMS.
156 //!
157 //! This function sets the operational mode of the VIMS.
158 //!
159 //! Upon reset the VIMS will be in \ref VIMS_MODE_CHANGING mode.
160 //!   In this mode the VIMS will initialize the cache (GP) RAM (to all zeros).
161 //!   The GP RAM will not be operational (read/write will result in bus fault).
162 //!   The Cache will not be operational.
163 //!   Reads and writes to flash will be uncached.
164 //!   After a short delay (approx. 1029 clock cycles) the VIMS will
165 //!   automatically switch mode to \ref VIMS_MODE_DISABLED (GPRAM enabled).
166 //!
167 //! In \ref VIMS_MODE_DISABLED mode, the cache is disabled but the GP RAM is
168 //! accessible:
169 //!   The GP RAM will be accessible.
170 //!   The Cache will not be operational.
171 //!   Reads from flash will be uncached.
172 //!   From this mode, the VIMS may be put in \ref VIMS_MODE_ENABLED (CACHE mode).
173 //!
174 //! In \ref VIMS_MODE_ENABLED mode, the cache is enabled for \b USERCODE space.
175 //!   The GP RAM will not be operational (read/write will result in bus fault).
176 //!   The Cache will be operational for SYSCODE space.
177 //!   Reads from flash in USERCODE space will be uncached.
178 //!
179 //! In \ref VIMS_MODE_OFF the cache RAM is off to conserve power.
180 //!
181 //! \note The VIMS must be invalidated when switching mode.
182 //! This is done by setting VIMS_MODE_OFF before setting any new mode.
183 //! This is automatically handled in \ref VIMSModeSafeSet()
184 //!
185 //! \note It is highly recommended that the VIMS is put in disabled mode before
186 //! \b writing to flash, since the cache will not be updated nor invalidated
187 //! by flash writes. The line buffers should also be disabled when updating the
188 //! flash. Once \ref VIMSModeSet() is used to set the VIMS in
189 //! \ref VIMS_MODE_CHANGING mode, the user should check using
190 //! \ref VIMSModeGet() when the mode switches to \ref VIMS_MODE_DISABLED. Only when
191 //! the mode has changed the cache has been completely invalidated.
192 //!
193 //! \note Access from System Bus is never cached. Only access through ICODE
194 //! DCODE bus from the System CPU is cached.
195 //!
196 //! \param ui32Base is the base address of the VIMS.
197 //! \param ui32Mode is the operational mode.
198 //! - \ref VIMS_MODE_DISABLED (GPRAM enabled)
199 //! - \ref VIMS_MODE_ENABLED  (CACHE mode)
200 //! - \ref VIMS_MODE_OFF
201 //!
202 //! \return None
203 //!
204 //! \sa \ref VIMSModeGet() and \ref VIMSModeSafeSet()
205 //
206 //*****************************************************************************
207 extern void VIMSModeSet(uint32_t ui32Base, uint32_t ui32Mode);
208 
209 //*****************************************************************************
210 //
211 //! \brief Get the current operational mode of the VIMS.
212 //!
213 //! This function returns the operational mode of the VIMS.
214 //!
215 //! \param ui32Base is the base address of the VIMS.
216 //!
217 //! \return Returns one of:
218 //! - \ref VIMS_MODE_CHANGING
219 //! - \ref VIMS_MODE_DISABLED (GPRAM enabled)
220 //! - \ref VIMS_MODE_ENABLED  (CACHE mode)
221 //! - \ref VIMS_MODE_OFF
222 //!
223 //! \sa \ref VIMSModeSet()
224 //
225 //*****************************************************************************
226 extern uint32_t VIMSModeGet(uint32_t ui32Base);
227 
228 //*****************************************************************************
229 //
230 //! \brief Set the operational mode of the VIMS in a safe sequence.
231 //!
232 //! This function sets the operational mode of the VIMS in a safe sequence
233 //!
234 //! Upon reset the VIMS will be in \ref VIMS_MODE_CHANGING mode.
235 //!   In this mode the VIMS will initialize the cache (GP) RAM (to all zeros).
236 //!   The GP RAM will not be operational (read/write will result in bus fault).
237 //!   The Cache will not be operational (read/write to flash will be uncached).
238 //!   After a short delay (approx. 1029 clock cycles) the VIMS will
239 //!   automatically switch mode to \ref VIMS_MODE_DISABLED (GPRAM enabled).
240 //!
241 //! In \ref VIMS_MODE_DISABLED mode, the cache is disabled but the GP RAM is
242 //! accessible:
243 //!   The GP RAM will be accessible.
244 //!   The Cache will not be operational.
245 //!   Reads from flash will be uncached.
246 //!   From this mode, the VIMS may be put in \ref VIMS_MODE_ENABLED (CACHE mode).
247 //!
248 //! In \ref VIMS_MODE_ENABLED mode, the cache is enabled for \b USERCODE space.
249 //!   The GP RAM will not be operational (read/write will result in bus fault).
250 //!   The Cache will be operational for SYSCODE space.
251 //!   Reads from flash in USERCODE space will be uncached.
252 //!
253 //! In \ref VIMS_MODE_OFF the cache RAM is off to conserve power.
254 //!
255 //! \note The VIMS must be invalidated when switching mode.
256 //! This is done by setting VIMS_MODE_OFF before setting any new mode.
257 //! This is automatically handled in this function.
258 //!
259 //! \note It is highly recommended that the VIMS is put in disabled mode before
260 //! \b writing to flash, since the cache will not be updated nor invalidated
261 //! by flash writes. The line buffers should also be disabled when updating the
262 //! flash.
263 //!
264 //! \note Access from System Bus is never cached. Only access through ICODE
265 //! DCODE bus from the System CPU is cached.
266 //!
267 //! \param ui32Base is the base address of the VIMS.
268 //! \param ui32NewMode is the new operational mode:
269 //! - \ref VIMS_MODE_DISABLED (GPRAM enabled)
270 //! - \ref VIMS_MODE_ENABLED  (CACHE mode)
271 //! - \ref VIMS_MODE_OFF
272 //! \param blocking shall be set to TRUE if further code execution shall be
273 //! blocked (delayed) until mode change is completed.
274 //!
275 //! \return None
276 //!
277 //! \sa \ref VIMSModeSet() and \ref VIMSModeGet()
278 //
279 //*****************************************************************************
280 extern void VIMSModeSafeSet( uint32_t ui32Base    ,
281                              uint32_t ui32NewMode ,
282                              bool     blocking    );
283 
284 //*****************************************************************************
285 //
286 //! \brief Disable VIMS linebuffers.
287 //!
288 //! Linebuffers should only be disabled when attempting to update the flash, to
289 //! ensure that the content of the buffers is not stale. As soon as flash is
290 //! updated the linebuffers should be reenabled. Failing to enable
291 //! will have a performance impact.
292 //!
293 //! \param ui32Base is the base address of the VIMS.
294 //!
295 //! \return None.
296 //
297 //*****************************************************************************
298 __STATIC_INLINE void
VIMSLineBufDisable(uint32_t ui32Base)299 VIMSLineBufDisable(uint32_t ui32Base)
300 {
301     // Disable line buffers
302     HWREG(ui32Base + VIMS_O_CTL) |= VIMS_CTL_IDCODE_LB_DIS_M |
303                                         VIMS_CTL_SYSBUS_LB_DIS_M;
304 }
305 
306 //*****************************************************************************
307 //
308 //! \brief Enable VIMS linebuffers.
309 //!
310 //! Linebuffers should only be disabled when attempting to update the flash, to
311 //! ensure that the content of the buffers is not stale. As soon as flash is
312 //! updated the linebuffers should be reenabled. Failing to enable
313 //! will have a performance impact.
314 //!
315 //! \param ui32Base is the base address of the VIMS.
316 //!
317 //! \return None.
318 //
319 //*****************************************************************************
320 __STATIC_INLINE void
VIMSLineBufEnable(uint32_t ui32Base)321 VIMSLineBufEnable(uint32_t ui32Base)
322 {
323     // Enable linebuffers
324     HWREG(ui32Base + VIMS_O_CTL) &= ~(VIMS_CTL_IDCODE_LB_DIS_M |
325                                           VIMS_CTL_SYSBUS_LB_DIS_M);
326 }
327 
328 //*****************************************************************************
329 //
330 // Support for DriverLib in ROM:
331 // Redirect to implementation in ROM when available.
332 //
333 //*****************************************************************************
334 #if !defined(DRIVERLIB_NOROM) && !defined(DOXYGEN)
335     #include "../driverlib/rom.h"
336     #ifdef ROM_VIMSConfigure
337         #undef  VIMSConfigure
338         #define VIMSConfigure                   ROM_VIMSConfigure
339     #endif
340     #ifdef ROM_VIMSModeSet
341         #undef  VIMSModeSet
342         #define VIMSModeSet                     ROM_VIMSModeSet
343     #endif
344     #ifdef ROM_VIMSModeGet
345         #undef  VIMSModeGet
346         #define VIMSModeGet                     ROM_VIMSModeGet
347     #endif
348     #ifdef ROM_VIMSModeSafeSet
349         #undef  VIMSModeSafeSet
350         #define VIMSModeSafeSet                 ROM_VIMSModeSafeSet
351     #endif
352 #endif
353 
354 //*****************************************************************************
355 //
356 // Mark the end of the C bindings section for C++ compilers.
357 //
358 //*****************************************************************************
359 #ifdef __cplusplus
360 }
361 #endif
362 
363 #endif //  __VIMS_H__
364 
365 //*****************************************************************************
366 //
367 //! Close the Doxygen group.
368 //! @}
369 //! @}
370 //
371 //*****************************************************************************
372