|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v4 1/3] xen/arm: Add imx8q{m,x} platform glue
> Subject: [PATCH v4 1/3] xen/arm: Add imx8q{m,x} platform glue
>
> When using Linux for dom0 there are a bunch of drivers that need to do SMC
> SIP calls into the firmware to enable certain hardware bits like the watchdog.
>
> Provide a basic platform glue that implements the needed SMC forwarding.
>
> The format of these calls are as follows:
> - reg 0: function ID
> - reg 1: subfunction ID (when there's a subfunction) remaining regs: args
>
> For now we only allow Dom0 to make these calls as they are all managing
> hardware. There is no specification for these SIP calls, the IDs and names
> have
> been extracted from the upstream linux kernel and the vendor kernel.
>
> Most of the SIP calls are only available for the iMX8M series of SoCs, so they
> are easy to reject and they need to be revisited when iMX8M series support is
> added.
>
> From the other calls we can reject CPUFREQ because Dom0 cannot make an
> informed decision regarding CPU frequency scaling, WAKEUP_SRC is to wake
> up from suspend, which Xen doesn't support at this time.
>
> This leaves the TIME SIP, OTP SIPs, BUILDINFO SIP and TEMP ALARM SIP,
> which for now are allowed to Dom0.
>
> NOTE: This code is based on code found in NXP Xen tree located here:
> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub
> .com%2Fnxp-imx%2Fimx-xen%2Fblob%2Flf-
> 5.10.y_4.13%2Fxen%2Farch%2Farm%2Fplatforms%2Fimx8qm.c&data=05%7
> C02%7Cpeng.fan%40nxp.com%7C5602a2d54f074c7dcd9608dc57e69286%7
> C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C6384818950076004
> 32%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMz
> IiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=qSf9A7yE17P
> 2q2%2FqXINORXh2EfFAS1%2BilhiY%2FexjcbA%3D&reserved=0
>
> Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
> [jernberg: Add SIP call filtering]
> Signed-off-by: John Ernberg <john.ernberg@xxxxxxxx>
>
> ---
>
> v4:
> - Fix coding style problems added in v3 (Michal Orzel)
> - Remove all calls not currently used by Linux on imx8q{m,xp} (Michal Orzel)
> - Fix {g,}printk inconsistencies, prefer gprintk (Michal Orzel)
>
> v3:
> - Adhere to style guidelines for line length and label indentation (Michal
> Orzel)
> - Use smccc macros to build the SIP function identifier (Michal Orzel)
> - Adjust platform name to be specific to QM and QXP variants (Michal Orzel)
> - Pick up additional SIPs which may be used by other Linux versions (Michal
> Orzel)
> - Changes to the commit message due to above
>
> v2:
> - Reword the commit message to be a bit clearer
> - Include the link previously added as a context note to the commit message
> (Julien Grall)
> - Add Pengs signed off (Julien Grall, Peng Fan)
> - Add basic SIP call filter (Julien Grall)
> - Expand the commit message a whole bunch because of the changes to the
> code
> ---
> xen/arch/arm/platforms/Makefile | 1 +
> xen/arch/arm/platforms/imx8qm.c | 139
> ++++++++++++++++++++++++++++++++
> 2 files changed, 140 insertions(+)
> create mode 100644 xen/arch/arm/platforms/imx8qm.c
>
> diff --git a/xen/arch/arm/platforms/Makefile
> b/xen/arch/arm/platforms/Makefile index 8632f4115f..bec6e55d1f 100644
> --- a/xen/arch/arm/platforms/Makefile
> +++ b/xen/arch/arm/platforms/Makefile
> @@ -9,5 +9,6 @@ obj-$(CONFIG_ALL_PLAT) += sunxi.o
> obj-$(CONFIG_ALL64_PLAT) += thunderx.o
> obj-$(CONFIG_ALL64_PLAT) += xgene-storm.o
> obj-$(CONFIG_ALL64_PLAT) += brcm-raspberry-pi.o
> +obj-$(CONFIG_ALL64_PLAT) += imx8qm.o
> obj-$(CONFIG_MPSOC_PLATFORM) += xilinx-zynqmp.o
> obj-$(CONFIG_MPSOC_PLATFORM) += xilinx-zynqmp-eemi.o diff --git
> a/xen/arch/arm/platforms/imx8qm.c b/xen/arch/arm/platforms/imx8qm.c
> new file mode 100644 index 0000000000..3600a073e8
> --- /dev/null
> +++ b/xen/arch/arm/platforms/imx8qm.c
> @@ -0,0 +1,139 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * xen/arch/arm/platforms/imx8qm.c
> + *
> + * i.MX 8QM setup
> + *
> + * Copyright (c) 2016 Freescale Inc.
> + * Copyright 2018-2019 NXP
> + *
> + *
> + * Peng Fan <peng.fan@xxxxxxx>
> + */
> +
> +#include <xen/sched.h>
> +#include <asm/platform.h>
> +#include <asm/smccc.h>
> +
> +static const char * const imx8qm_dt_compat[] __initconst = {
> + "fsl,imx8qm",
> + "fsl,imx8qxp",
> + NULL
> +};
> +
> +#define IMX_SIP_FID(fid) \
> + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
> + ARM_SMCCC_CONV_64, \
> + ARM_SMCCC_OWNER_SIP, \
> + (fid))
> +
> +#define IMX_SIP_F_CPUFREQ 0x1
> +#define IMX_SIP_F_TIME 0x2
> +#define IMX_SIP_F_WAKEUP_SRC 0x9
> +#define IMX_SIP_F_OTP_WRITE 0xB
> +
> +#define IMX_SIP_TIME_SF_RTC_SET_TIME 0x00
> +#define IMX_SIP_TIME_SF_WDOG_START 0x01
> +#define IMX_SIP_TIME_SF_WDOG_STOP 0x02
> +#define IMX_SIP_TIME_SF_WDOG_SET_ACT 0x03
> +#define IMX_SIP_TIME_SF_WDOG_PING 0x04
> +#define IMX_SIP_TIME_SF_WDOG_SET_TIMEOUT 0x05
> +#define IMX_SIP_TIME_SF_WDOG_GET_STAT 0x06
> +#define IMX_SIP_TIME_SF_WDOG_SET_PRETIME 0x07
> +
> +static bool imx8qm_is_sip_time_call_ok(uint32_t subfunction_id) {
> + switch ( subfunction_id )
> + {
> + case IMX_SIP_TIME_SF_RTC_SET_TIME:
> + return true;
> + case IMX_SIP_TIME_SF_WDOG_START:
> + case IMX_SIP_TIME_SF_WDOG_STOP:
> + case IMX_SIP_TIME_SF_WDOG_SET_ACT:
> + case IMX_SIP_TIME_SF_WDOG_PING:
> + case IMX_SIP_TIME_SF_WDOG_SET_TIMEOUT:
> + case IMX_SIP_TIME_SF_WDOG_GET_STAT:
> + case IMX_SIP_TIME_SF_WDOG_SET_PRETIME:
> + return true;
> + default:
> + gprintk(XENLOG_WARNING, "imx8qm: smc: time: Unknown
> subfunction id %x\n",
> + subfunction_id);
> + return false;
> + }
> +}
> +
> +static bool imx8qm_smc(struct cpu_user_regs *regs) {
> + uint32_t function_id = get_user_reg(regs, 0);
> + uint32_t subfunction_id = get_user_reg(regs, 1);
> + struct arm_smccc_res res;
> +
> + if ( !cpus_have_const_cap(ARM_SMCCC_1_1) )
> + {
> + printk_once(XENLOG_WARNING
> + "imx8qm: smc: no SMCCC 1.1 support. Disabling
> + firmware calls\n");
> +
> + return false;
> + }
> +
> + /* Only hardware domain may use the SIP calls */
> + if ( !is_hardware_domain(current->domain) )
> + {
> + gprintk(XENLOG_WARNING, "imx8qm: smc: No access\n");
> + return false;
> + }
> +
> + switch ( function_id )
> + {
> + case IMX_SIP_FID(IMX_SIP_F_CPUFREQ):
> + /* Hardware domain can't take any informed decision here */
> + return false;
> + case IMX_SIP_FID(IMX_SIP_F_TIME):
> + if ( imx8qm_is_sip_time_call_ok(subfunction_id) )
> + goto allow_call;
> + return false;
> + /* Xen doesn't have suspend support */
> + case IMX_SIP_FID(IMX_SIP_F_WAKEUP_SRC):
> + return false;
> + case IMX_SIP_FID(IMX_SIP_F_OTP_WRITE):
> + /* subfunction_id is the fuse number, no sensible check possible */
> + goto allow_call;
> + default:
> + gprintk(XENLOG_WARNING, "imx8qm: smc: Unknown function
> id %x\n",
> + function_id);
> + return false;
> + }
> +
> + allow_call:
> + arm_smccc_1_1_smc(function_id,
> + subfunction_id,
> + get_user_reg(regs, 2),
> + get_user_reg(regs, 3),
> + get_user_reg(regs, 4),
> + get_user_reg(regs, 5),
> + get_user_reg(regs, 6),
> + get_user_reg(regs, 7),
> + &res);
> +
> + set_user_reg(regs, 0, res.a0);
> + set_user_reg(regs, 1, res.a1);
> + set_user_reg(regs, 2, res.a2);
> + set_user_reg(regs, 3, res.a3);
> +
> + return true;
> +}
> +
> +PLATFORM_START(imx8qm, "i.MX 8Q{M,XP}")
> + .compatible = imx8qm_dt_compat,
> + .smc = imx8qm_smc,
> +PLATFORM_END
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> --
Reviewed-by: Peng Fan <peng.fan@xxxxxxx>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |