Blame view

cmd/bootstage.c 2 KB
2eba38cf8   Simon Glass   bootstage: Add bo...
1
2
3
  /*
   * Copyright (c) 2012, Google Inc. All rights reserved.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
4
   * SPDX-License-Identifier:	GPL-2.0+
2eba38cf8   Simon Glass   bootstage: Add bo...
5
6
7
   */
  
  #include <common.h>
2eba38cf8   Simon Glass   bootstage: Add bo...
8
9
10
11
12
13
14
15
16
17
18
19
  static int do_bootstage_report(cmd_tbl_t *cmdtp, int flag, int argc,
  			       char * const argv[])
  {
  	bootstage_report();
  
  	return 0;
  }
  
  static int get_base_size(int argc, char * const argv[], ulong *basep,
  			 ulong *sizep)
  {
  	char *endp;
ee2b24340   Simon Glass   Kconfig: Move CON...
20
  	*basep = CONFIG_BOOTSTAGE_STASH_ADDR;
2eba38cf8   Simon Glass   bootstage: Add bo...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  	*sizep = CONFIG_BOOTSTAGE_STASH_SIZE;
  	if (argc < 2)
  		return 0;
  	*basep = simple_strtoul(argv[1], &endp, 16);
  	if (*argv[1] == 0 || *endp != 0)
  		return -1;
  	if (argc == 2)
  		return 0;
  	*sizep = simple_strtoul(argv[2], &endp, 16);
  	if (*argv[2] == 0 || *endp != 0)
  		return -1;
  
  	return 0;
  }
  
  static int do_bootstage_stash(cmd_tbl_t *cmdtp, int flag, int argc,
  			      char * const argv[])
  {
  	ulong base, size;
  	int ret;
  
  	if (get_base_size(argc, argv, &base, &size))
  		return CMD_RET_USAGE;
  	if (base == -1UL) {
  		printf("No bootstage stash area defined
  ");
  		return 1;
  	}
  
  	if (0 == strcmp(argv[0], "stash"))
  		ret = bootstage_stash((void *)base, size);
  	else
  		ret = bootstage_unstash((void *)base, size);
  	if (ret)
  		return 1;
  
  	return 0;
  }
  
  static cmd_tbl_t cmd_bootstage_sub[] = {
  	U_BOOT_CMD_MKENT(report, 2, 1, do_bootstage_report, "", ""),
  	U_BOOT_CMD_MKENT(stash, 4, 0, do_bootstage_stash, "", ""),
  	U_BOOT_CMD_MKENT(unstash, 4, 0, do_bootstage_stash, "", ""),
  };
  
  /*
   * Process a bootstage sub-command
   */
  static int do_boostage(cmd_tbl_t *cmdtp, int flag, int argc,
  		       char * const argv[])
  {
  	cmd_tbl_t *c;
  
  	/* Strip off leading 'bootstage' command argument */
  	argc--;
  	argv++;
  
  	c = find_cmd_tbl(argv[0], cmd_bootstage_sub,
  			 ARRAY_SIZE(cmd_bootstage_sub));
  
  	if (c)
  		return c->cmd(cmdtp, flag, argc, argv);
  	else
  		return CMD_RET_USAGE;
  }
  
  
  U_BOOT_CMD(bootstage, 4, 1, do_boostage,
  	"Boot stage command",
  	" - check boot progress and timing
  "
  	"report                      - Print a report
  "
  	"stash [<start> [<size>]]    - Stash data into memory
  "
  	"unstash [<start> [<size>]]  - Unstash data from memory"
  );