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 15static int parse_argv(const char *); 16 17void __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 27static 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 56void __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 62static 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 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