]>
Commit | Line | Data |
---|---|---|
e4a95d11 | 1 | /* |
0044c42e | 2 | * (C) Copyright 2010-2012 |
e4a95d11 SR |
3 | * Stefan Roese, DENX Software Engineering, sr@denx.de. |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
e4a95d11 SR |
6 | */ |
7 | ||
0044c42e SR |
8 | #include <bootcount.h> |
9 | #include <linux/compiler.h> | |
e4a95d11 SR |
10 | |
11 | /* | |
12 | * Only override CONFIG_SYS_BOOTCOUNT_ADDR if not already defined. This | |
13 | * way, some boards can define it directly in their config header. | |
14 | */ | |
15 | #if !defined(CONFIG_SYS_BOOTCOUNT_ADDR) | |
16 | ||
17 | #if defined(CONFIG_MPC5xxx) | |
18 | #define CONFIG_SYS_BOOTCOUNT_ADDR (MPC5XXX_CDM_BRDCRMB) | |
19 | #define CONFIG_SYS_BOOTCOUNT_SINGLEWORD | |
20 | #endif /* defined(CONFIG_MPC5xxx) */ | |
21 | ||
955ea6fc MW |
22 | #if defined(CONFIG_MPC512X) |
23 | #define CONFIG_SYS_BOOTCOUNT_ADDR (&((immap_t *)CONFIG_SYS_IMMR)->clk.bcr) | |
24 | #define CONFIG_SYS_BOOTCOUNT_SINGLEWORD | |
25 | #endif /* defined(CONFIG_MPC512X) */ | |
26 | ||
e4a95d11 SR |
27 | #if defined(CONFIG_8xx) |
28 | #define CONFIG_SYS_BOOTCOUNT_ADDR (((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_dpmem + \ | |
29 | CPM_BOOTCOUNT_ADDR) | |
30 | #endif /* defined(CONFIG_8xx) */ | |
31 | ||
32 | #if defined(CONFIG_MPC8260) | |
33 | #include <asm/cpm_8260.h> | |
e4a95d11 SR |
34 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + CPM_BOOTCOUNT_ADDR) |
35 | #endif /* defined(CONFIG_MPC8260) */ | |
36 | ||
62ddcf05 | 37 | #if defined(CONFIG_QE) |
38d67a4e | 38 | #include <linux/immap_qe.h> |
e4a95d11 SR |
39 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + 0x110000 + \ |
40 | QE_MURAM_SIZE - 2 * sizeof(u32)) | |
76765375 | 41 | #endif /* defined(CONFIG_QE) */ |
e4a95d11 SR |
42 | |
43 | #if defined(CONFIG_4xx) | |
44 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_OCM_DATA_ADDR + \ | |
45 | CONFIG_SYS_BOOTCOUNT_ADDR) | |
46 | #endif /* defined(CONFIG_4xx) */ | |
47 | ||
48 | #endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ | |
49 | ||
0044c42e SR |
50 | /* Now implement the generic default functions */ |
51 | #if defined(CONFIG_SYS_BOOTCOUNT_ADDR) | |
52 | __weak void bootcount_store(ulong a) | |
e4a95d11 SR |
53 | { |
54 | void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; | |
55 | ||
56 | #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) | |
0044c42e | 57 | raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); |
e4a95d11 | 58 | #else |
0044c42e SR |
59 | raw_bootcount_store(reg, a); |
60 | raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC); | |
76765375 | 61 | #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD */ |
e4a95d11 SR |
62 | } |
63 | ||
0044c42e | 64 | __weak ulong bootcount_load(void) |
e4a95d11 SR |
65 | { |
66 | void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; | |
67 | ||
68 | #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) | |
0044c42e | 69 | u32 tmp = raw_bootcount_load(reg); |
59dde44a MW |
70 | |
71 | if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) | |
e4a95d11 SR |
72 | return 0; |
73 | else | |
59dde44a | 74 | return (tmp & 0x0000ffff); |
e4a95d11 | 75 | #else |
0044c42e | 76 | if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC) |
e4a95d11 SR |
77 | return 0; |
78 | else | |
0044c42e | 79 | return raw_bootcount_load(reg); |
76765375 | 80 | #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) */ |
e4a95d11 | 81 | } |
76765375 | 82 | #endif /* defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ |