Message ID | 20220926110758.666922-1-dmitry.baryshkov@linaro.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 3137f2e60098bccdf9b3a744747b06a96addab9e |
Headers | show |
Series | [RESEND,v2] firmware/psci: Add debugfs support to ease debugging | expand |
On Mon, 26 Sept 2022 at 13:08, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > > To ease debugging of PSCI supported features, add debugfs file called > 'psci' describing PSCI and SMC CC versions, enabled features and > options. > > Reviewed-by: Mark Brown <broonie@kernel.org> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > I sketched this while trying to narrow down the particular issue on > the Qualcomm platform (which started as an attempt to implement PSCI > domains, but then led to understanding that while the platform claims > supports OSI, it doesn't support SET_SUSPEND). We were going to use > this to help to narrow down issues with the PSCI support on other > platforms as well. > > Changes since v1: > - Extended the table to include MEM_PROTECT functions (noted by Mark > Brown) > - Switched to seq_puts where possible > - Changed S_IRUGO to 0444 > > The patch is resent to include soc@kernel.org > --- > drivers/firmware/psci/psci.c | 116 ++++++++++++++++++++++++++++++++++- > include/uapi/linux/psci.h | 14 +++++ > 2 files changed, 129 insertions(+), 1 deletion(-) > > diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c > index cfb448eabdaa..9fdcb6bff403 100644 > --- a/drivers/firmware/psci/psci.c > +++ b/drivers/firmware/psci/psci.c > @@ -9,6 +9,7 @@ > #include <linux/acpi.h> > #include <linux/arm-smccc.h> > #include <linux/cpuidle.h> > +#include <linux/debugfs.h> > #include <linux/errno.h> > #include <linux/linkage.h> > #include <linux/of.h> > @@ -324,12 +325,125 @@ static void psci_sys_poweroff(void) > invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > } > > -static int __init psci_features(u32 psci_func_id) > +static int psci_features(u32 psci_func_id) > { > return invoke_psci_fn(PSCI_1_0_FN_PSCI_FEATURES, > psci_func_id, 0, 0); > } > > +#ifdef CONFIG_DEBUG_FS > + > +#define PSCI_ID(ver, _name) \ > + { .fn = PSCI_##ver##_FN_##_name, .name = #_name, } > +#define PSCI_ID_NATIVE(ver, _name) \ > + { .fn = PSCI_FN_NATIVE(ver, _name), .name = #_name, } > + > +/* A table of all optional functions */ > +static const struct { > + u32 fn; > + const char *name; > +} psci_fn_ids[] = { > + PSCI_ID_NATIVE(0_2, MIGRATE), > + PSCI_ID(0_2, MIGRATE_INFO_TYPE), > + PSCI_ID_NATIVE(0_2, MIGRATE_INFO_UP_CPU), > + PSCI_ID(1_0, CPU_FREEZE), > + PSCI_ID_NATIVE(1_0, CPU_DEFAULT_SUSPEND), > + PSCI_ID_NATIVE(1_0, NODE_HW_STATE), > + PSCI_ID_NATIVE(1_0, SYSTEM_SUSPEND), > + PSCI_ID(1_0, SET_SUSPEND_MODE), > + PSCI_ID_NATIVE(1_0, STAT_RESIDENCY), > + PSCI_ID_NATIVE(1_0, STAT_COUNT), > + PSCI_ID_NATIVE(1_1, SYSTEM_RESET2), > + PSCI_ID(1_1, MEM_PROTECT), > + PSCI_ID_NATIVE(1_1, MEM_PROTECT_CHECK_RANGE), > +}; > + > +static int psci_debugfs_read(struct seq_file *s, void *data) > +{ > + int feature, type, i; > + u32 ver; > + > + ver = psci_ops.get_version(); This call and some other calls below, triggers calls into the PSCI FW (via smc calls). Rather than having to do that, each time user space wants to read the debugfs data, we could cache/store that data during the "probe" sequence of the psci fw driver. In this way, we don't need to run the smc calls each time, but just once when probing. Did you consider that option? Or perhaps there are other problems of doing that? > + seq_printf(s, "PSCIv%d.%d\n", > + PSCI_VERSION_MAJOR(ver), > + PSCI_VERSION_MINOR(ver)); > + > + /* PSCI_FEATURES is available only starting from 1.0 */ > + if (PSCI_VERSION_MAJOR(ver) < 1) > + return 0; > + > + feature = psci_features(ARM_SMCCC_VERSION_FUNC_ID); > + if (feature != PSCI_RET_NOT_SUPPORTED) { > + ver = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); > + seq_printf(s, "SMC Calling Convention v%d.%d\n", > + PSCI_VERSION_MAJOR(ver), > + PSCI_VERSION_MINOR(ver)); > + } else { > + seq_puts(s, "SMC Calling Convention v1.0 is assumed\n"); > + } > + > + feature = psci_features(PSCI_FN_NATIVE(0_2, CPU_SUSPEND)); > + if (feature < 0) { > + seq_printf(s, "PSCI_FEATURES(CPU_SUSPEND) error (%d)\n", feature); > + } else { > + seq_printf(s, "OSI is %ssupported\n", > + (feature & BIT(0)) ? "" : "not "); > + seq_printf(s, "%s StateID format is used\n", > + (feature & BIT(1)) ? "Extended" : "Original"); > + } > + > + type = psci_ops.migrate_info_type(); > + if (type == PSCI_0_2_TOS_UP_MIGRATE || > + type == PSCI_0_2_TOS_UP_NO_MIGRATE) { > + unsigned long cpuid; > + > + seq_printf(s, "Trusted OS %smigrate capable\n", > + type == PSCI_0_2_TOS_UP_NO_MIGRATE ? "not " : ""); > + cpuid = psci_migrate_info_up_cpu(); > + seq_printf(s, "Trusted OS resident on physical CPU 0x%lx (#%d)\n", > + cpuid, resident_cpu); > + } else if (type == PSCI_0_2_TOS_MP) { > + seq_puts(s, "Trusted OS migration not required\n"); > + } else { > + if (type != PSCI_RET_NOT_SUPPORTED) > + seq_printf(s, "MIGRATE_INFO_TYPE returned unknown type (%d)\n", type); > + } > + > + for (i = 0; i < ARRAY_SIZE(psci_fn_ids); i++) { > + feature = psci_features(psci_fn_ids[i].fn); > + if (feature == PSCI_RET_NOT_SUPPORTED) > + continue; > + if (feature < 0) > + seq_printf(s, "PSCI_FEATURES(%s) error (%d)\n", > + psci_fn_ids[i].name, feature); > + else > + seq_printf(s, "%s is supported\n", psci_fn_ids[i].name); > + } > + > + return 0; > +} [...] Kind regards Uffe
On Mon, 26 Sept 2022 at 14:39, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > On Mon, 26 Sept 2022 at 13:08, Dmitry Baryshkov > <dmitry.baryshkov@linaro.org> wrote: > > > > To ease debugging of PSCI supported features, add debugfs file called > > 'psci' describing PSCI and SMC CC versions, enabled features and > > options. > > > > Reviewed-by: Mark Brown <broonie@kernel.org> > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > --- > > I sketched this while trying to narrow down the particular issue on > > the Qualcomm platform (which started as an attempt to implement PSCI > > domains, but then led to understanding that while the platform claims > > supports OSI, it doesn't support SET_SUSPEND). We were going to use > > this to help to narrow down issues with the PSCI support on other > > platforms as well. > > > > Changes since v1: > > - Extended the table to include MEM_PROTECT functions (noted by Mark > > Brown) > > - Switched to seq_puts where possible > > - Changed S_IRUGO to 0444 > > > > The patch is resent to include soc@kernel.org > > --- > > drivers/firmware/psci/psci.c | 116 ++++++++++++++++++++++++++++++++++- > > include/uapi/linux/psci.h | 14 +++++ > > 2 files changed, 129 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c > > index cfb448eabdaa..9fdcb6bff403 100644 > > --- a/drivers/firmware/psci/psci.c > > +++ b/drivers/firmware/psci/psci.c > > @@ -9,6 +9,7 @@ > > #include <linux/acpi.h> > > #include <linux/arm-smccc.h> > > #include <linux/cpuidle.h> > > +#include <linux/debugfs.h> > > #include <linux/errno.h> > > #include <linux/linkage.h> > > #include <linux/of.h> > > @@ -324,12 +325,125 @@ static void psci_sys_poweroff(void) > > invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > > } > > > > -static int __init psci_features(u32 psci_func_id) > > +static int psci_features(u32 psci_func_id) > > { > > return invoke_psci_fn(PSCI_1_0_FN_PSCI_FEATURES, > > psci_func_id, 0, 0); > > } > > > > +#ifdef CONFIG_DEBUG_FS > > + > > +#define PSCI_ID(ver, _name) \ > > + { .fn = PSCI_##ver##_FN_##_name, .name = #_name, } > > +#define PSCI_ID_NATIVE(ver, _name) \ > > + { .fn = PSCI_FN_NATIVE(ver, _name), .name = #_name, } > > + > > +/* A table of all optional functions */ > > +static const struct { > > + u32 fn; > > + const char *name; > > +} psci_fn_ids[] = { > > + PSCI_ID_NATIVE(0_2, MIGRATE), > > + PSCI_ID(0_2, MIGRATE_INFO_TYPE), > > + PSCI_ID_NATIVE(0_2, MIGRATE_INFO_UP_CPU), > > + PSCI_ID(1_0, CPU_FREEZE), > > + PSCI_ID_NATIVE(1_0, CPU_DEFAULT_SUSPEND), > > + PSCI_ID_NATIVE(1_0, NODE_HW_STATE), > > + PSCI_ID_NATIVE(1_0, SYSTEM_SUSPEND), > > + PSCI_ID(1_0, SET_SUSPEND_MODE), > > + PSCI_ID_NATIVE(1_0, STAT_RESIDENCY), > > + PSCI_ID_NATIVE(1_0, STAT_COUNT), > > + PSCI_ID_NATIVE(1_1, SYSTEM_RESET2), > > + PSCI_ID(1_1, MEM_PROTECT), > > + PSCI_ID_NATIVE(1_1, MEM_PROTECT_CHECK_RANGE), > > +}; > > + > > +static int psci_debugfs_read(struct seq_file *s, void *data) > > +{ > > + int feature, type, i; > > + u32 ver; > > + > > + ver = psci_ops.get_version(); > > This call and some other calls below, triggers calls into the PSCI FW > (via smc calls). Rather than having to do that, each time user space > wants to read the debugfs data, we could cache/store that data during > the "probe" sequence of the psci fw driver. In this way, we don't need > to run the smc calls each time, but just once when probing. > > Did you consider that option? Or perhaps there are other problems of doing that? Basically I did not want to complicate this. While caching firmware information sounds appealing, it would complicate adding support for the additional debugging features, like checking sleep state stats. So, I'd say, it's not worth doing that. > > > + seq_printf(s, "PSCIv%d.%d\n", > > + PSCI_VERSION_MAJOR(ver), > > + PSCI_VERSION_MINOR(ver)); > > + > > + /* PSCI_FEATURES is available only starting from 1.0 */ > > + if (PSCI_VERSION_MAJOR(ver) < 1) > > + return 0; > > + > > + feature = psci_features(ARM_SMCCC_VERSION_FUNC_ID); > > + if (feature != PSCI_RET_NOT_SUPPORTED) { > > + ver = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); > > + seq_printf(s, "SMC Calling Convention v%d.%d\n", > > + PSCI_VERSION_MAJOR(ver), > > + PSCI_VERSION_MINOR(ver)); > > + } else { > > + seq_puts(s, "SMC Calling Convention v1.0 is assumed\n"); > > + } > > + > > + feature = psci_features(PSCI_FN_NATIVE(0_2, CPU_SUSPEND)); > > + if (feature < 0) { > > + seq_printf(s, "PSCI_FEATURES(CPU_SUSPEND) error (%d)\n", feature); > > + } else { > > + seq_printf(s, "OSI is %ssupported\n", > > + (feature & BIT(0)) ? "" : "not "); > > + seq_printf(s, "%s StateID format is used\n", > > + (feature & BIT(1)) ? "Extended" : "Original"); > > + } > > + > > + type = psci_ops.migrate_info_type(); > > + if (type == PSCI_0_2_TOS_UP_MIGRATE || > > + type == PSCI_0_2_TOS_UP_NO_MIGRATE) { > > + unsigned long cpuid; > > + > > + seq_printf(s, "Trusted OS %smigrate capable\n", > > + type == PSCI_0_2_TOS_UP_NO_MIGRATE ? "not " : ""); > > + cpuid = psci_migrate_info_up_cpu(); > > + seq_printf(s, "Trusted OS resident on physical CPU 0x%lx (#%d)\n", > > + cpuid, resident_cpu); > > + } else if (type == PSCI_0_2_TOS_MP) { > > + seq_puts(s, "Trusted OS migration not required\n"); > > + } else { > > + if (type != PSCI_RET_NOT_SUPPORTED) > > + seq_printf(s, "MIGRATE_INFO_TYPE returned unknown type (%d)\n", type); > > + } > > + > > + for (i = 0; i < ARRAY_SIZE(psci_fn_ids); i++) { > > + feature = psci_features(psci_fn_ids[i].fn); > > + if (feature == PSCI_RET_NOT_SUPPORTED) > > + continue; > > + if (feature < 0) > > + seq_printf(s, "PSCI_FEATURES(%s) error (%d)\n", > > + psci_fn_ids[i].name, feature); > > + else > > + seq_printf(s, "%s is supported\n", psci_fn_ids[i].name); > > + } > > + > > + return 0; > > +} > > [...] > > Kind regards > Uffe
On Mon, 26 Sept 2022 at 14:04, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote: > > On Mon, 26 Sept 2022 at 14:39, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > > > On Mon, 26 Sept 2022 at 13:08, Dmitry Baryshkov > > <dmitry.baryshkov@linaro.org> wrote: > > > > > > To ease debugging of PSCI supported features, add debugfs file called > > > 'psci' describing PSCI and SMC CC versions, enabled features and > > > options. > > > > > > Reviewed-by: Mark Brown <broonie@kernel.org> > > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > > --- > > > I sketched this while trying to narrow down the particular issue on > > > the Qualcomm platform (which started as an attempt to implement PSCI > > > domains, but then led to understanding that while the platform claims > > > supports OSI, it doesn't support SET_SUSPEND). We were going to use > > > this to help to narrow down issues with the PSCI support on other > > > platforms as well. > > > > > > Changes since v1: > > > - Extended the table to include MEM_PROTECT functions (noted by Mark > > > Brown) > > > - Switched to seq_puts where possible > > > - Changed S_IRUGO to 0444 > > > > > > The patch is resent to include soc@kernel.org > > > --- > > > drivers/firmware/psci/psci.c | 116 ++++++++++++++++++++++++++++++++++- > > > include/uapi/linux/psci.h | 14 +++++ > > > 2 files changed, 129 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c > > > index cfb448eabdaa..9fdcb6bff403 100644 > > > --- a/drivers/firmware/psci/psci.c > > > +++ b/drivers/firmware/psci/psci.c > > > @@ -9,6 +9,7 @@ > > > #include <linux/acpi.h> > > > #include <linux/arm-smccc.h> > > > #include <linux/cpuidle.h> > > > +#include <linux/debugfs.h> > > > #include <linux/errno.h> > > > #include <linux/linkage.h> > > > #include <linux/of.h> > > > @@ -324,12 +325,125 @@ static void psci_sys_poweroff(void) > > > invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > > > } > > > > > > -static int __init psci_features(u32 psci_func_id) > > > +static int psci_features(u32 psci_func_id) > > > { > > > return invoke_psci_fn(PSCI_1_0_FN_PSCI_FEATURES, > > > psci_func_id, 0, 0); > > > } > > > > > > +#ifdef CONFIG_DEBUG_FS > > > + > > > +#define PSCI_ID(ver, _name) \ > > > + { .fn = PSCI_##ver##_FN_##_name, .name = #_name, } > > > +#define PSCI_ID_NATIVE(ver, _name) \ > > > + { .fn = PSCI_FN_NATIVE(ver, _name), .name = #_name, } > > > + > > > +/* A table of all optional functions */ > > > +static const struct { > > > + u32 fn; > > > + const char *name; > > > +} psci_fn_ids[] = { > > > + PSCI_ID_NATIVE(0_2, MIGRATE), > > > + PSCI_ID(0_2, MIGRATE_INFO_TYPE), > > > + PSCI_ID_NATIVE(0_2, MIGRATE_INFO_UP_CPU), > > > + PSCI_ID(1_0, CPU_FREEZE), > > > + PSCI_ID_NATIVE(1_0, CPU_DEFAULT_SUSPEND), > > > + PSCI_ID_NATIVE(1_0, NODE_HW_STATE), > > > + PSCI_ID_NATIVE(1_0, SYSTEM_SUSPEND), > > > + PSCI_ID(1_0, SET_SUSPEND_MODE), > > > + PSCI_ID_NATIVE(1_0, STAT_RESIDENCY), > > > + PSCI_ID_NATIVE(1_0, STAT_COUNT), > > > + PSCI_ID_NATIVE(1_1, SYSTEM_RESET2), > > > + PSCI_ID(1_1, MEM_PROTECT), > > > + PSCI_ID_NATIVE(1_1, MEM_PROTECT_CHECK_RANGE), > > > +}; > > > + > > > +static int psci_debugfs_read(struct seq_file *s, void *data) > > > +{ > > > + int feature, type, i; > > > + u32 ver; > > > + > > > + ver = psci_ops.get_version(); > > > > This call and some other calls below, triggers calls into the PSCI FW > > (via smc calls). Rather than having to do that, each time user space > > wants to read the debugfs data, we could cache/store that data during > > the "probe" sequence of the psci fw driver. In this way, we don't need > > to run the smc calls each time, but just once when probing. > > > > Did you consider that option? Or perhaps there are other problems of doing that? > > Basically I did not want to complicate this. While caching firmware > information sounds appealing, it would complicate adding support for > the additional debugging features, like checking sleep state stats. > > So, I'd say, it's not worth doing that. Alright, no strong opinion from my side. Feel free to add: Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> [...] Kind regards Uffe
Hello: This patch was applied to soc/soc.git (for-next) by Arnd Bergmann <arnd@arndb.de>: On Mon, 26 Sep 2022 14:07:58 +0300 you wrote: > To ease debugging of PSCI supported features, add debugfs file called > 'psci' describing PSCI and SMC CC versions, enabled features and > options. > > Reviewed-by: Mark Brown <broonie@kernel.org> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > [...] Here is the summary with links: - [RESEND,v2] firmware/psci: Add debugfs support to ease debugging https://git.kernel.org/soc/soc/c/3137f2e60098 You are awesome, thank you!
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index cfb448eabdaa..9fdcb6bff403 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c @@ -9,6 +9,7 @@ #include <linux/acpi.h> #include <linux/arm-smccc.h> #include <linux/cpuidle.h> +#include <linux/debugfs.h> #include <linux/errno.h> #include <linux/linkage.h> #include <linux/of.h> @@ -324,12 +325,125 @@ static void psci_sys_poweroff(void) invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); } -static int __init psci_features(u32 psci_func_id) +static int psci_features(u32 psci_func_id) { return invoke_psci_fn(PSCI_1_0_FN_PSCI_FEATURES, psci_func_id, 0, 0); } +#ifdef CONFIG_DEBUG_FS + +#define PSCI_ID(ver, _name) \ + { .fn = PSCI_##ver##_FN_##_name, .name = #_name, } +#define PSCI_ID_NATIVE(ver, _name) \ + { .fn = PSCI_FN_NATIVE(ver, _name), .name = #_name, } + +/* A table of all optional functions */ +static const struct { + u32 fn; + const char *name; +} psci_fn_ids[] = { + PSCI_ID_NATIVE(0_2, MIGRATE), + PSCI_ID(0_2, MIGRATE_INFO_TYPE), + PSCI_ID_NATIVE(0_2, MIGRATE_INFO_UP_CPU), + PSCI_ID(1_0, CPU_FREEZE), + PSCI_ID_NATIVE(1_0, CPU_DEFAULT_SUSPEND), + PSCI_ID_NATIVE(1_0, NODE_HW_STATE), + PSCI_ID_NATIVE(1_0, SYSTEM_SUSPEND), + PSCI_ID(1_0, SET_SUSPEND_MODE), + PSCI_ID_NATIVE(1_0, STAT_RESIDENCY), + PSCI_ID_NATIVE(1_0, STAT_COUNT), + PSCI_ID_NATIVE(1_1, SYSTEM_RESET2), + PSCI_ID(1_1, MEM_PROTECT), + PSCI_ID_NATIVE(1_1, MEM_PROTECT_CHECK_RANGE), +}; + +static int psci_debugfs_read(struct seq_file *s, void *data) +{ + int feature, type, i; + u32 ver; + + ver = psci_ops.get_version(); + seq_printf(s, "PSCIv%d.%d\n", + PSCI_VERSION_MAJOR(ver), + PSCI_VERSION_MINOR(ver)); + + /* PSCI_FEATURES is available only starting from 1.0 */ + if (PSCI_VERSION_MAJOR(ver) < 1) + return 0; + + feature = psci_features(ARM_SMCCC_VERSION_FUNC_ID); + if (feature != PSCI_RET_NOT_SUPPORTED) { + ver = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); + seq_printf(s, "SMC Calling Convention v%d.%d\n", + PSCI_VERSION_MAJOR(ver), + PSCI_VERSION_MINOR(ver)); + } else { + seq_puts(s, "SMC Calling Convention v1.0 is assumed\n"); + } + + feature = psci_features(PSCI_FN_NATIVE(0_2, CPU_SUSPEND)); + if (feature < 0) { + seq_printf(s, "PSCI_FEATURES(CPU_SUSPEND) error (%d)\n", feature); + } else { + seq_printf(s, "OSI is %ssupported\n", + (feature & BIT(0)) ? "" : "not "); + seq_printf(s, "%s StateID format is used\n", + (feature & BIT(1)) ? "Extended" : "Original"); + } + + type = psci_ops.migrate_info_type(); + if (type == PSCI_0_2_TOS_UP_MIGRATE || + type == PSCI_0_2_TOS_UP_NO_MIGRATE) { + unsigned long cpuid; + + seq_printf(s, "Trusted OS %smigrate capable\n", + type == PSCI_0_2_TOS_UP_NO_MIGRATE ? "not " : ""); + cpuid = psci_migrate_info_up_cpu(); + seq_printf(s, "Trusted OS resident on physical CPU 0x%lx (#%d)\n", + cpuid, resident_cpu); + } else if (type == PSCI_0_2_TOS_MP) { + seq_puts(s, "Trusted OS migration not required\n"); + } else { + if (type != PSCI_RET_NOT_SUPPORTED) + seq_printf(s, "MIGRATE_INFO_TYPE returned unknown type (%d)\n", type); + } + + for (i = 0; i < ARRAY_SIZE(psci_fn_ids); i++) { + feature = psci_features(psci_fn_ids[i].fn); + if (feature == PSCI_RET_NOT_SUPPORTED) + continue; + if (feature < 0) + seq_printf(s, "PSCI_FEATURES(%s) error (%d)\n", + psci_fn_ids[i].name, feature); + else + seq_printf(s, "%s is supported\n", psci_fn_ids[i].name); + } + + return 0; +} + +static int psci_debugfs_open(struct inode *inode, struct file *f) +{ + return single_open(f, psci_debugfs_read, NULL); +} + +static const struct file_operations psci_debugfs_ops = { + .owner = THIS_MODULE, + .open = psci_debugfs_open, + .release = single_release, + .read = seq_read, + .llseek = seq_lseek +}; + +static int __init psci_debugfs_init(void) +{ + return PTR_ERR_OR_ZERO(debugfs_create_file("psci", 0444, NULL, NULL, + &psci_debugfs_ops)); +} +late_initcall(psci_debugfs_init) +#endif + #ifdef CONFIG_CPU_IDLE static int psci_suspend_finisher(unsigned long state) { diff --git a/include/uapi/linux/psci.h b/include/uapi/linux/psci.h index 2bf93c0d6354..3511095c2702 100644 --- a/include/uapi/linux/psci.h +++ b/include/uapi/linux/psci.h @@ -48,12 +48,26 @@ #define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU PSCI_0_2_FN64(7) #define PSCI_1_0_FN_PSCI_FEATURES PSCI_0_2_FN(10) +#define PSCI_1_0_FN_CPU_FREEZE PSCI_0_2_FN(11) +#define PSCI_1_0_FN_CPU_DEFAULT_SUSPEND PSCI_0_2_FN(12) +#define PSCI_1_0_FN_NODE_HW_STATE PSCI_0_2_FN(13) #define PSCI_1_0_FN_SYSTEM_SUSPEND PSCI_0_2_FN(14) #define PSCI_1_0_FN_SET_SUSPEND_MODE PSCI_0_2_FN(15) +#define PSCI_1_0_FN_STAT_RESIDENCY PSCI_0_2_FN(16) +#define PSCI_1_0_FN_STAT_COUNT PSCI_0_2_FN(17) + #define PSCI_1_1_FN_SYSTEM_RESET2 PSCI_0_2_FN(18) +#define PSCI_1_1_FN_MEM_PROTECT PSCI_0_2_FN(19) +#define PSCI_1_1_FN_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN(19) +#define PSCI_1_0_FN64_CPU_DEFAULT_SUSPEND PSCI_0_2_FN64(12) +#define PSCI_1_0_FN64_NODE_HW_STATE PSCI_0_2_FN64(13) #define PSCI_1_0_FN64_SYSTEM_SUSPEND PSCI_0_2_FN64(14) +#define PSCI_1_0_FN64_STAT_RESIDENCY PSCI_0_2_FN64(16) +#define PSCI_1_0_FN64_STAT_COUNT PSCI_0_2_FN64(17) + #define PSCI_1_1_FN64_SYSTEM_RESET2 PSCI_0_2_FN64(18) +#define PSCI_1_1_FN64_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN64(19) /* PSCI v0.2 power state encoding for CPU_SUSPEND function */ #define PSCI_0_2_POWER_STATE_ID_MASK 0xffff