[U-Boot] [PATCH] Add bootcount to AT91

From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Signed-off-by: Anders Darander ad@datarespons.se --- cpu/arm926ejs/at91/cpu.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/cpu/arm926ejs/at91/cpu.c b/cpu/arm926ejs/at91/cpu.c index f2f7b62..09c1376 100644 --- a/cpu/arm926ejs/at91/cpu.c +++ b/cpu/arm926ejs/at91/cpu.c @@ -31,6 +31,11 @@ #define AT91_MAIN_CLOCK 0 #endif
+/* The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3, + * to keep track of the bootcount. */ +#define AT91_GPBR_BOOTCOUNT_REGISTER 3 +#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4*AT91_GPBR_BOOTCOUNT_REGISTER) + int arch_cpu_init(void) { return at91_clock_init(AT91_MAIN_CLOCK); @@ -52,3 +57,26 @@ int print_cpuinfo(void) return 0; } #endif + +#ifdef CONFIG_BOOTCOUNT_LIMIT + +void bootcount_store (ulong a) +{ + volatile ulong *save_addr = + (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS); + + *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | a; +} + +ulong bootcount_load (void) +{ + volatile ulong *save_addr = + (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS); + + if ((*save_addr & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) + return 0; + else + return (*save_addr & 0x0000ffff); +} + +#endif /* CONFIG_BOOTCOUNT_LIMIT */

Hi all,
As the merge window has closed, I'd just like to bump my old mail below and ask for comments. Currently the actual register to use is hard-coded. I'm unsure of what the current status is when it comes to include new architecture specific CONFIG_*-options.
The bootcount-feature is supported in u-boot for some PPC-boards. The patch below is basically a rip-off of one of these features, adapted for the AT91SAM9-architecture. It is tested on an olimex board with an at91sam9260.
I'd be very happy if we could get this feature mainlined. (I've also got some replies off-list, from people wanting to use this feature.)
Thanks in advance! Best regards, Anders
On Thu, Jan 14, 2010 at 15:00, Anders Darander anders.darander@gmail.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Signed-off-by: Anders Darander ad@datarespons.se
cpu/arm926ejs/at91/cpu.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/cpu/arm926ejs/at91/cpu.c b/cpu/arm926ejs/at91/cpu.c index f2f7b62..09c1376 100644 --- a/cpu/arm926ejs/at91/cpu.c +++ b/cpu/arm926ejs/at91/cpu.c @@ -31,6 +31,11 @@ #define AT91_MAIN_CLOCK 0 #endif
+/* The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3,
- to keep track of the bootcount. */
+#define AT91_GPBR_BOOTCOUNT_REGISTER 3 +#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4*AT91_GPBR_BOOTCOUNT_REGISTER)
int arch_cpu_init(void) { return at91_clock_init(AT91_MAIN_CLOCK); @@ -52,3 +57,26 @@ int print_cpuinfo(void) return 0; } #endif
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+void bootcount_store (ulong a) +{
- volatile ulong *save_addr =
- (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS);
- *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | a;
+}
+ulong bootcount_load (void) +{
- volatile ulong *save_addr =
- (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS);
- if ((*save_addr & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000))
- return 0;
- else
- return (*save_addr & 0x0000ffff);
+}
+#endif /* CONFIG_BOOTCOUNT_LIMIT */
1.6.6

Hi,
On Thu, Jan 14, 2010 at 15:00, Anders Darander anders.darander@gmail.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
As a followup to Werners list of patches not incorporated (from some time ago), I'd just like to get a comment on the status of this patch.
Should it get reworked somehow, or could it be integrated?
Regards, Anders Darander

Anders Darander wrote:
Hi,
On Thu, Jan 14, 2010 at 15:00, Anders Darander anders.darander@gmail.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
As a followup to Werners list of patches not incorporated (from some time ago), I'd just like to get a comment on the status of this patch.
Should it get reworked somehow, or could it be integrated?
Regards, Anders Darander
Please send me a link to the original patch. I will take a look Tom

Hi Tom,
On Sun, Feb 7, 2010 at 15:35, Tom Tom.Rix@windriver.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Please send me a link to the original patch. I will take a look Tom
Here is the link from Werners patch-status mail: http://article.gmane.org/gmane.comp.boot-loaders.u-boot/73640
(Sorry for bumping this thread that many times... I'm pretty sure that you're quite busy...)
Best regards, Anders Darander

