spl_net.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * (C) Copyright 2000-2004
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * (C) Copyright 2012
  6. * Ilya Yanok <ilya.yanok@gmail.com>
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <errno.h>
  12. #include <spl.h>
  13. #include <net.h>
  14. #include <libfdt.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
  17. static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
  18. ulong count, void *buf)
  19. {
  20. debug("%s: sector %lx, count %lx, buf %lx\n",
  21. __func__, sector, count, (ulong)buf);
  22. memcpy(buf, (void *)(load_addr + sector), count);
  23. return count;
  24. }
  25. static int spl_net_load_image(struct spl_image_info *spl_image,
  26. struct spl_boot_device *bootdev)
  27. {
  28. struct image_header *header = (struct image_header *)load_addr;
  29. int rv;
  30. env_init();
  31. env_relocate();
  32. env_set("autoload", "yes");
  33. rv = eth_initialize();
  34. if (rv == 0) {
  35. printf("No Ethernet devices found\n");
  36. return -ENODEV;
  37. }
  38. if (bootdev->boot_device_name)
  39. env_set("ethact", bootdev->boot_device_name);
  40. rv = net_loop(BOOTP);
  41. if (rv < 0) {
  42. printf("Problem booting with BOOTP\n");
  43. return rv;
  44. }
  45. if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
  46. image_get_magic(header) == FDT_MAGIC) {
  47. struct spl_load_info load;
  48. debug("Found FIT\n");
  49. load.bl_len = 1;
  50. load.read = spl_net_load_read;
  51. rv = spl_load_simple_fit(spl_image, &load, 0, header);
  52. } else {
  53. debug("Legacy image\n");
  54. rv = spl_parse_image_header(spl_image, header);
  55. if (rv)
  56. return rv;
  57. memcpy((void *)spl_image->load_addr, header, spl_image->size);
  58. }
  59. return rv;
  60. }
  61. #endif
  62. #ifdef CONFIG_SPL_ETH_SUPPORT
  63. int spl_net_load_image_cpgmac(struct spl_image_info *spl_image,
  64. struct spl_boot_device *bootdev)
  65. {
  66. #ifdef CONFIG_SPL_ETH_DEVICE
  67. bootdev->boot_device_name = CONFIG_SPL_ETH_DEVICE;
  68. #endif
  69. return spl_net_load_image(spl_image, bootdev);
  70. }
  71. SPL_LOAD_IMAGE_METHOD("eth device", 0, BOOT_DEVICE_CPGMAC,
  72. spl_net_load_image_cpgmac);
  73. #endif
  74. #ifdef CONFIG_SPL_USBETH_SUPPORT
  75. int spl_net_load_image_usb(struct spl_image_info *spl_image,
  76. struct spl_boot_device *bootdev)
  77. {
  78. bootdev->boot_device_name = "usb_ether";
  79. return spl_net_load_image(spl_image, bootdev);
  80. }
  81. SPL_LOAD_IMAGE_METHOD("USB eth", 0, BOOT_DEVICE_USBETH, spl_net_load_image_usb);
  82. #endif