1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) Nelson Integration, LLC 2016
4  * Author: Eric Nelson<eric@nelint.com>
5  *
6  */
7 #include <command.h>
8 #include <config.h>
9 #include <common.h>
10 #include <malloc.h>
11 #include <part.h>
12 
blkc_show(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])13 static int blkc_show(struct cmd_tbl *cmdtp, int flag,
14 		     int argc, char *const argv[])
15 {
16 	struct block_cache_stats stats;
17 	blkcache_stats(&stats);
18 
19 	printf("hits: %u\n"
20 	       "misses: %u\n"
21 	       "entries: %u\n"
22 	       "max blocks/entry: %u\n"
23 	       "max cache entries: %u\n",
24 	       stats.hits, stats.misses, stats.entries,
25 	       stats.max_blocks_per_entry, stats.max_entries);
26 	return 0;
27 }
28 
blkc_configure(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])29 static int blkc_configure(struct cmd_tbl *cmdtp, int flag,
30 			  int argc, char *const argv[])
31 {
32 	unsigned blocks_per_entry, max_entries;
33 	if (argc != 3)
34 		return CMD_RET_USAGE;
35 
36 	blocks_per_entry = simple_strtoul(argv[1], 0, 0);
37 	max_entries = simple_strtoul(argv[2], 0, 0);
38 	blkcache_configure(blocks_per_entry, max_entries);
39 	printf("changed to max of %u entries of %u blocks each\n",
40 	       max_entries, blocks_per_entry);
41 	return 0;
42 }
43 
44 static struct cmd_tbl cmd_blkc_sub[] = {
45 	U_BOOT_CMD_MKENT(show, 0, 0, blkc_show, "", ""),
46 	U_BOOT_CMD_MKENT(configure, 3, 0, blkc_configure, "", ""),
47 };
48 
blkc_reloc(void)49 static __maybe_unused void blkc_reloc(void)
50 {
51 	static int relocated;
52 
53 	if (!relocated) {
54 		fixup_cmdtable(cmd_blkc_sub, ARRAY_SIZE(cmd_blkc_sub));
55 		relocated = 1;
56 	};
57 }
58 
do_blkcache(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])59 static int do_blkcache(struct cmd_tbl *cmdtp, int flag,
60 		       int argc, char *const argv[])
61 {
62 	struct cmd_tbl *c;
63 
64 #ifdef CONFIG_NEEDS_MANUAL_RELOC
65 	blkc_reloc();
66 #endif
67 	if (argc < 2)
68 		return CMD_RET_USAGE;
69 
70 	/* Strip off leading argument */
71 	argc--;
72 	argv++;
73 
74 	c = find_cmd_tbl(argv[0], &cmd_blkc_sub[0], ARRAY_SIZE(cmd_blkc_sub));
75 
76 	if (!c)
77 		return CMD_RET_USAGE;
78 
79 	return c->cmd(cmdtp, flag, argc, argv);
80 }
81 
82 U_BOOT_CMD(
83 	blkcache, 4, 0, do_blkcache,
84 	"block cache diagnostics and control",
85 	"show - show and reset statistics\n"
86 	"blkcache configure blocks entries\n"
87 );
88