diff mbox

[RFC,V2,6/6] hw/arm/virt: Use PSCI v0.2 function IDs when kernel supports its

Message ID 1396353232-3835-7-git-send-email-pranavkumar@linaro.org
State New
Headers show

Commit Message

PranavkumarSawargaonkar April 1, 2014, 11:53 a.m. UTC
If we have in-kernel emulation of PSCI v0.2 for KVM ARM/ARM64 then
we enable PSCI v0.2 for each VCPU at the time of VCPU init hence we
need to provide PSCI v0.2 function IDs via generated DTB.

This patch updates generated DTB to have PSCI v0.2 function IDs when
we have in-kernel emulation PSCI v0.2 for KVM ARM/ARM64.

Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
Signed-off-by: Anup Patel <anup.patel@linaro.org>
---
 hw/arm/virt.c |   28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

Comments

PranavkumarSawargaonkar April 1, 2014, noon UTC | #1
Hi Rob/Mark,

On 1 April 2014 17:23, Pranavkumar Sawargaonkar <pranavkumar@linaro.org> wrote:
> If we have in-kernel emulation of PSCI v0.2 for KVM ARM/ARM64 then
> we enable PSCI v0.2 for each VCPU at the time of VCPU init hence we
> need to provide PSCI v0.2 function IDs via generated DTB.
>
> This patch updates generated DTB to have PSCI v0.2 function IDs when
> we have in-kernel emulation PSCI v0.2 for KVM ARM/ARM64.
>
> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
> Signed-off-by: Anup Patel <anup.patel@linaro.org>
> ---
>  hw/arm/virt.c |   28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 2bbc931..cf6a774 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -187,11 +187,29 @@ static void create_fdt(VirtBoardInfo *vbi)
>          qemu_fdt_add_subnode(fdt, "/psci");
>          qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");

I have not updated compatible string to arm,psci-0,2 because still
stable dt bindings are not available in linux kernel.
Once they are available I will update this patch accordingly.

>          qemu_fdt_setprop_string(fdt, "/psci", "method", "hvc");
> -        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
> -                                  PSCI_FN_CPU_SUSPEND);
> -        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", PSCI_FN_CPU_OFF);
> -        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", PSCI_FN_CPU_ON);
> -        qemu_fdt_setprop_cell(fdt, "/psci", "migrate", PSCI_FN_MIGRATE);
> +        if (kvm_check_extension(kvm_state, KVM_CAP_ARM_PSCI_0_2)) {
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
> +                                      QEMU_PSCI_0_2_FN_CPU_SUSPEND);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off",
> +                                      QEMU_PSCI_0_2_FN_CPU_OFF);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on",
> +                                      QEMU_PSCI_0_2_FN_CPU_ON);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "migrate",
> +                                      QEMU_PSCI_0_2_FN_MIGRATE);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "system_off",
> +                                      QEMU_PSCI_0_2_FN_SYSTEM_OFF);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "system_reset",
> +                                      QEMU_PSCI_0_2_FN_SYSTEM_RESET);
> +        } else {
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
> +                                      QEMU_PSCI_FN_CPU_SUSPEND);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off",
> +                                      QEMU_PSCI_FN_CPU_OFF);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on",
> +                                      QEMU_PSCI_FN_CPU_ON);
> +            qemu_fdt_setprop_cell(fdt, "/psci", "migrate",
> +                                      QEMU_PSCI_FN_MIGRATE);
> +        }
>      }
>  }
>
> --
> 1.7.9.5
>

Thanks,
Pranav
diff mbox

Patch

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 2bbc931..cf6a774 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -187,11 +187,29 @@  static void create_fdt(VirtBoardInfo *vbi)
         qemu_fdt_add_subnode(fdt, "/psci");
         qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");
         qemu_fdt_setprop_string(fdt, "/psci", "method", "hvc");
-        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
-                                  PSCI_FN_CPU_SUSPEND);
-        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", PSCI_FN_CPU_OFF);
-        qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", PSCI_FN_CPU_ON);
-        qemu_fdt_setprop_cell(fdt, "/psci", "migrate", PSCI_FN_MIGRATE);
+        if (kvm_check_extension(kvm_state, KVM_CAP_ARM_PSCI_0_2)) {
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
+                                      QEMU_PSCI_0_2_FN_CPU_SUSPEND);
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off",
+                                      QEMU_PSCI_0_2_FN_CPU_OFF);
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on",
+                                      QEMU_PSCI_0_2_FN_CPU_ON);
+            qemu_fdt_setprop_cell(fdt, "/psci", "migrate",
+                                      QEMU_PSCI_0_2_FN_MIGRATE);
+            qemu_fdt_setprop_cell(fdt, "/psci", "system_off",
+                                      QEMU_PSCI_0_2_FN_SYSTEM_OFF);
+            qemu_fdt_setprop_cell(fdt, "/psci", "system_reset",
+                                      QEMU_PSCI_0_2_FN_SYSTEM_RESET);
+        } else {
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
+                                      QEMU_PSCI_FN_CPU_SUSPEND);
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off",
+                                      QEMU_PSCI_FN_CPU_OFF);
+            qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on",
+                                      QEMU_PSCI_FN_CPU_ON);
+            qemu_fdt_setprop_cell(fdt, "/psci", "migrate",
+                                      QEMU_PSCI_FN_MIGRATE);
+        }
     }
 }