summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S')
-rw-r--r--FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S188
1 files changed, 188 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S
new file mode 100644
index 000000000..482d4b61a
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/startup_gcc/mss_utils.S
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright 2021 Microchip Corporation.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * MPFS HAL Embedded Software
+ *
+ */
+
+/***************************************************************************
+ * @file mss_utils.S
+ * @author Microchip-FPGA Embedded Systems Solutions
+ * @brief utilities used by mpfs-hal startup code
+ *
+ */
+ .section .text.init,"ax", %progbits
+ .align 3
+
+/***********************************************************************************
+ *
+ * pdma_transfer
+ * Only used by the mpfs hal. App code uses the provided driver.
+ *
+ * a0 = dest
+ * a1 = src
+ * a2 = length
+ * a3 = PDMA Base Address - 0x3000000 + (0x01000 * PDMA_CHANNEL)
+ */
+ .globl pdma_transfer
+ .type pdma_transfer, @function
+pdma_transfer:
+ mv t1,a0
+ mv t0, a3 // Base address
+ li t1, 1
+ sw t1, 0(t0) // claim
+ li t1, 0
+ sw t1, 4(t0) // read[31:28]/write[27:24] size 0=>1byte, 1 =>2 bytes etx
+ mv t1, a2 // SIZE
+ sd t1, 8(t0) // bytes
+ mv t1, a0 // dest address
+ sd t1, 16(t0) // dest
+ mv t1, a1 // source address
+ sd t1, 24(t0) // src
+ li t1, 0xff000000
+ sw t1, 4(t0) // full speed copy
+ li t1, 3
+ sw t1, 0(t0) // start transfer
+ fence
+ ret
+
+/***********************************************************************************
+ *
+ * pdma_transfer_complete
+ * Loops until transfer complete
+ * Only used by the mpfs hal. App code uses the provided driver.
+ *
+ * a0 = PDMA Base Address - 0x3000000 + (0x01000 * PDMA_CHANNEL)
+ */
+ //
+ .globl pdma_transfer_complete
+ .type pdma_transfer_complete, @function
+pdma_transfer_complete:
+ mv t0, a0 // Base address
+1: // wait for completion
+ lw t1, 0(t0)
+ andi t1, t1, 2
+ bnez t1, 1b
+ // release DMA
+ sw zero, 0(t0)
+ ret
+
+
+ /***********************************************************************************
+ *
+ * memfill() - fills memory, alternate to lib function when not available
+ */
+ // memfill helper function:
+ // a0 = dest
+ // a1 = value to fill
+ // a2 = length
+ .globl memfill
+ .type memfill, @function
+memfill:
+ mv t1,a0
+ mv t2,a1
+ beqz a2,2f
+1:
+ sb t2,0(t1)
+ addi a2,a2,-1
+ addi t1,t1,1
+ bnez a2,1b
+2:
+ ret
+
+/***********************************************************************************
+ *
+ * The following config_copy() symbol overrides the weak symbol in the HAL and does
+ * a safe copy of HW config data
+ */
+ // config_copy helper function:
+ // a0 = dest
+ // a1 = src
+ // a2 = length
+ .globl config_copy
+ .type config_copy, @function
+config_copy:
+ mv t1,a0
+ beqz a2,2f
+1:
+ lb t2,0(a1)
+ sb t2,0(t1)
+ addi a2,a2,-1
+ addi t1,t1,1
+ addi a1,a1,1
+ bnez a2,1b
+2:
+ ret
+
+ /***********************************************************************************
+ *
+ * config_16_copy () Copies a word at a time, used when copying to contigous registers
+ */
+ // config_16_copy helper function:
+ // a0 = dest
+ // a1 = src
+ // a2 = length
+ .globl config_16_copy
+ .type config_16_copy, @function
+config_16_copy:
+ mv t1,a0
+ beqz a2,2f
+1:
+ lh t2,0(a1)
+ sh t2,0(t1)
+ addi a2,a2,-2
+ addi t1,t1,2
+ addi a1,a1,2
+ bnez a2,1b
+2:
+ ret
+
+/***********************************************************************************
+ *
+ * config_32_copy () Copies a word at a time, used when copying to contigous registers
+ */
+ // config_copy helper function:
+ // a0 = dest
+ // a1 = src
+ // a2 = length
+ .globl config_32_copy
+ .type config_32_copy, @function
+config_32_copy:
+ mv t1,a0
+ beqz a2,2f
+1:
+ lw t2,0(a1)
+ sw t2,0(t1)
+ addi a2,a2,-4
+ addi t1,t1,4
+ addi a1,a1,4
+ bnez a2,1b
+2:
+ ret
+
+ /***********************************************************************************
+ *
+ * config_64_copy - copying using 64 bit loads, addresses must be on 64 bit boundary
+ */
+ // config_64_copy helper function:
+ // a0 = dest
+ // a1 = src
+ // a2 = length
+ .globl config_64_copy
+ .type config_64_copy, @function
+config_64_copy:
+ mv t1,a0
+ beqz a2,2f
+1:
+ ld t2,0(a1)
+ sd t2,0(t1)
+ addi a2,a2,-8
+ addi t1,t1,8
+ addi a1,a1,8
+ bnez a2,1b
+2:
+ ret
+
+