MIPS: Add defs & probing of UFR
authorJames Hogan <james.hogan@imgtec.com>
Tue, 14 Mar 2017 10:15:08 +0000 (10:15 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Tue, 28 Mar 2017 13:48:53 +0000 (14:48 +0100)
Add definitions and probing of the UFR bit in Config5. This bit allows
user mode control of the FR bit (floating point register mode). It is
present if the UFRP bit is set in the floating point implementation
register.

This is a capability KVM may want to expose to guest kernels, even
though Linux is unlikely to ever use it due to the implications for
multi-threaded programs.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
arch/mips/include/asm/cpu-features.h
arch/mips/include/asm/cpu.h
arch/mips/kernel/cpu-probe.c

index e961c8a7ea6626a1b044b366a99c5201e6d5beb3..e12d4ec6854d604ef4f43b3f197fc2d608f64f63 100644 (file)
 # define cpu_has_msa           0
 #endif
 
+#ifndef cpu_has_ufr
+# define cpu_has_ufr           (cpu_data[0].options & MIPS_CPU_UFR)
+#endif
+
 #ifndef cpu_has_fre
 # define cpu_has_fre           (cpu_data[0].options & MIPS_CPU_FRE)
 #endif
index 9a8372484edc0f3dd48daf5e06a532473ff911db..98f59307e6a354ca5c61ada241aa010312d8c98c 100644 (file)
@@ -415,6 +415,7 @@ enum cpu_type_enum {
 #define MIPS_CPU_GUESTCTL2     MBIT_ULL(50)    /* CPU has VZ GuestCtl2 register */
 #define MIPS_CPU_GUESTID       MBIT_ULL(51)    /* CPU uses VZ ASE GuestID feature */
 #define MIPS_CPU_DRG           MBIT_ULL(52)    /* CPU has VZ Direct Root to Guest (DRG) */
+#define MIPS_CPU_UFR           MBIT_ULL(53)    /* CPU supports User mode FR switching */
 
 /*
  * CPU ASE encodings
index 07718bb5fc9d8612d98cc78d46a7ca10851f8245..708f5913a8fe6a25ed65d46d7d2bd41b2495fac4 100644 (file)
@@ -289,6 +289,8 @@ static void cpu_set_fpu_opts(struct cpuinfo_mips *c)
                            MIPS_CPU_ISA_M32R6 | MIPS_CPU_ISA_M64R6)) {
                if (c->fpu_id & MIPS_FPIR_3D)
                        c->ases |= MIPS_ASE_MIPS3D;
+               if (c->fpu_id & MIPS_FPIR_UFRP)
+                       c->options |= MIPS_CPU_UFR;
                if (c->fpu_id & MIPS_FPIR_FREP)
                        c->options |= MIPS_CPU_FRE;
        }