diff options
author | Anson Huang <Anson.Huang@nxp.com> | 2017-08-14 23:24:27 +0800 |
---|---|---|
committer | Abel Vesa <abel.vesa@nxp.com> | 2018-06-11 10:08:39 +0300 |
commit | 7b10c32b2a5dd81c425522dfd7d5c6c7e5e01b82 (patch) | |
tree | 19bbf95439d71e6237ac55841fe0db0d1d6e61a4 /plat | |
parent | f94a57297f6714785976dc44c6f566e15efeb264 (diff) |
i.mx8qm/i.mx8qxp: add SIP cpu-freq support
Linux kernel will issue cpu-freq scale via SIP, ATF
calls SCFW API to finish the CPU frequency scale.
Move SIP service code from i.mx8mq to common place for
all i.mx SoCs.
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Diffstat (limited to 'plat')
-rw-r--r-- | plat/imx/common/cpufreq.c | 57 | ||||
-rw-r--r-- | plat/imx/common/include/fsl_sip.h (renamed from plat/imx/imx8mq/include/fsl_sip.h) | 4 | ||||
-rw-r--r-- | plat/imx/common/sip_svc.c (renamed from plat/imx/imx8mq/sip_svc.c) | 14 | ||||
-rw-r--r-- | plat/imx/imx8mq/platform.mk | 2 | ||||
-rw-r--r-- | plat/imx/imx8qm/platform.mk | 2 | ||||
-rw-r--r-- | plat/imx/imx8qxp/platform.mk | 2 |
6 files changed, 77 insertions, 4 deletions
diff --git a/plat/imx/common/cpufreq.c b/plat/imx/common/cpufreq.c new file mode 100644 index 00000000..75f005dd --- /dev/null +++ b/plat/imx/common/cpufreq.c @@ -0,0 +1,57 @@ +/* + * Copyright 2017 NXP + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <debug.h> +#include <stdlib.h> +#include <stdint.h> +#include <smcc_helpers.h> +#include <std_svc.h> +#include <types.h> +#include <platform_def.h> +#include <fsl_sip.h> +#include <sci/sci.h> + +extern sc_ipc_t ipc_handle; + +const static int ap_cluster_index[2] = { + SC_R_A53, SC_R_A72, +}; + +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_IMX8QXP + 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 FSL_SIP_SET_CPUFREQ: + imx_cpufreq_set_target(x2, x3); + break; + default: + return SMC_UNK; + } + + return 0; +} diff --git a/plat/imx/imx8mq/include/fsl_sip.h b/plat/imx/common/include/fsl_sip.h index 73fa08d4..52dceb81 100644 --- a/plat/imx/imx8mq/include/fsl_sip.h +++ b/plat/imx/common/include/fsl_sip.h @@ -21,4 +21,8 @@ #define FSL_SIP_CONFIG_GPC_SET_WAKE 0x02 #define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03 +#define FSL_SIP_CPUFREQ 0xC2000001 +#define FSL_SIP_SET_CPUFREQ 0x00 + + #endif diff --git a/plat/imx/imx8mq/sip_svc.c b/plat/imx/common/sip_svc.c index 41104b06..d8c1c5bf 100644 --- a/plat/imx/imx8mq/sip_svc.c +++ b/plat/imx/common/sip_svc.c @@ -38,6 +38,7 @@ #include <uuid.h> extern int imx_gpc_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, u_register_t x3); +extern int imx_cpufreq_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, u_register_t x3); /* Setup i.MX platform specific services Services */ static int32_t plat_svc_setup(void) @@ -51,19 +52,26 @@ static int32_t plat_svc_setup(void) uintptr_t imx_svc_smc_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, - u_register_t x3, + u_register_t x3, u_register_t x4, void *cookie, void *handle, - u_register_t flags) + uint64_t flags) { NOTICE("smc_fid is %x\n", smc_fid); switch (smc_fid) { +#ifdef PLAT_IMX8M case FSL_SIP_GPC: SMC_RET1(handle, imx_gpc_handler(smc_fid, x1, x2, x3)); break; +#endif +#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QXP)) + case FSL_SIP_CPUFREQ: + SMC_RET1(handle, imx_cpufreq_handler(smc_fid, x1, x2, x3)); + break; +#endif default: - WARN("Uimplemented SIP Service Call: 0x%x \n", smc_fid); + WARN("Unimplemented SIP Service Call: 0x%x \n", smc_fid); SMC_RET1(handle, SMC_UNK); break; } diff --git a/plat/imx/imx8mq/platform.mk b/plat/imx/imx8mq/platform.mk index a7719770..4297c1b4 100644 --- a/plat/imx/imx8mq/platform.mk +++ b/plat/imx/imx8mq/platform.mk @@ -9,10 +9,10 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/imx/common/imx8_helpers.S \ plat/imx/common/mxcuart_console.S \ + plat/imx/common/sip_svc.c \ plat/imx/imx8mq/imx8m_bl31_setup.c \ plat/imx/imx8mq/gpc.c \ plat/imx/imx8mq/imx8m_psci.c \ - plat/imx/imx8mq/sip_svc.c \ plat/imx/common/imx8_topology.c \ plat/common/plat_psci_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ diff --git a/plat/imx/imx8qm/platform.mk b/plat/imx/imx8qm/platform.mk index a1296e2a..3753c430 100644 --- a/plat/imx/imx8qm/platform.mk +++ b/plat/imx/imx8qm/platform.mk @@ -40,6 +40,8 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/imx/common/lpuart_console.S \ plat/imx/common/imx8_helpers.S \ + plat/imx/common/sip_svc.c \ + plat/imx/common/cpufreq.c \ plat/imx/imx8qm/imx8qm_bl31_setup.c \ plat/imx/imx8qm/imx8qm_psci.c \ plat/imx/common/imx8_topology.c \ diff --git a/plat/imx/imx8qxp/platform.mk b/plat/imx/imx8qxp/platform.mk index 392a8233..260454d1 100644 --- a/plat/imx/imx8qxp/platform.mk +++ b/plat/imx/imx8qxp/platform.mk @@ -40,6 +40,8 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/imx/common/lpuart_console.S \ plat/imx/common/imx8_helpers.S \ + plat/imx/common/sip_svc.c \ + plat/imx/common/cpufreq.c \ plat/imx/imx8qxp/imx8qxp_bl31_setup.c \ plat/imx/imx8qxp/imx8qxp_psci.c \ plat/imx/common/imx8_topology.c \ |