10044c42eSStefan Roese /* 20044c42eSStefan Roese * (C) Copyright 2010-2012 30044c42eSStefan Roese * Stefan Roese, DENX Software Engineering, sr@denx.de. 40044c42eSStefan Roese * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 60044c42eSStefan Roese */ 70044c42eSStefan Roese 80044c42eSStefan Roese #include <bootcount.h> 90044c42eSStefan Roese #include <linux/compiler.h> 100044c42eSStefan Roese 110044c42eSStefan Roese /* 120044c42eSStefan Roese * Only override CONFIG_SYS_BOOTCOUNT_ADDR if not already defined. This 130044c42eSStefan Roese * way, some boards can define it directly in their config header. 140044c42eSStefan Roese */ 150044c42eSStefan Roese #if !defined(CONFIG_SYS_BOOTCOUNT_ADDR) 160044c42eSStefan Roese 170044c42eSStefan Roese #if defined(CONFIG_MPC5xxx) 180044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (MPC5XXX_CDM_BRDCRMB) 190044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_SINGLEWORD 200044c42eSStefan Roese #endif /* defined(CONFIG_MPC5xxx) */ 210044c42eSStefan Roese 220044c42eSStefan Roese #if defined(CONFIG_MPC512X) 230044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (&((immap_t *)CONFIG_SYS_IMMR)->clk.bcr) 240044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_SINGLEWORD 250044c42eSStefan Roese #endif /* defined(CONFIG_MPC512X) */ 260044c42eSStefan Roese 270044c42eSStefan Roese #if defined(CONFIG_8xx) 280044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_dpmem + \ 290044c42eSStefan Roese CPM_BOOTCOUNT_ADDR) 300044c42eSStefan Roese #endif /* defined(CONFIG_8xx) */ 310044c42eSStefan Roese 320044c42eSStefan Roese #if defined(CONFIG_MPC8260) 330044c42eSStefan Roese #include <asm/cpm_8260.h> 340044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + CPM_BOOTCOUNT_ADDR) 350044c42eSStefan Roese #endif /* defined(CONFIG_MPC8260) */ 360044c42eSStefan Roese 370044c42eSStefan Roese #if defined(CONFIG_QE) 3838d67a4eSZhao Qiang #include <linux/immap_qe.h> 390044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + 0x110000 + \ 400044c42eSStefan Roese QE_MURAM_SIZE - 2 * sizeof(u32)) 41*76765375SRobert P. J. Day #endif /* defined(CONFIG_QE) */ 420044c42eSStefan Roese 430044c42eSStefan Roese #if defined(CONFIG_4xx) 440044c42eSStefan Roese #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_OCM_DATA_ADDR + \ 450044c42eSStefan Roese CONFIG_SYS_BOOTCOUNT_ADDR) 460044c42eSStefan Roese #endif /* defined(CONFIG_4xx) */ 470044c42eSStefan Roese 480044c42eSStefan Roese #endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ 490044c42eSStefan Roese 500044c42eSStefan Roese /* Now implement the generic default functions */ 510044c42eSStefan Roese #if defined(CONFIG_SYS_BOOTCOUNT_ADDR) 520044c42eSStefan Roese __weak void bootcount_store(ulong a) 530044c42eSStefan Roese { 540044c42eSStefan Roese void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; 550044c42eSStefan Roese 560044c42eSStefan Roese #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) 570044c42eSStefan Roese raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); 580044c42eSStefan Roese #else 590044c42eSStefan Roese raw_bootcount_store(reg, a); 600044c42eSStefan Roese raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC); 61*76765375SRobert P. J. Day #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD */ 620044c42eSStefan Roese } 630044c42eSStefan Roese 640044c42eSStefan Roese __weak ulong bootcount_load(void) 650044c42eSStefan Roese { 660044c42eSStefan Roese void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; 670044c42eSStefan Roese 680044c42eSStefan Roese #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) 690044c42eSStefan Roese u32 tmp = raw_bootcount_load(reg); 700044c42eSStefan Roese 710044c42eSStefan Roese if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) 720044c42eSStefan Roese return 0; 730044c42eSStefan Roese else 740044c42eSStefan Roese return (tmp & 0x0000ffff); 750044c42eSStefan Roese #else 760044c42eSStefan Roese if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC) 770044c42eSStefan Roese return 0; 780044c42eSStefan Roese else 790044c42eSStefan Roese return raw_bootcount_load(reg); 80*76765375SRobert P. J. Day #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) */ 810044c42eSStefan Roese } 82*76765375SRobert P. J. Day #endif /* defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ 83