[v3,22/25] x86: mtrr: Restructure so command execution is in one place

Message ID 20200706033741.2169374-19-sjg@chromium.org
State Superseded
Headers show
Series
  • x86: Enhance MTRR functionality to support multiple CPUs
Related show

Commit Message

Simon Glass July 6, 2020, 3:37 a.m.
At present do_mtrr() does the 'list' subcommand at the top and the rest
below. Update it to do them all in the same place so we can (in a later
patch) add parsing of the CPU number for all subcommands.

Signed-off-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com>
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
---

(no changes since v1)

 cmd/x86/mtrr.c | 55 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 19 deletions(-)

Patch

diff --git a/cmd/x86/mtrr.c b/cmd/x86/mtrr.c
index b047a9897c..b51b1cd7e2 100644
--- a/cmd/x86/mtrr.c
+++ b/cmd/x86/mtrr.c
@@ -98,31 +98,48 @@  static int do_mtrr_set(int cpu_select, uint reg, int argc, char *const argv[])
 static int do_mtrr(struct cmd_tbl *cmdtp, int flag, int argc,
 		   char *const argv[])
 {
-	const char *cmd;
+	int cmd;
 	int cpu_select;
 	uint reg;
+	int ret;
 
 	cpu_select = MP_SELECT_BSP;
-	cmd = argv[1];
-	if (argc < 2 || *cmd == 'l')
+	argc--;
+	argv++;
+	cmd = argv[0] ? *argv[0] : 0;
+	if (argc < 1 || !cmd) {
+		cmd = 'l';
+		reg = 0;
+	} else {
+		if (argc < 2)
+			return CMD_RET_USAGE;
+		reg = simple_strtoul(argv[1], NULL, 16);
+		if (reg >= MTRR_COUNT) {
+			printf("Invalid register number\n");
+			return CMD_RET_USAGE;
+		}
+	}
+	if (cmd == 'l') {
 		return do_mtrr_list(cpu_select);
-	argc -= 2;
-	argv += 2;
-	if (argc <= 0)
-		return CMD_RET_USAGE;
-	reg = simple_strtoul(argv[0], NULL, 16);
-	if (reg >= MTRR_COUNT) {
-		printf("Invalid register number\n");
-		return CMD_RET_USAGE;
+	} else {
+		switch (cmd) {
+		case 'e':
+			ret = mtrr_set_valid(cpu_select, reg, true);
+			break;
+		case 'd':
+			ret = mtrr_set_valid(cpu_select, reg, false);
+			break;
+		case 's':
+			ret = do_mtrr_set(cpu_select, reg, argc - 2, argv + 2);
+			break;
+		default:
+			return CMD_RET_USAGE;
+		}
+		if (ret) {
+			printf("Operation failed (err=%d)\n", ret);
+			return CMD_RET_FAILURE;
+		}
 	}
-	if (*cmd == 'e')
-		return mtrr_set_valid(cpu_select, reg, true);
-	else if (*cmd == 'd')
-		return mtrr_set_valid(cpu_select, reg, false);
-	else if (*cmd == 's')
-		return do_mtrr_set(cpu_select, reg, argc - 1, argv + 1);
-	else
-		return CMD_RET_USAGE;
 
 	return 0;
 }