On 06/05/2012 01:37 AM, Stefan Roese wrote: > This patch moves all bootcount implementations into a common > directory: drivers/bootcount. The generic bootcount driver > is now usable not only by powerpc platforms, but others as well. > > Signed-off-by: Stefan Roese <s...@denx.de> > Cc: Heiko Schocher <h...@denx.de> > Cc: Valentin Longchamp <valentin.longch...@keymile.com> > Cc: Christian Riesch <christian.rie...@omicron.at> > Cc: Manfred Rudigier <manfred.rudig...@omicron.at> > Cc: Mike Frysinger <vap...@gentoo.org> > Cc: Rob Herring <rob.herr...@calxeda.com> > Cc: Reinhard Meyer <reinhard.me...@emk-elektronik.de> > Tested-by: Valentin Longchamp <valentin.longch...@keymile.com> > Tested-by: Christian Riesch <christian.rie...@omicron.at>
For highbank: Acked-by: Rob Herring <rob.herr...@calxeda.com> > --- > v3: > - Moved le-/be-accessors into header so that they now can be > used by all bootcount drivers. > - Changed CONFIG_BOOTCOUNT_LE to CONFIG_SYS_BOOTCOUNT_LE > - Enabled CONFIG_SYS_BOOTCOUNT_LE in highbank > - Enabled CONFIG_SYS_BOOTCOUNT_SINGLEWORD in highbank > > v2: > - Added CONFIG_BOOTCOUNT_LE to bootcount_davinci.c and enabled it > in calimain.h to select little-endian accessors. > > Makefile | 3 + > arch/arm/cpu/arm926ejs/at91/cpu.c | 26 ------- > arch/arm/cpu/armv7/highbank/Makefile | 2 +- > arch/arm/cpu/armv7/highbank/bootcount.c | 36 ---------- > arch/arm/cpu/ixp/cpu.c | 22 ------ > arch/powerpc/lib/Makefile | 1 - > board/enbw/enbw_cmc/enbw_cmc.c | 29 -------- > board/keymile/km_arm/km_arm.c | 51 -------------- > board/omicron/calimain/calimain.c | 29 -------- > drivers/bootcount/Makefile | 47 +++++++++++++ > .../powerpc/lib => drivers/bootcount}/bootcount.c | 25 ++++--- > drivers/bootcount/bootcount_at91.c | 43 ++++++++++++ > .../bootcount/bootcount_blackfin.c | 0 > drivers/bootcount/bootcount_davinci.c | 49 +++++++++++++ > drivers/bootcount/bootcount_ram.c | 72 > ++++++++++++++++++++ > include/bootcount.h | 42 ++++++++++++ > include/configs/calimain.h | 1 + > include/configs/highbank.h | 2 + > include/configs/km/km_arm.h | 2 + > 19 files changed, 276 insertions(+), 206 deletions(-) > delete mode 100644 arch/arm/cpu/armv7/highbank/bootcount.c > create mode 100644 drivers/bootcount/Makefile > rename {arch/powerpc/lib => drivers/bootcount}/bootcount.c (84%) > create mode 100644 drivers/bootcount/bootcount_at91.c > rename arch/blackfin/cpu/bootcount.c => > drivers/bootcount/bootcount_blackfin.c (100%) > create mode 100644 drivers/bootcount/bootcount_davinci.c > create mode 100644 drivers/bootcount/bootcount_ram.c > create mode 100644 include/bootcount.h > > diff --git a/Makefile b/Makefile > index 659e8f2..8fd51b8 100644 > --- a/Makefile > +++ b/Makefile > @@ -249,6 +249,9 @@ LIBS += net/libnet.o > LIBS += disk/libdisk.o > LIBS += drivers/bios_emulator/libatibiosemu.o > LIBS += drivers/block/libblock.o > +ifeq ($(CONFIG_BOOTCOUNT_LIMIT),y) > +LIBS += drivers/bootcount/libbootcount.o > +endif > LIBS += drivers/dma/libdma.o > LIBS += drivers/fpga/libfpga.o > LIBS += drivers/gpio/libgpio.o > diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c > b/arch/arm/cpu/arm926ejs/at91/cpu.c > index c47fb31..5cf4fad 100644 > --- a/arch/arm/cpu/arm926ejs/at91/cpu.c > +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c > @@ -71,29 +71,3 @@ int print_cpuinfo(void) > return 0; > } > #endif > - > -#ifdef CONFIG_BOOTCOUNT_LIMIT > -/* > - * We combine the BOOTCOUNT_MAGIC and bootcount in one 32-bit register. > - * This is done so we need to use only one of the four GPBR registers. > - */ > -void bootcount_store (ulong a) > -{ > - at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; > - > - writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), > - &gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); > -} > - > -ulong bootcount_load (void) > -{ > - at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; > - > - ulong val = readl(&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); > - if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) > - return 0; > - else > - return val & 0x0000ffff; > -} > - > -#endif /* CONFIG_BOOTCOUNT_LIMIT */ > diff --git a/arch/arm/cpu/armv7/highbank/Makefile > b/arch/arm/cpu/armv7/highbank/Makefile > index 917c3a3..76faeb0 100644 > --- a/arch/arm/cpu/armv7/highbank/Makefile > +++ b/arch/arm/cpu/armv7/highbank/Makefile > @@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk > > LIB = $(obj)lib$(SOC).o > > -COBJS := timer.o bootcount.o > +COBJS := timer.o > SOBJS := > > SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) > diff --git a/arch/arm/cpu/armv7/highbank/bootcount.c > b/arch/arm/cpu/armv7/highbank/bootcount.c > deleted file mode 100644 > index 9ca0656..0000000 > --- a/arch/arm/cpu/armv7/highbank/bootcount.c > +++ /dev/null > @@ -1,36 +0,0 @@ > -/* > - * Copyright 2011 Calxeda, Inc. > - * > - * This program is free software; you can redistribute it and/or modify it > - * under the terms of the GNU General Public License as published by the Free > - * Software Foundation; either version 2 of the License, or (at your option) > - * any later version. > - * > - * This program is distributed in the hope it will be useful, but WITHOUT > - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > - * more details. > - * > - * You should have received a copy of the GNU General Public License along > with > - * this program. If not, see <http://www.gnu.org/licenses/>. > - */ > - > -#include <common.h> > -#include <asm/io.h> > - > -#ifdef CONFIG_BOOTCOUNT_LIMIT > -void bootcount_store(ulong a) > -{ > - writel((BOOTCOUNT_MAGIC & 0xffff0000) | a, CONFIG_SYS_BOOTCOUNT_ADDR); > -} > - > -ulong bootcount_load(void) > -{ > - u32 tmp = readl(CONFIG_SYS_BOOTCOUNT_ADDR); > - > - if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) > - return 0; > - else > - return tmp & 0x0000ffff; > -} > -#endif > diff --git a/arch/arm/cpu/ixp/cpu.c b/arch/arm/cpu/ixp/cpu.c > index 942845d..f1864d6 100644 > --- a/arch/arm/cpu/ixp/cpu.c > +++ b/arch/arm/cpu/ixp/cpu.c > @@ -107,28 +107,6 @@ void pci_init(void) > } > */ > > -#ifdef CONFIG_BOOTCOUNT_LIMIT > - > -void bootcount_store (ulong a) > -{ > - volatile ulong *save_addr = (volatile ulong > *)(CONFIG_SYS_BOOTCOUNT_ADDR); > - > - save_addr[0] = a; > - save_addr[1] = BOOTCOUNT_MAGIC; > -} > - > -ulong bootcount_load (void) > -{ > - volatile ulong *save_addr = (volatile ulong > *)(CONFIG_SYS_BOOTCOUNT_ADDR); > - > - if (save_addr[1] != BOOTCOUNT_MAGIC) > - return 0; > - else > - return save_addr[0]; > -} > - > -#endif /* CONFIG_BOOTCOUNT_LIMIT */ > - > int cpu_eth_init(bd_t *bis) > { > #ifdef CONFIG_IXP4XX_NPE > diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile > index cdd62a2..965f9ea 100644 > --- a/arch/powerpc/lib/Makefile > +++ b/arch/powerpc/lib/Makefile > @@ -46,7 +46,6 @@ SOBJS-y += reloc.o > COBJS-$(CONFIG_BAT_RW) += bat_rw.o > COBJS-y += board.o > COBJS-y += bootm.o > -COBJS-$(CONFIG_BOOTCOUNT_LIMIT) += bootcount.o > COBJS-y += cache.o > COBJS-y += extable.o > COBJS-y += interrupts.o > diff --git a/board/enbw/enbw_cmc/enbw_cmc.c b/board/enbw/enbw_cmc/enbw_cmc.c > index 6c0d931..3616df0 100644 > --- a/board/enbw/enbw_cmc/enbw_cmc.c > +++ b/board/enbw/enbw_cmc/enbw_cmc.c > @@ -517,35 +517,6 @@ void arch_memory_failure_handle(void) > } > #endif > > -#if defined(CONFIG_BOOTCOUNT_LIMIT) > -void bootcount_store(ulong a) > -{ > - struct davinci_rtc *reg = > - (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > - > - /* > - * write RTC kick register to enable write > - * for RTC Scratch registers. Scratch0 and 1 are > - * used for bootcount values. > - */ > - writel(RTC_KICK0R_WE, ®->kick0r); > - writel(RTC_KICK1R_WE, ®->kick1r); > - out_be32(®->scratch0, a); > - out_be32(®->scratch1, BOOTCOUNT_MAGIC); > -} > - > -ulong bootcount_load(void) > -{ > - struct davinci_rtc *reg = > - (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > - > - if (in_be32(®->scratch1) != BOOTCOUNT_MAGIC) > - return 0; > - else > - return in_be32(®->scratch0); > -} > -#endif > - > void board_gpio_init(void) > { > struct davinci_gpio *gpio = davinci_gpio_bank01; > diff --git a/board/keymile/km_arm/km_arm.c b/board/keymile/km_arm/km_arm.c > index 9e9940c..667edbc 100644 > --- a/board/keymile/km_arm/km_arm.c > +++ b/board/keymile/km_arm/km_arm.c > @@ -404,57 +404,6 @@ int hush_init_var(void) > } > #endif > > -#if defined(CONFIG_BOOTCOUNT_LIMIT) > -const ulong patterns[] = { 0x00000000, > - 0xFFFFFFFF, > - 0xFF00FF00, > - 0x0F0F0F0F, > - 0xF0F0F0F0}; > -const ulong NBR_OF_PATTERNS = sizeof(patterns)/sizeof(*patterns); > -const ulong OFFS_PATTERN = 3; > -const ulong REPEAT_PATTERN = 1000; > - > -void bootcount_store(ulong a) > -{ > - ulong *save_addr; > - ulong size = 0; > - int i; > - > - for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) > - size += gd->bd->bi_dram[i].size; > - save_addr = (ulong *)(size - BOOTCOUNT_ADDR); > - writel(a, save_addr); > - writel(BOOTCOUNT_MAGIC, &save_addr[1]); > - > - for (i = 0; i < REPEAT_PATTERN; i++) > - writel(patterns[i % NBR_OF_PATTERNS], > - &save_addr[i+OFFS_PATTERN]); > - > -} > - > -ulong bootcount_load(void) > -{ > - ulong *save_addr; > - ulong size = 0; > - ulong counter = 0; > - int i, tmp; > - > - for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) > - size += gd->bd->bi_dram[i].size; > - save_addr = (ulong *)(size - BOOTCOUNT_ADDR); > - > - counter = readl(&save_addr[0]); > - > - /* Is the counter reliable, check in the big pattern for bit errors */ > - for (i = 0; (i < REPEAT_PATTERN) && (counter != 0); i++) { > - tmp = readl(&save_addr[i+OFFS_PATTERN]); > - if (tmp != patterns[i % NBR_OF_PATTERNS]) > - counter = 0; > - } > - return counter; > -} > -#endif > - > #if defined(CONFIG_SOFT_I2C) > void set_sda(int state) > { > diff --git a/board/omicron/calimain/calimain.c > b/board/omicron/calimain/calimain.c > index 54415ce..1060a1f 100644 > --- a/board/omicron/calimain/calimain.c > +++ b/board/omicron/calimain/calimain.c > @@ -157,32 +157,3 @@ void hw_watchdog_reset(void) > davinci_hw_watchdog_reset(); > } > #endif > - > -#if defined(CONFIG_BOOTCOUNT_LIMIT) > -void bootcount_store(ulong a) > -{ > - struct davinci_rtc *reg = > - (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > - > - /* > - * write RTC kick register to enable write > - * for RTC Scratch registers. Scratch0 and 1 are > - * used for bootcount values. > - */ > - writel(RTC_KICK0R_WE, ®->kick0r); > - writel(RTC_KICK1R_WE, ®->kick1r); > - writel(a, ®->scratch0); > - writel(BOOTCOUNT_MAGIC, ®->scratch1); > -} > - > -ulong bootcount_load(void) > -{ > - struct davinci_rtc *reg = > - (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > - > - if (readl(®->scratch1) != BOOTCOUNT_MAGIC) > - return 0; > - else > - return readl(®->scratch0); > -} > -#endif > diff --git a/drivers/bootcount/Makefile b/drivers/bootcount/Makefile > new file mode 100644 > index 0000000..3d5ec13 > --- /dev/null > +++ b/drivers/bootcount/Makefile > @@ -0,0 +1,47 @@ > +# > +# See file CREDITS for list of people who contributed to this > +# project. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation; either version 2 of > +# the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, > +# MA 02111-1307 USA > +# > + > +include $(TOPDIR)/config.mk > + > +LIB := $(obj)libbootcount.o > + > +COBJS-y += bootcount.o > +COBJS-$(CONFIG_AT91SAM9XE) += bootcount_at91.o > +COBJS-$(CONFIG_BFIN_CPU) += bootcount_blackfin.o > +COBJS-$(CONFIG_SOC_DA8XX) += bootcount_davinci.o > +COBJS-$(CONFIG_BOOTCOUNT_RAM) += bootcount_ram.o > + > +COBJS := $(COBJS-y) > +SRCS := $(COBJS:.o=.c) > +OBJS := $(addprefix $(obj),$(COBJS)) > + > +all: $(LIB) > + > +$(LIB): $(obj).depend $(OBJS) > + $(call cmd_link_o_target, $(OBJS)) > + > +######################################################################### > + > +# defines $(obj).depend target > +include $(SRCTREE)/rules.mk > + > +sinclude $(obj).depend > + > +######################################################################## > diff --git a/arch/powerpc/lib/bootcount.c b/drivers/bootcount/bootcount.c > similarity index 84% > rename from arch/powerpc/lib/bootcount.c > rename to drivers/bootcount/bootcount.c > index f9ce539..a470b62 100644 > --- a/arch/powerpc/lib/bootcount.c > +++ b/drivers/bootcount/bootcount.c > @@ -1,5 +1,5 @@ > /* > - * (C) Copyright 2010 > + * (C) Copyright 2010-2012 > * Stefan Roese, DENX Software Engineering, s...@denx.de. > * > * See file CREDITS for list of people who contributed to this > @@ -21,8 +21,8 @@ > * MA 02111-1307 USA > */ > > -#include <common.h> > -#include <asm/io.h> > +#include <bootcount.h> > +#include <linux/compiler.h> > > /* > * Only override CONFIG_SYS_BOOTCOUNT_ADDR if not already defined. This > @@ -65,33 +65,36 @@ > > #endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ > > -void bootcount_store(ulong a) > +/* Now implement the generic default functions */ > +#if defined(CONFIG_SYS_BOOTCOUNT_ADDR) > +__weak void bootcount_store(ulong a) > { > void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; > > #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) > - out_be32(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); > + bc_out32(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); > #else > - out_be32(reg, a); > - out_be32(reg + 4, BOOTCOUNT_MAGIC); > + bc_out32(reg, a); > + bc_out32(reg + 4, BOOTCOUNT_MAGIC); > #endif > } > > -ulong bootcount_load(void) > +__weak ulong bootcount_load(void) > { > void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; > > #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) > - u32 tmp = in_be32(reg); > + u32 tmp = bc_in32(reg); > > if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) > return 0; > else > return (tmp & 0x0000ffff); > #else > - if (in_be32(reg + 4) != BOOTCOUNT_MAGIC) > + if (bc_in32(reg + 4) != BOOTCOUNT_MAGIC) > return 0; > else > - return in_be32(reg); > + return bc_in32(reg); > #endif > } > +#endif > diff --git a/drivers/bootcount/bootcount_at91.c > b/drivers/bootcount/bootcount_at91.c > new file mode 100644 > index 0000000..7cfe14d > --- /dev/null > +++ b/drivers/bootcount/bootcount_at91.c > @@ -0,0 +1,43 @@ > +/* > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > + > +#include <common.h> > +#include <asm/io.h> > +#include <asm/arch/hardware.h> > +#include <asm/arch/at91_gpbr.h> > + > +/* > + * We combine the BOOTCOUNT_MAGIC and bootcount in one 32-bit register. > + * This is done so we need to use only one of the four GPBR registers. > + */ > +void bootcount_store(ulong a) > +{ > + at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; > + > + writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), > + &gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); > +} > + > +ulong bootcount_load(void) > +{ > + at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; > + > + ulong val = readl(&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); > + if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) > + return 0; > + else > + return val & 0x0000ffff; > +} > diff --git a/arch/blackfin/cpu/bootcount.c > b/drivers/bootcount/bootcount_blackfin.c > similarity index 100% > rename from arch/blackfin/cpu/bootcount.c > rename to drivers/bootcount/bootcount_blackfin.c > diff --git a/drivers/bootcount/bootcount_davinci.c > b/drivers/bootcount/bootcount_davinci.c > new file mode 100644 > index 0000000..f560d72 > --- /dev/null > +++ b/drivers/bootcount/bootcount_davinci.c > @@ -0,0 +1,49 @@ > +/* > + * (C) Copyright 2011 > + * Heiko Schocher, DENX Software Engineering, h...@denx.de. > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > + > +#include <bootcount.h> > +#include <asm/arch/da850_lowlevel.h> > +#include <asm/arch/davinci_misc.h> > + > +void bootcount_store(ulong a) > +{ > + struct davinci_rtc *reg = > + (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > + > + /* > + * write RTC kick register to enable write > + * for RTC Scratch registers. Scratch0 and 1 are > + * used for bootcount values. > + */ > + writel(RTC_KICK0R_WE, ®->kick0r); > + writel(RTC_KICK1R_WE, ®->kick1r); > + bc_out32(®->scratch0, a); > + bc_out32(®->scratch1, BOOTCOUNT_MAGIC); > +} > + > +ulong bootcount_load(void) > +{ > + struct davinci_rtc *reg = > + (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; > + > + if (bc_in32(®->scratch1) != BOOTCOUNT_MAGIC) > + return 0; > + else > + return bc_in32(®->scratch0); > +} > diff --git a/drivers/bootcount/bootcount_ram.c > b/drivers/bootcount/bootcount_ram.c > new file mode 100644 > index 0000000..8655af7 > --- /dev/null > +++ b/drivers/bootcount/bootcount_ram.c > @@ -0,0 +1,72 @@ > +/* > + * (C) Copyright 2010 > + * Heiko Schocher, DENX Software Engineering, h...@denx.de. > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > + > +#include <common.h> > +#include <asm/io.h> > + > +DECLARE_GLOBAL_DATA_PTR; > + > +const ulong patterns[] = { 0x00000000, > + 0xFFFFFFFF, > + 0xFF00FF00, > + 0x0F0F0F0F, > + 0xF0F0F0F0}; > +const ulong NBR_OF_PATTERNS = sizeof(patterns) / sizeof(*patterns); > +const ulong OFFS_PATTERN = 3; > +const ulong REPEAT_PATTERN = 1000; > + > +void bootcount_store(ulong a) > +{ > + ulong *save_addr; > + ulong size = 0; > + int i; > + > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) > + size += gd->bd->bi_dram[i].size; > + save_addr = (ulong *)(size - BOOTCOUNT_ADDR); > + writel(a, save_addr); > + writel(BOOTCOUNT_MAGIC, &save_addr[1]); > + > + for (i = 0; i < REPEAT_PATTERN; i++) > + writel(patterns[i % NBR_OF_PATTERNS], > + &save_addr[i + OFFS_PATTERN]); > + > +} > + > +ulong bootcount_load(void) > +{ > + ulong *save_addr; > + ulong size = 0; > + ulong counter = 0; > + int i, tmp; > + > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) > + size += gd->bd->bi_dram[i].size; > + save_addr = (ulong *)(size - BOOTCOUNT_ADDR); > + > + counter = readl(&save_addr[0]); > + > + /* Is the counter reliable, check in the big pattern for bit errors */ > + for (i = 0; (i < REPEAT_PATTERN) && (counter != 0); i++) { > + tmp = readl(&save_addr[i + OFFS_PATTERN]); > + if (tmp != patterns[i % NBR_OF_PATTERNS]) > + counter = 0; > + } > + return counter; > +} > diff --git a/include/bootcount.h b/include/bootcount.h > new file mode 100644 > index 0000000..1e60959 > --- /dev/null > +++ b/include/bootcount.h > @@ -0,0 +1,42 @@ > +/* > + * (C) Copyright 2012 > + * Stefan Roese, DENX Software Engineering, s...@denx.de. > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <common.h> > +#include <asm/io.h> > + > +#ifdef CONFIG_SYS_BOOTCOUNT_LE > +static inline void bc_out32(volatile u32 *addr, u32 data) > +{ > + out_le32(addr, data); > +} > + > +static inline u32 bc_in32(volatile u32 *addr) > +{ > + return in_le32(addr); > +} > +#else > +static inline void bc_out32(volatile u32 *addr, u32 data) > +{ > + out_be32(addr, data); > +} > + > +static inline u32 bc_in32(volatile u32 *addr) > +{ > + return in_be32(addr); > +} > +#endif > diff --git a/include/configs/calimain.h b/include/configs/calimain.h > index 6b68f10..c89f276 100644 > --- a/include/configs/calimain.h > +++ b/include/configs/calimain.h > @@ -354,6 +354,7 @@ > #define CONFIG_SYS_INIT_SP_ADDR (0x8001ff00) > > #define CONFIG_BOOTCOUNT_LIMIT > +#define CONFIG_SYS_BOOTCOUNT_LE /* Use little-endian accessors > */ > #define CONFIG_SYS_BOOTCOUNT_ADDR DAVINCI_RTC_BASE > > #ifndef __ASSEMBLY__ > diff --git a/include/configs/highbank.h b/include/configs/highbank.h > index 520fa4c..a76cfc3 100644 > --- a/include/configs/highbank.h > +++ b/include/configs/highbank.h > @@ -42,6 +42,8 @@ > #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } > > #define CONFIG_BOOTCOUNT_LIMIT > +#define CONFIG_SYS_BOOTCOUNT_SINGLEWORD > +#define CONFIG_SYS_BOOTCOUNT_LE /* Use little-endian accessors > */ > #define CONFIG_SYS_BOOTCOUNT_ADDR 0xfff3cf0c > > #define CONFIG_MISC_INIT_R > diff --git a/include/configs/km/km_arm.h b/include/configs/km/km_arm.h > index c73a10c..229745a 100644 > --- a/include/configs/km/km_arm.h > +++ b/include/configs/km/km_arm.h > @@ -274,6 +274,8 @@ int get_scl(void); > #define CONFIG_KM_RESERVED_PRAM 0x801000 > /* address for the bootcount (taken from end of RAM) */ > #define BOOTCOUNT_ADDR (CONFIG_KM_RESERVED_PRAM) > +/* Use generic bootcount RAM driver */ > +#define CONFIG_BOOTCOUNT_RAM > > /* enable POST tests */ > #define CONFIG_POST (CONFIG_SYS_POST_MEM_REGIONS) _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot