diff options
-rw-r--r-- | plat/freescale/common/cpufreq.c | 57 | ||||
-rw-r--r-- | plat/freescale/common/include/fsl_sip.h (renamed from plat/freescale/imx8mq/include/fsl_sip.h) | 4 | ||||
-rw-r--r-- | plat/freescale/common/sip_svc.c (renamed from plat/freescale/imx8mq/sip_svc.c) | 12 | ||||
-rw-r--r-- | plat/freescale/imx8mq/platform.mk | 2 | ||||
-rw-r--r-- | plat/freescale/imx8qm/platform.mk | 2 | ||||
-rw-r--r-- | plat/freescale/imx8qxp/platform.mk | 2 |
6 files changed, 76 insertions, 3 deletions
diff --git a/plat/freescale/common/cpufreq.c b/plat/freescale/common/cpufreq.c new file mode 100644 index 00000000..75f005dd --- /dev/null +++ b/plat/freescale/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/freescale/imx8mq/include/fsl_sip.h b/plat/freescale/common/include/fsl_sip.h index 73fa08d4..52dceb81 100644 --- a/plat/freescale/imx8mq/include/fsl_sip.h +++ b/plat/freescale/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/freescale/imx8mq/sip_svc.c b/plat/freescale/common/sip_svc.c index 0bf9cd3e..d8c1c5bf 100644 --- a/plat/freescale/imx8mq/sip_svc.c +++ b/plat/freescale/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,7 +52,7 @@ 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, @@ -59,11 +60,18 @@ uintptr_t imx_svc_smc_handler(uint32_t smc_fid, { 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/freescale/imx8mq/platform.mk b/plat/freescale/imx8mq/platform.mk index 424ccc83..b7c4b866 100644 --- a/plat/freescale/imx8mq/platform.mk +++ b/plat/freescale/imx8mq/platform.mk @@ -9,10 +9,10 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/freescale/common/imx8_helpers.S \ plat/freescale/common/mxcuart_console.S \ + plat/freescale/common/sip_svc.c \ plat/freescale/imx8mq/imx8m_bl31_setup.c \ plat/freescale/imx8mq/gpc.c \ plat/freescale/imx8mq/imx8m_psci.c \ - plat/freescale/imx8mq/sip_svc.c \ plat/freescale/common/imx8_topology.c \ plat/common/plat_psci_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ diff --git a/plat/freescale/imx8qm/platform.mk b/plat/freescale/imx8qm/platform.mk index c516c8df..8abc978d 100644 --- a/plat/freescale/imx8qm/platform.mk +++ b/plat/freescale/imx8qm/platform.mk @@ -40,6 +40,8 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/freescale/common/lpuart_console.S \ plat/freescale/common/imx8_helpers.S \ + plat/freescale/common/sip_svc.c \ + plat/freescale/common/cpufreq.c \ plat/freescale/imx8qm/imx8qm_bl31_setup.c \ plat/freescale/imx8qm/imx8qm_psci.c \ plat/freescale/common/imx8_topology.c \ diff --git a/plat/freescale/imx8qxp/platform.mk b/plat/freescale/imx8qxp/platform.mk index 50b695ef..9be92464 100644 --- a/plat/freescale/imx8qxp/platform.mk +++ b/plat/freescale/imx8qxp/platform.mk @@ -40,6 +40,8 @@ PLAT_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += plat/freescale/common/lpuart_console.S \ plat/freescale/common/imx8_helpers.S \ + plat/freescale/common/sip_svc.c \ + plat/freescale/common/cpufreq.c \ plat/freescale/imx8qxp/imx8qxp_bl31_setup.c \ plat/freescale/imx8qxp/imx8qxp_psci.c \ plat/freescale/common/imx8_topology.c \ |