[U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
This patch moves all bootcount implementations into a common directory: drivers/bootcount. The generic bootcount driver (bootcount.c) is now usable not only by powerpc platforms, but others as well. Highbank is already moved to this generic code. For all other non-generic implementations, SoC specific drivers have been created (e.g. bootcount_at91.c). 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 --- Mike, the blackfin implementation is not compile-tested yet. Could you please give it a try? Thanks, Stefan 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 | 50 ++ drivers/bootcount/bootcount_ram.c | 72 include/configs/km/km_arm.h|2 + 16 files changed, 225 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 0x) | (a 0x), - 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 0x) != (BOOTCOUNT_MAGIC 0x)) - return 0; - else - return val 0x; -} - -#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..000 --- 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
Re: [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
Hi Stefan, On Fri, Jun 1, 2012 at 11:52 AM, Stefan Roese s...@denx.de wrote: This patch moves all bootcount implementations into a common directory: drivers/bootcount. The generic bootcount driver (bootcount.c) is now usable not only by powerpc platforms, but others as well. Highbank is already moved to this generic code. For all other non-generic implementations, SoC specific drivers have been created (e.g. bootcount_at91.c). Thank you for this patch! I have reviewed and tested the davinci/calimain parts of it, please see below. [...] diff --git a/drivers/bootcount/bootcount_davinci.c b/drivers/bootcount/bootcount_davinci.c new file mode 100644 index 000..8674eb7 --- /dev/null +++ b/drivers/bootcount/bootcount_davinci.c @@ -0,0 +1,50 @@ +/* + * (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 common.h +#include asm/io.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, reg-kick0r); + writel(RTC_KICK1R_WE, reg-kick1r); + out_be32(reg-scratch0, a); + out_be32(reg-scratch1, BOOTCOUNT_MAGIC); This code here seems to be copied from the enbw_cmc board. The calimain board uses writel instead of out_be32 for the scratch registers (because I didn't understand why we should use big endian on a little endian machine). So your patch changes the byte order here for the calimain board and thus breaks our boot counter support. What's the reason for using out_be32 here? +} + +ulong bootcount_load(void) +{ + struct davinci_rtc *reg = + (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; + + if (in_be32(reg-scratch1) != BOOTCOUNT_MAGIC) + return 0; + else + return in_be32(reg-scratch0); Same as above, the calimain board uses readl instead of in_be32. I replaced out_be32 by writel and in_be32 by readl and tested it on the calimain board, it works fine :-) Regards, Christian ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
Hi Christian, On Friday 01 June 2012 14:51:32 Christian Riesch wrote: +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, reg-kick0r); + writel(RTC_KICK1R_WE, reg-kick1r); + out_be32(reg-scratch0, a); + out_be32(reg-scratch1, BOOTCOUNT_MAGIC); This code here seems to be copied from the enbw_cmc board. The calimain board uses writel instead of out_be32 for the scratch registers (because I didn't understand why we should use big endian on a little endian machine). So your patch changes the byte order here for the calimain board and thus breaks our boot counter support. I missed this difference. Thanks for spotting. What's the reason for using out_be32 here? I assume historical reasons, as all this bootcounter code is originated from powerpc specific code. Heiko, is this correct? +} + +ulong bootcount_load(void) +{ + struct davinci_rtc *reg = + (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; + + if (in_be32(reg-scratch1) != BOOTCOUNT_MAGIC) + return 0; + else + return in_be32(reg-scratch0); Same as above, the calimain board uses readl instead of in_be32. I replaced out_be32 by writel and in_be32 by readl and tested it on the calimain board, it works fine :-) I see. Too bad, now we have two Davince boards using nearly the same driver, one little endian and one big endian. If none of both boards can be changed, then we need to add an configuration switch to select the endianess. Heiko? Any comments? Thanks, Stefan -- DENX Software Engineering GmbH, MD: Wolfgang Denk Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: off...@denx.de ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot