[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 15/25] target/arm: Allow users to set the number of VFP registers
From: |
Cédric Le Goater |
Subject: |
[PATCH 15/25] target/arm: Allow users to set the number of VFP registers |
Date: |
Thu, 19 Jan 2023 13:34:39 +0100 |
Cortex A7 CPUs with an FPU implementing VFPv4 without NEON support
have 16 64-bit FPU registers and not 32 registers. Let users set the
number of VFP registers with a CPU property.
The primary use case of this property is for the Cortex A7 of the
Aspeed AST2600 SoC.
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
target/arm/cpu.h | 2 ++
hw/arm/aspeed_ast2600.c | 2 ++
target/arm/cpu.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index bf2bce046d..5f2fefef4e 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -901,6 +901,8 @@ struct ArchCPU {
bool has_pmu;
/* CPU has VFP */
bool has_vfp;
+ /* CPU has 32 VFP registers */
+ bool has_vfp_d32;
/* CPU has Neon */
bool has_neon;
/* CPU has M-profile DSP extension */
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index cd75465c2b..37f43b4165 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -309,6 +309,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev,
Error **errp)
&error_abort);
object_property_set_bool(OBJECT(&s->cpu[i]), "neon", false,
&error_abort);
+ object_property_set_bool(OBJECT(&s->cpu[i]), "vfp-d32", false,
+ &error_abort);
object_property_set_link(OBJECT(&s->cpu[i]), "memory",
OBJECT(s->memory), &error_abort);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 5f63316dbf..ad90de75fb 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1269,6 +1269,9 @@ static Property arm_cpu_cfgend_property =
static Property arm_cpu_has_vfp_property =
DEFINE_PROP_BOOL("vfp", ARMCPU, has_vfp, true);
+static Property arm_cpu_has_vfp_d32_property =
+ DEFINE_PROP_BOOL("vfp-d32", ARMCPU, has_vfp_d32, true);
+
static Property arm_cpu_has_neon_property =
DEFINE_PROP_BOOL("neon", ARMCPU, has_neon, true);
@@ -1400,6 +1403,14 @@ void arm_cpu_post_init(Object *obj)
}
}
+ if (cpu->has_vfp && cpu_isar_feature(aa32_simd_r32, cpu)) {
+ cpu->has_vfp_d32 = true;
+ if (!kvm_enabled()) {
+ qdev_property_add_static(DEVICE(obj),
+ &arm_cpu_has_vfp_d32_property);
+ }
+ }
+
if (arm_feature(&cpu->env, ARM_FEATURE_NEON)) {
cpu->has_neon = true;
if (!kvm_enabled()) {
@@ -1661,6 +1672,26 @@ static void arm_cpu_realizefn(DeviceState *dev, Error
**errp)
return;
}
+ if (!cpu->has_vfp_d32 &&
+ arm_feature(env, ARM_FEATURE_V8) &&
+ !arm_feature(env, ARM_FEATURE_M)) {
+ error_setg(errp, "ARMv8A CPUs must have VFP32");
+ return;
+ }
+
+ if (cpu->has_vfp_d32 != cpu->has_neon) {
+ error_setg(errp, "ARM CPUs must have both VFP32 and Neon or neither");
+ return;
+ }
+
+ if (!cpu->has_vfp_d32) {
+ uint32_t u;
+
+ u = cpu->isar.mvfr0;
+ u = FIELD_DP32(u, MVFR0, SIMDREG, 1); /* 16 registers */
+ cpu->isar.mvfr0 = u;
+ }
+
if (!cpu->has_vfp) {
uint64_t t;
uint32_t u;
--
2.39.0
- [PATCH 05/25] m25p80: Add the is25wp256 SFPD table, (continued)
- [PATCH 05/25] m25p80: Add the is25wp256 SFPD table, Cédric Le Goater, 2023/01/19
- [PATCH 06/25] tests/avocado/machine_aspeed.py: update buildroot tests, Cédric Le Goater, 2023/01/19
- [PATCH 07/25] tests/avocado/machine_aspeed.py: Mask systemd services to speed up SDK boot, Cédric Le Goater, 2023/01/19
- [PATCH 08/25] hw/arm/boot: Export write_bootloader for Aspeed machines, Cédric Le Goater, 2023/01/19
- [PATCH 09/25] hw/core/loader: Remove declarations of option_rom_has_mr/rom_file_has_mr, Cédric Le Goater, 2023/01/19
- [PATCH 10/25] hw/arm: Extract at24c_eeprom_init helper from Aspeed and Nuvoton boards, Cédric Le Goater, 2023/01/19
- [PATCH 11/25] hw/arm/aspeed: Replace aspeed_eeprom_init with at24c_eeprom_init, Cédric Le Goater, 2023/01/19
- [PATCH 12/25] hw/nvram/eeprom_at24c: Add init_rom field and at24c_eeprom_init_rom helper, Cédric Le Goater, 2023/01/19
- [PATCH 13/25] hw/arm/aspeed: Add aspeed_eeprom.c, Cédric Le Goater, 2023/01/19
- [PATCH 14/25] hw/nvram/eeprom_at24c: Make reset behavior more like hardware, Cédric Le Goater, 2023/01/19
- [PATCH 15/25] target/arm: Allow users to set the number of VFP registers,
Cédric Le Goater <=
- [PATCH 17/25] hw/watchdog/wdt_aspeed: Extend MMIO range to cover more registers, Cédric Le Goater, 2023/01/19
- [PATCH 18/25] hw/watchdog/wdt_aspeed: Log unimplemented registers as UNIMP level, Cédric Le Goater, 2023/01/19
- [PATCH 20/25] hw/arm/aspeed_ast10x0: Add various unimplemented peripherals, Cédric Le Goater, 2023/01/19
- [PATCH 21/25] hw/arm/aspeed_ast10x0: Map I3C peripheral, Cédric Le Goater, 2023/01/19
- [PATCH 16/25] hw/watchdog/wdt_aspeed: Rename MMIO region size as 'iosize', Cédric Le Goater, 2023/01/19
- [PATCH 24/25] hw/arm/aspeed_ast10x0: Add TODO comment to use Cortex-M4F, Cédric Le Goater, 2023/01/19
- [PATCH 19/25] hw/misc/aspeed_hace: Do not crash if address_space_map() failed, Cédric Le Goater, 2023/01/19
- [PATCH 22/25] hw/arm/aspeed_ast10x0: Map the secure SRAM, Cédric Le Goater, 2023/01/19