diff --git a/plat/imx/common/imx_sip_handler.c b/plat/imx/common/imx_sip_handler.c new file mode 100644 index 000000000..a414a4467 --- /dev/null +++ b/plat/imx/common/imx_sip_handler.c @@ -0,0 +1,44 @@ +/* + * Copyright 2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +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); +} diff --git a/plat/imx/common/imx_sip_svc.c b/plat/imx/common/imx_sip_svc.c new file mode 100644 index 000000000..23ff0bbef --- /dev/null +++ b/plat/imx/common/imx_sip_svc.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include + +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); +#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 +); diff --git a/plat/imx/common/include/imx_sip_svc.h b/plat/imx/common/include/imx_sip_svc.h new file mode 100644 index 000000000..0d21f7562 --- /dev/null +++ b/plat/imx/common/include/imx_sip_svc.h @@ -0,0 +1,19 @@ +/* + * 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_SRTC 0xC2000002 +#define IMX_SIP_SRTC_SET_TIME 0x00 + +#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX)) +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__ */ diff --git a/plat/imx/imx8qm/platform.mk b/plat/imx/imx8qm/platform.mk index dc45e901d..9113d33eb 100644 --- a/plat/imx/imx8qm/platform.mk +++ b/plat/imx/imx8qm/platform.mk @@ -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 \ diff --git a/plat/imx/imx8qx/platform.mk b/plat/imx/imx8qx/platform.mk index a831bf2f0..eeb1f34ed 100644 --- a/plat/imx/imx8qx/platform.mk +++ b/plat/imx/imx8qx/platform.mk @@ -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 \