Skip to content

Commit

Permalink
hw/intc/arm_gicv3: Use correct number of priority bits for the CPU
Browse files Browse the repository at this point in the history
Make the GICv3 set its number of bits of physical priority from the
implementation-specific value provided in the CPU state struct, in
the same way we already do for virtual priority bits.  Because this
would be a migration compatibility break, we provide a property
force-8-bit-prio which is enabled for 7.0 and earlier versioned board
models to retain the legacy "always use 8 bits" behaviour.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220512151457.3899052-6-peter.maydell@linaro.org
Message-id: 20220506162129.2896966-5-peter.maydell@linaro.org
  • Loading branch information
pm215 committed May 19, 2022
1 parent 84597ff commit 39f29e5
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 5 deletions.
4 changes: 3 additions & 1 deletion hw/core/machine.c
Expand Up @@ -41,7 +41,9 @@
#include "hw/virtio/virtio-pci.h"
#include "qom/object_interfaces.h"

GlobalProperty hw_compat_7_0[] = {};
GlobalProperty hw_compat_7_0[] = {
{ "arm-gicv3-common", "force-8-bit-prio", "on" },
};
const size_t hw_compat_7_0_len = G_N_ELEMENTS(hw_compat_7_0);

GlobalProperty hw_compat_6_2[] = {
Expand Down
5 changes: 5 additions & 0 deletions hw/intc/arm_gicv3_common.c
Expand Up @@ -563,6 +563,11 @@ static Property arm_gicv3_common_properties[] = {
DEFINE_PROP_UINT32("revision", GICv3State, revision, 3),
DEFINE_PROP_BOOL("has-lpi", GICv3State, lpi_enable, 0),
DEFINE_PROP_BOOL("has-security-extensions", GICv3State, security_extn, 0),
/*
* Compatibility property: force 8 bits of physical priority, even
* if the CPU being emulated should have fewer.
*/
DEFINE_PROP_BOOL("force-8-bit-prio", GICv3State, force_8bit_prio, 0),
DEFINE_PROP_ARRAY("redist-region-count", GICv3State, nb_redist_regions,
redist_region_count, qdev_prop_uint32, uint32_t),
DEFINE_PROP_LINK("sysmem", GICv3State, dma, TYPE_MEMORY_REGION,
Expand Down
15 changes: 11 additions & 4 deletions hw/intc/arm_gicv3_cpuif.c
Expand Up @@ -2798,6 +2798,7 @@ void gicv3_init_cpuif(GICv3State *s)
* cpu->gic_num_lrs
* cpu->gic_vpribits
* cpu->gic_vprebits
* cpu->gic_pribits
*/

/* Note that we can't just use the GICv3CPUState as an opaque pointer
Expand All @@ -2810,11 +2811,17 @@ void gicv3_init_cpuif(GICv3State *s)
define_arm_cp_regs(cpu, gicv3_cpuif_reginfo);

/*
* For the moment, retain the existing behaviour of 8 priority bits;
* in a following commit we will take this from the CPU state,
* as we do for the virtual priority bits.
* The CPU implementation specifies the number of supported
* bits of physical priority. For backwards compatibility
* of migration, we have a compat property that forces use
* of 8 priority bits regardless of what the CPU really has.
*/
cs->pribits = 8;
if (s->force_8bit_prio) {
cs->pribits = 8;
} else {
cs->pribits = cpu->gic_pribits ?: 5;
}

/*
* The GICv3 has separate ID register fields for virtual priority
* and preemption bit values, but only a single ID register field
Expand Down
1 change: 1 addition & 0 deletions include/hw/intc/arm_gicv3_common.h
Expand Up @@ -248,6 +248,7 @@ struct GICv3State {
uint32_t revision;
bool lpi_enable;
bool security_extn;
bool force_8bit_prio;
bool irq_reset_nonsecure;
bool gicd_no_migration_shift_bug;

Expand Down
1 change: 1 addition & 0 deletions target/arm/cpu.h
Expand Up @@ -1002,6 +1002,7 @@ struct ArchCPU {
int gic_num_lrs; /* number of list registers */
int gic_vpribits; /* number of virtual priority bits */
int gic_vprebits; /* number of virtual preemption bits */
int gic_pribits; /* number of physical priority bits */

/* Whether the cfgend input is high (i.e. this CPU should reset into
* big-endian mode). This setting isn't used directly: instead it modifies
Expand Down
6 changes: 6 additions & 0 deletions target/arm/cpu64.c
Expand Up @@ -87,6 +87,7 @@ static void aarch64_a57_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;
define_cortex_a72_a57_a53_cp_reginfo(cpu);
}

Expand Down Expand Up @@ -140,6 +141,7 @@ static void aarch64_a53_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;
define_cortex_a72_a57_a53_cp_reginfo(cpu);
}

Expand Down Expand Up @@ -191,6 +193,7 @@ static void aarch64_a72_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;
define_cortex_a72_a57_a53_cp_reginfo(cpu);
}

Expand Down Expand Up @@ -252,6 +255,7 @@ static void aarch64_a76_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;

/* From B5.1 AdvSIMD AArch64 register summary */
cpu->isar.mvfr0 = 0x10110222;
Expand Down Expand Up @@ -317,6 +321,7 @@ static void aarch64_neoverse_n1_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;

/* From B5.1 AdvSIMD AArch64 register summary */
cpu->isar.mvfr0 = 0x10110222;
Expand Down Expand Up @@ -1008,6 +1013,7 @@ static void aarch64_a64fx_initfn(Object *obj)
cpu->gic_num_lrs = 4;
cpu->gic_vpribits = 5;
cpu->gic_vprebits = 5;
cpu->gic_pribits = 5;

/* Suppport of A64FX's vector length are 128,256 and 512bit only */
aarch64_add_sve_properties(obj);
Expand Down

0 comments on commit 39f29e5

Please sign in to comment.