ba3405d9edf39015716228bdad6d06838bf09f92
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / family / common / vayu / vayuipu / vayucore0 / VAYUIpuCore0HalReset.c
1 /*
2  *  @file   VAYUIpuCore0HalReset.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 VAYUIPUCORE0.
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  *  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 #include <ti/syslink/Std.h>
56 /* OSAL & Utils headers */
57 #include <ti/syslink/utils/Trace.h>
58 #include <Bitops.h>
60 /* Module level headers */
61 #include <_ProcDefs.h>
62 #include <Processor.h>
64 /* Hardware Abstraction Layer headers */
65 #include <VAYUIpuHal.h>
66 #include <VAYUIpuCore0HalReset.h>
68 #include <hw/inout.h>
70 #if defined (__cplusplus)
71 extern "C" {
72 #endif
75 /* =============================================================================
76  *  Macros and types
77  * =============================================================================
78  */
79 /* M4 PRCM Regs*/
80 #define RM_IPU_RSTCTRL_OFFSET        0x210
81 #define RM_IPU_RSTST_OFFSET          0x214
83 #define CM_IPU_CLKSTCTRL_OFFSET      0x200
84 #define CM_IPU_IPU_CLKCTRL_OFFSET    0x220
86 /*
87  * empirically determined delay that is necessary between when the IPU
88  * clock is enabled and when the status bit is set
89  */
90 #define DELAY                        100
92 /*
93  * IPU1 functional clock selection
94  * 0: DPLL_ABE_X2_CLK
95  * 1: CORE_IPU_ISS_BOOST_CLK
96  */
97 #define USE_CORE_IPU_ISS_BOOST_CLK   1
99 #if USE_CORE_IPU_ISS_BOOST_CLK
100 #define IPU1_CLKSEL                  0x1000000
101 #else
102 #define IPU1_CLKSEL                  0x0
103 #endif
105 /* =============================================================================
106  * APIs called by VAYUIPUCORE0PROC module
107  * =============================================================================
108  */
109 /*!
110  *  @brief      Function to control reset operations
111  *
112  *  @param      halObj  Pointer to the HAL object
113  *  @param      cmd     Reset control command
114  *  @param      arg     Arguments specific to the reset control command
115  *
116  *  @sa
117  */
118 Int
119 VAYUIPUCORE0_halResetCtrl (Ptr halObj, Processor_ResetCtrlCmd cmd)
121     Int                 status    = PROCESSOR_SUCCESS;
122     VAYUIPU_HalObject * halObject = NULL;
123     UInt32              cmBase;
124     UInt32              prmBase;
125     UInt32              reg       = 0;
126     UInt32              counter   = DELAY;
128     GT_2trace (curTrace, GT_ENTER, "VAYUIPUCORE0_halResetCtrl", halObj, cmd);
130     GT_assert (curTrace, (halObj != NULL));
131     GT_assert (curTrace, (cmd < Processor_ResetCtrlCmd_EndValue));
133     halObject = (VAYUIPU_HalObject *) halObj ;
134     cmBase = halObject->cmBase;
135     prmBase = halObject->prmBase;
137     switch (cmd) {
138         case Processor_ResetCtrlCmd_Reset:
139         {
140 #ifdef SYSLINK_SYSBIOS_SMP
141             /*Put Benelli M4_0 and M4_1 to Reset*/
142             /* Put IPU core 0 and core 1 into reset */
143             SETBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 1);
144             SETBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0);
145             /* Read back the reset control register */
146             reg = INREG32(prmBase + RM_IPU_RSTCTRL_OFFSET);
147 #else
148             /*Put ONLY Benelli M4_0 to Reset*/
149             /* Put IPU core 0 into reset */
150             SETBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0);
151             /* Read back the reset control register */
152             reg = INREG32(prmBase + RM_IPU_RSTCTRL_OFFSET);
153 #endif
154         }
155         break;
157         case Processor_ResetCtrlCmd_MMU_Reset:
158         {
159             /* Put IPU MMU into reset */
160             SETBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0x2);
161             /* Disable the IPU clock */
162             OUTREG32(cmBase + CM_IPU_IPU_CLKCTRL_OFFSET, 0x01);
163         }
164         break;
166         case Processor_ResetCtrlCmd_MMU_Release:
167         {
168             reg = INREG32(prmBase + RM_IPU_RSTST_OFFSET);
169             if (reg != 0x0) {
170                 Osal_printf("VAYUIPUCORE0_halResetCtrl: clearing reset status!\n");
171                 OUTREG32(prmBase + RM_IPU_RSTST_OFFSET, reg);
172                 while ((reg = INREG32(prmBase + RM_IPU_RSTST_OFFSET)) != 0x0);
173                 Osal_printf("VAYUIPUCORE0_halResetCtrl: reset state reset!\n");
174             }
175             /* Module is managed automatically by HW */
176             if (halObject->procId == MultiProc_getId("IPU1")) {
177                 /* For IPU1, select CORE_IPU_ISS_BOOST_CLK as functional clk */
178                 OUTREG32(cmBase + CM_IPU_IPU_CLKCTRL_OFFSET, 0x1 | IPU1_CLKSEL);
179             }
180             else {
181                 OUTREG32(cmBase + CM_IPU_IPU_CLKCTRL_OFFSET, 0x1);
182             }
183             /* Enable the IPU clock */
184             OUTREG32(cmBase + CM_IPU_CLKSTCTRL_OFFSET, 0x2);
186             do {
187                 if (TESTBITREG32(cmBase + CM_IPU_CLKSTCTRL_OFFSET,
188                                  8)) {
189                     Osal_printf("IPU clock enabled:"
190                                 "CORE_CM_IPU_CLKSTCTRL = 0x%x\n",
191                                 INREG32(cmBase + CM_IPU_CLKSTCTRL_OFFSET));
192                     break;
193                 }
194             } while (--counter);
196 #ifndef VAYU_VIRTIO // skip this check
197             if (counter == 0) {
198                 Osal_printf("FAILED TO ENABLE IPU CLOCK !\n");
199                 return PROCESSOR_E_OSFAILURE;
200             }
201 #endif
203             /* Check that releasing resets would indeed be effective */
204             reg =  INREG32(prmBase + RM_IPU_RSTCTRL_OFFSET);
205             if (reg != 0x7) {
206                 Osal_printf("VAYUIPUCORE0_halResetCtrl: "
207                             "Resets in not proper state! [0x%x]\n",
208                             reg);
209                 OUTREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0x7);
210                 while ((INREG32(prmBase + RM_IPU_RSTCTRL_OFFSET) & 0x7) != 0x7);
211             }
213             /* De-assert RST3, and clear the Reset status */
214             Osal_printf("De-assert RST3\n");
215             CLRBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 2);
217 #ifndef VAYU_VIRTIO // skip this check, reset status not modeled properly
218             while (!(INREG32(prmBase + RM_IPU_RSTST_OFFSET) & 0x4));
219             Osal_printf("RST3 released!\n");
220             SETBITREG32(prmBase + RM_IPU_RSTST_OFFSET, 2);
221 #endif
222         }
223         break;
225         case Processor_ResetCtrlCmd_Release:
226         {
227 #ifdef SYSLINK_SYSBIOS_SMP
228             /*Bring Benelli M4_0 and M4_1 out of Reset*/
229             /* De-assert RST1 and RST2, and clear the Reset status */
230             Osal_printf("De-assert RST1\n");
231             CLRBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0);
232             Osal_printf("De-assert RST2\n");
233             CLRBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 1);
235 #ifndef VAYU_VIRTIO // skip this check for now
236             while (!(INREG32(prmBase + RM_IPU_RSTST_OFFSET) & 0x3));
237             Osal_printf("RST1 & RST2 released!");
238             SETBITREG32(prmBase + RM_IPU_RSTST_OFFSET, 0);
239             SETBITREG32(prmBase + RM_IPU_RSTST_OFFSET, 1);
240 #endif
241 #else
242             /*Bring ONLY Benelli M4_0 out of Reset*/
243             /* De-assert RST1, and clear the Reset status */
244             Osal_printf("De-assert RST1\n");
245             CLRBITREG32(prmBase + RM_IPU_RSTCTRL_OFFSET, 0);
247 #ifndef VAYU_VIRTIO // skip this check for now
248             while (!(INREG32(prmBase + RM_IPU_RSTST_OFFSET) & 0x1));
249             Osal_printf("RST1 released!");
250             SETBITREG32(prmBase + RM_IPU_RSTST_OFFSET, 0);
251 #endif
252 #endif
254             /* Setting to HW_AUTO Mode */
255             reg = INREG32(cmBase + CM_IPU_CLKSTCTRL_OFFSET);
256             reg &= ~0x3;
257             reg |= 0x3;
258             OUTREG32(cmBase + CM_IPU_CLKSTCTRL_OFFSET, reg);
259         }
260         break;
262         case Processor_ResetCtrlCmd_PeripheralUp:
263         {
264             /* Nothing to be done to bringup the peripherals for this device. */
265         }
266         break;
268         default:
269         {
270             /*! @retval PROCESSOR_E_INVALIDARG Invalid argument */
271             status = PROCESSOR_E_INVALIDARG;
272             GT_setFailureReason (curTrace,
273                                  GT_4CLASS,
274                                  "VAYUIPUCORE0_halResetCtrl",
275                                  status,
276                                  "Unsupported reset ctrl cmd specified");
277         }
278         break ;
279     }
281     GT_1trace (curTrace, GT_LEAVE, "VAYUIPUCORE0_halResetCtrl",status);
283     /*! @retval PROCESSOR_SUCCESS Operation successful */
284     return status;
288 #if defined (__cplusplus)
290 #endif