1
2
3
4
5
6
7
8
9
10#include <common.h>
11#include <command.h>
12#include <cpu_func.h>
13#include <linux/compiler.h>
14
15static int parse_argv(const char *);
16
17void __weak invalidate_icache_all(void)
18{
19
20 puts("No arch specific invalidate_icache_all available!\n");
21}
22
23__weak void noncached_set_region(void)
24{
25}
26
27static int do_icache(struct cmd_tbl *cmdtp, int flag, int argc,
28 char *const argv[])
29{
30 switch (argc) {
31 case 2:
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:
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
56void __weak flush_dcache_all(void)
57{
58 puts("No arch specific flush_dcache_all available!\n");
59
60}
61
62static int do_dcache(struct cmd_tbl *cmdtp, int flag, int argc,
63 char *const argv[])
64{
65 switch (argc) {
66 case 2:
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:
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
92static 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
105U_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
112U_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