[U-Boot] [PATCH 1/2] command/cmd_cache.c: Add optional flush arguments

It might be desirable to have the ability to flush icache/dcache within u-boot, this patch gives each arch the ability to provide a flush_dcache/flush_icache function to let u-boot flush caches from the prompt
Signed-off-by: Matthew McClintock msm@freescale.com --- There are some checkpatch.pl warnings for formatting issues. In this case I choose to keep the same formatting as was used in the file already:
#44: FILE: common/cmd_cache.c:48: + case 2: flush_icache();
ERROR: trailing statements should be on next line #70: FILE: common/cmd_cache.c:78: + case 2: flush_dcache();
ERROR: return is not a function, parentheses are not required #84: FILE: common/cmd_cache.c:96: + return (2);
total: 3 errors, 0 warnings, 83 lines checked
common/cmd_cache.c | 38 +++++++++++++++++++++++++++++--------- 1 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/common/cmd_cache.c b/common/cmd_cache.c index 5cdd834..78d53df 100644 --- a/common/cmd_cache.c +++ b/common/cmd_cache.c @@ -27,17 +27,26 @@ #include <common.h> #include <command.h>
-static int on_off (const char *); +static int parse_argv(const char *); + +void __flush_icache(void) +{ + /* please define arch specific flush_icache */ + printf("No arch specific flush_icache available!\n"); +} +void flush_icache(void) __attribute__((weak, alias("__flush_icache")));
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { switch (argc) { case 2: /* on / off */ - switch (on_off(argv[1])) { + switch (parse_argv(argv[1])) { case 0: icache_disable(); break; case 1: icache_enable (); break; + case 2: flush_icache(); + break; } /* FALL TROUGH */ case 1: /* get status */ @@ -50,15 +59,24 @@ int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 0; }
+void __flush_dcache(void) +{ + printf("No arch specific flush_dcache available!\n"); + /* please define arch specific flush_dcache */ +} +void flush_dcache(void) __attribute__((weak, alias("__flush_dcache"))); + int do_dcache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { switch (argc) { case 2: /* on / off */ - switch (on_off(argv[1])) { + switch (parse_argv(argv[1])) { case 0: dcache_disable(); break; case 1: dcache_enable (); break; + case 2: flush_dcache(); + break; } /* FALL TROUGH */ case 1: /* get status */ @@ -72,9 +90,11 @@ int do_dcache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}
-static int on_off (const char *s) +static int parse_argv(const char *s) { - if (strcmp(s, "on") == 0) { + if (strcmp(s, "flush") == 0) { + return (2); + } else if (strcmp(s, "on") == 0) { return (1); } else if (strcmp(s, "off") == 0) { return (0); @@ -86,13 +106,13 @@ static int on_off (const char *s) U_BOOT_CMD( icache, 2, 1, do_icache, "enable or disable instruction cache", - "[on, off]\n" - " - enable or disable instruction cache" + "[on, off, flush]\n" + " - enable, disable, or flush instruction cache" );
U_BOOT_CMD( dcache, 2, 1, do_dcache, "enable or disable data cache", - "[on, off]\n" - " - enable or disable data (writethrough) cache" + "[on, off, flush]\n" + " - enable, disable, or flush data (writethrough) cache" );

This provides a function that will override the weak function flush_icache to let 85xx boards to flush the icache
cc: Kumar Gala kumar.gala@freescale.com Signed-off-by: Matthew McClintock msm@freescale.com --- arch/powerpc/cpu/mpc85xx/start.S | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index 05db90a..f717309 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -745,6 +745,8 @@ mck_return:
/* Cache functions. */ +.globl flush_icache +flush_icache: .globl invalidate_icache invalidate_icache: mfspr r0,L1CSR1

On May 23, 2011, at 1:38 PM, Matthew McClintock wrote:
This provides a function that will override the weak function flush_icache to let 85xx boards to flush the icache
cc: Kumar Gala kumar.gala@freescale.com Signed-off-by: Matthew McClintock msm@freescale.com
arch/powerpc/cpu/mpc85xx/start.S | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
applied to 85xx
- k

On Monday, May 23, 2011 14:38:52 Matthew McClintock wrote:
There are some checkpatch.pl warnings for formatting issues. In this case I choose to keep the same formatting as was used in the file already:
this is fine i think. otherwise, you'd send another patch to first fix the formatting and then base this on top of that.
+void __flush_icache(void) +{
- /* please define arch specific flush_icache */
- printf("No arch specific flush_icache available!\n");
+} +void flush_icache(void) __attribute__((weak, alias("__flush_icache")));
i dont see much point in having the indirection. just do:
void __weak flush_icache(void) { /* please define arch specific flush_icache */ puts("No arch specific flush_icache available!\n"); } -mike

On Mon, May 23, 2011 at 7:25 PM, Mike Frysinger vapier@gentoo.org wrote:
void __weak flush_icache(void) { /* please define arch specific flush_icache */ puts("No arch specific flush_icache available!\n"); }
This syntax does not quite work for me... how about something like:
void flush_icache(void) __attribute__((weak)); void flush_icache(void) { /* please define arch specific flush_icache */ puts("No arch specific flush_icache available!\n"); }
I seem to require separate declaration and definition for this to work.... however the alias is not required.
-M

On Tuesday, May 24, 2011 11:06:03 McClintock Matthew-B29882 wrote:
On Mon, May 23, 2011 at 7:25 PM, Mike Frysinger vapier@gentoo.org wrote:
void __weak flush_icache(void) { /* please define arch specific flush_icache */ puts("No arch specific flush_icache available!\n"); }
This syntax does not quite work for me... how about something like:
void flush_icache(void) __attribute__((weak)); void flush_icache(void)
now, that's exactly what i do not want. i'm guessing you simply did not include linux/compiler.h and so was missing the __weak define. -mike

It might be desirable to have the ability to flush icache/dcache within u-boot, this patch gives each arch the ability to provide a flush_dcache/flush_icache function to let u-boot flush caches from the prompt
Signed-off-by: Matthew McClintock msm@freescale.com --- v2: Use __weak instead of __attribute__((weak,alias))
common/cmd_cache.c | 37 ++++++++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/common/cmd_cache.c b/common/cmd_cache.c index 5cdd834..9778d3b 100644 --- a/common/cmd_cache.c +++ b/common/cmd_cache.c @@ -26,18 +26,27 @@ */ #include <common.h> #include <command.h> +#include <linux/compiler.h>
-static int on_off (const char *); +static int parse_argv(const char *); + +void __weak flush_icache(void) +{ + /* please define arch specific flush_icache */ + puts("No arch specific flush_icache available!\n"); +}
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { switch (argc) { case 2: /* on / off */ - switch (on_off(argv[1])) { + switch (parse_argv(argv[1])) { case 0: icache_disable(); break; case 1: icache_enable (); break; + case 2: flush_icache(); + break; } /* FALL TROUGH */ case 1: /* get status */ @@ -50,15 +59,23 @@ int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 0; }
+void __weak flush_dcache(void) +{ + puts("No arch specific flush_dcache available!\n"); + /* please define arch specific flush_dcache */ +} + int do_dcache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { switch (argc) { case 2: /* on / off */ - switch (on_off(argv[1])) { + switch (parse_argv(argv[1])) { case 0: dcache_disable(); break; case 1: dcache_enable (); break; + case 2: flush_dcache(); + break; } /* FALL TROUGH */ case 1: /* get status */ @@ -72,9 +89,11 @@ int do_dcache ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}
-static int on_off (const char *s) +static int parse_argv(const char *s) { - if (strcmp(s, "on") == 0) { + if (strcmp(s, "flush") == 0) { + return (2); + } else if (strcmp(s, "on") == 0) { return (1); } else if (strcmp(s, "off") == 0) { return (0); @@ -86,13 +105,13 @@ static int on_off (const char *s) U_BOOT_CMD( icache, 2, 1, do_icache, "enable or disable instruction cache", - "[on, off]\n" - " - enable or disable instruction cache" + "[on, off, flush]\n" + " - enable, disable, or flush instruction cache" );
U_BOOT_CMD( dcache, 2, 1, do_dcache, "enable or disable data cache", - "[on, off]\n" - " - enable or disable data (writethrough) cache" + "[on, off, flush]\n" + " - enable, disable, or flush data (writethrough) cache" );

Dear Matthew McClintock,
In message 1306267745-14531-1-git-send-email-msm@freescale.com you wrote:
It might be desirable to have the ability to flush icache/dcache within u-boot, this patch gives each arch the ability to provide a flush_dcache/flush_icache function to let u-boot flush caches from the prompt
Signed-off-by: Matthew McClintock msm@freescale.com
v2: Use __weak instead of __attribute__((weak,alias))
common/cmd_cache.c | 37 ++++++++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 9 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
participants (5)
-
Kumar Gala
-
Matthew McClintock
-
McClintock Matthew-B29882
-
Mike Frysinger
-
Wolfgang Denk