]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
KVM: PPC: Book3S: Add count cache flush parameters to kvmppc_get_cpu_char()
authorSuraj Jitindar Singh <sjitindarsingh@gmail.com>
Fri, 1 Mar 2019 03:25:16 +0000 (14:25 +1100)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Tue, 23 Apr 2019 15:48:56 +0000 (17:48 +0200)
Add KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST &
KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE to the characteristics returned
from the H_GET_CPU_CHARACTERISTICS H-CALL, as queried from either the
hypervisor or the device tree.

BugLink: https://bugs.launchpad.net/bugs/1822870
Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
(cherry picked from commit 2b57ecd0208f7ac0b20b1b171698f027481a39f6)
Signed-off-by: Manoj Iyer <manoj.iyer@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
arch/powerpc/include/uapi/asm/kvm.h
arch/powerpc/kvm/powerpc.c

index 833ed9a16adfd03e0b6cb70adc19fe03055f7344..9020628ca2442ef27c861d016657fe800dbafd79 100644 (file)
@@ -463,10 +463,12 @@ struct kvm_ppc_cpu_char {
 #define KVM_PPC_CPU_CHAR_BR_HINT_HONOURED      (1ULL << 58)
 #define KVM_PPC_CPU_CHAR_MTTRIG_THR_RECONF     (1ULL << 57)
 #define KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS       (1ULL << 56)
+#define KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST    (1ull << 54)
 
 #define KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY      (1ULL << 63)
 #define KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR         (1ULL << 62)
 #define KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR    (1ULL << 61)
+#define KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE    (1ull << 58)
 
 /* Per-vcpu XICS interrupt controller state */
 #define KVM_REG_PPC_ICP_STATE  (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
index aa0c128730a76fcea50c42027143d2cfa2ecba9c..60ab1aa8cf9f9e38290a45f008d1c8af6334d91b 100644 (file)
@@ -1945,10 +1945,12 @@ static int pseries_get_cpu_char(struct kvm_ppc_cpu_char *cp)
                        KVM_PPC_CPU_CHAR_L1D_THREAD_PRIV |
                        KVM_PPC_CPU_CHAR_BR_HINT_HONOURED |
                        KVM_PPC_CPU_CHAR_MTTRIG_THR_RECONF |
-                       KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+                       KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS |
+                       KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
                cp->behaviour_mask = KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY |
                        KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR |
-                       KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+                       KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR |
+                       KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
        }
        return 0;
 }
@@ -2007,12 +2009,16 @@ static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
                if (have_fw_feat(fw_features, "enabled",
                                 "fw-count-cache-disabled"))
                        cp->character |= KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+               if (have_fw_feat(fw_features, "enabled",
+                                "fw-count-cache-flush-bcctr2,0,0"))
+                       cp->character |= KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
                cp->character_mask = KVM_PPC_CPU_CHAR_SPEC_BAR_ORI31 |
                        KVM_PPC_CPU_CHAR_BCCTRL_SERIALISED |
                        KVM_PPC_CPU_CHAR_L1D_FLUSH_ORI30 |
                        KVM_PPC_CPU_CHAR_L1D_FLUSH_TRIG2 |
                        KVM_PPC_CPU_CHAR_L1D_THREAD_PRIV |
-                       KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS;
+                       KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS |
+                       KVM_PPC_CPU_CHAR_BCCTR_FLUSH_ASSIST;
 
                if (have_fw_feat(fw_features, "enabled",
                                 "speculation-policy-favor-security"))
@@ -2023,9 +2029,13 @@ static int kvmppc_get_cpu_char(struct kvm_ppc_cpu_char *cp)
                if (!have_fw_feat(fw_features, "disabled",
                                  "needs-spec-barrier-for-bound-checks"))
                        cp->behaviour |= KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+               if (have_fw_feat(fw_features, "enabled",
+                                "needs-count-cache-flush-on-context-switch"))
+                       cp->behaviour |= KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
                cp->behaviour_mask = KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY |
                        KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR |
-                       KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
+                       KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR |
+                       KVM_PPC_CPU_BEHAV_FLUSH_COUNT_CACHE;
 
                of_node_put(fw_features);
        }