Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / metag / tbx / tbidspram.S
diff --git a/kernel/arch/metag/tbx/tbidspram.S b/kernel/arch/metag/tbx/tbidspram.S
new file mode 100644 (file)
index 0000000..2f27c03
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * tbidspram.S
+ *
+ * Copyright (C) 2009, 2012 Imagination Technologies.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation.
+ *
+ * Explicit state save and restore routines forming part of the thread binary
+ * interface for META processors
+ */
+
+       .file   "tbidspram.S"
+
+/* These aren't generally useful to a user so for now, they arent publically available */
+#define _TBIECH_DSPRAM_DUA_S    8
+#define _TBIECH_DSPRAM_DUA_BITS 0x7f00
+#define _TBIECH_DSPRAM_DUB_S    0
+#define _TBIECH_DSPRAM_DUB_BITS 0x007f
+
+/*
+ * void *__TBIDspramSaveA( short DspramSizes, void *pExt )
+ */
+       .text
+       .balign 4
+       .global ___TBIDspramSaveA
+       .type   ___TBIDspramSaveA,function
+___TBIDspramSaveA:
+
+       SETL    [A0StP++], D0.5, D1.5
+       MOV     A0.3, D0Ar2
+
+       /* D1Ar1 - Dspram Sizes
+        * A0.4  - Pointer to buffer
+        */
+
+       /* Save the specified amount of dspram DUA */
+DL     MOV     D0AR.0, #0
+       LSR     D1Ar1, D1Ar1, #_TBIECH_DSPRAM_DUA_S
+       AND     D1Ar1, D1Ar1, #(_TBIECH_DSPRAM_DUA_BITS >> _TBIECH_DSPRAM_DUA_S)
+       SUB     TXRPT, D1Ar1, #1
+$L1:
+DL     MOV     D0Re0, [D0AR.0++]
+DL     MOV     D0Ar6, [D0AR.0++]
+DL     MOV     D0Ar4, [D0AR.0++]
+DL     MOV     D0.5,  [D0AR.0++]
+       MSETL   [A0.3++], D0Re0, D0Ar6, D0Ar4, D0.5
+
+       BR      $L1
+
+       GETL    D0.5, D1.5, [--A0StP]
+       MOV     PC, D1RtP
+
+       .size   ___TBIDspramSaveA,.-___TBIDspramSaveA
+
+/*
+ * void *__TBIDspramSaveB( short DspramSizes, void *pExt )
+ */
+       .balign 4
+       .global ___TBIDspramSaveB
+       .type   ___TBIDspramSaveB,function
+___TBIDspramSaveB:
+
+       SETL    [A0StP++], D0.5, D1.5
+       MOV     A0.3, D0Ar2
+
+       /* D1Ar1 - Dspram Sizes
+        * A0.3  - Pointer to buffer
+        */
+
+       /* Save the specified amount of dspram DUA */
+DL     MOV     D0BR.0, #0
+       LSR     D1Ar1, D1Ar1, #_TBIECH_DSPRAM_DUB_S
+       AND     D1Ar1, D1Ar1, #(_TBIECH_DSPRAM_DUB_BITS >> _TBIECH_DSPRAM_DUB_S)
+       SUB     TXRPT, D1Ar1, #1
+$L2:
+DL     MOV     D0Re0, [D0BR.0++]
+DL     MOV     D0Ar6, [D0BR.0++]
+DL     MOV     D0Ar4, [D0BR.0++]
+DL     MOV     D0.5,  [D0BR.0++]
+       MSETL   [A0.3++], D0Re0, D0Ar6, D0Ar4, D0.5
+
+       BR      $L2
+
+       GETL    D0.5, D1.5, [--A0StP]
+       MOV     PC, D1RtP
+
+       .size   ___TBIDspramSaveB,.-___TBIDspramSaveB
+
+/*
+ * void *__TBIDspramRestoreA( short DspramSizes, void *pExt )
+ */
+       .balign 4
+       .global ___TBIDspramRestoreA
+       .type   ___TBIDspramRestoreA,function
+___TBIDspramRestoreA:
+
+       SETL    [A0StP++], D0.5, D1.5
+       MOV     A0.3, D0Ar2
+
+       /* D1Ar1 - Dspram Sizes
+        * A0.3 - Pointer to buffer
+        */
+
+       /* Restore the specified amount of dspram DUA */
+DL     MOV     D0AW.0, #0
+       LSR     D1Ar1, D1Ar1, #_TBIECH_DSPRAM_DUA_S
+       AND     D1Ar1, D1Ar1, #(_TBIECH_DSPRAM_DUA_BITS >> _TBIECH_DSPRAM_DUA_S)
+       SUB     TXRPT, D1Ar1, #1
+$L3:
+       MGETL   D0Re0, D0Ar6, D0Ar4, D0.5, [A0.3++]
+DL     MOV     [D0AW.0++], D0Re0
+DL     MOV     [D0AW.0++], D0Ar6
+DL     MOV     [D0AW.0++], D0Ar4
+DL     MOV     [D0AW.0++], D0.5
+
+       BR      $L3
+
+       GETL    D0.5, D1.5, [--A0StP]
+       MOV     PC, D1RtP
+
+       .size   ___TBIDspramRestoreA,.-___TBIDspramRestoreA
+
+/*
+ * void *__TBIDspramRestoreB( short DspramSizes, void *pExt )
+ */
+       .balign 4
+       .global ___TBIDspramRestoreB
+       .type   ___TBIDspramRestoreB,function
+___TBIDspramRestoreB:
+
+       SETL    [A0StP++], D0.5, D1.5
+       MOV     A0.3, D0Ar2
+
+       /* D1Ar1 - Dspram Sizes
+        * A0.3 - Pointer to buffer
+        */
+
+       /* Restore the specified amount of dspram DUA */
+DL     MOV     D0BW.0, #0
+       LSR     D1Ar1, D1Ar1, #_TBIECH_DSPRAM_DUB_S
+       AND     D1Ar1, D1Ar1, #(_TBIECH_DSPRAM_DUB_BITS >> _TBIECH_DSPRAM_DUB_S)
+       SUB     TXRPT, D1Ar1, #1
+$L4:
+       MGETL   D0Re0, D0Ar6, D0Ar4, D0.5, [A0.3++]
+DL     MOV     [D0BW.0++], D0Re0
+DL     MOV     [D0BW.0++], D0Ar6
+DL     MOV     [D0BW.0++], D0Ar4
+DL     MOV     [D0BW.0++], D0.5
+
+       BR      $L4
+
+       GETL    D0.5, D1.5, [--A0StP]
+       MOV     PC, D1RtP
+
+       .size   ___TBIDspramRestoreB,.-___TBIDspramRestoreB
+
+/*
+ * End of tbidspram.S
+ */