Merge tag 'u-boot-stm32-20200813' of https://gitlab.denx.de/u-boot/custodians/u-boot-stm
[platform/kernel/u-boot.git] / cmd / cache.c
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
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
23 __weak void noncached_set_region(void)
24 {
25 }
26
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
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
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
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 );