Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
aea05550
Unverified
Commit
aea05550
authored
Jan 17, 2019
by
Antonio Niño Díaz
Committed by
GitHub
Jan 17, 2019
Browse files
Merge pull request #1754 from Anson-Huang/master
Add i.MX8 SoC SRTC/cpu-freq SIP runtime service support
parents
af4aad2f
d3996c59
Changes
10
Hide whitespace changes
Inline
Side-by-side
plat/imx/common/imx_sip_handler.c
0 → 100644
View file @
aea05550
/*
* Copyright 2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdlib.h>
#include <stdint.h>
#include <std_svc.h>
#include <platform_def.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <imx_sip_svc.h>
#include <sci/sci.h>
#ifdef PLAT_IMX8QM
const
static
int
ap_cluster_index
[
PLATFORM_CLUSTER_COUNT
]
=
{
SC_R_A53
,
SC_R_A72
,
};
#endif
static
int
imx_srtc_set_time
(
uint32_t
year_mon
,
unsigned
long
day_hour
,
unsigned
long
min_sec
)
{
return
sc_timer_set_rtc_time
(
ipc_handle
,
year_mon
>>
16
,
year_mon
&
0xffff
,
day_hour
>>
16
,
day_hour
&
0xffff
,
min_sec
>>
16
,
min_sec
&
0xffff
);
}
int
imx_srtc_handler
(
uint32_t
smc_fid
,
void
*
handle
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
)
{
int
ret
;
switch
(
x1
)
{
case
IMX_SIP_SRTC_SET_TIME
:
ret
=
imx_srtc_set_time
(
x2
,
x3
,
x4
);
break
;
default:
ret
=
SMC_UNK
;
}
SMC_RET1
(
handle
,
ret
);
}
static
void
imx_cpufreq_set_target
(
uint32_t
cluster_id
,
unsigned
long
freq
)
{
sc_pm_clock_rate_t
rate
=
(
sc_pm_clock_rate_t
)
freq
;
#ifdef PLAT_IMX8QM
sc_pm_set_clock_rate
(
ipc_handle
,
ap_cluster_index
[
cluster_id
],
SC_PM_CLK_CPU
,
&
rate
);
#endif
#ifdef PLAT_IMX8QX
sc_pm_set_clock_rate
(
ipc_handle
,
SC_R_A35
,
SC_PM_CLK_CPU
,
&
rate
);
#endif
}
int
imx_cpufreq_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
)
{
switch
(
x1
)
{
case
IMX_SIP_SET_CPUFREQ
:
imx_cpufreq_set_target
(
x2
,
x3
);
break
;
default:
return
SMC_UNK
;
}
return
0
;
}
plat/imx/common/imx_sip_svc.c
0 → 100644
View file @
aea05550
/*
* Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdint.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/pmf/pmf.h>
#include <tools_share/uuid.h>
#include <imx_sip_svc.h>
static
int32_t
imx_sip_setup
(
void
)
{
return
0
;
}
static
uintptr_t
imx_sip_handler
(
unsigned
int
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
,
void
*
cookie
,
void
*
handle
,
u_register_t
flags
)
{
switch
(
smc_fid
)
{
#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX))
case
IMX_SIP_SRTC
:
return
imx_srtc_handler
(
smc_fid
,
handle
,
x1
,
x2
,
x3
,
x4
);
case
IMX_SIP_CPUFREQ
:
SMC_RET1
(
handle
,
imx_cpufreq_handler
(
smc_fid
,
x1
,
x2
,
x3
));
break
;
#endif
default:
WARN
(
"Unimplemented i.MX SiP Service Call: 0x%x
\n
"
,
smc_fid
);
SMC_RET1
(
handle
,
SMC_UNK
);
break
;
}
}
/* Define a runtime service descriptor for fast SMC calls */
DECLARE_RT_SVC
(
imx_sip_svc
,
OEN_SIP_START
,
OEN_SIP_END
,
SMC_TYPE_FAST
,
imx_sip_setup
,
imx_sip_handler
);
plat/imx/common/include/imx_sip_svc.h
0 → 100644
View file @
aea05550
/*
* Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __IMX_SIP_SVC_H__
#define __IMX_SIP_SVC_H__
/* SMC function IDs for SiP Service queries */
#define IMX_SIP_CPUFREQ 0xC2000001
#define IMX_SIP_SET_CPUFREQ 0x00
#define IMX_SIP_SRTC 0xC2000002
#define IMX_SIP_SRTC_SET_TIME 0x00
#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX))
int
imx_cpufreq_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
);
int
imx_srtc_handler
(
uint32_t
smc_fid
,
void
*
handle
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
);
#endif
#endif
/* __IMX_SIP_SVC_H__ */
plat/imx/common/include/sci/sci.h
View file @
aea05550
/*
* Copyright (c) 2015-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -15,5 +15,6 @@
#include <sci/svc/pad/sci_pad_api.h>
#include <sci/svc/pm/sci_pm_api.h>
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/svc/timer/sci_timer_api.h>
#endif
/* SCI_H */
plat/imx/common/include/sci/svc/timer/sci_timer_api.h
0 → 100644
View file @
aea05550
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* Header file containing the public API for the System Controller (SC)
* Timer function.
*
* @addtogroup TIMER_SVC (SVC) Timer Service
*
* Module for the Timer service. This includes support for the watchdog, RTC,
* and system counter. Note every resource partition has a watchdog it can
* use.
*
* @{
*/
#ifndef SC_TIMER_API_H
#define SC_TIMER_API_H
/* Includes */
#include <sci/sci_types.h>
/* Defines */
/*!
* @name Defines for type widths
*/
/*@{*/
#define SC_TIMER_ACTION_W 3U
/* Width of sc_timer_wdog_action_t */
/*@}*/
/*!
* @name Defines for sc_timer_wdog_action_t
*/
/*@{*/
#define SC_TIMER_WDOG_ACTION_PARTITION 0U
/* Reset partition */
#define SC_TIMER_WDOG_ACTION_WARM 1U
/* Warm reset system */
#define SC_TIMER_WDOG_ACTION_COLD 2U
/* Cold reset system */
#define SC_TIMER_WDOG_ACTION_BOARD 3U
/* Reset board */
#define SC_TIMER_WDOG_ACTION_IRQ 4U
/* Only generate IRQs */
/*@}*/
/* Types */
/*!
* This type is used to configure the watchdog action.
*/
typedef
uint8_t
sc_timer_wdog_action_t
;
/*!
* This type is used to declare a watchdog time value in milliseconds.
*/
typedef
uint32_t
sc_timer_wdog_time_t
;
/* Functions */
/*!
* @name Watchdog Functions
* @{
*/
/*!
* This function sets the watchdog timeout in milliseconds. If not
* set then the timeout defaults to the max. Once locked this value
* cannot be changed.
*
* @param[in] ipc IPC handle
* @param[in] timeout timeout period for the watchdog
*
* @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED
* = locked).
*/
sc_err_t
sc_timer_set_wdog_timeout
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
timeout
);
/*!
* This function sets the watchdog pre-timeout in milliseconds. If not
* set then the pre-timeout defaults to the max. Once locked this value
* cannot be changed.
*
* @param[in] ipc IPC handle
* @param[in] pre_timeout pre-timeout period for the watchdog
*
* When the pre-timeout expires an IRQ will be generated. Note this timeout
* clears when the IRQ is triggered. An IRQ is generated for the failing
* partition and all of its child partitions.
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_set_wdog_pre_timeout
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
pre_timeout
);
/*!
* This function starts the watchdog.
*
* @param[in] ipc IPC handle
* @param[in] lock boolean indicating the lock status
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* If \a lock is set then the watchdog cannot be stopped or the timeout
* period changed.
*/
sc_err_t
sc_timer_start_wdog
(
sc_ipc_t
ipc
,
sc_bool_t
lock
);
/*!
* This function stops the watchdog if it is not locked.
*
* @param[in] ipc IPC handle
*
* @return Returns an error code (SC_ERR_NONE = success, SC_ERR_LOCKED
* = locked).
*/
sc_err_t
sc_timer_stop_wdog
(
sc_ipc_t
ipc
);
/*!
* This function pings (services, kicks) the watchdog resetting the time
* before expiration back to the timeout.
*
* @param[in] ipc IPC handle
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_ping_wdog
(
sc_ipc_t
ipc
);
/*!
* This function gets the status of the watchdog. All arguments are
* in milliseconds.
*
* @param[in] ipc IPC handle
* @param[out] timeout pointer to return the timeout
* @param[out] max_timeout pointer to return the max timeout
* @param[out] remaining_time pointer to return the time remaining
* until trigger
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_get_wdog_status
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
*
timeout
,
sc_timer_wdog_time_t
*
max_timeout
,
sc_timer_wdog_time_t
*
remaining_time
);
/*!
* This function gets the status of the watchdog of a partition. All
* arguments are in milliseconds.
*
* @param[in] ipc IPC handle
* @param[in] pt partition to query
* @param[out] enb pointer to return enable status
* @param[out] timeout pointer to return the timeout
* @param[out] remaining_time pointer to return the time remaining
* until trigger
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_pt_get_wdog_status
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_bool_t
*
enb
,
sc_timer_wdog_time_t
*
timeout
,
sc_timer_wdog_time_t
*
remaining_time
);
/*!
* This function configures the action to be taken when a watchdog
* expires.
*
* @param[in] ipc IPC handle
* @param[in] pt partition to affect
* @param[in] action action to take
*
* Default action is inherited from the parent.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid parameters,
* - SC_ERR_NOACCESS if caller's partition is not the SYSTEM owner,
* - SC_ERR_LOCKED if the watchdog is locked
*/
sc_err_t
sc_timer_set_wdog_action
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_timer_wdog_action_t
action
);
/* @} */
/*!
* @name Real-Time Clock (RTC) Functions
* @{
*/
/*!
* This function sets the RTC time. Only the owner of the SC_R_SYSTEM
* resource can set the time.
*
* @param[in] ipc IPC handle
* @param[in] year year (min 1970)
* @param[in] mon month (1-12)
* @param[in] day day of the month (1-31)
* @param[in] hour hour (0-23)
* @param[in] min minute (0-59)
* @param[in] sec second (0-59)
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters,
* - SC_ERR_NOACCESS if caller's partition is not the SYSTEM owner
*/
sc_err_t
sc_timer_set_rtc_time
(
sc_ipc_t
ipc
,
uint16_t
year
,
uint8_t
mon
,
uint8_t
day
,
uint8_t
hour
,
uint8_t
min
,
uint8_t
sec
);
/*!
* This function gets the RTC time.
*
* @param[in] ipc IPC handle
* @param[out] year pointer to return year (min 1970)
* @param[out] mon pointer to return month (1-12)
* @param[out] day pointer to return day of the month (1-31)
* @param[out] hour pointer to return hour (0-23)
* @param[out] min pointer to return minute (0-59)
* @param[out] sec pointer to return second (0-59)
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_get_rtc_time
(
sc_ipc_t
ipc
,
uint16_t
*
year
,
uint8_t
*
mon
,
uint8_t
*
day
,
uint8_t
*
hour
,
uint8_t
*
min
,
uint8_t
*
sec
);
/*!
* This function gets the RTC time in seconds since 1/1/1970.
*
* @param[in] ipc IPC handle
* @param[out] sec pointer to return second
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_get_rtc_sec1970
(
sc_ipc_t
ipc
,
uint32_t
*
sec
);
/*!
* This function sets the RTC alarm.
*
* @param[in] ipc IPC handle
* @param[in] year year (min 1970)
* @param[in] mon month (1-12)
* @param[in] day day of the month (1-31)
* @param[in] hour hour (0-23)
* @param[in] min minute (0-59)
* @param[in] sec second (0-59)
*
* Note this alarm setting clears when the alarm is triggered.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_set_rtc_alarm
(
sc_ipc_t
ipc
,
uint16_t
year
,
uint8_t
mon
,
uint8_t
day
,
uint8_t
hour
,
uint8_t
min
,
uint8_t
sec
);
/*!
* This function sets the RTC alarm (periodic mode).
*
* @param[in] ipc IPC handle
* @param[in] sec period in seconds
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_set_rtc_periodic_alarm
(
sc_ipc_t
ipc
,
uint32_t
sec
);
/*!
* This function cancels the RTC alarm.
*
* @param[in] ipc IPC handle
*
* Note this alarm setting clears when the alarm is triggered.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_cancel_rtc_alarm
(
sc_ipc_t
ipc
);
/*!
* This function sets the RTC calibration value. Only the owner of the SC_R_SYSTEM
* resource can set the calibration.
*
* @param[in] ipc IPC handle
* @param[in] count calbration count (-16 to 15)
*
* The calibration value is a 5-bit value including the sign bit, which is
* implemented in 2's complement. It is added or subtracted from the RTC on
* a perdiodic basis, once per 32768 cycles of the RTC clock.
*
* @return Returns an error code (SC_ERR_NONE = success).
*/
sc_err_t
sc_timer_set_rtc_calb
(
sc_ipc_t
ipc
,
int8_t
count
);
/* @} */
/*!
* @name System Counter (SYSCTR) Functions
* @{
*/
/*!
* This function sets the SYSCTR alarm.
*
* @param[in] ipc IPC handle
* @param[in] ticks number of 8MHz cycles
*
* Note this alarm setting clears when the alarm is triggered.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_set_sysctr_alarm
(
sc_ipc_t
ipc
,
uint64_t
ticks
);
/*!
* This function sets the SYSCTR alarm (periodic mode).
*
* @param[in] ipc IPC handle
* @param[in] ticks number of 8MHz cycles
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_set_sysctr_periodic_alarm
(
sc_ipc_t
ipc
,
uint64_t
ticks
);
/*!
* This function cancels the SYSCTR alarm.
*
* @param[in] ipc IPC handle
*
* Note this alarm setting clears when the alarm is triggered.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_PARM if invalid time/date parameters
*/
sc_err_t
sc_timer_cancel_sysctr_alarm
(
sc_ipc_t
ipc
);
/* @} */
#endif
/* SC_TIMER_API_H */
/**@}*/
plat/imx/common/sci/sci_api.mk
View file @
aea05550
#
# Copyright (c) 2015-201
8
, ARM Limited and Contributors. All rights reserved.
# Copyright (c) 2015-201
9
, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
...
...
@@ -8,4 +8,5 @@ BL31_SOURCES += plat/imx/common/sci/ipc.c \
plat/imx/common/sci/imx8_mu.c
\
plat/imx/common/sci/svc/pad/pad_rpc_clnt.c
\
plat/imx/common/sci/svc/pm/pm_rpc_clnt.c
\
plat/imx/common/sci/svc/rm/rm_rpc_clnt.c
plat/imx/common/sci/svc/rm/rm_rpc_clnt.c
\
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
plat/imx/common/sci/svc/timer/sci_timer_rpc.h
0 → 100644
View file @
aea05550
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* Header file for the TIMER RPC implementation.
*
* @addtogroup TIMER_SVC
* @{
*/
#ifndef SC_TIMER_RPC_H
#define SC_TIMER_RPC_H
/* Includes */
/* Defines */
/*!
* @name Defines for RPC TIMER function calls
*/
/*@{*/
#define TIMER_FUNC_UNKNOWN 0
/* Unknown function */
#define TIMER_FUNC_SET_WDOG_TIMEOUT 1U
/* Index for timer_set_wdog_timeout() RPC call */
#define TIMER_FUNC_SET_WDOG_PRE_TIMEOUT 12U
/* Index for timer_set_wdog_pre_timeout() RPC call */
#define TIMER_FUNC_START_WDOG 2U
/* Index for timer_start_wdog() RPC call */
#define TIMER_FUNC_STOP_WDOG 3U
/* Index for timer_stop_wdog() RPC call */
#define TIMER_FUNC_PING_WDOG 4U
/* Index for timer_ping_wdog() RPC call */
#define TIMER_FUNC_GET_WDOG_STATUS 5U
/* Index for timer_get_wdog_status() RPC call */
#define TIMER_FUNC_PT_GET_WDOG_STATUS 13U
/* Index for timer_pt_get_wdog_status() RPC call */
#define TIMER_FUNC_SET_WDOG_ACTION 10U
/* Index for timer_set_wdog_action() RPC call */
#define TIMER_FUNC_SET_RTC_TIME 6U
/* Index for timer_set_rtc_time() RPC call */
#define TIMER_FUNC_GET_RTC_TIME 7U
/* Index for timer_get_rtc_time() RPC call */
#define TIMER_FUNC_GET_RTC_SEC1970 9U
/* Index for timer_get_rtc_sec1970() RPC call */
#define TIMER_FUNC_SET_RTC_ALARM 8U
/* Index for timer_set_rtc_alarm() RPC call */
#define TIMER_FUNC_SET_RTC_PERIODIC_ALARM 14U
/* Index for timer_set_rtc_periodic_alarm() RPC call */
#define TIMER_FUNC_CANCEL_RTC_ALARM 15U
/* Index for timer_cancel_rtc_alarm() RPC call */
#define TIMER_FUNC_SET_RTC_CALB 11U
/* Index for timer_set_rtc_calb() RPC call */
#define TIMER_FUNC_SET_SYSCTR_ALARM 16U
/* Index for timer_set_sysctr_alarm() RPC call */
#define TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM 17U
/* Index for timer_set_sysctr_periodic_alarm() RPC call */
#define TIMER_FUNC_CANCEL_SYSCTR_ALARM 18U
/* Index for timer_cancel_sysctr_alarm() RPC call */
/*@}*/
/* Types */
/* Functions */
/*!
* This function dispatches an incoming TIMER RPC request.
*
* @param[in] caller_pt caller partition
* @param[in] msg pointer to RPC message
*/
void
timer_dispatch
(
sc_rm_pt_t
caller_pt
,
sc_rpc_msg_t
*
msg
);
/*!
* This function translates and dispatches an TIMER RPC request.
*
* @param[in] ipc IPC handle
* @param[in] msg pointer to RPC message
*/
void
timer_xlate
(
sc_ipc_t
ipc
,
sc_rpc_msg_t
*
msg
);
#endif
/* SC_TIMER_RPC_H */
/**@}*/
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
0 → 100644
View file @
aea05550
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* File containing client-side RPC functions for the TIMER service. These
* functions are ported to clients that communicate to the SC.
*
* @addtogroup TIMER_SVC
* @{
*/
/* Includes */
#include <sci/sci_types.h>
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/svc/timer/sci_timer_api.h>
#include <sci/sci_rpc.h>
#include <stdlib.h>
#include "sci_timer_rpc.h"
/* Local Defines */
/* Local Types */
/* Local Functions */
sc_err_t
sc_timer_set_wdog_timeout
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
timeout
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_WDOG_TIMEOUT
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
timeout
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_wdog_pre_timeout
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
pre_timeout
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_WDOG_PRE_TIMEOUT
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
pre_timeout
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_start_wdog
(
sc_ipc_t
ipc
,
sc_bool_t
lock
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_START_WDOG
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
lock
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_stop_wdog
(
sc_ipc_t
ipc
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_STOP_WDOG
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_ping_wdog
(
sc_ipc_t
ipc
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_PING_WDOG
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_get_wdog_status
(
sc_ipc_t
ipc
,
sc_timer_wdog_time_t
*
timeout
,
sc_timer_wdog_time_t
*
max_timeout
,
sc_timer_wdog_time_t
*
remaining_time
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_GET_WDOG_STATUS
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
timeout
!=
NULL
)
*
timeout
=
RPC_U32
(
&
msg
,
0U
);
if
(
max_timeout
!=
NULL
)
*
max_timeout
=
RPC_U32
(
&
msg
,
4U
);
if
(
remaining_time
!=
NULL
)
*
remaining_time
=
RPC_U32
(
&
msg
,
8U
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_pt_get_wdog_status
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_bool_t
*
enb
,
sc_timer_wdog_time_t
*
timeout
,
sc_timer_wdog_time_t
*
remaining_time
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_PT_GET_WDOG_STATUS
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
pt
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
timeout
!=
NULL
)
*
timeout
=
RPC_U32
(
&
msg
,
0U
);
if
(
remaining_time
!=
NULL
)
*
remaining_time
=
RPC_U32
(
&
msg
,
4U
);
result
=
RPC_R8
(
&
msg
);
if
(
enb
!=
NULL
)
*
enb
=
RPC_U8
(
&
msg
,
8U
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_wdog_action
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_timer_wdog_action_t
action
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_WDOG_ACTION
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
pt
;
RPC_U8
(
&
msg
,
1U
)
=
(
uint8_t
)
action
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_rtc_time
(
sc_ipc_t
ipc
,
uint16_t
year
,
uint8_t
mon
,
uint8_t
day
,
uint8_t
hour
,
uint8_t
min
,
uint8_t
sec
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_RTC_TIME
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
year
;
RPC_U8
(
&
msg
,
2U
)
=
(
uint8_t
)
mon
;
RPC_U8
(
&
msg
,
3U
)
=
(
uint8_t
)
day
;
RPC_U8
(
&
msg
,
4U
)
=
(
uint8_t
)
hour
;
RPC_U8
(
&
msg
,
5U
)
=
(
uint8_t
)
min
;
RPC_U8
(
&
msg
,
6U
)
=
(
uint8_t
)
sec
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_get_rtc_time
(
sc_ipc_t
ipc
,
uint16_t
*
year
,
uint8_t
*
mon
,
uint8_t
*
day
,
uint8_t
*
hour
,
uint8_t
*
min
,
uint8_t
*
sec
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_GET_RTC_TIME
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
year
!=
NULL
)
*
year
=
RPC_U16
(
&
msg
,
0U
);
result
=
RPC_R8
(
&
msg
);
if
(
mon
!=
NULL
)
*
mon
=
RPC_U8
(
&
msg
,
2U
);
if
(
day
!=
NULL
)
*
day
=
RPC_U8
(
&
msg
,
3U
);
if
(
hour
!=
NULL
)
*
hour
=
RPC_U8
(
&
msg
,
4U
);
if
(
min
!=
NULL
)
*
min
=
RPC_U8
(
&
msg
,
5U
);
if
(
sec
!=
NULL
)
*
sec
=
RPC_U8
(
&
msg
,
6U
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_get_rtc_sec1970
(
sc_ipc_t
ipc
,
uint32_t
*
sec
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_GET_RTC_SEC1970
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
sec
!=
NULL
)
*
sec
=
RPC_U32
(
&
msg
,
0U
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_rtc_alarm
(
sc_ipc_t
ipc
,
uint16_t
year
,
uint8_t
mon
,
uint8_t
day
,
uint8_t
hour
,
uint8_t
min
,
uint8_t
sec
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_RTC_ALARM
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
year
;
RPC_U8
(
&
msg
,
2U
)
=
(
uint8_t
)
mon
;
RPC_U8
(
&
msg
,
3U
)
=
(
uint8_t
)
day
;
RPC_U8
(
&
msg
,
4U
)
=
(
uint8_t
)
hour
;
RPC_U8
(
&
msg
,
5U
)
=
(
uint8_t
)
min
;
RPC_U8
(
&
msg
,
6U
)
=
(
uint8_t
)
sec
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_rtc_periodic_alarm
(
sc_ipc_t
ipc
,
uint32_t
sec
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_RTC_PERIODIC_ALARM
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
sec
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_cancel_rtc_alarm
(
sc_ipc_t
ipc
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_CANCEL_RTC_ALARM
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_rtc_calb
(
sc_ipc_t
ipc
,
int8_t
count
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_RTC_CALB
;
RPC_I8
(
&
msg
,
0U
)
=
(
int8_t
)
count
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_sysctr_alarm
(
sc_ipc_t
ipc
,
uint64_t
ticks
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_SYSCTR_ALARM
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
ticks
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
ticks
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_set_sysctr_periodic_alarm
(
sc_ipc_t
ipc
,
uint64_t
ticks
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
ticks
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
ticks
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_timer_cancel_sysctr_alarm
(
sc_ipc_t
ipc
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_TIMER
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
TIMER_FUNC_CANCEL_SYSCTR_ALARM
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
/**@}*/
plat/imx/imx8qm/platform.mk
View file @
aea05550
...
...
@@ -22,6 +22,8 @@ BL31_SOURCES += plat/imx/common/lpuart_console.S \
plat/imx/imx8qm/imx8qm_psci.c
\
plat/imx/common/imx8_topology.c
\
plat/imx/common/imx8_psci.c
\
plat/imx/common/imx_sip_svc.c
\
plat/imx/common/imx_sip_handler.c
\
lib/xlat_tables/aarch64/xlat_tables.c
\
lib/xlat_tables/xlat_tables_common.c
\
lib/cpus/aarch64/cortex_a53.S
\
...
...
plat/imx/imx8qx/platform.mk
View file @
aea05550
...
...
@@ -21,6 +21,8 @@ BL31_SOURCES += plat/imx/common/lpuart_console.S \
plat/imx/imx8qx/imx8qx_psci.c
\
plat/imx/common/imx8_topology.c
\
plat/imx/common/imx8_psci.c
\
plat/imx/common/imx_sip_svc.c
\
plat/imx/common/imx_sip_handler.c
\
plat/common/plat_psci_common.c
\
lib/xlat_tables/xlat_tables_common.c
\
lib/xlat_tables/aarch64/xlat_tables.c
\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment