lbx_op  = 0x16,
 };
 
+/*
+ * func field for special2 MXU opcodes (Ingenic XBurst MXU).
+ */
+enum mxu_func {
+       /* TODO, other MXU funcs */
+       mxu_lx_op = 0x28,
+};
+
+/*
+ * op field for special2 MXU LX opcodes (Ingenic XBurst MXU).
+ */
+enum lx_ingenic_func {
+       mxu_lxb_op,
+       mxu_lxh_op,
+       /* reserved */
+       mxu_lxw_op = 3,
+       mxu_lxbu_op,
+       mxu_lxhu_op,
+       /* more reserved */
+};
+
 /*
  * BSHFL opcodes
  */
        ;))))))
 };
 
+struct mxu_lx_format {         /* SPEC2 MXU LX format instructions */
+       __BITFIELD_FIELD(unsigned int opcode : 6,
+       __BITFIELD_FIELD(unsigned int rs : 5,
+       __BITFIELD_FIELD(unsigned int rt : 5,
+       __BITFIELD_FIELD(unsigned int rd : 5,
+       __BITFIELD_FIELD(unsigned int strd : 2,
+       __BITFIELD_FIELD(unsigned int op : 3,
+       __BITFIELD_FIELD(unsigned int func : 6,
+       ;)))))))
+};
+
 struct spec3_format {   /* SPEC3 */
        __BITFIELD_FIELD(unsigned int opcode:6,
        __BITFIELD_FIELD(unsigned int rs:5,
        struct loongson3_lswc2_format loongson3_lswc2_format;
        struct loongson3_lsdc2_format loongson3_lsdc2_format;
        struct loongson3_lscsr_format loongson3_lscsr_format;
+       struct mxu_lx_format mxu_lx_format;
 };
 
 union mips16e_instruction {
 
                 * The remaining opcodes are the ones that are really of
                 * interest.
                 */
+#ifdef CONFIG_MACH_INGENIC
+       case spec2_op:
+               if (insn.mxu_lx_format.func != mxu_lx_op)
+                       goto sigbus; /* other MXU instructions we don't care */
+
+               switch (insn.mxu_lx_format.op) {
+               case mxu_lxw_op:
+                       if (user && !access_ok(addr, 4))
+                               goto sigbus;
+                       LoadW(addr, value, res);
+                       if (res)
+                               goto fault;
+                       compute_return_epc(regs);
+                       regs->regs[insn.mxu_lx_format.rd] = value;
+                       break;
+               case mxu_lxh_op:
+                       if (user && !access_ok(addr, 2))
+                               goto sigbus;
+                       LoadHW(addr, value, res);
+                       if (res)
+                               goto fault;
+                       compute_return_epc(regs);
+                       regs->regs[insn.dsp_format.rd] = value;
+                       break;
+               case mxu_lxhu_op:
+                       if (user && !access_ok(addr, 2))
+                               goto sigbus;
+                       LoadHWU(addr, value, res);
+                       if (res)
+                               goto fault;
+                       compute_return_epc(regs);
+                       regs->regs[insn.dsp_format.rd] = value;
+                       break;
+               case mxu_lxb_op:
+               case mxu_lxbu_op:
+                       goto sigbus;
+               default:
+                       goto sigill;
+               }
+               break;
+#endif
        case spec3_op:
                if (insn.dsp_format.func == lx_op) {
                        switch (insn.dsp_format.op) {