1 // SPDX-License-Identifier: GPL-2.0+
4 * Ventana Micro Systems Inc.
18 static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
19 ulong size, void *buf)
23 struct blk_dev *dev = (struct blk_dev *)load->priv;
25 ret = fs_set_blk_dev(dev->ifname, dev->dev_part_str, FS_TYPE_ANY);
27 printf("spl: unable to set blk_dev %s %s. Err - %d\n",
28 dev->ifname, dev->dev_part_str, ret);
32 ret = fs_read(load->filename, (ulong)buf, file_offset, size, &actlen);
34 printf("spl: error reading image %s. Err - %d\n",
42 int spl_blk_load_image(struct spl_image_info *spl_image,
43 struct spl_boot_device *bootdev,
44 enum uclass_id uclass_id, int devnum, int partnum)
46 const char *filename = CONFIG_SPL_FS_LOAD_PAYLOAD_NAME;
47 struct legacy_img_hdr *header;
48 struct blk_desc *blk_desc;
49 loff_t actlen, filesize;
53 blk_desc = blk_get_devnum_by_uclass_id(uclass_id, devnum);
55 printf("blk desc for %d %d not found\n", uclass_id, devnum);
59 blk_show_device(uclass_id, devnum);
60 header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
62 dev.ifname = blk_get_uclass_name(uclass_id);
63 snprintf(dev.dev_part_str, sizeof(dev.dev_part_str) - 1, "%x:%x",
65 ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
67 printf("spl: unable to set blk_dev %s %s. Err - %d\n",
68 dev.ifname, dev.dev_part_str, ret);
72 ret = fs_read(filename, (ulong)header, 0,
73 sizeof(struct legacy_img_hdr), &actlen);
75 printf("spl: unable to read file %s. Err - %d\n", filename,
80 if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
81 image_get_magic(header) == FDT_MAGIC) {
82 struct spl_load_info load;
85 load.read = spl_fit_read;
87 load.filename = (void *)filename;
90 return spl_load_simple_fit(spl_image, &load, 0, header);
93 ret = spl_parse_image_header(spl_image, bootdev, header);
95 printf("spl: unable to parse image header. Err - %d\n",
100 ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
102 printf("spl: unable to set blk_dev %s %s. Err - %d\n",
103 dev.ifname, dev.dev_part_str, ret);
107 ret = fs_size(filename, &filesize);
109 printf("spl: unable to get file size: %s. Err - %d\n",
114 ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
116 printf("spl: unable to set blk_dev %s %s. Err - %d\n",
117 dev.ifname, dev.dev_part_str, ret);
121 ret = fs_read(filename, (ulong)spl_image->load_addr, 0, filesize,
124 printf("spl: unable to read file %s. Err - %d\n",