1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2000
4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 */
6
7 /*
8 * Cache support: switch on or off, get status
9 */
10 #include <common.h>
11 #include <command.h>
12 #include <cpu_func.h>
13 #include <linux/compiler.h>
14
15 static int parse_argv(const char *);
16
invalidate_icache_all(void)17 void __weak invalidate_icache_all(void)
18 {
19 /* please define arch specific invalidate_icache_all */
20 puts("No arch specific invalidate_icache_all available!\n");
21 }
22
noncached_set_region(void)23 __weak void noncached_set_region(void)
24 {
25 }
26
do_icache(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])27 static int do_icache(struct cmd_tbl *cmdtp, int flag, int argc,
28 char *const argv[])
29 {
30 switch (argc) {
31 case 2: /* on / off / flush */
32 switch (parse_argv(argv[1])) {
33 case 0:
34 icache_disable();
35 break;
36 case 1:
37 icache_enable();
38 break;
39 case 2:
40 invalidate_icache_all();
41 break;
42 default:
43 return CMD_RET_USAGE;
44 }
45 break;
46 case 1: /* get status */
47 printf("Instruction Cache is %s\n",
48 icache_status() ? "ON" : "OFF");
49 return 0;
50 default:
51 return CMD_RET_USAGE;
52 }
53 return 0;
54 }
55
flush_dcache_all(void)56 void __weak flush_dcache_all(void)
57 {
58 puts("No arch specific flush_dcache_all available!\n");
59 /* please define arch specific flush_dcache_all */
60 }
61
do_dcache(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])62 static int do_dcache(struct cmd_tbl *cmdtp, int flag, int argc,
63 char *const argv[])
64 {
65 switch (argc) {
66 case 2: /* on / off / flush */
67 switch (parse_argv(argv[1])) {
68 case 0:
69 dcache_disable();
70 break;
71 case 1:
72 dcache_enable();
73 noncached_set_region();
74 break;
75 case 2:
76 flush_dcache_all();
77 break;
78 default:
79 return CMD_RET_USAGE;
80 }
81 break;
82 case 1: /* get status */
83 printf("Data (writethrough) Cache is %s\n",
84 dcache_status() ? "ON" : "OFF");
85 return 0;
86 default:
87 return CMD_RET_USAGE;
88 }
89 return 0;
90 }
91
parse_argv(const char * s)92 static int parse_argv(const char *s)
93 {
94 if (strcmp(s, "flush") == 0)
95 return 2;
96 else if (strcmp(s, "on") == 0)
97 return 1;
98 else if (strcmp(s, "off") == 0)
99 return 0;
100
101 return -1;
102 }
103
104
105 U_BOOT_CMD(
106 icache, 2, 1, do_icache,
107 "enable or disable instruction cache",
108 "[on, off, flush]\n"
109 " - enable, disable, or flush instruction cache"
110 );
111
112 U_BOOT_CMD(
113 dcache, 2, 1, do_dcache,
114 "enable or disable data cache",
115 "[on, off, flush]\n"
116 " - enable, disable, or flush data (writethrough) cache"
117 );
118