aboutsummaryrefslogtreecommitdiff
path: root/libgloss/mips/hal/mips_dsp.S
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/mips/hal/mips_dsp.S')
-rw-r--r--libgloss/mips/hal/mips_dsp.S127
1 files changed, 127 insertions, 0 deletions
diff --git a/libgloss/mips/hal/mips_dsp.S b/libgloss/mips/hal/mips_dsp.S
new file mode 100644
index 0000000..da4b8b3
--- /dev/null
+++ b/libgloss/mips/hal/mips_dsp.S
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016-2018 MIPS Tech, LLC
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+*/
+
+.set nomips16
+#include <mips/regdef.h>
+#include <mips/cpu.h>
+#include <mips/asm.h>
+#include <mips/hal.h>
+
+#
+# FUNCTION: _dsp_save
+# DESCRIPTION: save the DSP context.
+# RETURNS: int
+# 0: No context saved
+# CTX_*: Type of conext stored
+#
+LEAF(_dsp_save)
+ move a1, a0
+ PTR_S zero, LINKCTX_NEXT(a1)
+ move va0, zero
+
+ /* Test for DSP support */
+ mfc0 t0, C0_CONFIG3
+ ext t0, t0, CFG3_DSPP_SHIFT, 1
+ beqz t0, 1f
+
+ /* Test for DSP enabled */
+ mfc0 t0, C0_STATUS
+ ext t0, t0, SR_MX_SHIFT, 1
+ beqz t0, 1f
+
+ li va0, LINKCTX_TYPE_DSP
+ .set push
+ .set dsp
+ rddsp t1
+ mfhi t2, $ac1
+ mflo t3, $ac1
+ mfhi t4, $ac2
+ mflo t5, $ac2
+ mfhi t6, $ac3
+ mflo t7, $ac3
+ .set pop
+ sw t1, DSPCTX_DSPC(a1)
+ sw t2, DSPCTX_HI1(a1)
+ sw t3, DSPCTX_LO1(a1)
+ sw t4, DSPCTX_HI2(a1)
+ sw t5, DSPCTX_LO2(a1)
+ sw t6, DSPCTX_HI3(a1)
+ sw t7, DSPCTX_LO3(a1)
+ REG_S va0, LINKCTX_ID(a1)
+1:
+ jr ra
+END(_dsp_save)
+
+#
+# FUNCTION: _dsp_load
+# DESCRIPTION: load the DSP context.
+# RETURNS: int
+# 0: Unrecognised context
+# CTX_*: Type of context restored
+#
+LEAF(_dsp_load)
+ move a1, a0
+ REG_L va0, LINKCTX_ID(a1)
+ li v1, LINKCTX_TYPE_DSP
+ bne va0,v1,1f
+
+ /* Test for DSP support */
+ mfc0 t0, C0_CONFIG3
+ ext t0, t0, CFG3_DSPP_SHIFT, 1
+ beqz t0, 1f
+
+ /* Force on DSP */
+ di t3
+ ehb
+ or t3, t3, SR_MX
+ mtc0 t3, C0_STATUS
+ ehb
+
+ lw t1, DSPCTX_DSPC(a1)
+ lw t2, DSPCTX_HI1(a1)
+ lw t3, DSPCTX_LO1(a1)
+ lw t4, DSPCTX_HI2(a1)
+ lw t5, DSPCTX_LO2(a1)
+ lw t6, DSPCTX_HI3(a1)
+ lw t7, DSPCTX_LO3(a1)
+ .set push
+ .set dsp
+ wrdsp t1
+ mthi t2, $ac1
+ mtlo t3, $ac1
+ mthi t4, $ac2
+ mtlo t5, $ac2
+ mthi t6, $ac3
+ mtlo t7, $ac3
+ .set pop
+ jr ra
+1:
+ /* Don't recognise this context, fail */
+ move va0, zero
+ jr ra
+END(_dsp_load)