Blame view
common/cmd_disk.c
3.04 KB
7405a1331 combine block dev... |
1 2 3 4 |
/* * (C) Copyright 2000-2011 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
1a4596601 Add GPL-2.0+ SPDX... |
5 |
* SPDX-License-Identifier: GPL-2.0+ |
7405a1331 combine block dev... |
6 7 8 |
*/ #include <common.h> #include <command.h> |
475c7970c cmd_disk: use com... |
9 |
#include <part.h> |
7405a1331 combine block dev... |
10 |
|
475c7970c cmd_disk: use com... |
11 12 |
#if defined(CONFIG_CMD_IDE) || defined(CONFIG_CMD_SCSI) || \ defined(CONFIG_USB_STORAGE) |
7405a1331 combine block dev... |
13 14 15 |
int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc, char *const argv[]) { |
475c7970c cmd_disk: use com... |
16 17 18 |
int dev, part; ulong addr = CONFIG_SYS_LOAD_ADDR; ulong cnt; |
7405a1331 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 cmd_disk: use com... |
28 |
if (argc > 3) { |
7405a1331 combine block dev... |
29 30 31 32 |
bootstage_error(BOOTSTAGE_ID_IDE_ADDR); return CMD_RET_USAGE; } bootstage_mark(BOOTSTAGE_ID_IDE_ADDR); |
475c7970c cmd_disk: use com... |
33 34 |
if (argc > 1) addr = simple_strtoul(argv[1], NULL, 16); |
7405a1331 combine block dev... |
35 |
|
475c7970c cmd_disk: use com... |
36 |
bootstage_mark(BOOTSTAGE_ID_IDE_BOOT_DEVICE); |
7405a1331 combine block dev... |
37 |
|
475c7970c cmd_disk: use com... |
38 |
part = get_device_and_partition(intf, (argc == 3) ? argv[2] : NULL, |
10a37fd7a disk: get_device_... |
39 |
&dev_desc, &info, 1); |
475c7970c cmd_disk: use com... |
40 |
if (part < 0) { |
7405a1331 combine block dev... |
41 42 43 |
bootstage_error(BOOTSTAGE_ID_IDE_TYPE); return 1; } |
7405a1331 combine block dev... |
44 |
|
475c7970c cmd_disk: use com... |
45 46 |
dev = dev_desc->dev; bootstage_mark(BOOTSTAGE_ID_IDE_TYPE); |
7405a1331 combine block dev... |
47 |
|
475c7970c 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 combine block dev... |
53 |
|
04735e9c5 Fix ext2/ext4 fil... |
54 55 56 |
debug("First Block: " LBAFU ", # of blocks: " LBAFU ", Block Size: %ld ", |
7405a1331 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 cmd_disk: use com... |
137 |
#endif |