aboutsummaryrefslogtreecommitdiffstats
path: root/arm
diff options
context:
space:
mode:
authorRobin Murphy <Robin.Murphy@arm.com>2014-01-06 17:38:37 +0000
committerWill Deacon <will.deacon@arm.com>2015-06-01 16:39:54 +0100
commitf4c0490cc3990b175d070e763a9c19b17ec341f7 (patch)
tree48a0204ec5c1bc29d36911a5294d04e7ae5660b7 /arm
parentdfb8fd674f5fba45932df92b2045a42d291477d8 (diff)
downloadkvmtool-f4c0490cc3990b175d070e763a9c19b17ec341f7.tar.gz
kvm tools: arm: add option to override generic timer frequency
Some platforms have secure firmware which does not correctly set the CNTFRQ register on boot, preventing the use of the Generic Timer. This patch allows mirroring the necessary host workaround by specifying the clock-frequency property in the guest DT. This should only be considered a means of KVM bring-up on such systems, such that vendors may be convinced to properly implement their firmware to support the virtualisation capabilities of their hardware. Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'arm')
-rw-r--r--arm/include/arm-common/kvm-config-arch.h15
-rw-r--r--arm/timer.c3
2 files changed, 13 insertions, 5 deletions
diff --git a/arm/include/arm-common/kvm-config-arch.h b/arm/include/arm-common/kvm-config-arch.h
index 7ac6f6e8..f3baf392 100644
--- a/arm/include/arm-common/kvm-config-arch.h
+++ b/arm/include/arm-common/kvm-config-arch.h
@@ -5,13 +5,18 @@
struct kvm_config_arch {
const char *dump_dtb_filename;
+ unsigned int force_cntfrq;
bool aarch32_guest;
};
-#define OPT_ARCH_RUN(pfx, cfg) \
- pfx, \
- ARM_OPT_ARCH_RUN(cfg) \
- OPT_STRING('\0', "dump-dtb", &(cfg)->dump_dtb_filename, \
- ".dtb file", "Dump generated .dtb to specified file"),
+#define OPT_ARCH_RUN(pfx, cfg) \
+ pfx, \
+ ARM_OPT_ARCH_RUN(cfg) \
+ OPT_STRING('\0', "dump-dtb", &(cfg)->dump_dtb_filename, \
+ ".dtb file", "Dump generated .dtb to specified file"), \
+ OPT_UINTEGER('\0', "override-bad-firmware-cntfrq", &(cfg)->force_cntfrq,\
+ "Specify Generic Timer frequency in guest DT to " \
+ "work around buggy secure firmware *Firmware should be " \
+ "updated to program CNTFRQ correctly*"),
#endif /* ARM_COMMON__KVM_CONFIG_ARCH_H */
diff --git a/arm/timer.c b/arm/timer.c
index e31faaec..d757c1dd 100644
--- a/arm/timer.c
+++ b/arm/timer.c
@@ -33,5 +33,8 @@ void timer__generate_fdt_nodes(void *fdt, struct kvm *kvm, int *irqs)
_FDT(fdt_begin_node(fdt, "timer"));
_FDT(fdt_property(fdt, "compatible", compatible, sizeof(compatible)));
_FDT(fdt_property(fdt, "interrupts", irq_prop, sizeof(irq_prop)));
+ if (kvm->cfg.arch.force_cntfrq > 0)
+ _FDT(fdt_property_cell(fdt, "clock-frequency", kvm->cfg.arch.force_cntfrq));
_FDT(fdt_end_node(fdt));
}
+