Message ID | 1338813539-28831-1-git-send-email-sr@denx.de |
---|---|
State | Superseded |
Headers | show |
Hi Stefan, On 06/04/2012 02:38 PM, 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. I have tested it on km_kirkwood (km_arm) with the bootcount_ram driver and it works as expected on this platform. Tested-by: Valentin Longchamp <valentin.longchamp@keymile.com> > > Signed-off-by: Stefan Roese <sr@denx.de> > Cc: Heiko Schocher <hs@denx.de> > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> > Cc: Christian Riesch <christian.riesch@omicron.at> > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> > Cc: Mike Frysinger <vapier@gentoo.org> > Cc: Rob Herring <rob.herring@calxeda.com> > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> > --- > 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 | 10 ++- > drivers/bootcount/bootcount_at91.c | 43 ++++++++++++ > .../bootcount/bootcount_blackfin.c | 0 > drivers/bootcount/bootcount_davinci.c | 72 ++++++++++++++++++++ > drivers/bootcount/bootcount_ram.c | 72 ++++++++++++++++++++ > include/configs/calimain.h | 1 + > include/configs/km/km_arm.h | 2 + > 17 files changed, 248 insertions(+), 198 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 (92%) > 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 >
On 06/04/2012 07:38 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 <sr@denx.de> > Cc: Heiko Schocher <hs@denx.de> > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> > Cc: Christian Riesch <christian.riesch@omicron.at> > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> > Cc: Mike Frysinger <vapier@gentoo.org> > Cc: Rob Herring <rob.herring@calxeda.com> > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> > --- > v2: > - Added CONFIG_BOOTCOUNT_LE to bootcount_davinci.c and enabled it > in calimain.h to select little-endian accessors. highbank is also LE. Why don't you use __BYTE_ORDER rather than a new define? Rob > > 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 | 10 ++- > drivers/bootcount/bootcount_at91.c | 43 ++++++++++++ > .../bootcount/bootcount_blackfin.c | 0 > drivers/bootcount/bootcount_davinci.c | 72 ++++++++++++++++++++ > drivers/bootcount/bootcount_ram.c | 72 ++++++++++++++++++++ > include/configs/calimain.h | 1 + > include/configs/km/km_arm.h | 2 + > 17 files changed, 248 insertions(+), 198 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 (92%) > 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 > > 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 92% > rename from arch/powerpc/lib/bootcount.c > rename to drivers/bootcount/bootcount.c > index f9ce539..5d22a28 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, sr@denx.de. > * > * See file CREDITS for list of people who contributed to this > @@ -22,6 +22,7 @@ > */ > > #include <common.h> > +#include <linux/compiler.h> > #include <asm/io.h> > > /* > @@ -65,7 +66,9 @@ > > #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; > > @@ -77,7 +80,7 @@ void bootcount_store(ulong a) > #endif > } > > -ulong bootcount_load(void) > +__weak ulong bootcount_load(void) > { > void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; > > @@ -95,3 +98,4 @@ ulong bootcount_load(void) > return in_be32(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..e0471f1 > --- /dev/null > +++ b/drivers/bootcount/bootcount_davinci.c > @@ -0,0 +1,72 @@ > +/* > + * (C) Copyright 2011 > + * Heiko Schocher, DENX Software Engineering, hs@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> > +#include <asm/arch/da850_lowlevel.h> > +#include <asm/arch/davinci_misc.h> > + > +#ifdef CONFIG_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 > + > +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, hs@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/configs/calimain.h b/include/configs/calimain.h > index 6b68f10..f2815f9 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_BOOTCOUNT_LE /* Use little-endian accessors */ > #define CONFIG_SYS_BOOTCOUNT_ADDR DAVINCI_RTC_BASE > > #ifndef __ASSEMBLY__ > 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)
On Monday 04 June 2012 15:03:27 Rob Herring wrote: > On 06/04/2012 07:38 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 <sr@denx.de> > > Cc: Heiko Schocher <hs@denx.de> > > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> > > Cc: Christian Riesch <christian.riesch@omicron.at> > > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> > > Cc: Mike Frysinger <vapier@gentoo.org> > > Cc: Rob Herring <rob.herring@calxeda.com> > > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> > > --- > > v2: > > - Added CONFIG_BOOTCOUNT_LE to bootcount_davinci.c and enabled it > > > > in calimain.h to select little-endian accessors. > > highbank is also LE. Yes, sure. I could move those inline functions to a header, so that they can be used by the other "drivers" as well. Okay? > Why don't you use __BYTE_ORDER rather than a new > define? Unfortunately not. There are LE platforms that use BE accessors for the bootcounter already (Davinci enbw_cmc). Mostly historical reasons I assume, since the original bootcount implementation was powerpc specific with those be32() functions. Thanks, Stefan
Hi, On Mon, Jun 4, 2012 at 3:14 PM, Stefan Roese <sr@denx.de> wrote: > On Monday 04 June 2012 15:03:27 Rob Herring wrote: >> On 06/04/2012 07:38 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 <sr@denx.de> >> > Cc: Heiko Schocher <hs@denx.de> >> > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> >> > Cc: Christian Riesch <christian.riesch@omicron.at> >> > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> >> > Cc: Mike Frysinger <vapier@gentoo.org> >> > Cc: Rob Herring <rob.herring@calxeda.com> >> > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> >> > --- >> > v2: >> > - Added CONFIG_BOOTCOUNT_LE to bootcount_davinci.c and enabled it Thanks a lot! I will test it on the calimain board. >> > >> > in calimain.h to select little-endian accessors. >> >> highbank is also LE. > > Yes, sure. I could move those inline functions to a header, so that they can > be used by the other "drivers" as well. Okay? > I don't think this is necessary. As long as a board uses its native endianess to store the boot counter, nothing special is needed. Regards, Christian >> Why don't you use __BYTE_ORDER rather than a new >> define? > > Unfortunately not. There are LE platforms that use BE accessors for the > bootcounter already (Davinci enbw_cmc). Mostly historical reasons I assume, > since the original bootcount implementation was powerpc specific with those > be32() functions. > > Thanks, > Stefan > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot
Hi Stefan, On Mon, Jun 4, 2012 at 2:38 PM, Stefan Roese <sr@denx.de> 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. For the calimain board Tested-by: Christian Riesch <christian.riesch@omicron.at> Thanks, Christian > > Signed-off-by: Stefan Roese <sr@denx.de> > Cc: Heiko Schocher <hs@denx.de> > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> > Cc: Christian Riesch <christian.riesch@omicron.at> > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> > Cc: Mike Frysinger <vapier@gentoo.org> > Cc: Rob Herring <rob.herring@calxeda.com> > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> > --- > 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 | 10 ++- > drivers/bootcount/bootcount_at91.c | 43 ++++++++++++ > .../bootcount/bootcount_blackfin.c | 0 > drivers/bootcount/bootcount_davinci.c | 72 ++++++++++++++++++++ > drivers/bootcount/bootcount_ram.c | 72 ++++++++++++++++++++ > include/configs/calimain.h | 1 + > include/configs/km/km_arm.h | 2 + > 17 files changed, 248 insertions(+), 198 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 (92%) > 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
Rob, On Monday 04 June 2012 15:03:27 Rob Herring wrote: > On 06/04/2012 07:38 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 <sr@denx.de> > > Cc: Heiko Schocher <hs@denx.de> > > Cc: Valentin Longchamp <valentin.longchamp@keymile.com> > > Cc: Christian Riesch <christian.riesch@omicron.at> > > Cc: Manfred Rudigier <manfred.rudigier@omicron.at> > > Cc: Mike Frysinger <vapier@gentoo.org> > > Cc: Rob Herring <rob.herring@calxeda.com> > > Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> > > --- > > v2: > > - Added CONFIG_BOOTCOUNT_LE to bootcount_davinci.c and enabled it > > > > in calimain.h to select little-endian accessors. > > highbank is also LE. Why don't you use __BYTE_ORDER rather than a new > define? I just noticed, that highbank only uses one lword as bootcounter storage. So CONFIG_SYS_BOOTCOUNT_SINGLEWORD needs to be set for the "generic" bootcount driver to work here. I'll fix this in v3 after a short delay for further review comments. Thanks, Stefan
Dear Stefan Roese, In message <201206041514.17201.sr@denx.de> you wrote: > > > Why don't you use __BYTE_ORDER rather than a new > > define? > > Unfortunately not. There are LE platforms that use BE accessors for the > bootcounter already (Davinci enbw_cmc). Mostly historical reasons I assume, > since the original bootcount implementation was powerpc specific with those > be32() functions. We should check this, and eventually fix enbw_cmc. Heiko, what do you think? Best regards, Wolfgang Denk
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 92% rename from arch/powerpc/lib/bootcount.c rename to drivers/bootcount/bootcount.c index f9ce539..5d22a28 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, sr@denx.de. * * See file CREDITS for list of people who contributed to this @@ -22,6 +22,7 @@ */ #include <common.h> +#include <linux/compiler.h> #include <asm/io.h> /* @@ -65,7 +66,9 @@ #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; @@ -77,7 +80,7 @@ void bootcount_store(ulong a) #endif } -ulong bootcount_load(void) +__weak ulong bootcount_load(void) { void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; @@ -95,3 +98,4 @@ ulong bootcount_load(void) return in_be32(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..e0471f1 --- /dev/null +++ b/drivers/bootcount/bootcount_davinci.c @@ -0,0 +1,72 @@ +/* + * (C) Copyright 2011 + * Heiko Schocher, DENX Software Engineering, hs@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> +#include <asm/arch/da850_lowlevel.h> +#include <asm/arch/davinci_misc.h> + +#ifdef CONFIG_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 + +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, hs@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/configs/calimain.h b/include/configs/calimain.h index 6b68f10..f2815f9 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_BOOTCOUNT_LE /* Use little-endian accessors */ #define CONFIG_SYS_BOOTCOUNT_ADDR DAVINCI_RTC_BASE #ifndef __ASSEMBLY__ 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)
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 <sr@denx.de> Cc: Heiko Schocher <hs@denx.de> Cc: Valentin Longchamp <valentin.longchamp@keymile.com> Cc: Christian Riesch <christian.riesch@omicron.at> Cc: Manfred Rudigier <manfred.rudigier@omicron.at> Cc: Mike Frysinger <vapier@gentoo.org> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Reinhard Meyer <reinhard.meyer@emk-elektronik.de> --- 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 | 10 ++- drivers/bootcount/bootcount_at91.c | 43 ++++++++++++ .../bootcount/bootcount_blackfin.c | 0 drivers/bootcount/bootcount_davinci.c | 72 ++++++++++++++++++++ drivers/bootcount/bootcount_ram.c | 72 ++++++++++++++++++++ include/configs/calimain.h | 1 + include/configs/km/km_arm.h | 2 + 17 files changed, 248 insertions(+), 198 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 (92%) 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