bootcount.c 2.29 KB
Newer Older
1
/*
2
 * (C) Copyright 2010-2012
3 4
 * Stefan Roese, DENX Software Engineering, sr@denx.de.
 *
5
 * SPDX-License-Identifier:	GPL-2.0+
6 7
 */

8 9
#include <bootcount.h>
#include <linux/compiler.h>
10 11 12 13 14 15 16 17 18 19 20 21

/*
 * Only override CONFIG_SYS_BOOTCOUNT_ADDR if not already defined. This
 * way, some boards can define it directly in their config header.
 */
#if !defined(CONFIG_SYS_BOOTCOUNT_ADDR)

#if defined(CONFIG_MPC5xxx)
#define CONFIG_SYS_BOOTCOUNT_ADDR	(MPC5XXX_CDM_BRDCRMB)
#define CONFIG_SYS_BOOTCOUNT_SINGLEWORD
#endif /* defined(CONFIG_MPC5xxx) */

22 23 24 25 26
#if defined(CONFIG_MPC512X)
#define CONFIG_SYS_BOOTCOUNT_ADDR	(&((immap_t *)CONFIG_SYS_IMMR)->clk.bcr)
#define CONFIG_SYS_BOOTCOUNT_SINGLEWORD
#endif /* defined(CONFIG_MPC512X) */

27 28 29 30 31 32 33 34 35 36
#if defined(CONFIG_8xx)
#define CONFIG_SYS_BOOTCOUNT_ADDR (((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_dpmem + \
				CPM_BOOTCOUNT_ADDR)
#endif /* defined(CONFIG_8xx) */

#if defined(CONFIG_MPC8260)
#include <asm/cpm_8260.h>
#define CONFIG_SYS_BOOTCOUNT_ADDR	(CONFIG_SYS_IMMR + CPM_BOOTCOUNT_ADDR)
#endif /* defined(CONFIG_MPC8260) */

37
#if defined(CONFIG_QE)
38
#include <linux/immap_qe.h>
39 40
#define CONFIG_SYS_BOOTCOUNT_ADDR	(CONFIG_SYS_IMMR + 0x110000 + \
					 QE_MURAM_SIZE - 2 * sizeof(u32))
41
#endif /* defined(CONFIG_QE) */
42 43 44 45 46 47 48 49

#if defined(CONFIG_4xx)
#define CONFIG_SYS_BOOTCOUNT_ADDR	(CONFIG_SYS_OCM_DATA_ADDR + \
				CONFIG_SYS_BOOTCOUNT_ADDR)
#endif /* defined(CONFIG_4xx) */

#endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */

50 51 52
/* Now implement the generic default functions */
#if defined(CONFIG_SYS_BOOTCOUNT_ADDR)
__weak void bootcount_store(ulong a)
53 54 55 56
{
	void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR;

#if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD)
57
	raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a);
58
#else
59 60
	raw_bootcount_store(reg, a);
	raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC);
61
#endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD */
62 63
}

64
__weak ulong bootcount_load(void)
65 66 67 68
{
	void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR;

#if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD)
69
	u32 tmp = raw_bootcount_load(reg);
70 71

	if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000))
72 73
		return 0;
	else
74
		return (tmp & 0x0000ffff);
75
#else
76
	if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC)
77 78
		return 0;
	else
79
		return raw_bootcount_load(reg);
80
#endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) */
81
}
82
#endif /* defined(CONFIG_SYS_BOOTCOUNT_ADDR) */