Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
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
6 years ago
by
Antonio Niño Díaz
Committed by
GitHub
6 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #1754 from Anson-Huang/master
Add i.MX8 SoC SRTC/cpu-freq SIP runtime service support
parents
af4aad2f
d3996c59
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
v2.1
v2.1-rc1
v2.1-rc0
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
plat/imx/common/imx_sip_handler.c
+78
-0
plat/imx/common/imx_sip_handler.c
plat/imx/common/imx_sip_svc.c
+51
-0
plat/imx/common/imx_sip_svc.c
plat/imx/common/include/imx_sip_svc.h
+24
-0
plat/imx/common/include/imx_sip_svc.h
plat/imx/common/include/sci/sci.h
+2
-1
plat/imx/common/include/sci/sci.h
plat/imx/common/include/sci/svc/timer/sci_timer_api.h
+358
-0
plat/imx/common/include/sci/svc/timer/sci_timer_api.h
plat/imx/common/sci/sci_api.mk
+3
-2
plat/imx/common/sci/sci_api.mk
plat/imx/common/sci/svc/timer/sci_timer_rpc.h
+69
-0
plat/imx/common/sci/svc/timer/sci_timer_rpc.h
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
+396
-0
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
plat/imx/imx8qm/platform.mk
+2
-0
plat/imx/imx8qm/platform.mk
plat/imx/imx8qx/platform.mk
+2
-0
plat/imx/imx8qx/platform.mk
with
985 additions
and
3 deletions
+985
-3
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
;
}
This diff is collapsed.
Click to expand it.
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
);
This diff is collapsed.
Click to expand it.
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__ */
This diff is collapsed.
Click to expand it.
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 */
This diff is collapsed.
Click to expand it.
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 */
/**@}*/
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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 */
/**@}*/
This diff is collapsed.
Click to expand it.
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
;
}
/**@}*/
This diff is collapsed.
Click to expand it.
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
\
...
...
This diff is collapsed.
Click to expand it.
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
\
...
...
This diff is collapsed.
Click to expand it.
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
Menu
Projects
Groups
Snippets
Help