2013-10-24 19:30:15 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2013 ARM Ltd.
|
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
#ifndef __ASM_CPU_OPS_H
|
|
|
|
#define __ASM_CPU_OPS_H
|
|
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/threads.h>
|
|
|
|
|
|
|
|
struct device_node;
|
|
|
|
|
arm64: factor out spin-table boot method
The arm64 kernel has an internal holding pen, which is necessary for
some systems where we can't bring CPUs online individually and must hold
multiple CPUs in a safe area until the kernel is able to handle them.
The current SMP infrastructure for arm64 is closely coupled to this
holding pen, and alternative boot methods must launch CPUs into the pen,
where they sit before they are launched into the kernel proper.
With PSCI (and possibly other future boot methods), we can bring CPUs
online individually, and need not perform the secondary_holding_pen
dance. Instead, this patch factors the holding pen management code out
to the spin-table boot method code, as it is the only boot method
requiring the pen.
A new entry point for secondaries, secondary_entry is added for other
boot methods to use, which bypasses the holding pen and its associated
overhead when bringing CPUs online. The smp.pen.text section is also
removed, as the pen can live in head.text without problem.
The cpu_operations structure is extended with two new functions,
cpu_boot and cpu_postboot, for bringing a cpu into the kernel and
performing any post-boot cleanup required by a bootmethod (e.g.
resetting the secondary_holding_pen_release to INVALID_HWID).
Documentation is added for cpu_operations.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2013-10-24 19:30:16 +00:00
|
|
|
/**
|
|
|
|
* struct cpu_operations - Callback operations for hotplugging CPUs.
|
|
|
|
*
|
|
|
|
* @name: Name of the property as appears in a devicetree cpu node's
|
|
|
|
* enable-method property.
|
|
|
|
* @cpu_init: Reads any data necessary for a specific enable-method from the
|
|
|
|
* devicetree, for a given cpu node and proposed logical id.
|
|
|
|
* @cpu_prepare: Early one-time preparation step for a cpu. If there is a
|
|
|
|
* mechanism for doing so, tests whether it is possible to boot
|
|
|
|
* the given CPU.
|
|
|
|
* @cpu_boot: Boots a cpu into the kernel.
|
|
|
|
* @cpu_postboot: Optionally, perform any post-boot cleanup or necesary
|
|
|
|
* synchronisation. Called from the cpu being booted.
|
2013-10-24 19:30:18 +00:00
|
|
|
* @cpu_disable: Prepares a cpu to die. May fail for some mechanism-specific
|
|
|
|
* reason, which will cause the hot unplug to be aborted. Called
|
|
|
|
* from the cpu to be killed.
|
|
|
|
* @cpu_die: Makes a cpu leave the kernel. Must not fail. Called from the
|
|
|
|
* cpu being killed.
|
arm64: factor out spin-table boot method
The arm64 kernel has an internal holding pen, which is necessary for
some systems where we can't bring CPUs online individually and must hold
multiple CPUs in a safe area until the kernel is able to handle them.
The current SMP infrastructure for arm64 is closely coupled to this
holding pen, and alternative boot methods must launch CPUs into the pen,
where they sit before they are launched into the kernel proper.
With PSCI (and possibly other future boot methods), we can bring CPUs
online individually, and need not perform the secondary_holding_pen
dance. Instead, this patch factors the holding pen management code out
to the spin-table boot method code, as it is the only boot method
requiring the pen.
A new entry point for secondaries, secondary_entry is added for other
boot methods to use, which bypasses the holding pen and its associated
overhead when bringing CPUs online. The smp.pen.text section is also
removed, as the pen can live in head.text without problem.
The cpu_operations structure is extended with two new functions,
cpu_boot and cpu_postboot, for bringing a cpu into the kernel and
performing any post-boot cleanup required by a bootmethod (e.g.
resetting the secondary_holding_pen_release to INVALID_HWID).
Documentation is added for cpu_operations.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2013-10-24 19:30:16 +00:00
|
|
|
*/
|
2013-10-24 19:30:15 +00:00
|
|
|
struct cpu_operations {
|
|
|
|
const char *name;
|
|
|
|
int (*cpu_init)(struct device_node *, unsigned int);
|
|
|
|
int (*cpu_prepare)(unsigned int);
|
arm64: factor out spin-table boot method
The arm64 kernel has an internal holding pen, which is necessary for
some systems where we can't bring CPUs online individually and must hold
multiple CPUs in a safe area until the kernel is able to handle them.
The current SMP infrastructure for arm64 is closely coupled to this
holding pen, and alternative boot methods must launch CPUs into the pen,
where they sit before they are launched into the kernel proper.
With PSCI (and possibly other future boot methods), we can bring CPUs
online individually, and need not perform the secondary_holding_pen
dance. Instead, this patch factors the holding pen management code out
to the spin-table boot method code, as it is the only boot method
requiring the pen.
A new entry point for secondaries, secondary_entry is added for other
boot methods to use, which bypasses the holding pen and its associated
overhead when bringing CPUs online. The smp.pen.text section is also
removed, as the pen can live in head.text without problem.
The cpu_operations structure is extended with two new functions,
cpu_boot and cpu_postboot, for bringing a cpu into the kernel and
performing any post-boot cleanup required by a bootmethod (e.g.
resetting the secondary_holding_pen_release to INVALID_HWID).
Documentation is added for cpu_operations.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2013-10-24 19:30:16 +00:00
|
|
|
int (*cpu_boot)(unsigned int);
|
|
|
|
void (*cpu_postboot)(void);
|
2013-10-24 19:30:18 +00:00
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
|
int (*cpu_disable)(unsigned int cpu);
|
|
|
|
void (*cpu_die)(unsigned int cpu);
|
|
|
|
#endif
|
2013-10-24 19:30:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
extern const struct cpu_operations *cpu_ops[NR_CPUS];
|
2013-10-24 19:30:17 +00:00
|
|
|
extern int __init cpu_read_ops(struct device_node *dn, int cpu);
|
|
|
|
extern void __init cpu_read_bootcpu_ops(void);
|
2013-10-24 19:30:15 +00:00
|
|
|
|
|
|
|
#endif /* ifndef __ASM_CPU_OPS_H */
|