xref: /arm-trusted-firmware/plat/imx/common/include/sci/svc/timer/sci_timer_api.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (C) 2016 Freescale Semiconductor, Inc.
3*91f16700Schasinglulu  * Copyright 2017-2019 NXP
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu /*!
9*91f16700Schasinglulu  * Header file containing the public API for the System Controller (SC)
10*91f16700Schasinglulu  * Timer function.
11*91f16700Schasinglulu  *
12*91f16700Schasinglulu  * @addtogroup TIMER_SVC (SVC) Timer Service
13*91f16700Schasinglulu  *
14*91f16700Schasinglulu  * Module for the Timer service. This includes support for the watchdog, RTC,
15*91f16700Schasinglulu  * and system counter. Note every resource partition has a watchdog it can
16*91f16700Schasinglulu  * use.
17*91f16700Schasinglulu  *
18*91f16700Schasinglulu  * @{
19*91f16700Schasinglulu  */
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #ifndef SC_TIMER_API_H
22*91f16700Schasinglulu #define SC_TIMER_API_H
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /* Includes */
25*91f16700Schasinglulu 
26*91f16700Schasinglulu #include <sci/sci_types.h>
27*91f16700Schasinglulu 
28*91f16700Schasinglulu /* Defines */
29*91f16700Schasinglulu 
30*91f16700Schasinglulu /*!
31*91f16700Schasinglulu  * @name Defines for type widths
32*91f16700Schasinglulu  */
33*91f16700Schasinglulu /*@{*/
34*91f16700Schasinglulu #define SC_TIMER_ACTION_W   3U	/* Width of sc_timer_wdog_action_t */
35*91f16700Schasinglulu /*@}*/
36*91f16700Schasinglulu 
37*91f16700Schasinglulu /*!
38*91f16700Schasinglulu  * @name Defines for sc_timer_wdog_action_t
39*91f16700Schasinglulu  */
40*91f16700Schasinglulu /*@{*/
41*91f16700Schasinglulu #define SC_TIMER_WDOG_ACTION_PARTITION      0U	/* Reset partition */
42*91f16700Schasinglulu #define SC_TIMER_WDOG_ACTION_WARM           1U	/* Warm reset system */
43*91f16700Schasinglulu #define SC_TIMER_WDOG_ACTION_COLD           2U	/* Cold reset system */
44*91f16700Schasinglulu #define SC_TIMER_WDOG_ACTION_BOARD          3U	/* Reset board */
45*91f16700Schasinglulu #define SC_TIMER_WDOG_ACTION_IRQ            4U	/* Only generate IRQs */
46*91f16700Schasinglulu /*@}*/
47*91f16700Schasinglulu 
48*91f16700Schasinglulu /* Types */
49*91f16700Schasinglulu 
50*91f16700Schasinglulu /*!
51*91f16700Schasinglulu  * This type is used to configure the watchdog action.
52*91f16700Schasinglulu  */
53*91f16700Schasinglulu typedef uint8_t sc_timer_wdog_action_t;
54*91f16700Schasinglulu 
55*91f16700Schasinglulu /*!
56*91f16700Schasinglulu  * This type is used to declare a watchdog time value in milliseconds.
57*91f16700Schasinglulu  */
58*91f16700Schasinglulu typedef uint32_t sc_timer_wdog_time_t;
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /* Functions */
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /*!
63*91f16700Schasinglulu  * @name Watchdog Functions
64*91f16700Schasinglulu  * @{
65*91f16700Schasinglulu  */
66*91f16700Schasinglulu 
67*91f16700Schasinglulu /*!
68*91f16700Schasinglulu  * This function sets the watchdog timeout in milliseconds. If not
69*91f16700Schasinglulu  * set then the timeout defaults to the max. Once locked this value
70*91f16700Schasinglulu  * cannot be changed.
71*91f16700Schasinglulu  *
72*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
73*91f16700Schasinglulu  * @param[in]     timeout     timeout period for the watchdog
74*91f16700Schasinglulu  *
75*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED
76*91f16700Schasinglulu  *         = locked).
77*91f16700Schasinglulu  */
78*91f16700Schasinglulu sc_err_t sc_timer_set_wdog_timeout(sc_ipc_t ipc, sc_timer_wdog_time_t timeout);
79*91f16700Schasinglulu 
80*91f16700Schasinglulu /*!
81*91f16700Schasinglulu  * This function sets the watchdog pre-timeout in milliseconds. If not
82*91f16700Schasinglulu  * set then the pre-timeout defaults to the max. Once locked this value
83*91f16700Schasinglulu  * cannot be changed.
84*91f16700Schasinglulu  *
85*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
86*91f16700Schasinglulu  * @param[in]     pre_timeout pre-timeout period for the watchdog
87*91f16700Schasinglulu  *
88*91f16700Schasinglulu  * When the pre-timeout expires an IRQ will be generated. Note this timeout
89*91f16700Schasinglulu  * clears when the IRQ is triggered. An IRQ is generated for the failing
90*91f16700Schasinglulu  * partition and all of its child partitions.
91*91f16700Schasinglulu  *
92*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
93*91f16700Schasinglulu  */
94*91f16700Schasinglulu sc_err_t sc_timer_set_wdog_pre_timeout(sc_ipc_t ipc,
95*91f16700Schasinglulu 				       sc_timer_wdog_time_t pre_timeout);
96*91f16700Schasinglulu 
97*91f16700Schasinglulu /*!
98*91f16700Schasinglulu  * This function starts the watchdog.
99*91f16700Schasinglulu  *
100*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
101*91f16700Schasinglulu  * @param[in]     lock        boolean indicating the lock status
102*91f16700Schasinglulu  *
103*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
104*91f16700Schasinglulu  *
105*91f16700Schasinglulu  * If \a lock is set then the watchdog cannot be stopped or the timeout
106*91f16700Schasinglulu  * period changed.
107*91f16700Schasinglulu  */
108*91f16700Schasinglulu sc_err_t sc_timer_start_wdog(sc_ipc_t ipc, sc_bool_t lock);
109*91f16700Schasinglulu 
110*91f16700Schasinglulu /*!
111*91f16700Schasinglulu  * This function stops the watchdog if it is not locked.
112*91f16700Schasinglulu  *
113*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
114*91f16700Schasinglulu  *
115*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED
116*91f16700Schasinglulu  *         = locked).
117*91f16700Schasinglulu  */
118*91f16700Schasinglulu sc_err_t sc_timer_stop_wdog(sc_ipc_t ipc);
119*91f16700Schasinglulu 
120*91f16700Schasinglulu /*!
121*91f16700Schasinglulu  * This function pings (services, kicks) the watchdog resetting the time
122*91f16700Schasinglulu  * before expiration back to the timeout.
123*91f16700Schasinglulu  *
124*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
125*91f16700Schasinglulu  *
126*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
127*91f16700Schasinglulu  */
128*91f16700Schasinglulu sc_err_t sc_timer_ping_wdog(sc_ipc_t ipc);
129*91f16700Schasinglulu 
130*91f16700Schasinglulu /*!
131*91f16700Schasinglulu  * This function gets the status of the watchdog. All arguments are
132*91f16700Schasinglulu  * in milliseconds.
133*91f16700Schasinglulu  *
134*91f16700Schasinglulu  * @param[in]     ipc             IPC handle
135*91f16700Schasinglulu  * @param[out]    timeout         pointer to return the timeout
136*91f16700Schasinglulu  * @param[out]    max_timeout     pointer to return the max timeout
137*91f16700Schasinglulu  * @param[out]    remaining_time  pointer to return the time remaining
138*91f16700Schasinglulu  *                                until trigger
139*91f16700Schasinglulu  *
140*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
141*91f16700Schasinglulu  */
142*91f16700Schasinglulu sc_err_t sc_timer_get_wdog_status(sc_ipc_t ipc,
143*91f16700Schasinglulu 				  sc_timer_wdog_time_t *timeout,
144*91f16700Schasinglulu 				  sc_timer_wdog_time_t *max_timeout,
145*91f16700Schasinglulu 				  sc_timer_wdog_time_t *remaining_time);
146*91f16700Schasinglulu 
147*91f16700Schasinglulu /*!
148*91f16700Schasinglulu  * This function gets the status of the watchdog of a partition. All
149*91f16700Schasinglulu  * arguments are in milliseconds.
150*91f16700Schasinglulu  *
151*91f16700Schasinglulu  * @param[in]     ipc             IPC handle
152*91f16700Schasinglulu  * @param[in]     pt              partition to query
153*91f16700Schasinglulu  * @param[out]    enb             pointer to return enable status
154*91f16700Schasinglulu  * @param[out]    timeout         pointer to return the timeout
155*91f16700Schasinglulu  * @param[out]    remaining_time  pointer to return the time remaining
156*91f16700Schasinglulu  *                                until trigger
157*91f16700Schasinglulu  *
158*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
159*91f16700Schasinglulu  */
160*91f16700Schasinglulu sc_err_t sc_timer_pt_get_wdog_status(sc_ipc_t ipc, sc_rm_pt_t pt,
161*91f16700Schasinglulu 				     sc_bool_t *enb,
162*91f16700Schasinglulu 				     sc_timer_wdog_time_t *timeout,
163*91f16700Schasinglulu 				     sc_timer_wdog_time_t *remaining_time);
164*91f16700Schasinglulu 
165*91f16700Schasinglulu /*!
166*91f16700Schasinglulu  * This function configures the action to be taken when a watchdog
167*91f16700Schasinglulu  * expires.
168*91f16700Schasinglulu  *
169*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
170*91f16700Schasinglulu  * @param[in]     pt          partition to affect
171*91f16700Schasinglulu  * @param[in]     action      action to take
172*91f16700Schasinglulu  *
173*91f16700Schasinglulu  * Default action is inherited from the parent.
174*91f16700Schasinglulu  *
175*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
176*91f16700Schasinglulu  *
177*91f16700Schasinglulu  * Return errors:
178*91f16700Schasinglulu  * - SC_ERR_PARM if invalid parameters,
179*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the SYSTEM owner,
180*91f16700Schasinglulu  * - SC_ERR_LOCKED if the watchdog is locked
181*91f16700Schasinglulu  */
182*91f16700Schasinglulu sc_err_t sc_timer_set_wdog_action(sc_ipc_t ipc,
183*91f16700Schasinglulu 				  sc_rm_pt_t pt, sc_timer_wdog_action_t action);
184*91f16700Schasinglulu 
185*91f16700Schasinglulu /* @} */
186*91f16700Schasinglulu 
187*91f16700Schasinglulu /*!
188*91f16700Schasinglulu  * @name Real-Time Clock (RTC) Functions
189*91f16700Schasinglulu  * @{
190*91f16700Schasinglulu  */
191*91f16700Schasinglulu 
192*91f16700Schasinglulu /*!
193*91f16700Schasinglulu  * This function sets the RTC time. Only the owner of the SC_R_SYSTEM
194*91f16700Schasinglulu  * resource can set the time.
195*91f16700Schasinglulu  *
196*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
197*91f16700Schasinglulu  * @param[in]     year        year (min 1970)
198*91f16700Schasinglulu  * @param[in]     mon         month (1-12)
199*91f16700Schasinglulu  * @param[in]     day         day of the month (1-31)
200*91f16700Schasinglulu  * @param[in]     hour        hour (0-23)
201*91f16700Schasinglulu  * @param[in]     min         minute (0-59)
202*91f16700Schasinglulu  * @param[in]     sec         second (0-59)
203*91f16700Schasinglulu  *
204*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
205*91f16700Schasinglulu  *
206*91f16700Schasinglulu  * Return errors:
207*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters,
208*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the SYSTEM owner
209*91f16700Schasinglulu  */
210*91f16700Schasinglulu sc_err_t sc_timer_set_rtc_time(sc_ipc_t ipc, uint16_t year, uint8_t mon,
211*91f16700Schasinglulu 			       uint8_t day, uint8_t hour, uint8_t min,
212*91f16700Schasinglulu 			       uint8_t sec);
213*91f16700Schasinglulu 
214*91f16700Schasinglulu /*!
215*91f16700Schasinglulu  * This function gets the RTC time.
216*91f16700Schasinglulu  *
217*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
218*91f16700Schasinglulu  * @param[out]    year        pointer to return year (min 1970)
219*91f16700Schasinglulu  * @param[out]    mon         pointer to return month (1-12)
220*91f16700Schasinglulu  * @param[out]    day         pointer to return day of the month (1-31)
221*91f16700Schasinglulu  * @param[out]    hour        pointer to return hour (0-23)
222*91f16700Schasinglulu  * @param[out]    min         pointer to return minute (0-59)
223*91f16700Schasinglulu  * @param[out]    sec         pointer to return second (0-59)
224*91f16700Schasinglulu  *
225*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
226*91f16700Schasinglulu  */
227*91f16700Schasinglulu sc_err_t sc_timer_get_rtc_time(sc_ipc_t ipc, uint16_t *year, uint8_t *mon,
228*91f16700Schasinglulu 			       uint8_t *day, uint8_t *hour, uint8_t *min,
229*91f16700Schasinglulu 			       uint8_t *sec);
230*91f16700Schasinglulu 
231*91f16700Schasinglulu /*!
232*91f16700Schasinglulu  * This function gets the RTC time in seconds since 1/1/1970.
233*91f16700Schasinglulu  *
234*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
235*91f16700Schasinglulu  * @param[out]    sec         pointer to return second
236*91f16700Schasinglulu  *
237*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
238*91f16700Schasinglulu  */
239*91f16700Schasinglulu sc_err_t sc_timer_get_rtc_sec1970(sc_ipc_t ipc, uint32_t *sec);
240*91f16700Schasinglulu 
241*91f16700Schasinglulu /*!
242*91f16700Schasinglulu  * This function sets the RTC alarm.
243*91f16700Schasinglulu  *
244*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
245*91f16700Schasinglulu  * @param[in]     year        year (min 1970)
246*91f16700Schasinglulu  * @param[in]     mon         month (1-12)
247*91f16700Schasinglulu  * @param[in]     day         day of the month (1-31)
248*91f16700Schasinglulu  * @param[in]     hour        hour (0-23)
249*91f16700Schasinglulu  * @param[in]     min         minute (0-59)
250*91f16700Schasinglulu  * @param[in]     sec         second (0-59)
251*91f16700Schasinglulu  *
252*91f16700Schasinglulu  * Note this alarm setting clears when the alarm is triggered.
253*91f16700Schasinglulu  *
254*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
255*91f16700Schasinglulu  *
256*91f16700Schasinglulu  * Return errors:
257*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
258*91f16700Schasinglulu  */
259*91f16700Schasinglulu sc_err_t sc_timer_set_rtc_alarm(sc_ipc_t ipc, uint16_t year, uint8_t mon,
260*91f16700Schasinglulu 				uint8_t day, uint8_t hour, uint8_t min,
261*91f16700Schasinglulu 				uint8_t sec);
262*91f16700Schasinglulu 
263*91f16700Schasinglulu /*!
264*91f16700Schasinglulu  * This function sets the RTC alarm (periodic mode).
265*91f16700Schasinglulu  *
266*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
267*91f16700Schasinglulu  * @param[in]     sec         period in seconds
268*91f16700Schasinglulu  *
269*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
270*91f16700Schasinglulu  *
271*91f16700Schasinglulu  * Return errors:
272*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
273*91f16700Schasinglulu  */
274*91f16700Schasinglulu sc_err_t sc_timer_set_rtc_periodic_alarm(sc_ipc_t ipc, uint32_t sec);
275*91f16700Schasinglulu 
276*91f16700Schasinglulu /*!
277*91f16700Schasinglulu  * This function cancels the RTC alarm.
278*91f16700Schasinglulu  *
279*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
280*91f16700Schasinglulu  *
281*91f16700Schasinglulu  * Note this alarm setting clears when the alarm is triggered.
282*91f16700Schasinglulu  *
283*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
284*91f16700Schasinglulu  *
285*91f16700Schasinglulu  * Return errors:
286*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
287*91f16700Schasinglulu  */
288*91f16700Schasinglulu sc_err_t sc_timer_cancel_rtc_alarm(sc_ipc_t ipc);
289*91f16700Schasinglulu 
290*91f16700Schasinglulu /*!
291*91f16700Schasinglulu  * This function sets the RTC calibration value. Only the owner of the SC_R_SYSTEM
292*91f16700Schasinglulu  * resource can set the calibration.
293*91f16700Schasinglulu  *
294*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
295*91f16700Schasinglulu  * @param[in]     count       calbration count (-16 to 15)
296*91f16700Schasinglulu  *
297*91f16700Schasinglulu  * The calibration value is a 5-bit value including the sign bit, which is
298*91f16700Schasinglulu  * implemented in 2's complement. It is added or subtracted from the RTC on
299*91f16700Schasinglulu  * a perdiodic basis, once per 32768 cycles of the RTC clock.
300*91f16700Schasinglulu  *
301*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
302*91f16700Schasinglulu  */
303*91f16700Schasinglulu sc_err_t sc_timer_set_rtc_calb(sc_ipc_t ipc, int8_t count);
304*91f16700Schasinglulu 
305*91f16700Schasinglulu /* @} */
306*91f16700Schasinglulu 
307*91f16700Schasinglulu /*!
308*91f16700Schasinglulu  * @name System Counter (SYSCTR) Functions
309*91f16700Schasinglulu  * @{
310*91f16700Schasinglulu  */
311*91f16700Schasinglulu 
312*91f16700Schasinglulu /*!
313*91f16700Schasinglulu  * This function sets the SYSCTR alarm.
314*91f16700Schasinglulu  *
315*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
316*91f16700Schasinglulu  * @param[in]     ticks       number of 8MHz cycles
317*91f16700Schasinglulu  *
318*91f16700Schasinglulu  * Note this alarm setting clears when the alarm is triggered.
319*91f16700Schasinglulu  *
320*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
321*91f16700Schasinglulu  *
322*91f16700Schasinglulu  * Return errors:
323*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
324*91f16700Schasinglulu  */
325*91f16700Schasinglulu sc_err_t sc_timer_set_sysctr_alarm(sc_ipc_t ipc, uint64_t ticks);
326*91f16700Schasinglulu 
327*91f16700Schasinglulu /*!
328*91f16700Schasinglulu  * This function sets the SYSCTR alarm (periodic mode).
329*91f16700Schasinglulu  *
330*91f16700Schasinglulu  * @param[in]     ipc          IPC handle
331*91f16700Schasinglulu  * @param[in]     ticks        number of 8MHz cycles
332*91f16700Schasinglulu  *
333*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
334*91f16700Schasinglulu  *
335*91f16700Schasinglulu  * Return errors:
336*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
337*91f16700Schasinglulu  */
338*91f16700Schasinglulu sc_err_t sc_timer_set_sysctr_periodic_alarm(sc_ipc_t ipc, uint64_t ticks);
339*91f16700Schasinglulu 
340*91f16700Schasinglulu /*!
341*91f16700Schasinglulu  * This function cancels the SYSCTR alarm.
342*91f16700Schasinglulu  *
343*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
344*91f16700Schasinglulu  *
345*91f16700Schasinglulu  * Note this alarm setting clears when the alarm is triggered.
346*91f16700Schasinglulu  *
347*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
348*91f16700Schasinglulu  *
349*91f16700Schasinglulu  * Return errors:
350*91f16700Schasinglulu  * - SC_ERR_PARM if invalid time/date parameters
351*91f16700Schasinglulu  */
352*91f16700Schasinglulu sc_err_t sc_timer_cancel_sysctr_alarm(sc_ipc_t ipc);
353*91f16700Schasinglulu 
354*91f16700Schasinglulu /* @} */
355*91f16700Schasinglulu 
356*91f16700Schasinglulu #endif				/* SC_TIMER_API_H */
357*91f16700Schasinglulu 
358*91f16700Schasinglulu /**@}*/
359