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