#define cpu_has_nan_2008       (cpu_data[0].options & MIPS_CPU_NAN_2008)
 #endif
 
+#ifndef cpu_has_ebase_wg
+# define cpu_has_ebase_wg      (cpu_data[0].options & MIPS_CPU_EBASE_WG)
+#endif
+
 #endif /* __ASM_CPU_FEATURES_H */
 
 #define MIPS_CPU_VP            MBIT_ULL(40)    /* MIPSr6 Virtual Processors (multi-threading) */
 #define MIPS_CPU_LDPTE         MBIT_ULL(41)    /* CPU has ldpte/lddir instructions */
 #define MIPS_CPU_MVH           MBIT_ULL(42)    /* CPU supports MFHC0/MTHC0 */
+#define MIPS_CPU_EBASE_WG      MBIT_ULL(43)    /* CPU has EBase.WG */
 
 /*
  * CPU ASE encodings
 
 #define read_c0_ebase()                __read_32bit_c0_register($15, 1)
 #define write_c0_ebase(val)    __write_32bit_c0_register($15, 1, val)
 
+#define read_c0_ebase_64()     __read_64bit_c0_register($15, 1)
+#define write_c0_ebase_64(val) __write_64bit_c0_register($15, 1, val)
+
 #define read_c0_cdmmbase()     __read_ulong_c0_register($15, 2)
 #define write_c0_cdmmbase(val) __write_ulong_c0_register($15, 2, val)
 
 
        if (ok)
                ok = decode_config5(c);
 
+       /* Probe the EBase.WG bit */
+       if (cpu_has_mips_r2_r6) {
+               u64 ebase;
+               unsigned int status;
+
+               /* {read,write}_c0_ebase_64() may be UNDEFINED prior to r6 */
+               ebase = cpu_has_mips64r6 ? read_c0_ebase_64()
+                                        : (s32)read_c0_ebase();
+               if (ebase & MIPS_EBASE_WG) {
+                       /* WG bit already set, we can avoid the clumsy probe */
+                       c->options |= MIPS_CPU_EBASE_WG;
+               } else {
+                       /* Its UNDEFINED to change EBase while BEV=0 */
+                       status = read_c0_status();
+                       write_c0_status(status | ST0_BEV);
+                       irq_enable_hazard();
+                       /*
+                        * On pre-r6 cores, this may well clobber the upper bits
+                        * of EBase. This is hard to avoid without potentially
+                        * hitting UNDEFINED dm*c0 behaviour if EBase is 32-bit.
+                        */
+                       if (cpu_has_mips64r6)
+                               write_c0_ebase_64(ebase | MIPS_EBASE_WG);
+                       else
+                               write_c0_ebase(ebase | MIPS_EBASE_WG);
+                       back_to_back_c0_hazard();
+                       /* Restore BEV */
+                       write_c0_status(status);
+                       if (read_c0_ebase() & MIPS_EBASE_WG) {
+                               c->options |= MIPS_CPU_EBASE_WG;
+                               write_c0_ebase(ebase);
+                       }
+               }
+       }
+
        mips_probe_watch_registers(c);
 
 #ifndef CONFIG_MIPS_CPS