Blame view

common/cmd_disk.c 3.04 KB
7405a1331   Rob Herring   combine block dev...
1
2
3
4
  /*
   * (C) Copyright 2000-2011
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
7405a1331   Rob Herring   combine block dev...
6
7
8
   */
  #include <common.h>
  #include <command.h>
475c7970c   Rob Herring   cmd_disk: use com...
9
  #include <part.h>
7405a1331   Rob Herring   combine block dev...
10

475c7970c   Rob Herring   cmd_disk: use com...
11
12
  #if defined(CONFIG_CMD_IDE) || defined(CONFIG_CMD_SCSI) || \
  	defined(CONFIG_USB_STORAGE)
7405a1331   Rob Herring   combine block dev...
13
14
15
  int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
  		    char *const argv[])
  {
475c7970c   Rob Herring   cmd_disk: use com...
16
17
18
  	int dev, part;
  	ulong addr = CONFIG_SYS_LOAD_ADDR;
  	ulong cnt;
7405a1331   Rob Herring   combine block dev...
19
20
21
22
23
24
25
26
27
  	disk_partition_t info;
  	image_header_t *hdr;
  	block_dev_desc_t *dev_desc;
  
  #if defined(CONFIG_FIT)
  	const void *fit_hdr = NULL;
  #endif
  
  	bootstage_mark(BOOTSTAGE_ID_IDE_START);
475c7970c   Rob Herring   cmd_disk: use com...
28
  	if (argc > 3) {
7405a1331   Rob Herring   combine block dev...
29
30
31
32
  		bootstage_error(BOOTSTAGE_ID_IDE_ADDR);
  		return CMD_RET_USAGE;
  	}
  	bootstage_mark(BOOTSTAGE_ID_IDE_ADDR);
475c7970c   Rob Herring   cmd_disk: use com...
33
34
  	if (argc > 1)
  		addr = simple_strtoul(argv[1], NULL, 16);
7405a1331   Rob Herring   combine block dev...
35

475c7970c   Rob Herring   cmd_disk: use com...
36
  	bootstage_mark(BOOTSTAGE_ID_IDE_BOOT_DEVICE);
7405a1331   Rob Herring   combine block dev...
37

475c7970c   Rob Herring   cmd_disk: use com...
38
  	part = get_device_and_partition(intf, (argc == 3) ? argv[2] : NULL,
10a37fd7a   Stephen Warren   disk: get_device_...
39
  					&dev_desc, &info, 1);
475c7970c   Rob Herring   cmd_disk: use com...
40
  	if (part < 0) {
7405a1331   Rob Herring   combine block dev...
41
42
43
  		bootstage_error(BOOTSTAGE_ID_IDE_TYPE);
  		return 1;
  	}
7405a1331   Rob Herring   combine block dev...
44

475c7970c   Rob Herring   cmd_disk: use com...
45
46
  	dev = dev_desc->dev;
  	bootstage_mark(BOOTSTAGE_ID_IDE_TYPE);
7405a1331   Rob Herring   combine block dev...
47

475c7970c   Rob Herring   cmd_disk: use com...
48
49
50
51
52
  	printf("
  Loading from %s device %d, partition %d: "
  	       "Name: %.32s  Type: %.32s
  ", intf, dev, part, info.name,
  	       info.type);
7405a1331   Rob Herring   combine block dev...
53

04735e9c5   Frederic Leroy   Fix ext2/ext4 fil...
54
55
56
  	debug("First Block: " LBAFU ",  # of blocks: " LBAFU
  	      ", Block Size: %ld
  ",
7405a1331   Rob Herring   combine block dev...
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  	      info.start, info.size, info.blksz);
  
  	if (dev_desc->block_read(dev, info.start, 1, (ulong *) addr) != 1) {
  		printf("** Read error on %d:%d
  ", dev, part);
  		bootstage_error(BOOTSTAGE_ID_IDE_PART_READ);
  		return 1;
  	}
  	bootstage_mark(BOOTSTAGE_ID_IDE_PART_READ);
  
  	switch (genimg_get_format((void *) addr)) {
  	case IMAGE_FORMAT_LEGACY:
  		hdr = (image_header_t *) addr;
  
  		bootstage_mark(BOOTSTAGE_ID_IDE_FORMAT);
  
  		if (!image_check_hcrc(hdr)) {
  			puts("
  ** Bad Header Checksum **
  ");
  			bootstage_error(BOOTSTAGE_ID_IDE_CHECKSUM);
  			return 1;
  		}
  		bootstage_mark(BOOTSTAGE_ID_IDE_CHECKSUM);
  
  		image_print_contents(hdr);
  
  		cnt = image_get_image_size(hdr);
  		break;
  #if defined(CONFIG_FIT)
  	case IMAGE_FORMAT_FIT:
  		fit_hdr = (const void *) addr;
  		puts("Fit image detected...
  ");
  
  		cnt = fit_get_size(fit_hdr);
  		break;
  #endif
  	default:
  		bootstage_error(BOOTSTAGE_ID_IDE_FORMAT);
  		puts("** Unknown image type
  ");
  		return 1;
  	}
  
  	cnt += info.blksz - 1;
  	cnt /= info.blksz;
  	cnt -= 1;
  
  	if (dev_desc->block_read(dev, info.start + 1, cnt,
  					 (ulong *)(addr + info.blksz)) != cnt) {
  		printf("** Read error on %d:%d
  ", dev, part);
  		bootstage_error(BOOTSTAGE_ID_IDE_READ);
  		return 1;
  	}
  	bootstage_mark(BOOTSTAGE_ID_IDE_READ);
  
  #if defined(CONFIG_FIT)
  	/* This cannot be done earlier,
  	 * we need complete FIT image in RAM first */
  	if (genimg_get_format((void *) addr) == IMAGE_FORMAT_FIT) {
  		if (!fit_check_format(fit_hdr)) {
  			bootstage_error(BOOTSTAGE_ID_IDE_FIT_READ);
  			puts("** Bad FIT image format
  ");
  			return 1;
  		}
  		bootstage_mark(BOOTSTAGE_ID_IDE_FIT_READ_OK);
  		fit_print_contents(fit_hdr);
  	}
  #endif
  
  	flush_cache(addr, (cnt+1)*info.blksz);
  
  	/* Loading ok, update default load address */
  	load_addr = addr;
  
  	return bootm_maybe_autostart(cmdtp, argv[0]);
  }
475c7970c   Rob Herring   cmd_disk: use com...
137
  #endif