[PATCH] ppc/spapr: Add ibm,pi-features

Nicholas Piggin posted 1 patch 6 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20240518095641.408598-1-npiggin@gmail.com
Maintainers: Nicholas Piggin <npiggin@gmail.com>, Daniel Henrique Barboza <danielhb413@gmail.com>, David Gibson <david@gibson.dropbear.id.au>, Harsh Prateek Bora <harshpb@linux.ibm.com>
hw/ppc/spapr.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
[PATCH] ppc/spapr: Add ibm,pi-features
Posted by Nicholas Piggin 6 months, 1 week ago
The ibm,pi-features property has a bit to say whether or not
msgsndp should be used. Linux checks if it is being run under
KVM and avoids msgsndp anyway, but it would be preferable to
rely on this bit.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hw/ppc/spapr.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 611a9e5184..6891d91e6e 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -353,6 +353,31 @@ static void spapr_dt_pa_features(SpaprMachineState *spapr,
     _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
 }
 
+static void spapr_dt_pi_features(SpaprMachineState *spapr,
+                                 PowerPCCPU *cpu,
+                                 void *fdt, int offset)
+{
+    uint8_t pi_features[] = { 1, 0,
+        0x00 };
+
+    if (kvm_enabled() && ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00,
+                                          0, cpu->compat_pvr)) {
+        /*
+         * POWER9 and later CPUs with KVM run in LPAR-per-thread mode where
+         * all threads are essentially independent CPUs, and msgsndp does not
+         * work (because it is physically-addressed) and therefore is
+         * emulated by KVM, so disable it here to ensure XIVE will be used.
+         * This is both KVM and CPU implementation-specific behaviour so a KVM
+         * cap would be cleanest, but for now this works. If KVM ever permits
+         * native msgsndp execution by guests, a cap could be added at that
+         * time.
+         */
+        pi_features[2] |= 0x08; /* 4: No msgsndp */
+    }
+
+    _FDT((fdt_setprop(fdt, offset, "ibm,pi-features", pi_features, sizeof(pi_features))));
+}
+
 static hwaddr spapr_node0_size(MachineState *machine)
 {
     if (machine->numa_state->num_nodes) {
@@ -815,6 +840,8 @@ static void spapr_dt_cpu(CPUState *cs, void *fdt, int offset,
 
     spapr_dt_pa_features(spapr, cpu, fdt, offset);
 
+    spapr_dt_pi_features(spapr, cpu, fdt, offset);
+
     _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
                            cs->cpu_index / vcpus_per_socket)));
 
-- 
2.43.0
Re: [PATCH] ppc/spapr: Add ibm,pi-features
Posted by Harsh Prateek Bora 6 months, 1 week ago

On 5/18/24 15:26, Nicholas Piggin wrote:
> The ibm,pi-features property has a bit to say whether or not
> msgsndp should be used. Linux checks if it is being run under
> KVM and avoids msgsndp anyway, but it would be preferable to
> rely on this bit.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

> ---
>   hw/ppc/spapr.c | 27 +++++++++++++++++++++++++++
>   1 file changed, 27 insertions(+)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 611a9e5184..6891d91e6e 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -353,6 +353,31 @@ static void spapr_dt_pa_features(SpaprMachineState *spapr,
>       _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
>   }
>   
> +static void spapr_dt_pi_features(SpaprMachineState *spapr,
> +                                 PowerPCCPU *cpu,
> +                                 void *fdt, int offset)
> +{
> +    uint8_t pi_features[] = { 1, 0,
> +        0x00 };
> +
> +    if (kvm_enabled() && ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00,
> +                                          0, cpu->compat_pvr)) {
> +        /*
> +         * POWER9 and later CPUs with KVM run in LPAR-per-thread mode where
> +         * all threads are essentially independent CPUs, and msgsndp does not
> +         * work (because it is physically-addressed) and therefore is
> +         * emulated by KVM, so disable it here to ensure XIVE will be used.
> +         * This is both KVM and CPU implementation-specific behaviour so a KVM
> +         * cap would be cleanest, but for now this works. If KVM ever permits
> +         * native msgsndp execution by guests, a cap could be added at that
> +         * time.
> +         */
> +        pi_features[2] |= 0x08; /* 4: No msgsndp */
> +    }
> +
> +    _FDT((fdt_setprop(fdt, offset, "ibm,pi-features", pi_features, sizeof(pi_features))));
> +}
> +
>   static hwaddr spapr_node0_size(MachineState *machine)
>   {
>       if (machine->numa_state->num_nodes) {
> @@ -815,6 +840,8 @@ static void spapr_dt_cpu(CPUState *cs, void *fdt, int offset,
>   
>       spapr_dt_pa_features(spapr, cpu, fdt, offset);
>   
> +    spapr_dt_pi_features(spapr, cpu, fdt, offset);
> +
>       _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
>                              cs->cpu_index / vcpus_per_socket)));
>