]>
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> | |
34 | ||
35 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + CPM_BOOTCOUNT_ADDR) | |
36 | #endif /* defined(CONFIG_MPC8260) */ | |
37 | ||
62ddcf05 | 38 | #if defined(CONFIG_QE) |
e4a95d11 SR |
39 | #include <asm/immap_qe.h> |
40 | ||
41 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + 0x110000 + \ | |
42 | QE_MURAM_SIZE - 2 * sizeof(u32)) | |
43 | #endif /* defined(CONFIG_MPC8360) */ | |
44 | ||
45 | #if defined(CONFIG_4xx) | |
46 | #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_OCM_DATA_ADDR + \ | |
47 | CONFIG_SYS_BOOTCOUNT_ADDR) | |
48 | #endif /* defined(CONFIG_4xx) */ | |
49 | ||
50 | #endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ | |
51 | ||
0044c42e SR |
52 | /* Now implement the generic default functions */ |
53 | #if defined(CONFIG_SYS_BOOTCOUNT_ADDR) | |
54 | __weak void bootcount_store(ulong a) | |
e4a95d11 SR |
55 | { |
56 | void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; | |
57 | ||
58 | #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) | |
0044c42e | 59 | raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); |
e4a95d11 | 60 | #else |
0044c42e SR |
61 | raw_bootcount_store(reg, a); |
62 | raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC); | |
e4a95d11 SR |
63 | #endif |
64 | } | |
65 | ||
0044c42e | 66 | __weak ulong bootcount_load(void) |
e4a95d11 SR |
67 | { |
68 | void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; | |
69 | ||
70 | #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) | |
0044c42e | 71 | u32 tmp = raw_bootcount_load(reg); |
59dde44a MW |
72 | |
73 | if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) | |
e4a95d11 SR |
74 | return 0; |
75 | else | |
59dde44a | 76 | return (tmp & 0x0000ffff); |
e4a95d11 | 77 | #else |
0044c42e | 78 | if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC) |
e4a95d11 SR |
79 | return 0; |
80 | else | |
0044c42e | 81 | return raw_bootcount_load(reg); |
e4a95d11 SR |
82 | #endif |
83 | } | |
0044c42e | 84 | #endif |