diff options
author | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-10-12 10:36:56 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:01:49 +0200 |
commit | 6d5e109c04c4f655c48c0e00956c25ab80d5baa5 (patch) | |
tree | 130ccfe3b4b5dd1839bddabc3e776acd75231664 /arch/arm/mach-ux500 | |
parent | 02da9474428977763aeb9d146391b95c2ce9487f (diff) |
ux500: sw reset: Save SW Reset Reason before reset
Converts the reboot reason string received in SYSCALL_DEFINE4 in
sys.c into a 2 bytes reset reason code. This 16 bit value is
stored in the TCDM Memory at location: tcdm_base + 0xFF8.
The string to code mapping structure has been added in file
reboot_reasons.h and reboot_reasons.c. The code for translation
has been placed in cpu.c.
ST-Ericsson Linux next: Tested and reviewed with 2011-03-28
ST-Ericsson ID: 327863
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I5fe83b824c6dbe3f61a3d77671ce845e6f81d87b
Signed-off-by: rickard evertsson <rickard.evertsson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/19174
Reviewed-by: Mattias WALLIN <mattias.wallin@stericsson.com>
Conflicts:
arch/arm/mach-ux500/Makefile
arch/arm/mach-ux500/cpu.c
Conflicts:
arch/arm/mach-ux500/Makefile
arch/arm/mach-ux500/cpu.c
arch/arm/mach-ux500/include/mach/prcmu-fw-api.h
drivers/misc/shrm/shrm_protocol.c
Diffstat (limited to 'arch/arm/mach-ux500')
-rw-r--r-- | arch/arm/mach-ux500/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-u5500.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-ux500/cpu.c | 33 | ||||
-rw-r--r-- | arch/arm/mach-ux500/include/mach/reboot_reasons.h | 39 | ||||
-rw-r--r-- | arch/arm/mach-ux500/include/mach/setup.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-ux500/reboot_reasons.c | 20 |
7 files changed, 98 insertions, 3 deletions
diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile index 0992ac1115c..c9ace64f2cb 100644 --- a/arch/arm/mach-ux500/Makefile +++ b/arch/arm/mach-ux500/Makefile @@ -4,7 +4,7 @@ obj-y := clock.o cpu.o devices.o \ devices-common.o \ - id.o pins.o usb.o timer.o + id.o pins.o usb.o timer.o reboot_reasons.o obj-y += pm/ obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o prcmu-db5500.o \ diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 46af8280f63..9042796a5ce 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -859,6 +859,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform") .timer = &ux500_timer, .handle_irq = gic_handle_irq, .init_machine = mop500_init_machine, + .restart = ux500_restart, MACHINE_END MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") @@ -868,6 +869,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") .timer = &ux500_timer, .handle_irq = gic_handle_irq, .init_machine = hrefv60_init_machine, + .restart = ux500_restart, MACHINE_END MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") @@ -878,6 +880,7 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") .timer = &ux500_timer, .handle_irq = gic_handle_irq, .init_machine = snowball_init_machine, + .restart = ux500_restart, MACHINE_END #ifdef CONFIG_MACH_UX500_DT diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 7cc37ba0c1d..5795c66681f 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c @@ -341,6 +341,7 @@ MACHINE_START(U5500, "ST-Ericsson U5500 Platform") .timer = &ux500_timer, .handle_irq = gic_handle_irq, .init_machine = u5500_init_machine, + .restart = ux500_restart, MACHINE_END MACHINE_START(B5500, "ST-Ericsson U5500 Big Board") @@ -349,4 +350,5 @@ MACHINE_START(B5500, "ST-Ericsson U5500 Big Board") .init_irq = ux500_init_irq, .timer = &ux500_timer, .init_machine = u5500_init_machine, + .restart = ux500_restart, MACHINE_END diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index 6a8ec186ab5..65211b0b628 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c @@ -26,6 +26,7 @@ #include <mach/hardware.h> #include <mach/setup.h> #include <mach/devices.h> +#include <mach/reboot_reasons.h> #include "clock.h" @@ -36,9 +37,37 @@ static const struct of_device_id ux500_dt_irq_match[] = { {}, }; -static void ux500_restart(char mode, const char *cmd) +/* + * The reboot reason string can be 255 characters long and the memory + * in which we save the sw reset reason is 2 bytes. Therefore we need to + * convert the string into a 16 bit pattern. + * + * See file reboot_reasons.h for conversion. + */ +static unsigned short map_cmd_to_code(const char *cmd) { - prcmu_system_reset(); + int i; + + if (cmd == NULL) + /* normal reboot w/o argument */ + return SW_RESET_NO_ARGUMENT; + + /* Search through reboot reason list */ + for (i = 0; i < reboot_reasons_size; i++) { + if (!strcmp(reboot_reasons[i].reason, cmd)) + return reboot_reasons[i].code; + } + + /* No valid Reboot Reason found */ + return SW_RESET_CRASH; +} + +void ux500_restart(char mode, const char *cmd) +{ + unsigned short reset_code; + + reset_code = map_cmd_to_code(cmd); + prcmu_system_reset(reset_code); mdelay(1000); printk("Reboot via PRCMU failed -- System halted\n"); diff --git a/arch/arm/mach-ux500/include/mach/reboot_reasons.h b/arch/arm/mach-ux500/include/mach/reboot_reasons.h new file mode 100644 index 00000000000..06a73754b56 --- /dev/null +++ b/arch/arm/mach-ux500/include/mach/reboot_reasons.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * Author: Rickard Evertsson <rickard.evertsson@stericsson.com> + * for ST-Ericsson. + * + * License terms: GNU General Public License (GPL) version 2 + * + * Use this file to customize your reboot / sw reset reasons. Add, remove or + * modify reasons in reboot_reasons[]. + * The reboot reasons will be saved to a secure location in TCDM memory and + * can be read at bootup by e.g. the bootloader. + */ + +#ifndef _REBOOT_REASONS_H +#define _REBOOT_REASONS_H + +/* + * These defines contains the codes that will be written down to a secure + * location before resetting. These values are just dummy values and does not, + * at the moment, affect anything. + */ +#define SW_RESET_NO_ARGUMENT 0x0 +#define SW_RESET_CRASH 0xDEAD +#define SW_RESET_NORMAL 0xc001 + +/* + * The array reboot_reasons[] is used when you want to map a string to a reboot + * reason code + */ +struct reboot_reason { + const char *reason; + unsigned short code; +}; + +extern struct reboot_reason reboot_reasons[]; + +extern unsigned int reboot_reasons_size; + +#endif diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index 3dc00ffa7bf..e7ae259c29b 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h @@ -14,6 +14,8 @@ #include <asm/mach/time.h> #include <linux/init.h> +extern void ux500_restart(char, const char *); + void __init ux500_map_io(void); extern void __init u5500_map_io(void); extern void __init u8500_map_io(void); diff --git a/arch/arm/mach-ux500/reboot_reasons.c b/arch/arm/mach-ux500/reboot_reasons.c new file mode 100644 index 00000000000..b625c6a615f --- /dev/null +++ b/arch/arm/mach-ux500/reboot_reasons.c @@ -0,0 +1,20 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * Author: Rickard Evertsson <rickard.evertsson@stericsson.com> + * for ST-Ericsson. + * + * License terms: GNU General Public License (GPL) version 2 + * + * Use this file to customize your reboot / sw reset reasons. Add, remove or + * modify reasons in reboot_reasons[]. + */ + +#include <linux/kernel.h> +#include <mach/reboot_reasons.h> + +struct reboot_reason reboot_reasons[] = { + {"crash", SW_RESET_CRASH}, + {"", SW_RESET_NORMAL}, /* Normal Boot */ +}; + +unsigned int reboot_reasons_size = ARRAY_SIZE(reboot_reasons); |