spl_blk_fs.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2023
  4. * Ventana Micro Systems Inc.
  5. *
  6. */
  7. #include <common.h>
  8. #include <spl.h>
  9. #include <image.h>
  10. #include <fs.h>
  11. struct blk_dev {
  12. const char *ifname;
  13. char dev_part_str[8];
  14. };
  15. static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
  16. ulong size, void *buf)
  17. {
  18. loff_t actlen;
  19. int ret;
  20. struct blk_dev *dev = (struct blk_dev *)load->priv;
  21. ret = fs_set_blk_dev(dev->ifname, dev->dev_part_str, FS_TYPE_ANY);
  22. if (ret) {
  23. printf("spl: unable to set blk_dev %s %s. Err - %d\n",
  24. dev->ifname, dev->dev_part_str, ret);
  25. return ret;
  26. }
  27. ret = fs_read(load->filename, (ulong)buf, file_offset, size, &actlen);
  28. if (ret < 0) {
  29. printf("spl: error reading image %s. Err - %d\n",
  30. load->filename, ret);
  31. return ret;
  32. }
  33. return actlen;
  34. }
  35. int spl_blk_load_image(struct spl_image_info *spl_image,
  36. struct spl_boot_device *bootdev,
  37. enum uclass_id uclass_id, int devnum, int partnum)
  38. {
  39. const char *filename = CONFIG_SPL_FS_LOAD_PAYLOAD_NAME;
  40. struct legacy_img_hdr *header;
  41. struct blk_desc *blk_desc;
  42. loff_t actlen, filesize;
  43. struct blk_dev dev;
  44. int ret;
  45. blk_desc = blk_get_devnum_by_uclass_id(uclass_id, devnum);
  46. if (!blk_desc) {
  47. printf("blk desc for %d %d not found\n", uclass_id, devnum);
  48. return -ENODEV;
  49. }
  50. blk_show_device(uclass_id, devnum);
  51. header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
  52. dev.ifname = blk_get_uclass_name(uclass_id);
  53. snprintf(dev.dev_part_str, sizeof(dev.dev_part_str) - 1, "%x:%x",
  54. devnum, partnum);
  55. ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
  56. if (ret) {
  57. printf("spl: unable to set blk_dev %s %s. Err - %d\n",
  58. dev.ifname, dev.dev_part_str, ret);
  59. goto out;
  60. }
  61. ret = fs_read(filename, (ulong)header, 0,
  62. sizeof(struct legacy_img_hdr), &actlen);
  63. if (ret) {
  64. printf("spl: unable to read file %s. Err - %d\n", filename,
  65. ret);
  66. goto out;
  67. }
  68. if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
  69. image_get_magic(header) == FDT_MAGIC) {
  70. struct spl_load_info load;
  71. debug("Found FIT\n");
  72. load.read = spl_fit_read;
  73. load.bl_len = 1;
  74. load.filename = (void *)filename;
  75. load.priv = &dev;
  76. return spl_load_simple_fit(spl_image, &load, 0, header);
  77. }
  78. ret = spl_parse_image_header(spl_image, bootdev, header);
  79. if (ret) {
  80. printf("spl: unable to parse image header. Err - %d\n",
  81. ret);
  82. goto out;
  83. }
  84. ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
  85. if (ret) {
  86. printf("spl: unable to set blk_dev %s %s. Err - %d\n",
  87. dev.ifname, dev.dev_part_str, ret);
  88. goto out;
  89. }
  90. ret = fs_size(filename, &filesize);
  91. if (ret) {
  92. printf("spl: unable to get file size: %s. Err - %d\n",
  93. filename, ret);
  94. goto out;
  95. }
  96. ret = fs_set_blk_dev(dev.ifname, dev.dev_part_str, FS_TYPE_ANY);
  97. if (ret) {
  98. printf("spl: unable to set blk_dev %s %s. Err - %d\n",
  99. dev.ifname, dev.dev_part_str, ret);
  100. goto out;
  101. }
  102. ret = fs_read(filename, (ulong)spl_image->load_addr, 0, filesize,
  103. &actlen);
  104. if (ret)
  105. printf("spl: unable to read file %s. Err - %d\n",
  106. filename, ret);
  107. out:
  108. return ret;
  109. }