Anders Darander wrote:
Hi Tom,
On Sun, Feb 7, 2010 at 15:35, Tom Tom.Rix@windriver.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Please send me a link to the original patch. I will take a look Tom
Here is the link from Werners patch-status mail: http://article.gmane.org/gmane.comp.boot-loaders.u-boot/73640
(Sorry for bumping this thread that many times... I'm pretty sure that you're quite busy...)
No problem. Its quite all right to ping me. I have added your patch to what will be reviewed this week. Tom
Best regards, Anders Darander

Hi Tom,
Any news on this?
Best regards, Anders
On Mon, Feb 8, 2010 at 14:32, Tom Tom.Rix@windriver.com wrote:
Anders Darander wrote:
Hi Tom,
On Sun, Feb 7, 2010 at 15:35, Tom Tom.Rix@windriver.com wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Please send me a link to the original patch. I will take a look Tom
Here is the link from Werners patch-status mail: http://article.gmane.org/gmane.comp.boot-loaders.u-boot/73640
(Sorry for bumping this thread that many times... I'm pretty sure that you're quite busy...)
No problem. Its quite all right to ping me. I have added your patch to what will be reviewed this week. Tom
Best regards, Anders Darander

Anders Darander wrote:
From: Anders Darander ad@datarespons.se
Use AT91_GPBR 3 as a bootcount register.
Signed-off-by: Anders Darander ad@datarespons.se
cpu/arm926ejs/at91/cpu.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/cpu/arm926ejs/at91/cpu.c b/cpu/arm926ejs/at91/cpu.c index f2f7b62..09c1376 100644 --- a/cpu/arm926ejs/at91/cpu.c +++ b/cpu/arm926ejs/at91/cpu.c @@ -31,6 +31,11 @@ #define AT91_MAIN_CLOCK 0 #endif
+/* The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3,
- to keep track of the bootcount. */
multi-line comments are /* *Comment lines */
+#define AT91_GPBR_BOOTCOUNT_REGISTER 3 +#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4*AT91_GPBR_BOOTCOUNT_REGISTER)
int arch_cpu_init(void) { return at91_clock_init(AT91_MAIN_CLOCK); @@ -52,3 +57,26 @@ int print_cpuinfo(void) return 0; } #endif
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+void bootcount_store (ulong a) +{
- volatile ulong *save_addr =
(volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS);
- *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | a;
implied length of a is 16 bits. the parameter type passed in should be explicitly cast/masked to u16.
I see sharing the 32 bits this way is how mpc5xxx does it..
But
mpc8260, mpc83xx, mpc8xx, ppc4xx, ipx store the bootcount_magic and the parameter as 2 32bit values.
Is there a memory limitation on why you can not follow what most of the others are doing ? If there is, please add the explanation as a comment.
Thank you for pinging me, Tom

Hi Tom,
Thanks for your comments.
On Thu, Feb 25, 2010 at 15:24, Tom Tom.Rix@windriver.com wrote:
Anders Darander wrote:
From: Anders Darander ad@datarespons.se --- a/cpu/arm926ejs/at91/cpu.c +++ b/cpu/arm926ejs/at91/cpu.c @@ -31,6 +31,11 @@ #define AT91_MAIN_CLOCK 0 #endif +/* The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3,
- to keep track of the bootcount. */
multi-line comments are /* *Comment lines */
Correct, I'll fix this.
+#define AT91_GPBR_BOOTCOUNT_REGISTER 3 +#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4*AT91_GPBR_BOOTCOUNT_REGISTER)
int arch_cpu_init(void) { return at91_clock_init(AT91_MAIN_CLOCK); @@ -52,3 +57,26 @@ int print_cpuinfo(void) return 0; } #endif
+#ifdef CONFIG_BOOTCOUNT_LIMIT
+void bootcount_store (ulong a) +{
- volatile ulong *save_addr =
- (volatile ulong *)(AT91_BASE_SYS +
AT91_BOOTCOUNT_ADDRESS);
- *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | a;
implied length of a is 16 bits. the parameter type passed in should be explicitly cast/masked to u16.
Correct, I'll fix this.
I see sharing the 32 bits this way is how mpc5xxx does it..
But
mpc8260, mpc83xx, mpc8xx, ppc4xx, ipx store the bootcount_magic and the parameter as 2 32bit values.
Is there a memory limitation on why you can not follow what most of the others are doing ? If there is, please add the explanation as a comment.
Well, I think I'd prefer to keep the boocount and the magic to share a 32-bit register; the main reason being that the AT91SAM9260 only has 4 GPBR, i.e. only four registers that keep it's data between resets. I'll add a comment about this.
Best regards, Anders
participants (2)
-
Anders Darander
-
Tom