* [PATCH v3 0/6] Add support for a fake, para-virtualised machine @ 2012-12-18 17:53 Will Deacon [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:53 ` [PATCH v3 6/6] ARM: mach-virt: add SMP support using PSCI Will Deacon 0 siblings, 2 replies; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw Hi, This is version three of the patches originally posted here: v1.) http://lists.infradead.org/pipermail/linux-arm-kernel/2012-December/135870.html v2.) http://lists.infradead.org/pipermail/linux-arm-kernel/2012-December/137750.html Thanks to all those who have provided comments so far. Changes for v3 include: * Ripped out *even more* SMP code by rebasing onto latest mainline * Removed function-base property from device-tree binding * Annotated the low-level firmware invocation functions with noinline to clarify intent * Minor cleanups As usual, testing this relies on KVM support for PSCI, a magic kvmtool and Mark Rutland's arch-timer patches. Comments welcome, Will Marc Zyngier (1): ARM: Dummy Virtual Machine platform support Will Deacon (5): ARM: opcodes: add missing include of linux/linkage.h ARM: opcodes: add opcodes definitions for ARM security extensions ARM: psci: add devicetree binding for describing PSCI firmware ARM: psci: add support for PSCI invocations from the kernel ARM: mach-virt: add SMP support using PSCI Documentation/devicetree/bindings/arm/psci.txt | 55 +++++++ arch/arm/Kconfig | 12 ++ arch/arm/Makefile | 1 + arch/arm/include/asm/opcodes-sec.h | 24 +++ arch/arm/include/asm/opcodes.h | 1 + arch/arm/include/asm/psci.h | 36 +++++ arch/arm/kernel/Makefile | 1 + arch/arm/kernel/psci.c | 211 +++++++++++++++++++++++++ arch/arm/mach-virt/Kconfig | 10 ++ arch/arm/mach-virt/Makefile | 6 + arch/arm/mach-virt/platsmp.c | 58 +++++++ arch/arm/mach-virt/virt.c | 69 ++++++++ 12 files changed, 484 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/psci.txt create mode 100644 arch/arm/include/asm/opcodes-sec.h create mode 100644 arch/arm/include/asm/psci.h create mode 100644 arch/arm/kernel/psci.c create mode 100644 arch/arm/mach-virt/Kconfig create mode 100644 arch/arm/mach-virt/Makefile create mode 100644 arch/arm/mach-virt/platsmp.c create mode 100644 arch/arm/mach-virt/virt.c -- 1.8.0 ^ permalink raw reply [flat|nested] 12+ messages in thread
[parent not found: <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>]
* [PATCH v3 1/6] ARM: opcodes: add missing include of linux/linkage.h [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> @ 2012-12-18 17:53 ` Will Deacon 2012-12-18 17:53 ` [PATCH v3 2/6] ARM: opcodes: add opcodes definitions for ARM security extensions Will Deacon ` (4 subsequent siblings) 5 siblings, 0 replies; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw opcodes.h wants to declare an asmlinkage function, so we need to include linux/linkage.h Acked-by: Dave Martin <dave.martin-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> --- arch/arm/include/asm/opcodes.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h index 74e211a..e796c59 100644 --- a/arch/arm/include/asm/opcodes.h +++ b/arch/arm/include/asm/opcodes.h @@ -10,6 +10,7 @@ #define __ASM_ARM_OPCODES_H #ifndef __ASSEMBLY__ +#include <linux/linkage.h> extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); #endif -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/6] ARM: opcodes: add opcodes definitions for ARM security extensions [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:53 ` [PATCH v3 1/6] ARM: opcodes: add missing include of linux/linkage.h Will Deacon @ 2012-12-18 17:53 ` Will Deacon 2012-12-18 17:53 ` [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware Will Deacon ` (3 subsequent siblings) 5 siblings, 0 replies; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw The ARM security extensions introduced the smc instruction, which is not supported by all versions of GAS. This patch introduces opcodes-sec.h, so that smc is made available in a similar manner to hvc. Acked-by: Dave Martin <dave.martin-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> --- arch/arm/include/asm/opcodes-sec.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 arch/arm/include/asm/opcodes-sec.h diff --git a/arch/arm/include/asm/opcodes-sec.h b/arch/arm/include/asm/opcodes-sec.h new file mode 100644 index 0000000..bc3a917 --- /dev/null +++ b/arch/arm/include/asm/opcodes-sec.h @@ -0,0 +1,24 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + * + * Copyright (C) 2012 ARM Limited + */ + +#ifndef __ASM_ARM_OPCODES_SEC_H +#define __ASM_ARM_OPCODES_SEC_H + +#include <asm/opcodes.h> + +#define __SMC(imm4) __inst_arm_thumb32( \ + 0xE1600070 | (((imm4) & 0xF) << 0), \ + 0xF7F08000 | (((imm4) & 0xF) << 16) \ +) + +#endif /* __ASM_ARM_OPCODES_SEC_H */ -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:53 ` [PATCH v3 1/6] ARM: opcodes: add missing include of linux/linkage.h Will Deacon 2012-12-18 17:53 ` [PATCH v3 2/6] ARM: opcodes: add opcodes definitions for ARM security extensions Will Deacon @ 2012-12-18 17:53 ` Will Deacon 2012-12-19 4:11 ` Nicolas Pitre 2012-12-18 17:53 ` [PATCH v3 4/6] ARM: psci: add support for PSCI invocations from the kernel Will Deacon ` (2 subsequent siblings) 5 siblings, 1 reply; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw This patch adds a new devicetree binding for describing PSCI firmware to Linux. Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> --- Documentation/devicetree/bindings/arm/psci.txt | 55 ++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/psci.txt diff --git a/Documentation/devicetree/bindings/arm/psci.txt b/Documentation/devicetree/bindings/arm/psci.txt new file mode 100644 index 0000000..433afe9 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/psci.txt @@ -0,0 +1,55 @@ +* Power State Coordination Interface (PSCI) + +Firmware implementing the PSCI functions described in ARM document number +ARM DEN 0022A ("Power State Coordination Interface System Software on ARM +processors") can be used by Linux to initiate various CPU-centric power +operations. + +Issue A of the specification describes functions for CPU suspend, hotplug +and migration of secure software. + +Functions are invoked by trapping to the privilege level of the PSCI +firmware (specified as part of the binding below) and passing arguments +in a manner similar to that specified by AAPCS: + + r0 => 32-bit Function ID / return value + {r1 - r3} => Parameters + +Note that the immediate field of the trapping instruction must be set +to #0. + + +Main node required properties: + + - compatible : Must be "arm,psci" + + - method : The method of calling the PSCI firmware. Permitted + values are: + + "smc" : SMC #0, with the register assignments specified + in this binding. + + "hvc" : HVC #0, with the register assignments specified + in this binding. + +Main node optional properties: + + - cpu_suspend : Function ID for CPU_SUSPEND operation + + - cpu_off : Function ID for CPU_OFF operation + + - cpu_on : Function ID for CPU_ON operation + + - migrate : Function ID for MIGRATE operation + + +Example: + + psci { + compatible = "arm,psci"; + method = "smc"; + cpu_suspend = <0x95c10000>; + cpu_off = <0x95c10001>; + cpu_on = <0x95c10002>; + migrate = <0x95c10003>; + }; -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware 2012-12-18 17:53 ` [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware Will Deacon @ 2012-12-19 4:11 ` Nicolas Pitre 0 siblings, 0 replies; 12+ messages in thread From: Nicolas Pitre @ 2012-12-19 4:11 UTC (permalink / raw) To: Will Deacon Cc: dave.martin, arnd, Marc.Zyngier, devicetree-discuss, xen-devel, linux-arm-kernel On Tue, 18 Dec 2012, Will Deacon wrote: > This patch adds a new devicetree binding for describing PSCI firmware > to Linux. > > Signed-off-by: Will Deacon <will.deacon@arm.com> Acked-by: Nicolas Pitre <nico@linaro.org> > --- > Documentation/devicetree/bindings/arm/psci.txt | 55 ++++++++++++++++++++++++++ > 1 file changed, 55 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/psci.txt > > diff --git a/Documentation/devicetree/bindings/arm/psci.txt b/Documentation/devicetree/bindings/arm/psci.txt > new file mode 100644 > index 0000000..433afe9 > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/psci.txt > @@ -0,0 +1,55 @@ > +* Power State Coordination Interface (PSCI) > + > +Firmware implementing the PSCI functions described in ARM document number > +ARM DEN 0022A ("Power State Coordination Interface System Software on ARM > +processors") can be used by Linux to initiate various CPU-centric power > +operations. > + > +Issue A of the specification describes functions for CPU suspend, hotplug > +and migration of secure software. > + > +Functions are invoked by trapping to the privilege level of the PSCI > +firmware (specified as part of the binding below) and passing arguments > +in a manner similar to that specified by AAPCS: > + > + r0 => 32-bit Function ID / return value > + {r1 - r3} => Parameters > + > +Note that the immediate field of the trapping instruction must be set > +to #0. > + > + > +Main node required properties: > + > + - compatible : Must be "arm,psci" > + > + - method : The method of calling the PSCI firmware. Permitted > + values are: > + > + "smc" : SMC #0, with the register assignments specified > + in this binding. > + > + "hvc" : HVC #0, with the register assignments specified > + in this binding. > + > +Main node optional properties: > + > + - cpu_suspend : Function ID for CPU_SUSPEND operation > + > + - cpu_off : Function ID for CPU_OFF operation > + > + - cpu_on : Function ID for CPU_ON operation > + > + - migrate : Function ID for MIGRATE operation > + > + > +Example: > + > + psci { > + compatible = "arm,psci"; > + method = "smc"; > + cpu_suspend = <0x95c10000>; > + cpu_off = <0x95c10001>; > + cpu_on = <0x95c10002>; > + migrate = <0x95c10003>; > + }; > -- > 1.8.0 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 4/6] ARM: psci: add support for PSCI invocations from the kernel [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> ` (2 preceding siblings ...) 2012-12-18 17:53 ` [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware Will Deacon @ 2012-12-18 17:53 ` Will Deacon [not found] ` <1355853196-23676-5-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:53 ` [PATCH v3 5/6] ARM: Dummy Virtual Machine platform support Will Deacon 2012-12-18 17:59 ` [PATCH v3 0/6] Add support for a fake, para-virtualised machine Arnd Bergmann 5 siblings, 1 reply; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw This patch adds support for the Power State Coordination Interface defined by ARM, allowing Linux to request CPU-centric power-management operations from firmware implementing the PSCI protocol. Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> --- arch/arm/Kconfig | 10 +++ arch/arm/include/asm/psci.h | 36 ++++++++ arch/arm/kernel/Makefile | 1 + arch/arm/kernel/psci.c | 211 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 258 insertions(+) create mode 100644 arch/arm/include/asm/psci.h create mode 100644 arch/arm/kernel/psci.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8c83d98..80d54b8 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1617,6 +1617,16 @@ config HOTPLUG_CPU Say Y here to experiment with turning CPUs off and on. CPUs can be controlled through /sys/devices/system/cpu. +config ARM_PSCI + bool "Support for the ARM Power State Coordination Interface (PSCI)" + depends on CPU_V7 + help + Say Y here if you want Linux to communicate with system firmware + implementing the PSCI specification for CPU-centric power + management operations described in ARM document number ARM DEN + 0022A ("Power State Coordination Interface System Software on + ARM processors"). + config LOCAL_TIMERS bool "Use local timer interrupts" depends on SMP diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h new file mode 100644 index 0000000..ce0dbe7 --- /dev/null +++ b/arch/arm/include/asm/psci.h @@ -0,0 +1,36 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + * + * Copyright (C) 2012 ARM Limited + */ + +#ifndef __ASM_ARM_PSCI_H +#define __ASM_ARM_PSCI_H + +#define PSCI_POWER_STATE_TYPE_STANDBY 0 +#define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 + +struct psci_power_state { + u16 id; + u8 type; + u8 affinity_level; +}; + +struct psci_operations { + int (*cpu_suspend)(struct psci_power_state state, + unsigned long entry_point); + int (*cpu_off)(struct psci_power_state state); + int (*cpu_on)(unsigned long cpuid, unsigned long entry_point); + int (*migrate)(unsigned long cpuid); +}; + +extern struct psci_operations psci_ops; + +#endif /* __ASM_ARM_PSCI_H */ diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 5bbec7b..5f3338e 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -82,5 +82,6 @@ obj-$(CONFIG_DEBUG_LL) += debug.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o +obj-$(CONFIG_ARM_PSCI) += psci.o extra-y := $(head-y) vmlinux.lds diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c new file mode 100644 index 0000000..3653164 --- /dev/null +++ b/arch/arm/kernel/psci.c @@ -0,0 +1,211 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + * + * Copyright (C) 2012 ARM Limited + * + * Author: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> + */ + +#define pr_fmt(fmt) "psci: " fmt + +#include <linux/init.h> +#include <linux/of.h> + +#include <asm/compiler.h> +#include <asm/errno.h> +#include <asm/opcodes-sec.h> +#include <asm/opcodes-virt.h> +#include <asm/psci.h> + +struct psci_operations psci_ops; + +static int (*invoke_psci_fn)(u32, u32, u32, u32); + +enum psci_function { + PSCI_FN_CPU_SUSPEND, + PSCI_FN_CPU_ON, + PSCI_FN_CPU_OFF, + PSCI_FN_MIGRATE, + PSCI_FN_MAX, +}; + +static u32 psci_function_id[PSCI_FN_MAX]; + +#define PSCI_RET_SUCCESS 0 +#define PSCI_RET_EOPNOTSUPP -1 +#define PSCI_RET_EINVAL -2 +#define PSCI_RET_EPERM -3 + +static int psci_to_linux_errno(int errno) +{ + switch (errno) { + case PSCI_RET_SUCCESS: + return 0; + case PSCI_RET_EOPNOTSUPP: + return -EOPNOTSUPP; + case PSCI_RET_EINVAL: + return -EINVAL; + case PSCI_RET_EPERM: + return -EPERM; + }; + + return -EINVAL; +} + +#define PSCI_POWER_STATE_ID_MASK 0xffff +#define PSCI_POWER_STATE_ID_SHIFT 0 +#define PSCI_POWER_STATE_TYPE_MASK 0x1 +#define PSCI_POWER_STATE_TYPE_SHIFT 16 +#define PSCI_POWER_STATE_AFFL_MASK 0x3 +#define PSCI_POWER_STATE_AFFL_SHIFT 24 + +static u32 psci_power_state_pack(struct psci_power_state state) +{ + return ((state.id & PSCI_POWER_STATE_ID_MASK) + << PSCI_POWER_STATE_ID_SHIFT) | + ((state.type & PSCI_POWER_STATE_TYPE_MASK) + << PSCI_POWER_STATE_TYPE_SHIFT) | + ((state.affinity_level & PSCI_POWER_STATE_AFFL_MASK) + << PSCI_POWER_STATE_AFFL_SHIFT); +} + +/* + * The following two functions are invoked via the invoke_psci_fn pointer + * and will not be inlined, allowing us to piggyback on the AAPCS. + */ +static noinline int __invoke_psci_fn_hvc(u32 function_id, u32 arg0, u32 arg1, + u32 arg2) +{ + asm volatile( + __asmeq("%0", "r0") + __asmeq("%1", "r1") + __asmeq("%2", "r2") + __asmeq("%3", "r3") + __HVC(0) + : "+r" (function_id) + : "r" (arg0), "r" (arg1), "r" (arg2)); + + return function_id; +} + +static noinline int __invoke_psci_fn_smc(u32 function_id, u32 arg0, u32 arg1, + u32 arg2) +{ + asm volatile( + __asmeq("%0", "r0") + __asmeq("%1", "r1") + __asmeq("%2", "r2") + __asmeq("%3", "r3") + __SMC(0) + : "+r" (function_id) + : "r" (arg0), "r" (arg1), "r" (arg2)); + + return function_id; +} + +static int psci_cpu_suspend(struct psci_power_state state, + unsigned long entry_point) +{ + int err; + u32 fn, power_state; + + fn = psci_function_id[PSCI_FN_CPU_SUSPEND]; + power_state = psci_power_state_pack(state); + err = invoke_psci_fn(fn, power_state, entry_point, 0); + return psci_to_linux_errno(err); +} + +static int psci_cpu_off(struct psci_power_state state) +{ + int err; + u32 fn, power_state; + + fn = psci_function_id[PSCI_FN_CPU_OFF]; + power_state = psci_power_state_pack(state); + err = invoke_psci_fn(fn, power_state, 0, 0); + return psci_to_linux_errno(err); +} + +static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point) +{ + int err; + u32 fn; + + fn = psci_function_id[PSCI_FN_CPU_ON]; + err = invoke_psci_fn(fn, cpuid, entry_point, 0); + return psci_to_linux_errno(err); +} + +static int psci_migrate(unsigned long cpuid) +{ + int err; + u32 fn; + + fn = psci_function_id[PSCI_FN_MIGRATE]; + err = invoke_psci_fn(fn, cpuid, 0, 0); + return psci_to_linux_errno(err); +} + +static const struct of_device_id psci_of_match[] __initconst = { + { .compatible = "arm,psci", }, + {}, +}; + +static int __init psci_init(void) +{ + struct device_node *np; + const char *method; + u32 id; + + np = of_find_matching_node(NULL, psci_of_match); + if (!np) + return 0; + + pr_info("probing function IDs from device-tree\n"); + + if (of_property_read_string(np, "method", &method)) { + pr_warning("missing \"method\" property\n"); + goto out_put_node; + } + + if (!strcmp("hvc", method)) { + invoke_psci_fn = __invoke_psci_fn_hvc; + } else if (!strcmp("smc", method)) { + invoke_psci_fn = __invoke_psci_fn_smc; + } else { + pr_warning("invalid \"method\" property: %s\n", method); + goto out_put_node; + } + + if (!of_property_read_u32(np, "cpu_suspend", &id)) { + psci_function_id[PSCI_FN_CPU_SUSPEND] = id; + psci_ops.cpu_suspend = psci_cpu_suspend; + } + + if (!of_property_read_u32(np, "cpu_off", &id)) { + psci_function_id[PSCI_FN_CPU_OFF] = id; + psci_ops.cpu_off = psci_cpu_off; + } + + if (!of_property_read_u32(np, "cpu_on", &id)) { + psci_function_id[PSCI_FN_CPU_ON] = id; + psci_ops.cpu_on = psci_cpu_on; + } + + if (!of_property_read_u32(np, "migrate", &id)) { + psci_function_id[PSCI_FN_MIGRATE] = id; + psci_ops.migrate = psci_migrate; + } + +out_put_node: + of_node_put(np); + return 0; +} +early_initcall(psci_init); -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <1355853196-23676-5-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>]
* Re: [PATCH v3 4/6] ARM: psci: add support for PSCI invocations from the kernel [not found] ` <1355853196-23676-5-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> @ 2012-12-19 4:16 ` Nicolas Pitre 0 siblings, 0 replies; 12+ messages in thread From: Nicolas Pitre @ 2012-12-19 4:16 UTC (permalink / raw) To: Will Deacon Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, xen-devel-GuqFBffKawuEi8DpZVb4nw, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Tue, 18 Dec 2012, Will Deacon wrote: > This patch adds support for the Power State Coordination Interface > defined by ARM, allowing Linux to request CPU-centric power-management > operations from firmware implementing the PSCI protocol. > > Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> Acked-by: Nicolas Pitre <nico-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > --- > arch/arm/Kconfig | 10 +++ > arch/arm/include/asm/psci.h | 36 ++++++++ > arch/arm/kernel/Makefile | 1 + > arch/arm/kernel/psci.c | 211 ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 258 insertions(+) > create mode 100644 arch/arm/include/asm/psci.h > create mode 100644 arch/arm/kernel/psci.c > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 8c83d98..80d54b8 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -1617,6 +1617,16 @@ config HOTPLUG_CPU > Say Y here to experiment with turning CPUs off and on. CPUs > can be controlled through /sys/devices/system/cpu. > > +config ARM_PSCI > + bool "Support for the ARM Power State Coordination Interface (PSCI)" > + depends on CPU_V7 > + help > + Say Y here if you want Linux to communicate with system firmware > + implementing the PSCI specification for CPU-centric power > + management operations described in ARM document number ARM DEN > + 0022A ("Power State Coordination Interface System Software on > + ARM processors"). > + > config LOCAL_TIMERS > bool "Use local timer interrupts" > depends on SMP > diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h > new file mode 100644 > index 0000000..ce0dbe7 > --- /dev/null > +++ b/arch/arm/include/asm/psci.h > @@ -0,0 +1,36 @@ > +/* > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * 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. > + * > + * Copyright (C) 2012 ARM Limited > + */ > + > +#ifndef __ASM_ARM_PSCI_H > +#define __ASM_ARM_PSCI_H > + > +#define PSCI_POWER_STATE_TYPE_STANDBY 0 > +#define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 > + > +struct psci_power_state { > + u16 id; > + u8 type; > + u8 affinity_level; > +}; > + > +struct psci_operations { > + int (*cpu_suspend)(struct psci_power_state state, > + unsigned long entry_point); > + int (*cpu_off)(struct psci_power_state state); > + int (*cpu_on)(unsigned long cpuid, unsigned long entry_point); > + int (*migrate)(unsigned long cpuid); > +}; > + > +extern struct psci_operations psci_ops; > + > +#endif /* __ASM_ARM_PSCI_H */ > diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile > index 5bbec7b..5f3338e 100644 > --- a/arch/arm/kernel/Makefile > +++ b/arch/arm/kernel/Makefile > @@ -82,5 +82,6 @@ obj-$(CONFIG_DEBUG_LL) += debug.o > obj-$(CONFIG_EARLY_PRINTK) += early_printk.o > > obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o > +obj-$(CONFIG_ARM_PSCI) += psci.o > > extra-y := $(head-y) vmlinux.lds > diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c > new file mode 100644 > index 0000000..3653164 > --- /dev/null > +++ b/arch/arm/kernel/psci.c > @@ -0,0 +1,211 @@ > +/* > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * 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. > + * > + * Copyright (C) 2012 ARM Limited > + * > + * Author: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> > + */ > + > +#define pr_fmt(fmt) "psci: " fmt > + > +#include <linux/init.h> > +#include <linux/of.h> > + > +#include <asm/compiler.h> > +#include <asm/errno.h> > +#include <asm/opcodes-sec.h> > +#include <asm/opcodes-virt.h> > +#include <asm/psci.h> > + > +struct psci_operations psci_ops; > + > +static int (*invoke_psci_fn)(u32, u32, u32, u32); > + > +enum psci_function { > + PSCI_FN_CPU_SUSPEND, > + PSCI_FN_CPU_ON, > + PSCI_FN_CPU_OFF, > + PSCI_FN_MIGRATE, > + PSCI_FN_MAX, > +}; > + > +static u32 psci_function_id[PSCI_FN_MAX]; > + > +#define PSCI_RET_SUCCESS 0 > +#define PSCI_RET_EOPNOTSUPP -1 > +#define PSCI_RET_EINVAL -2 > +#define PSCI_RET_EPERM -3 > + > +static int psci_to_linux_errno(int errno) > +{ > + switch (errno) { > + case PSCI_RET_SUCCESS: > + return 0; > + case PSCI_RET_EOPNOTSUPP: > + return -EOPNOTSUPP; > + case PSCI_RET_EINVAL: > + return -EINVAL; > + case PSCI_RET_EPERM: > + return -EPERM; > + }; > + > + return -EINVAL; > +} > + > +#define PSCI_POWER_STATE_ID_MASK 0xffff > +#define PSCI_POWER_STATE_ID_SHIFT 0 > +#define PSCI_POWER_STATE_TYPE_MASK 0x1 > +#define PSCI_POWER_STATE_TYPE_SHIFT 16 > +#define PSCI_POWER_STATE_AFFL_MASK 0x3 > +#define PSCI_POWER_STATE_AFFL_SHIFT 24 > + > +static u32 psci_power_state_pack(struct psci_power_state state) > +{ > + return ((state.id & PSCI_POWER_STATE_ID_MASK) > + << PSCI_POWER_STATE_ID_SHIFT) | > + ((state.type & PSCI_POWER_STATE_TYPE_MASK) > + << PSCI_POWER_STATE_TYPE_SHIFT) | > + ((state.affinity_level & PSCI_POWER_STATE_AFFL_MASK) > + << PSCI_POWER_STATE_AFFL_SHIFT); > +} > + > +/* > + * The following two functions are invoked via the invoke_psci_fn pointer > + * and will not be inlined, allowing us to piggyback on the AAPCS. > + */ > +static noinline int __invoke_psci_fn_hvc(u32 function_id, u32 arg0, u32 arg1, > + u32 arg2) > +{ > + asm volatile( > + __asmeq("%0", "r0") > + __asmeq("%1", "r1") > + __asmeq("%2", "r2") > + __asmeq("%3", "r3") > + __HVC(0) > + : "+r" (function_id) > + : "r" (arg0), "r" (arg1), "r" (arg2)); > + > + return function_id; > +} > + > +static noinline int __invoke_psci_fn_smc(u32 function_id, u32 arg0, u32 arg1, > + u32 arg2) > +{ > + asm volatile( > + __asmeq("%0", "r0") > + __asmeq("%1", "r1") > + __asmeq("%2", "r2") > + __asmeq("%3", "r3") > + __SMC(0) > + : "+r" (function_id) > + : "r" (arg0), "r" (arg1), "r" (arg2)); > + > + return function_id; > +} > + > +static int psci_cpu_suspend(struct psci_power_state state, > + unsigned long entry_point) > +{ > + int err; > + u32 fn, power_state; > + > + fn = psci_function_id[PSCI_FN_CPU_SUSPEND]; > + power_state = psci_power_state_pack(state); > + err = invoke_psci_fn(fn, power_state, entry_point, 0); > + return psci_to_linux_errno(err); > +} > + > +static int psci_cpu_off(struct psci_power_state state) > +{ > + int err; > + u32 fn, power_state; > + > + fn = psci_function_id[PSCI_FN_CPU_OFF]; > + power_state = psci_power_state_pack(state); > + err = invoke_psci_fn(fn, power_state, 0, 0); > + return psci_to_linux_errno(err); > +} > + > +static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point) > +{ > + int err; > + u32 fn; > + > + fn = psci_function_id[PSCI_FN_CPU_ON]; > + err = invoke_psci_fn(fn, cpuid, entry_point, 0); > + return psci_to_linux_errno(err); > +} > + > +static int psci_migrate(unsigned long cpuid) > +{ > + int err; > + u32 fn; > + > + fn = psci_function_id[PSCI_FN_MIGRATE]; > + err = invoke_psci_fn(fn, cpuid, 0, 0); > + return psci_to_linux_errno(err); > +} > + > +static const struct of_device_id psci_of_match[] __initconst = { > + { .compatible = "arm,psci", }, > + {}, > +}; > + > +static int __init psci_init(void) > +{ > + struct device_node *np; > + const char *method; > + u32 id; > + > + np = of_find_matching_node(NULL, psci_of_match); > + if (!np) > + return 0; > + > + pr_info("probing function IDs from device-tree\n"); > + > + if (of_property_read_string(np, "method", &method)) { > + pr_warning("missing \"method\" property\n"); > + goto out_put_node; > + } > + > + if (!strcmp("hvc", method)) { > + invoke_psci_fn = __invoke_psci_fn_hvc; > + } else if (!strcmp("smc", method)) { > + invoke_psci_fn = __invoke_psci_fn_smc; > + } else { > + pr_warning("invalid \"method\" property: %s\n", method); > + goto out_put_node; > + } > + > + if (!of_property_read_u32(np, "cpu_suspend", &id)) { > + psci_function_id[PSCI_FN_CPU_SUSPEND] = id; > + psci_ops.cpu_suspend = psci_cpu_suspend; > + } > + > + if (!of_property_read_u32(np, "cpu_off", &id)) { > + psci_function_id[PSCI_FN_CPU_OFF] = id; > + psci_ops.cpu_off = psci_cpu_off; > + } > + > + if (!of_property_read_u32(np, "cpu_on", &id)) { > + psci_function_id[PSCI_FN_CPU_ON] = id; > + psci_ops.cpu_on = psci_cpu_on; > + } > + > + if (!of_property_read_u32(np, "migrate", &id)) { > + psci_function_id[PSCI_FN_MIGRATE] = id; > + psci_ops.migrate = psci_migrate; > + } > + > +out_put_node: > + of_node_put(np); > + return 0; > +} > +early_initcall(psci_init); > -- > 1.8.0 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 5/6] ARM: Dummy Virtual Machine platform support [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> ` (3 preceding siblings ...) 2012-12-18 17:53 ` [PATCH v3 4/6] ARM: psci: add support for PSCI invocations from the kernel Will Deacon @ 2012-12-18 17:53 ` Will Deacon [not found] ` <1355853196-23676-6-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:59 ` [PATCH v3 0/6] Add support for a fake, para-virtualised machine Arnd Bergmann 5 siblings, 1 reply; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Will Deacon, xen-devel-GuqFBffKawuEi8DpZVb4nw From: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> Add support for the smallest, dumbest possible platform, to be used as a guest for KVM or other hypervisors. It only mandates a GIC and architected timers. Fits nicely with a multiplatform zImage. Uses very little silicon area. Signed-off-by: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> --- arch/arm/Kconfig | 2 ++ arch/arm/Makefile | 1 + arch/arm/mach-virt/Kconfig | 9 +++++++ arch/arm/mach-virt/Makefile | 5 ++++ arch/arm/mach-virt/virt.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 arch/arm/mach-virt/Kconfig create mode 100644 arch/arm/mach-virt/Makefile create mode 100644 arch/arm/mach-virt/virt.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 80d54b8..3443d89 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1130,6 +1130,8 @@ source "arch/arm/mach-versatile/Kconfig" source "arch/arm/mach-vexpress/Kconfig" source "arch/arm/plat-versatile/Kconfig" +source "arch/arm/mach-virt/Kconfig" + source "arch/arm/mach-vt8500/Kconfig" source "arch/arm/mach-w90x900/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 30c443c..ea4f481 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -194,6 +194,7 @@ machine-$(CONFIG_ARCH_SOCFPGA) += socfpga machine-$(CONFIG_ARCH_SPEAR13XX) += spear13xx machine-$(CONFIG_ARCH_SPEAR3XX) += spear3xx machine-$(CONFIG_MACH_SPEAR600) += spear6xx +machine-$(CONFIG_ARCH_VIRT) += virt machine-$(CONFIG_ARCH_ZYNQ) += zynq machine-$(CONFIG_ARCH_SUNXI) += sunxi diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig new file mode 100644 index 0000000..a568a2a --- /dev/null +++ b/arch/arm/mach-virt/Kconfig @@ -0,0 +1,9 @@ +config ARCH_VIRT + bool "Dummy Virtual Machine" if ARCH_MULTI_V7 + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_GIC + select ARM_ARCH_TIMER + select HAVE_SMP + select CPU_V7 + select SPARSE_IRQ + select USE_OF diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile new file mode 100644 index 0000000..7ddbfa6 --- /dev/null +++ b/arch/arm/mach-virt/Makefile @@ -0,0 +1,5 @@ +# +# Makefile for the linux kernel. +# + +obj-y := virt.o diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c new file mode 100644 index 0000000..174b9da --- /dev/null +++ b/arch/arm/mach-virt/virt.c @@ -0,0 +1,65 @@ +/* + * Dummy Virtual Machine - does what it says on the tin. + * + * Copyright (C) 2012 ARM Ltd + * Authors: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>, + * Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <asm/arch_timer.h> +#include <asm/hardware/gic.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> + +const static struct of_device_id irq_match[] = { + { .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, + {} +}; + +static void __init gic_init_irq(void) +{ + of_irq_init(irq_match); +} + +static void __init virt_init(void) +{ + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static void __init virt_timer_init(void) +{ + WARN_ON(arch_timer_of_register() != 0); + WARN_ON(arch_timer_sched_clock_init() != 0); +} + +static const char *virt_dt_match[] = { + "linux,dummy-virt", + NULL +}; + +static struct sys_timer virt_timer = { + .init = virt_timer_init, +}; + +DT_MACHINE_START(VIRT, "Dummy Virtual Machine") + .init_irq = gic_init_irq, + .handle_irq = gic_handle_irq, + .timer = &virt_timer, + .init_machine = virt_init, + .dt_compat = virt_dt_match, +MACHINE_END -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <1355853196-23676-6-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>]
* Re: [PATCH v3 5/6] ARM: Dummy Virtual Machine platform support [not found] ` <1355853196-23676-6-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> @ 2012-12-19 4:17 ` Nicolas Pitre 0 siblings, 0 replies; 12+ messages in thread From: Nicolas Pitre @ 2012-12-19 4:17 UTC (permalink / raw) To: Will Deacon Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, xen-devel-GuqFBffKawuEi8DpZVb4nw, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Tue, 18 Dec 2012, Will Deacon wrote: > From: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> > > Add support for the smallest, dumbest possible platform, to be > used as a guest for KVM or other hypervisors. > > It only mandates a GIC and architected timers. Fits nicely with > a multiplatform zImage. Uses very little silicon area. > > Signed-off-by: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> > Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> Acked-by: Nicolas Pitre <nico-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > --- > arch/arm/Kconfig | 2 ++ > arch/arm/Makefile | 1 + > arch/arm/mach-virt/Kconfig | 9 +++++++ > arch/arm/mach-virt/Makefile | 5 ++++ > arch/arm/mach-virt/virt.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 82 insertions(+) > create mode 100644 arch/arm/mach-virt/Kconfig > create mode 100644 arch/arm/mach-virt/Makefile > create mode 100644 arch/arm/mach-virt/virt.c > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 80d54b8..3443d89 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -1130,6 +1130,8 @@ source "arch/arm/mach-versatile/Kconfig" > source "arch/arm/mach-vexpress/Kconfig" > source "arch/arm/plat-versatile/Kconfig" > > +source "arch/arm/mach-virt/Kconfig" > + > source "arch/arm/mach-vt8500/Kconfig" > > source "arch/arm/mach-w90x900/Kconfig" > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 30c443c..ea4f481 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -194,6 +194,7 @@ machine-$(CONFIG_ARCH_SOCFPGA) += socfpga > machine-$(CONFIG_ARCH_SPEAR13XX) += spear13xx > machine-$(CONFIG_ARCH_SPEAR3XX) += spear3xx > machine-$(CONFIG_MACH_SPEAR600) += spear6xx > +machine-$(CONFIG_ARCH_VIRT) += virt > machine-$(CONFIG_ARCH_ZYNQ) += zynq > machine-$(CONFIG_ARCH_SUNXI) += sunxi > > diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig > new file mode 100644 > index 0000000..a568a2a > --- /dev/null > +++ b/arch/arm/mach-virt/Kconfig > @@ -0,0 +1,9 @@ > +config ARCH_VIRT > + bool "Dummy Virtual Machine" if ARCH_MULTI_V7 > + select ARCH_WANT_OPTIONAL_GPIOLIB > + select ARM_GIC > + select ARM_ARCH_TIMER > + select HAVE_SMP > + select CPU_V7 > + select SPARSE_IRQ > + select USE_OF > diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile > new file mode 100644 > index 0000000..7ddbfa6 > --- /dev/null > +++ b/arch/arm/mach-virt/Makefile > @@ -0,0 +1,5 @@ > +# > +# Makefile for the linux kernel. > +# > + > +obj-y := virt.o > diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c > new file mode 100644 > index 0000000..174b9da > --- /dev/null > +++ b/arch/arm/mach-virt/virt.c > @@ -0,0 +1,65 @@ > +/* > + * Dummy Virtual Machine - does what it says on the tin. > + * > + * Copyright (C) 2012 ARM Ltd > + * Authors: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>, > + * Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * 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. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <linux/of_irq.h> > +#include <linux/of_platform.h> > + > +#include <asm/arch_timer.h> > +#include <asm/hardware/gic.h> > +#include <asm/mach/arch.h> > +#include <asm/mach/time.h> > + > +const static struct of_device_id irq_match[] = { > + { .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, > + {} > +}; > + > +static void __init gic_init_irq(void) > +{ > + of_irq_init(irq_match); > +} > + > +static void __init virt_init(void) > +{ > + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > +} > + > +static void __init virt_timer_init(void) > +{ > + WARN_ON(arch_timer_of_register() != 0); > + WARN_ON(arch_timer_sched_clock_init() != 0); > +} > + > +static const char *virt_dt_match[] = { > + "linux,dummy-virt", > + NULL > +}; > + > +static struct sys_timer virt_timer = { > + .init = virt_timer_init, > +}; > + > +DT_MACHINE_START(VIRT, "Dummy Virtual Machine") > + .init_irq = gic_init_irq, > + .handle_irq = gic_handle_irq, > + .timer = &virt_timer, > + .init_machine = virt_init, > + .dt_compat = virt_dt_match, > +MACHINE_END > -- > 1.8.0 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/6] Add support for a fake, para-virtualised machine [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> ` (4 preceding siblings ...) 2012-12-18 17:53 ` [PATCH v3 5/6] ARM: Dummy Virtual Machine platform support Will Deacon @ 2012-12-18 17:59 ` Arnd Bergmann 5 siblings, 0 replies; 12+ messages in thread From: Arnd Bergmann @ 2012-12-18 17:59 UTC (permalink / raw) To: Will Deacon Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, xen-devel-GuqFBffKawuEi8DpZVb4nw, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Tuesday 18 December 2012, Will Deacon wrote: > This is version three of the patches originally posted here: > > v1.) http://lists.infradead.org/pipermail/linux-arm-kernel/2012-December/135870.html > v2.) http://lists.infradead.org/pipermail/linux-arm-kernel/2012-December/137750.html > > Thanks to all those who have provided comments so far. > Changes for v3 include: > > * Ripped out *even more* SMP code by rebasing onto latest > mainline > * Removed function-base property from device-tree binding > * Annotated the low-level firmware invocation functions with > noinline to clarify intent > * Minor cleanups > > As usual, testing this relies on KVM support for PSCI, a magic kvmtool > and Mark Rutland's arch-timer patches. > Acked-by: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 6/6] ARM: mach-virt: add SMP support using PSCI 2012-12-18 17:53 [PATCH v3 0/6] Add support for a fake, para-virtualised machine Will Deacon [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> @ 2012-12-18 17:53 ` Will Deacon [not found] ` <1355853196-23676-7-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 1 sibling, 1 reply; 12+ messages in thread From: Will Deacon @ 2012-12-18 17:53 UTC (permalink / raw) To: linux-arm-kernel Cc: dave.martin, arnd, nico, Marc.Zyngier, devicetree-discuss, Will Deacon, xen-devel This patch adds support for SMP to mach-virt using the PSCI infrastructure. Signed-off-by: Will Deacon <will.deacon@arm.com> --- arch/arm/mach-virt/Kconfig | 1 + arch/arm/mach-virt/Makefile | 1 + arch/arm/mach-virt/platsmp.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-virt/virt.c | 4 +++ 4 files changed, 64 insertions(+) create mode 100644 arch/arm/mach-virt/platsmp.c diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig index a568a2a..8958f0d 100644 --- a/arch/arm/mach-virt/Kconfig +++ b/arch/arm/mach-virt/Kconfig @@ -3,6 +3,7 @@ config ARCH_VIRT select ARCH_WANT_OPTIONAL_GPIOLIB select ARM_GIC select ARM_ARCH_TIMER + select ARM_PSCI select HAVE_SMP select CPU_V7 select SPARSE_IRQ diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile index 7ddbfa6..042afc1 100644 --- a/arch/arm/mach-virt/Makefile +++ b/arch/arm/mach-virt/Makefile @@ -3,3 +3,4 @@ # obj-y := virt.o +obj-$(CONFIG_SMP) += platsmp.o diff --git a/arch/arm/mach-virt/platsmp.c b/arch/arm/mach-virt/platsmp.c new file mode 100644 index 0000000..e358beb --- /dev/null +++ b/arch/arm/mach-virt/platsmp.c @@ -0,0 +1,58 @@ +/* + * Dummy Virtual Machine - does what it says on the tin. + * + * Copyright (C) 2012 ARM Ltd + * Author: Will Deacon <will.deacon@arm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/init.h> +#include <linux/smp.h> +#include <linux/of.h> + +#include <asm/psci.h> +#include <asm/smp_plat.h> +#include <asm/hardware/gic.h> + +extern void secondary_startup(void); + +static void __init virt_smp_init_cpus(void) +{ + set_smp_cross_call(gic_raise_softirq); +} + +static void __init virt_smp_prepare_cpus(unsigned int max_cpus) +{ +} + +static int __cpuinit virt_boot_secondary(unsigned int cpu, + struct task_struct *idle) +{ + if (psci_ops.cpu_on) + return psci_ops.cpu_on(cpu_logical_map(cpu), + __pa(secondary_startup)); + return -ENODEV; +} + +static void __cpuinit virt_secondary_init(unsigned int cpu) +{ + gic_secondary_init(0); +} + +struct smp_operations __initdata virt_smp_ops = { + .smp_init_cpus = virt_smp_init_cpus, + .smp_prepare_cpus = virt_smp_prepare_cpus, + .smp_secondary_init = virt_secondary_init, + .smp_boot_secondary = virt_boot_secondary, +}; diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c index 174b9da..1d0a85a 100644 --- a/arch/arm/mach-virt/virt.c +++ b/arch/arm/mach-virt/virt.c @@ -20,6 +20,7 @@ #include <linux/of_irq.h> #include <linux/of_platform.h> +#include <linux/smp.h> #include <asm/arch_timer.h> #include <asm/hardware/gic.h> @@ -56,10 +57,13 @@ static struct sys_timer virt_timer = { .init = virt_timer_init, }; +extern struct smp_operations virt_smp_ops; + DT_MACHINE_START(VIRT, "Dummy Virtual Machine") .init_irq = gic_init_irq, .handle_irq = gic_handle_irq, .timer = &virt_timer, .init_machine = virt_init, + .smp = smp_ops(virt_smp_ops), .dt_compat = virt_dt_match, MACHINE_END -- 1.8.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <1355853196-23676-7-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>]
* Re: [PATCH v3 6/6] ARM: mach-virt: add SMP support using PSCI [not found] ` <1355853196-23676-7-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> @ 2012-12-19 4:09 ` Nicolas Pitre 0 siblings, 0 replies; 12+ messages in thread From: Nicolas Pitre @ 2012-12-19 4:09 UTC (permalink / raw) To: Will Deacon Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, xen-devel-GuqFBffKawuEi8DpZVb4nw, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Tue, 18 Dec 2012, Will Deacon wrote: > This patch adds support for SMP to mach-virt using the PSCI > infrastructure. > > Signed-off-by: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> Reviewed-by: Nicolas Pitre <nico-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > --- > arch/arm/mach-virt/Kconfig | 1 + > arch/arm/mach-virt/Makefile | 1 + > arch/arm/mach-virt/platsmp.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ > arch/arm/mach-virt/virt.c | 4 +++ > 4 files changed, 64 insertions(+) > create mode 100644 arch/arm/mach-virt/platsmp.c > > diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig > index a568a2a..8958f0d 100644 > --- a/arch/arm/mach-virt/Kconfig > +++ b/arch/arm/mach-virt/Kconfig > @@ -3,6 +3,7 @@ config ARCH_VIRT > select ARCH_WANT_OPTIONAL_GPIOLIB > select ARM_GIC > select ARM_ARCH_TIMER > + select ARM_PSCI > select HAVE_SMP > select CPU_V7 > select SPARSE_IRQ > diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile > index 7ddbfa6..042afc1 100644 > --- a/arch/arm/mach-virt/Makefile > +++ b/arch/arm/mach-virt/Makefile > @@ -3,3 +3,4 @@ > # > > obj-y := virt.o > +obj-$(CONFIG_SMP) += platsmp.o > diff --git a/arch/arm/mach-virt/platsmp.c b/arch/arm/mach-virt/platsmp.c > new file mode 100644 > index 0000000..e358beb > --- /dev/null > +++ b/arch/arm/mach-virt/platsmp.c > @@ -0,0 +1,58 @@ > +/* > + * Dummy Virtual Machine - does what it says on the tin. > + * > + * Copyright (C) 2012 ARM Ltd > + * Author: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * 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. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <linux/init.h> > +#include <linux/smp.h> > +#include <linux/of.h> > + > +#include <asm/psci.h> > +#include <asm/smp_plat.h> > +#include <asm/hardware/gic.h> > + > +extern void secondary_startup(void); > + > +static void __init virt_smp_init_cpus(void) > +{ > + set_smp_cross_call(gic_raise_softirq); > +} > + > +static void __init virt_smp_prepare_cpus(unsigned int max_cpus) > +{ > +} > + > +static int __cpuinit virt_boot_secondary(unsigned int cpu, > + struct task_struct *idle) > +{ > + if (psci_ops.cpu_on) > + return psci_ops.cpu_on(cpu_logical_map(cpu), > + __pa(secondary_startup)); > + return -ENODEV; > +} > + > +static void __cpuinit virt_secondary_init(unsigned int cpu) > +{ > + gic_secondary_init(0); > +} > + > +struct smp_operations __initdata virt_smp_ops = { > + .smp_init_cpus = virt_smp_init_cpus, > + .smp_prepare_cpus = virt_smp_prepare_cpus, > + .smp_secondary_init = virt_secondary_init, > + .smp_boot_secondary = virt_boot_secondary, > +}; > diff --git a/arch/arm/mach-virt/virt.c b/arch/arm/mach-virt/virt.c > index 174b9da..1d0a85a 100644 > --- a/arch/arm/mach-virt/virt.c > +++ b/arch/arm/mach-virt/virt.c > @@ -20,6 +20,7 @@ > > #include <linux/of_irq.h> > #include <linux/of_platform.h> > +#include <linux/smp.h> > > #include <asm/arch_timer.h> > #include <asm/hardware/gic.h> > @@ -56,10 +57,13 @@ static struct sys_timer virt_timer = { > .init = virt_timer_init, > }; > > +extern struct smp_operations virt_smp_ops; > + > DT_MACHINE_START(VIRT, "Dummy Virtual Machine") > .init_irq = gic_init_irq, > .handle_irq = gic_handle_irq, > .timer = &virt_timer, > .init_machine = virt_init, > + .smp = smp_ops(virt_smp_ops), > .dt_compat = virt_dt_match, > MACHINE_END > -- > 1.8.0 > ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-12-19 4:17 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-12-18 17:53 [PATCH v3 0/6] Add support for a fake, para-virtualised machine Will Deacon [not found] ` <1355853196-23676-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-18 17:53 ` [PATCH v3 1/6] ARM: opcodes: add missing include of linux/linkage.h Will Deacon 2012-12-18 17:53 ` [PATCH v3 2/6] ARM: opcodes: add opcodes definitions for ARM security extensions Will Deacon 2012-12-18 17:53 ` [PATCH v3 3/6] ARM: psci: add devicetree binding for describing PSCI firmware Will Deacon 2012-12-19 4:11 ` Nicolas Pitre 2012-12-18 17:53 ` [PATCH v3 4/6] ARM: psci: add support for PSCI invocations from the kernel Will Deacon [not found] ` <1355853196-23676-5-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-19 4:16 ` Nicolas Pitre 2012-12-18 17:53 ` [PATCH v3 5/6] ARM: Dummy Virtual Machine platform support Will Deacon [not found] ` <1355853196-23676-6-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-19 4:17 ` Nicolas Pitre 2012-12-18 17:59 ` [PATCH v3 0/6] Add support for a fake, para-virtualised machine Arnd Bergmann 2012-12-18 17:53 ` [PATCH v3 6/6] ARM: mach-virt: add SMP support using PSCI Will Deacon [not found] ` <1355853196-23676-7-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org> 2012-12-19 4:09 ` Nicolas Pitre
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).