xen/arm: Detect silicon revision and set cap bits accordingly

After each CPU has been started, we iterate through a list of CPU
errata to detect CPUs which need from hypervisor code patches.

For each bug there is a function which checks if that a particular CPU is
affected. This needs to be done on every CPU to cover heterogenous
systems properly.

If a certain erratum has been detected, the capability bit will be set.
In the case the erratum requires code patching, this will be triggered
by the call to apply_alternatives.

The code is based on the file arch/arm64/kernel/cpu_errata.c in Linux
v4.6-rc3.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Julien Grall authored and Konrad Rzeszutek Wilk committed 2016-08-03 15:47:07 -04:00
1 parent 64eb606000
commit 8b01f6364f
6 files changed
+61

No files matched your search

+1
View File
@@ -7,6 +7,7 @@ subdir-$(CONFIG_ACPI) += acpi
obj-$(CONFIG_ALTERNATIVE) += alternative.o
obj-y += bootfdt.o
obj-y += cpu.o
obj-y += cpuerrata.o
obj-y += cpufeature.o
obj-y += decode.o
obj-y += device.o
+34
View File
@@ -0,0 +1,34 @@
#include <xen/config.h>
#include <asm/cpufeature.h>
#include <asm/cpuerrata.h>
#define MIDR_RANGE(model, min, max) \
.matches = is_affected_midr_range, \
.midr_model = model, \
.midr_range_min = min, \
.midr_range_max = max
static bool_t __maybe_unused
is_affected_midr_range(const struct arm_cpu_capabilities *entry)
{
return MIDR_IS_CPU_MODEL_RANGE(boot_cpu_data.midr.bits, entry->midr_model,
entry->midr_range_min,
entry->midr_range_max);
}
static const struct arm_cpu_capabilities arm_errata[] = {
{},
};
void check_local_cpu_errata(void)
{
update_cpu_capabilities(arm_errata, "enabled workaround for");
}
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
+3
View File
@@ -43,6 +43,7 @@
#include <asm/current.h>
#include <asm/setup.h>
#include <asm/gic.h>
#include <asm/cpuerrata.h>
#include <asm/cpufeature.h>
#include <asm/platform.h>
#include <asm/procinfo.h>
@@ -171,6 +172,8 @@ static void __init processor_id(void)
}
processor_setup();
check_local_cpu_errata();
}
void dt_unreserved_regions(paddr_t s, paddr_t e,
+3
View File
@@ -29,6 +29,7 @@
#include <xen/timer.h>
#include <xen/irq.h>
#include <xen/console.h>
#include <asm/cpuerrata.h>
#include <asm/gic.h>
#include <asm/psci.h>
#include <asm/acpi.h>
@@ -316,6 +317,8 @@ void start_secondary(unsigned long boot_phys_offset,
local_irq_enable();
local_abort_enable();
check_local_cpu_errata();
printk(XENLOG_DEBUG "CPU %u booted.\n", smp_processor_id());
startup_cpu_idle_loop();
+14
View File
@@ -0,0 +1,14 @@
#ifndef __ARM_CPUERRATA_H__
#define __ARM_CPUERRATA_H__
void check_local_cpu_errata(void);
#endif /* __ARM_CPUERRATA_H__ */
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
+6
View File
@@ -66,6 +66,12 @@ struct arm_cpu_capabilities {
const char *desc;
u16 capability;
bool_t (*matches)(const struct arm_cpu_capabilities *);
union {
struct { /* To be used for eratum handling only */
u32 midr_model;
u32 midr_range_min, midr_range_max;
};
};
};
void update_cpu_capabilities(const struct arm_cpu_capabilities *caps,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.