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