aboutsummaryrefslogtreecommitdiffstats
path: root/roms/opensbi/firmware/fw_payload.S
diff options
context:
space:
mode:
Diffstat (limited to 'roms/opensbi/firmware/fw_payload.S')
-rw-r--r--roms/opensbi/firmware/fw_payload.S97
1 files changed, 97 insertions, 0 deletions
diff --git a/roms/opensbi/firmware/fw_payload.S b/roms/opensbi/firmware/fw_payload.S
new file mode 100644
index 000000000..1ef121e28
--- /dev/null
+++ b/roms/opensbi/firmware/fw_payload.S
@@ -0,0 +1,97 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2019 Western Digital Corporation or its affiliates.
+ *
+ * Authors:
+ * Anup Patel <anup.patel@wdc.com>
+ */
+
+#include "fw_base.S"
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_boot_hart
+ /*
+ * This function is called very early even before
+ * fw_save_info() is called.
+ * We can only use a0, a1, and a2 registers here.
+ * The boot HART id should be returned in 'a0'.
+ */
+fw_boot_hart:
+ li a0, -1
+ ret
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_save_info
+ /*
+ * We can only use a0, a1, a2, a3, and a4 registers here.
+ * The a0, a1, and a2 registers will be same as passed by
+ * previous booting stage.
+ * Nothing to be returned here.
+ */
+fw_save_info:
+ ret
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_next_arg1
+ /*
+ * We can only use a0, a1, and a2 registers here.
+ * The a0, a1, and a2 registers will be same as passed by
+ * previous booting stage.
+ * The next arg1 should be returned in 'a0'.
+ */
+fw_next_arg1:
+#ifdef FW_PAYLOAD_FDT_ADDR
+ li a0, FW_PAYLOAD_FDT_ADDR
+#else
+ add a0, a1, zero
+#endif
+ ret
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_next_addr
+ /*
+ * We can only use a0, a1, and a2 registers here.
+ * The next address should be returned in 'a0'.
+ */
+fw_next_addr:
+ la a0, payload_bin
+ ret
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_next_mode
+ /*
+ * We can only use a0, a1, and a2 registers here.
+ * The next address should be returned in 'a0'.
+ */
+fw_next_mode:
+ li a0, PRV_S
+ ret
+
+ .section .entry, "ax", %progbits
+ .align 3
+ .global fw_options
+ /*
+ * We can only use a0, a1, and a2 registers here.
+ * The 'a4' register will have default options.
+ * The next address should be returned in 'a0'.
+ */
+fw_options:
+ add a0, zero, zero
+ ret
+
+ .section .payload, "ax", %progbits
+ .align 4
+ .globl payload_bin
+payload_bin:
+#ifndef FW_PAYLOAD_PATH
+ wfi
+ j payload_bin
+#else
+ .incbin FW_PAYLOAD_PATH
+#endif