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