6781bb2e3399a3bd14726dd66446610ccec681a3
[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, 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  *  Contact information for paper mail:
42  *  Texas Instruments
43  *  Post Office Box 655303
44  *  Dallas, Texas 75265
45  *  Contact information:
46  *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
47  *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
48  *  ============================================================================
49  *
50  */
54 #if defined(SYSLINK_BUILD_RTOS)
55 #include <xdc/std.h>
56 #include <xdc/runtime/Error.h>
57 #endif /* #if defined(SYSLINK_BUILD_RTOS) */
59 #if defined(SYSLINK_BUILD_HLOS)
60 #include <ti/syslink/Std.h>
61 #endif /* #if defined(SYSLINK_BUILD_HLOS) */
63 /* OSAL & Utils headers */
64 #include <ti/syslink/utils/Trace.h>
65 #include <Bitops.h>
67 /* Module level headers */
68 #include <_ProcDefs.h>
69 #include <Processor.h>
71 /* Hardware Abstraction Layer headers */
72 #include <VAYUDspHal.h>
73 #include <VAYUDspHalReset.h>
75 #include <hw/inout.h>
77 #if defined (__cplusplus)
78 extern "C" {
79 #endif
82 /* =============================================================================
83  *  Macros and types
84  * =============================================================================
85  */
86 /* DSP PRCM Regs*/
87 #define CM_DSP_CLKSTCTRL      0x400
88 #define CM_DSP_STATICDEP      0x404
89 #define CM_DSP_DYNMICDEP      0x408
90 #define CM_DSP_DSP_CLKCTRL    0x420
92 #define PM_DSP_PWRSTCTRL      0x400
93 #define PM_DSP_PWRSTST        0x404
94 #define RM_DSP_RSTCTRL        0x410
95 #define RM_DSP_RSTST          0x414
97 #define DSP_SYS_MMU_CONFIG_OFFSET 0x18
99 /* =============================================================================
100  * APIs called by VAYUDSPPROC module
101  * =============================================================================
102  */
103 /*!
104  *  @brief      Function to control reset operations
105  *
106  *  @param      halObj  Pointer to the HAL object
107  *  @param      cmd     Reset control command
108  *  @param      arg     Arguments specific to the reset control command
109  *
110  *  @sa
111  */
112 Int
113 VAYUDSP_halResetCtrl(Ptr halObj, VAYUDspHal_ResetCmd cmd)
115     Int                     status = PROCESSOR_SUCCESS;
116     VAYUDSP_HalObject *     halObject = NULL;
117     UInt32                  cmBase;
118     UInt32                  prmBase;
119     UInt32                  mmuSysBase;
120     UInt32                  addr;
121     UInt32                  val;
122     Int32                   counter = 10;
124     GT_2trace(curTrace, GT_ENTER, "VAYUDSP_halResetCTRL", halObj, cmd);
126     GT_assert(curTrace, (halObj != NULL));
127     GT_assert(curTrace, (cmd < VAYUDspHal_Reset_EndValue));
129     halObject = (VAYUDSP_HalObject *)halObj;
130     cmBase = halObject->cmBase;
131     prmBase = halObject->prmBase;
132     mmuSysBase = halObject->mmuSysBase;
134     switch (cmd) {
135         case Processor_ResetCtrlCmd_Reset:
136         {
137             /* assert GEM global and cpu resets */
138             addr = prmBase + RM_DSP_RSTCTRL;
139             SETBITREG32(addr, 0x0);
141         }
142         break;
144         case Processor_ResetCtrlCmd_MMU_Reset:
145         {
146             /* Assert MMU Reset */
147             addr = prmBase + RM_DSP_RSTCTRL;
148             SETBITREG32(addr, 0x1);
150         }
151         break;
153         case Processor_ResetCtrlCmd_MMU_Release:
154         {
155             /* clear status bit, write-1 to clear bit */
156             addr = prmBase + RM_DSP_RSTST;
157             val = INREG32(addr);
158             if (val != 0x0) {
159                 Osal_printf("VAYUDSP_halResetCtrl: clearing DSP reset status!\n");
160                 OUTREG32(addr, val);
161                 while ((val = INREG32(addr)) != 0x0);
162                 Osal_printf("VAYUDSP_halResetCtrl: DSP reset state reset!\n");
163             }
165             addr = prmBase + PM_DSP_PWRSTCTRL;
166             val = INREG32(addr);
167             val |= 0x7;
168             OUTREG32(addr, val);
169             addr = prmBase + PM_DSP_PWRSTST;
170             val = INREG32(addr);
171             /* Module is managed automatically by HW */
172             addr = cmBase + CM_DSP_DSP_CLKCTRL;
173             OUTREG32(addr, 0x01);
174             /* Enable the DSP clock */
175             addr = cmBase + CM_DSP_CLKSTCTRL;
176             OUTREG32(addr, 0x02);
177 #ifndef VAYU_VIRTIO
178             do {
179                 val = INREG32(addr);
180                 if (val & 0x100) {
181                     Osal_printf("DSP clock enabled:DSP_CLKSTCTRL = 0x%x\n", val);
182                     break;
183                 }
184             } while (--counter);
185             if (counter == 0) {
186                 Osal_printf("FAILED TO ENABLE DSP CLOCK !\n");
187                 status = -1;
188                 break;
189             }
190 #endif
191             /* Check that releasing resets would indeed be effective */
192             addr = prmBase + RM_DSP_RSTCTRL;
193             val =  INREG32(addr);
194             if (val != 3) {
195                 Osal_printf("DSP Resets in not proper state! [0x%x]\n", val);
196                 OUTREG32(addr, 0x3);
197                 counter = 1000;
198 #ifndef VAYU_VIRTIO
199                 while ((--counter)&&((INREG32(addr) & 0x3) != 0x3));
200                 if (counter == 0) {
201                     Osal_printf("RESET bits not set in DSP reset Ctrl!\n");
202                     status = -1;
203                     break;
204                 }
205 #endif
206             }
207             /* De-assert RST2, and clear the Reset status */
208             OUTREG32(addr, 0x1);
209             addr = prmBase + RM_DSP_RSTST;
210 #ifndef VAYU_VIRTIO
211             while (!((INREG32(addr))& 0x2));
212 #endif
213             Osal_printf("DSP:RST2 released!\n");
214             OUTREG32(addr, 0x2);
216             /* enable MMU0 and MMU1 through global system register */
217             val = INREG32(mmuSysBase + DSP_SYS_MMU_CONFIG_OFFSET);
218             OUTREG32(mmuSysBase + DSP_SYS_MMU_CONFIG_OFFSET, (val & ~0x11) | 0x11);
219             Osal_printf("DSP:SYS_MMU_CONFIG MMU0 and MMU1 enabled!\n");
220         }
221         break;
223         case Processor_ResetCtrlCmd_Release:
224         {
225             addr = prmBase + PM_DSP_PWRSTCTRL;
226             val = INREG32(addr);
227             val |= 0x7;
228             OUTREG32(addr, val);
229             addr = prmBase + PM_DSP_PWRSTST;
230             val = INREG32(addr);
231             /* Module is managed automatically by HW */
232             addr = cmBase + CM_DSP_DSP_CLKCTRL;
233             OUTREG32(addr, 0x01);
234             /* Enable the DSP clock */
235             addr = cmBase + CM_DSP_CLKSTCTRL;
236             OUTREG32(addr, 0x02);
238             /*De-assert RST2 and clear the Reset Status */
239             addr = prmBase + RM_DSP_RSTCTRL;
240             Osal_printf("De-assert DSP RST1\n");
241             OUTREG32(addr, 0x0);
242             Osal_printf("DSP:RST1 released!\n");
243             addr = prmBase + RM_DSP_RSTST;
244             OUTREG32(addr, 0x1);
245         }
246         break;
248         default:
249         {
250             /*! @retval PROCESSOR_E_INVALIDARG Invalid argument */
251             status = PROCESSOR_E_INVALIDARG;
252             GT_setFailureReason(curTrace, GT_4CLASS,
253                 "VAYUDSP_halResetCtrl", status,
254                 "Unsupported reset ctrl cmd specified");
255         }
256         break;
257     }
259     GT_1trace(curTrace, GT_LEAVE, "VAYUDSP_halResetCtrl", status);
261     /*! @retval PROCESSOR_SUCCESS Operation successful */
262     return status;
266 #if defined (__cplusplus)
268 #endif