summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTien Fong Chee <tien.fong.chee@intel.com>2017-04-13 13:17:55 +0800
committerTien Fong Chee <tien.fong.chee@intel.com>2017-04-13 13:17:55 +0800
commit077e579b1d6a213768dd2bab0daa7615a33fd53c (patch)
treeaef909422cf49dc1f3ee88065d53652d4dcfc8fb
parentd5d5f74301d7abbd9fbf15a03690319b954284dd (diff)
downloadu-boot-socfpga-077e579b1d6a213768dd2bab0daa7615a33fd53c.tar.gz
After completion of the multiport front end (MPFE) reset recovery loop, we want to restore the s2f mask bit to user setting. This patch is needed so that the user setting stays valid. Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com> --- Changes for V5 - Changed commit messages, moving the s2f magic define to header, and changing appropriate parameter name 'flag' to 'set'. Changes for v4 - Changed the function parameter name declaration Changes for v3 - Rewrite commit message clearly. Changes for v2 - Added new #define for const number, changed the programming style, and changing to better #define name for s2f warm reset restore.
-rwxr-xr-xarch/arm/cpu/armv7/socfpga_arria10/misc.c48
-rwxr-xr-xarch/arm/include/asm/arch-socfpga_arria10/misc.h6
2 files changed, 37 insertions, 17 deletions
diff --git a/arch/arm/cpu/armv7/socfpga_arria10/misc.c b/arch/arm/cpu/armv7/socfpga_arria10/misc.c
index ddde0f6dea..5ec2ddb0de 100755
--- a/arch/arm/cpu/armv7/socfpga_arria10/misc.c
+++ b/arch/arm/cpu/armv7/socfpga_arria10/misc.c
@@ -33,6 +33,7 @@
#define QSPI_S25FL_SOFT_RESET_COMMAND 0x00f0ff82
#define QSPI_N25_SOFT_RESET_COMMAND 0x00000001
#define QSPI_NO_SOFT_RESET 0x00000000
+#define MPFE_RESET_RECOVERY_REG 7
DECLARE_GLOBAL_DATA_PTR;
@@ -398,44 +399,61 @@ unsigned int uart_com_port(const void *blob)
* This magic number is part of boot progress tracking
* and required by boot to initialize HW.
*/
-void set_regular_boot(unsigned int status)
+void set_regular_boot(unsigned int set)
{
- unsigned int ret = 0;
-
- if (status) {
- if (!is_early_release_fpga_config(gd->fdt_blob)) {
- ret = readl(&reset_manager_base->syswarmmask);
+ unsigned int ret =
+ readl(&reset_manager_base->syswarmmask);
+ unsigned int s2f_ret =
+ readl(&system_manager_base->
+ isw_handoff[MPFE_RESET_RECOVERY_REG]);
+
+ if (set) {
+ if ((ret & ALT_RSTMGR_SYSWARMMASK_S2F_SET_MSK) &&
+ !is_early_release_fpga_config(gd->fdt_blob)) {
/* Masking s2f module reset */
writel(ret & (~ALT_RSTMGR_SYSWARMMASK_S2F_SET_MSK),
&reset_manager_base->syswarmmask);
- }
- writel(REGULAR_BOOT_MAGIC,
- &system_manager_base->isw_handoff[7]);
+ /*
+ * Signal for restoring s2f user setting after
+ * warm reset
+ */
+ writel(REGULAR_BOOT_S2FWARMRESET_RESTORE_MAGIC,
+ &system_manager_base->
+ isw_handoff[MPFE_RESET_RECOVERY_REG]);
+ } else {
+ writel(REGULAR_BOOT_MAGIC,
+ &system_manager_base->
+ isw_handoff[MPFE_RESET_RECOVERY_REG]);
+ }
} else {
- if (!is_early_release_fpga_config(gd->fdt_blob)) {
- ret = readl(&reset_manager_base->syswarmmask);
+ if ((s2f_ret == REGULAR_BOOT_S2FWARMRESET_RESTORE_MAGIC) &&
+ !is_early_release_fpga_config(gd->fdt_blob)) {
/* Unmasking s2f module reset */
writel(ret | ALT_RSTMGR_SYSWARMMASK_S2F_SET_MSK,
&reset_manager_base->syswarmmask);
}
- writel(0, &system_manager_base->isw_handoff[7]);
+ writel(0, &system_manager_base->
+ isw_handoff[MPFE_RESET_RECOVERY_REG]);
}
}
/*
* This function is used to check whether
* handoff register isw_handoff[7] contains
- * magic number "0xd15ea5e".
+ * magic number "0xd15ea5e" or s2f warm reset
+ * restore magic number "0xd15ea5f".
*/
unsigned int is_regular_boot(void)
{
unsigned int status;
- status = readl(&system_manager_base->isw_handoff[7]);
+ status = readl(&system_manager_base->
+ isw_handoff[MPFE_RESET_RECOVERY_REG]);
- if (REGULAR_BOOT_MAGIC == status)
+ if (status == REGULAR_BOOT_MAGIC ||
+ status == REGULAR_BOOT_S2FWARMRESET_RESTORE_MAGIC)
return 1;
else
return 0;
diff --git a/arch/arm/include/asm/arch-socfpga_arria10/misc.h b/arch/arm/include/asm/arch-socfpga_arria10/misc.h
index 367a2fcceb..e292bd89cb 100755
--- a/arch/arm/include/asm/arch-socfpga_arria10/misc.h
+++ b/arch/arm/include/asm/arch-socfpga_arria10/misc.h
@@ -8,6 +8,8 @@
#define _SOCFPGA_MISC_H_
#define REGULAR_BOOT_MAGIC 0xd15ea5e
+/* For restoring s2f module of syswarmmask register to default state */
+#define REGULAR_BOOT_S2FWARMRESET_RESTORE_MAGIC 0xd15ea5f
#define RAM_BOOT_EN_MAGIC 0xae9efebc
#ifndef __ASSEMBLY__
@@ -20,10 +22,10 @@ unsigned int dedicated_uart_com_port(const void *blob);
unsigned int shared_uart_com_port(const void *blob);
void shared_uart_buffer_to_console(void);
unsigned int uart_com_port(const void *blob);
-void set_regular_boot(unsigned int status);
+void set_regular_boot(unsigned int set);
unsigned int is_regular_boot(void);
int qspi_software_reset(void);
-void enable_ram_boot(unsigned int status, unsigned long reentrance_loc);
+void enable_ram_boot(unsigned int enable, unsigned long reentrance_loc);
#endif /* __ASSEMBLY__ */
#endif /* _SOCFPGA_MISC_H_ */