QNX: Remove dead virtio-related macros
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / family / common / vayu / vayudsp / VAYUDspHalReset.c
1 /*
2  *  @file   VAYUDspHalReset.c
3  *
4  *  @brief      Reset control module.
5  *
6  *              This module is responsible for handling reset-related hardware-
7  *              specific operations.
8  *              The implementation is specific to VAYUDSP.
9  *
10  *
11  *  ============================================================================
12  *
13  *  Copyright (c) 2013-2014, Texas Instruments Incorporated
14  *
15  *  Redistribution and use in source and binary forms, with or without
16  *  modification, are permitted provided that the following conditions
17  *  are met:
18  *
19  *  *  Redistributions of source code must retain the above copyright
20  *     notice, this list of conditions and the following disclaimer.
21  *
22  *  *  Redistributions in binary form must reproduce the above copyright
23  *     notice, this list of conditions and the following disclaimer in the
24  *     documentation and/or other materials provided with the distribution.
25  *
26  *  *  Neither the name of Texas Instruments Incorporated nor the names of
27  *     its contributors may be used to endorse or promote products derived
28  *     from this software without specific prior written permission.
29  *
30  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
31  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
32  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
33  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
35  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
36  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
37  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
38  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
39  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
40  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41  */
43 #if defined(SYSLINK_BUILD_RTOS)
44 #include <xdc/std.h>
45 #include <xdc/runtime/Error.h>
46 #endif /* #if defined(SYSLINK_BUILD_RTOS) */
48 #if defined(SYSLINK_BUILD_HLOS)
49 #include <ti/syslink/Std.h>
50 #endif /* #if defined(SYSLINK_BUILD_HLOS) */
52 /* OSAL & Utils headers */
53 #include <ti/syslink/utils/Trace.h>
54 #include <Bitops.h>
56 /* Module level headers */
57 #include <_ProcDefs.h>
58 #include <Processor.h>
60 /* Hardware Abstraction Layer headers */
61 #include <VAYUDspHal.h>
62 #include <VAYUDspHalReset.h>
64 #include <hw/inout.h>
66 #if defined (__cplusplus)
67 extern "C" {
68 #endif
71 /* =============================================================================
72  *  Macros and types
73  * =============================================================================
74  */
75 /* DSP PRCM Regs*/
76 #define CM_DSP_CLKSTCTRL      0x400
77 #define CM_DSP_STATICDEP      0x404
78 #define CM_DSP_DYNMICDEP      0x408
79 #define CM_DSP_DSP_CLKCTRL    0x420
81 #define PM_DSP_PWRSTCTRL      0x400
82 #define PM_DSP_PWRSTST        0x404
83 #define RM_DSP_RSTCTRL        0x410
84 #define RM_DSP_RSTST          0x414
86 #define DSP_SYS_MMU_CONFIG_OFFSET 0x18
88 /* =============================================================================
89  * APIs called by VAYUDSPPROC module
90  * =============================================================================
91  */
92 /*!
93  *  @brief      Function to control reset operations
94  *
95  *  @param      halObj  Pointer to the HAL object
96  *  @param      cmd     Reset control command
97  *  @param      arg     Arguments specific to the reset control command
98  *
99  *  @sa
100  */
101 Int
102 VAYUDSP_halResetCtrl(Ptr halObj, VAYUDspHal_ResetCmd cmd)
104     Int                     status = PROCESSOR_SUCCESS;
105     VAYUDSP_HalObject *     halObject = NULL;
106     UInt32                  cmBase;
107     UInt32                  prmBase;
108     UInt32                  mmuSysBase;
109     UInt32                  addr;
110     UInt32                  val;
111     Int32                   counter = 10;
113     GT_2trace(curTrace, GT_ENTER, "VAYUDSP_halResetCTRL", halObj, cmd);
115     GT_assert(curTrace, (halObj != NULL));
116     GT_assert(curTrace, (cmd < VAYUDspHal_Reset_EndValue));
118     halObject = (VAYUDSP_HalObject *)halObj;
119     cmBase = halObject->cmBase;
120     prmBase = halObject->prmBase;
121     mmuSysBase = halObject->mmuSysBase;
123     switch (cmd) {
124         case Processor_ResetCtrlCmd_Reset:
125         {
126             /* assert GEM global and cpu resets */
127             addr = prmBase + RM_DSP_RSTCTRL;
128             SETBITREG32(addr, 0x0);
130         }
131         break;
133         case Processor_ResetCtrlCmd_MMU_Reset:
134         {
135             /* Assert MMU Reset */
136             addr = prmBase + RM_DSP_RSTCTRL;
137             SETBITREG32(addr, 0x1);
139         }
140         break;
142         case Processor_ResetCtrlCmd_MMU_Release:
143         {
144             /* clear status bit, write-1 to clear bit */
145             addr = prmBase + RM_DSP_RSTST;
146             val = INREG32(addr);
147             if (val != 0x0) {
148                 Osal_printf("VAYUDSP_halResetCtrl: clearing DSP reset status!\n");
149                 OUTREG32(addr, val);
150                 while ((val = INREG32(addr)) != 0x0);
151                 Osal_printf("VAYUDSP_halResetCtrl: DSP reset state reset!\n");
152             }
154             addr = prmBase + PM_DSP_PWRSTCTRL;
155             val = INREG32(addr);
156             val |= 0x7;
157             OUTREG32(addr, val);
158             addr = prmBase + PM_DSP_PWRSTST;
159             val = INREG32(addr);
160             /* Module is managed automatically by HW */
161             addr = cmBase + CM_DSP_DSP_CLKCTRL;
162             OUTREG32(addr, 0x01);
163             /* Enable the DSP clock */
164             addr = cmBase + CM_DSP_CLKSTCTRL;
165             OUTREG32(addr, 0x02);
167             do {
168                 val = INREG32(addr);
169                 if (val & 0x100) {
170                     Osal_printf("DSP clock enabled:DSP_CLKSTCTRL = 0x%x\n", val);
171                     break;
172                 }
173             } while (--counter);
174             if (counter == 0) {
175                 Osal_printf("FAILED TO ENABLE DSP CLOCK !\n");
176                 status = -1;
177                 break;
178             }
180             /* Check that releasing resets would indeed be effective */
181             addr = prmBase + RM_DSP_RSTCTRL;
182             val =  INREG32(addr);
183             if (val != 3) {
184                 Osal_printf("DSP Resets in not proper state! [0x%x]\n", val);
185                 OUTREG32(addr, 0x3);
186                 counter = 1000;
188                 while ((--counter)&&((INREG32(addr) & 0x3) != 0x3));
189                 if (counter == 0) {
190                     Osal_printf("RESET bits not set in DSP reset Ctrl!\n");
191                     status = -1;
192                     break;
193                 }
194             }
195             /* De-assert RST2, and clear the Reset status */
196             OUTREG32(addr, 0x1);
197             addr = prmBase + RM_DSP_RSTST;
199             while (!((INREG32(addr))& 0x2));
201             Osal_printf("DSP:RST2 released!\n");
202             OUTREG32(addr, 0x2);
204             /* enable MMU0 and MMU1 through global system register */
205             val = INREG32(mmuSysBase + DSP_SYS_MMU_CONFIG_OFFSET);
206             OUTREG32(mmuSysBase + DSP_SYS_MMU_CONFIG_OFFSET, (val & ~0x11) | 0x11);
207             Osal_printf("DSP:SYS_MMU_CONFIG MMU0 and MMU1 enabled!\n");
208         }
209         break;
211         case Processor_ResetCtrlCmd_Release:
212         {
213             addr = prmBase + PM_DSP_PWRSTCTRL;
214             val = INREG32(addr);
215             val |= 0x7;
216             OUTREG32(addr, val);
217             addr = prmBase + PM_DSP_PWRSTST;
218             val = INREG32(addr);
219             /* Module is managed automatically by HW */
220             addr = cmBase + CM_DSP_DSP_CLKCTRL;
221             OUTREG32(addr, 0x01);
222             /* Enable the DSP clock */
223             addr = cmBase + CM_DSP_CLKSTCTRL;
224             OUTREG32(addr, 0x02);
226             /*De-assert RST2 and clear the Reset Status */
227             addr = prmBase + RM_DSP_RSTCTRL;
228             Osal_printf("De-assert DSP RST1\n");
229             OUTREG32(addr, 0x0);
230             Osal_printf("DSP:RST1 released!\n");
231             addr = prmBase + RM_DSP_RSTST;
232             OUTREG32(addr, 0x1);
233         }
234         break;
236         default:
237         {
238             /*! @retval PROCESSOR_E_INVALIDARG Invalid argument */
239             status = PROCESSOR_E_INVALIDARG;
240             GT_setFailureReason(curTrace, GT_4CLASS,
241                 "VAYUDSP_halResetCtrl", status,
242                 "Unsupported reset ctrl cmd specified");
243         }
244         break;
245     }
247     GT_1trace(curTrace, GT_LEAVE, "VAYUDSP_halResetCtrl", status);
249     /*! @retval PROCESSOR_SUCCESS Operation successful */
250     return status;
254 #if defined (__cplusplus)
256 #endif