* [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
@ 2012-06-01 9:52 Stefan Roese
2012-06-01 12:51 ` Christian Riesch
0 siblings, 1 reply; 3+ messages in thread
From: Stefan Roese @ 2012-06-01 9:52 UTC (permalink / raw)
To: u-boot
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 <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>
---
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 & 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 at 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..8674eb7
--- /dev/null
+++ b/drivers/bootcount/bootcount_davinci.c
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2011
+ * Heiko Schocher, DENX Software Engineering, hs at 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, ®->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);
+}
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 at 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/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)
--
1.7.10.3
^ permalink raw reply related [flat|nested] 3+ messages in thread* [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
2012-06-01 9:52 [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount Stefan Roese
@ 2012-06-01 12:51 ` Christian Riesch
2012-06-01 13:05 ` Stefan Roese
0 siblings, 1 reply; 3+ messages in thread
From: Christian Riesch @ 2012-06-01 12:51 UTC (permalink / raw)
To: u-boot
Hi Stefan,
On Fri, Jun 1, 2012 at 11:52 AM, Stefan Roese <sr@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 0000000..8674eb7
> --- /dev/null
> +++ b/drivers/bootcount/bootcount_davinci.c
> @@ -0,0 +1,50 @@
> +/*
> + * (C) Copyright 2011
> + * Heiko Schocher, DENX Software Engineering, hs at 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, ®->kick0r);
> + ? ? ? writel(RTC_KICK1R_WE, ®->kick1r);
> + ? ? ? out_be32(®->scratch0, a);
> + ? ? ? out_be32(®->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(®->scratch1) != BOOTCOUNT_MAGIC)
> + ? ? ? ? ? ? ? return 0;
> + ? ? ? else
> + ? ? ? ? ? ? ? return in_be32(®->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
^ permalink raw reply [flat|nested] 3+ messages in thread* [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount
2012-06-01 12:51 ` Christian Riesch
@ 2012-06-01 13:05 ` Stefan Roese
0 siblings, 0 replies; 3+ messages in thread
From: Stefan Roese @ 2012-06-01 13:05 UTC (permalink / raw)
To: u-boot
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, ®->kick0r);
> > + writel(RTC_KICK1R_WE, ®->kick1r);
> > + out_be32(®->scratch0, a);
> > + out_be32(®->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(®->scratch1) != BOOTCOUNT_MAGIC)
> > + return 0;
> > + else
> > + return in_be32(®->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: office at denx.de
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-06-01 13:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-01 9:52 [U-Boot] [PATCH] Consolidate bootcount code into drivers/bootcount Stefan Roese
2012-06-01 12:51 ` Christian Riesch
2012-06-01 13:05 ` Stefan Roese
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox