dload_util: Add normal dload mode entrance
Enum determines if the requested dload mode is emergency or normal.
All dependent function calls are updated respectively.
msm8974 and msm8226 set_download_mode() functions are updated with the
target-specific normal download mode address
Change-Id: I500c1e3c7e835ad6a6fa59ea2701790a7fd12769
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 7c7f78b..59f43dd 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -1977,15 +1977,15 @@
/* Check if we should do something other than booting up */
if (keys_get_state(KEY_VOLUMEUP) && keys_get_state(KEY_VOLUMEDOWN))
{
- dprintf(ALWAYS,"dload mode key sequence detected");
- if (set_download_mode())
+ dprintf(ALWAYS,"dload mode key sequence detected\n");
+ if (set_download_mode(EMERGENCY_DLOAD))
{
- dprintf(CRITICAL,"dload mode not supported by target");
+ dprintf(CRITICAL,"dload mode not supported by target\n");
}
else
{
reboot_device(0);
- dprintf(CRITICAL,"Failed to reboot into dload mode");
+ dprintf(CRITICAL,"Failed to reboot into dload mode\n");
}
boot_into_fastboot = true;
}
diff --git a/include/platform.h b/include/platform.h
index 1c5b27e..aa63431 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -23,6 +23,8 @@
#ifndef __PLATFORM_H
#define __PLATFORM_H
+#include <dload_util.h>
+
#define PA(x) platform_get_virt_to_phys_mapping(x)
#define VA(x) platform_get_phys_to_virt_mapping(x)
@@ -50,6 +52,6 @@
unsigned check_reboot_mode(void);
void platform_uninit_timer(void);
void reboot_device(unsigned);
-int set_download_mode(void);
+int set_download_mode(enum dload_mode mode);
#endif
diff --git a/platform/msm8226/include/platform/iomap.h b/platform/msm8226/include/platform/iomap.h
index 2fe4b42..851e798 100644
--- a/platform/msm8226/include/platform/iomap.h
+++ b/platform/msm8226/include/platform/iomap.h
@@ -42,7 +42,8 @@
#define MSM_SHARED_IMEM_BASE 0xFE805000
#define RESTART_REASON_ADDR (MSM_SHARED_IMEM_BASE + 0x65C)
-#define FORCE_DLOAD_MODE_ADDR (MSM_SHARED_IMEM_BASE + 0xFE0)
+#define DLOAD_MODE_ADDR (MSM_SHARED_IMEM_BASE + 0x0)
+#define EMERGENCY_DLOAD_MODE_ADDR (MSM_SHARED_IMEM_BASE + 0xFE0)
#define MSM_GIC_DIST_BASE APPS_SS_BASE
#define MSM_GIC_CPU_BASE (APPS_SS_BASE + 0x2000)
diff --git a/platform/msm8974/include/platform/iomap.h b/platform/msm8974/include/platform/iomap.h
index 12f0015..ff7ab1b 100644
--- a/platform/msm8974/include/platform/iomap.h
+++ b/platform/msm8974/include/platform/iomap.h
@@ -41,10 +41,10 @@
#define SYSTEM_IMEM_BASE 0xFE800000
#define MSM_SHARED_IMEM_BASE 0xFE805000
-#define RESTART_REASON_ADDR (RPM_MSG_RAM_BASE + 0x65C)
-#define RESTART_REASON_ADDR_V2 (MSM_SHARED_IMEM_BASE + 0x65C)
-
-#define FORCE_DLOAD_MODE_ADDR_V2 (MSM_SHARED_IMEM_BASE + 0xFE0)
+#define RESTART_REASON_ADDR (RPM_MSG_RAM_BASE + 0x65C)
+#define RESTART_REASON_ADDR_V2 (MSM_SHARED_IMEM_BASE + 0x65C)
+#define DLOAD_MODE_ADDR_V2 (MSM_SHARED_IMEM_BASE + 0x0)
+#define EMERGENCY_DLOAD_MODE_ADDR_V2 (MSM_SHARED_IMEM_BASE + 0xFE0)
#define KPSS_BASE 0xF9000000
diff --git a/platform/msm_shared/dload_util.c b/platform/msm_shared/dload_util.c
index 4b7d08b..06140f2 100644
--- a/platform/msm_shared/dload_util.c
+++ b/platform/msm_shared/dload_util.c
@@ -28,18 +28,34 @@
#include <stdlib.h>
#include <reg.h>
+#include <dload_util.h>
-#define FORCE_DLOAD_COOKIE_0 0x322A4F99
-#define FORCE_DLOAD_COOKIE_1 0xC67E4350
-#define FORCE_DLOAD_COOKIE_2 0x77777777
+#define NORMAL_DLOAD_COOKIE_0 0xE47B337D
+#define NORMAL_DLOAD_COOKIE_1 0xCE14091A
+
+#define EMERGENCY_DLOAD_COOKIE_0 0x322A4F99
+#define EMERGENCY_DLOAD_COOKIE_1 0xC67E4350
+#define EMERGENCY_DLOAD_COOKIE_2 0x77777777
extern void dsb();
-void dload_util_write_cookie(uint32_t target_dload_mode_addr)
+void dload_util_write_cookie(uint32_t target_dload_mode_addr,
+ enum dload_mode mode)
{
- writel(FORCE_DLOAD_COOKIE_0, target_dload_mode_addr);
- writel(FORCE_DLOAD_COOKIE_1, target_dload_mode_addr + sizeof(uint32_t));
- writel(FORCE_DLOAD_COOKIE_2, target_dload_mode_addr + 2 * sizeof(uint32_t));
+ if (mode == NORMAL_DLOAD)
+ {
+ writel(NORMAL_DLOAD_COOKIE_0, target_dload_mode_addr);
+ writel(NORMAL_DLOAD_COOKIE_1,
+ target_dload_mode_addr + sizeof(uint32_t));
+ }
+ else
+ {
+ writel(EMERGENCY_DLOAD_COOKIE_0, target_dload_mode_addr);
+ writel(EMERGENCY_DLOAD_COOKIE_1,
+ target_dload_mode_addr + sizeof(uint32_t));
+ writel(EMERGENCY_DLOAD_COOKIE_2,
+ target_dload_mode_addr + 2 * sizeof(uint32_t));
+ }
dsb();
}
diff --git a/platform/msm_shared/include/dload_util.h b/platform/msm_shared/include/dload_util.h
index 71d045d..8415773 100644
--- a/platform/msm_shared/include/dload_util.h
+++ b/platform/msm_shared/include/dload_util.h
@@ -31,6 +31,12 @@
#include <sys/types.h>
-void dload_util_write_cookie(uint32_t target_dload_mode_addr);
+enum dload_mode {
+ NORMAL_DLOAD,
+ EMERGENCY_DLOAD
+};
+
+void dload_util_write_cookie(uint32_t target_dload_mode_addr,
+ enum dload_mode mode);
#endif
diff --git a/target/init.c b/target/init.c
index 937f136..1f4362a 100644
--- a/target/init.c
+++ b/target/init.c
@@ -24,6 +24,7 @@
#include <debug.h>
#include <target.h>
#include <compiler.h>
+#include <dload_util.h>
#define EXPAND(NAME) #NAME
#define TARGET(NAME) EXPAND(NAME)
@@ -68,7 +69,7 @@
{
}
-__WEAK int set_download_mode(void)
+__WEAK int set_download_mode(enum dload_mode mode)
{
return -1;
}
diff --git a/target/msm8226/init.c b/target/msm8226/init.c
index ac648e8..026aa53 100644
--- a/target/msm8226/init.c
+++ b/target/msm8226/init.c
@@ -328,9 +328,10 @@
return _emmc_recovery_init();
}
-int set_download_mode(void)
+int set_download_mode(enum dload_mode mode)
{
- dload_util_write_cookie(FORCE_DLOAD_MODE_ADDR);
+ dload_util_write_cookie(mode == NORMAL_DLOAD ?
+ DLOAD_MODE_ADDR : EMERGENCY_DLOAD_MODE_ADDR, mode);
return 0;
}
diff --git a/target/msm8974/init.c b/target/msm8974/init.c
index 5a0057c..daa98b7 100644
--- a/target/msm8974/init.c
+++ b/target/msm8974/init.c
@@ -488,9 +488,10 @@
dprintf(CRITICAL, "Rebooting failed\n");
}
-int set_download_mode(void)
+int set_download_mode(enum dload_mode mode)
{
- dload_util_write_cookie(FORCE_DLOAD_MODE_ADDR_V2);
+ dload_util_write_cookie(mode == NORMAL_DLOAD ?
+ DLOAD_MODE_ADDR_V2 : EMERGENCY_DLOAD_MODE_ADDR_V2, mode);
return 0;
}