1 /*
2  * Copyright 2023-2024 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "fsl_clock.h"
9 #include "fsl_power.h"
10 #include "fsl_ezhv.h"
11 
12 /*******************************************************************************
13  * Definitions
14  ******************************************************************************/
15 /* Component ID definition, used by tools. */
16 #ifndef FSL_COMPONENT_ID
17 #define FSL_COMPONENT_ID "platform.drivers.ezhv"
18 #endif
19 
20 #define EZHV_M_EXT_INT    (11UL)
21 /* shared ram space between arm and ezhv, size=256Bytes */
22 #define EZHV_ARM2EZHV_PARA_ADDR    (0x2410FF00U)
23 
24 /*******************************************************************************
25  * Variables
26  ******************************************************************************/
27 static ezhv_callback_t s_ezhvCallback;
28 static void *s_ezhvCallbackParam;
29 
30 /*******************************************************************************
31  * Prototypes
32  ******************************************************************************/
33 
34 /*******************************************************************************
35  * Code
36  ******************************************************************************/
EZHV_Init(ezhv_copy_image_t * ezhvCopyImage)37 void EZHV_Init(ezhv_copy_image_t *ezhvCopyImage)
38 {
39     EZHV_InitWithoutFirmware();
40     EZHV_InstallFirmware(ezhvCopyImage);
41 }
42 
EZHV_InitWithoutFirmware(void)43 void EZHV_InitWithoutFirmware(void)
44 {
45     CLOCK_EnableClock(kCLOCK_Ezhv);
46     CLOCK_EnableClock(kCLOCK_AxbsEzh);
47 
48     POWER_DisablePD(kPDRUNCFG_APD_EZHV_TCM);
49     POWER_DisablePD(kPDRUNCFG_PPD_EZHV_TCM);
50     POWER_ApplyPD();
51 }
52 
EZHV_InstallFirmware(ezhv_copy_image_t * ezhvCopyImage)53 void EZHV_InstallFirmware(ezhv_copy_image_t *ezhvCopyImage)
54 {
55     uint32_t dstAddr;
56     uint32_t srcAddr;
57     uint32_t size;
58 
59     assert(ezhvCopyImage != NULL);
60     assert(ezhvCopyImage->srcAddr != 0U);
61     assert(ezhvCopyImage->destAddr != 0U);
62     assert(ezhvCopyImage->size != 0U);
63 
64     dstAddr = ezhvCopyImage->destAddr;
65     srcAddr = ezhvCopyImage->srcAddr;
66     size = ezhvCopyImage->size;
67 
68     memcpy((void*)(uint32_t*)dstAddr, (const void*)(uint32_t*)srcAddr, size);
69 }
70 
EZHV_Boot(uint32_t bootAddr)71 void EZHV_Boot(uint32_t bootAddr)
72 {
73     SYSCON4->EZHV_RSTBASE = bootAddr >> 2;
74     SYSCON4->EZHV_RSTMTVEC = bootAddr;
75     SYSCON4->EZHV_VOFFSET_T = EZHV_M_EXT_INT;
76     /* reset to start ezhv */
77     RESET_PeripheralReset(kEZHV_RST_SHIFT_RSTn);
78 }
79 
EZHV_SetPara(ezhv_param_t * para)80 void EZHV_SetPara(ezhv_param_t *para)
81 {
82     assert(para != NULL);
83     memcpy((void*)EZHV_ARM2EZHV_PARA_ADDR, para, sizeof(ezhv_param_t));
84 }
85 
EZHV_GetParaAddr(void)86 uint32_t *EZHV_GetParaAddr(void)
87 {
88     return (uint32_t *)EZHV_ARM2EZHV_PARA_ADDR;
89 }
90 
EZHV_WakeupEzhv(arm2ezhv_intctl_t arm2ezhvInt)91 void EZHV_WakeupEzhv(arm2ezhv_intctl_t arm2ezhvInt)
92 {
93     SYSCON4->ARM2EZHV_INT_CTRL = arm2ezhvInt;
94 }
95 
EZHV_Deinit(void)96 void EZHV_Deinit(void)
97 {
98     CLOCK_DisableClock(kCLOCK_Ezhv);
99     CLOCK_DisableClock(kCLOCK_AxbsEzh);
100 
101     POWER_EnablePD(kPDRUNCFG_APD_EZHV_TCM);
102     POWER_EnablePD(kPDRUNCFG_PPD_EZHV_TCM);
103     POWER_ApplyPD();
104 }
105 
EZHV_InstallCallback(ezhv_callback_t callback,void * param)106 void EZHV_InstallCallback(ezhv_callback_t callback, void *param)
107 {
108     s_ezhvCallback       = callback;
109     s_ezhvCallbackParam  = param;
110 }
111 
EZHV_HandleIRQ(void)112 void EZHV_HandleIRQ(void)
113 {
114     if (NULL != s_ezhvCallback)
115     {
116         s_ezhvCallback(s_ezhvCallbackParam);
117     }
118 }
119 
EZHV_DriverIRQHandler(void)120 void EZHV_DriverIRQHandler(void)
121 {
122     EZHV_HandleIRQ();
123 }
124