1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <common.h> 6*4882a593Smuzhiyun #include <asm/io.h> 7*4882a593Smuzhiyun #include <asm/arch/hardware.h> 8*4882a593Smuzhiyun #include <asm/arch/at91_gpbr.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* 11*4882a593Smuzhiyun * We combine the BOOTCOUNT_MAGIC and bootcount in one 32-bit register. 12*4882a593Smuzhiyun * This is done so we need to use only one of the four GPBR registers. 13*4882a593Smuzhiyun */ bootcount_store(ulong a)14*4882a593Smuzhiyunvoid bootcount_store(ulong a) 15*4882a593Smuzhiyun { 16*4882a593Smuzhiyun at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), 19*4882a593Smuzhiyun &gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun bootcount_load(void)22*4882a593Smuzhiyunulong bootcount_load(void) 23*4882a593Smuzhiyun { 24*4882a593Smuzhiyun at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun ulong val = readl(&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); 27*4882a593Smuzhiyun if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) 28*4882a593Smuzhiyun return 0; 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun return val & 0x0000ffff; 31*4882a593Smuzhiyun } 32