]>
Commit | Line | Data |
---|---|---|
7ac2fe2d IY |
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 | * | |
1a459660 | 8 | * SPDX-License-Identifier: GPL-2.0+ |
7ac2fe2d IY |
9 | */ |
10 | #include <common.h> | |
36afd451 | 11 | #include <errno.h> |
7ac2fe2d IY |
12 | #include <spl.h> |
13 | #include <net.h> | |
6dca5e8a | 14 | #include <libfdt.h> |
7ac2fe2d IY |
15 | |
16 | DECLARE_GLOBAL_DATA_PTR; | |
17 | ||
7ec03893 | 18 | #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT) |
6dca5e8a AD |
19 | static ulong spl_net_load_read(struct spl_load_info *load, ulong sector, |
20 | ulong count, void *buf) | |
21 | { | |
22 | debug("%s: sector %lx, count %lx, buf %lx\n", | |
23 | __func__, sector, count, (ulong)buf); | |
24 | memcpy(buf, (void *)(load_addr + sector), count); | |
25 | return count; | |
26 | } | |
27 | ||
2a2ee2ac SG |
28 | static int spl_net_load_image(struct spl_image_info *spl_image, |
29 | struct spl_boot_device *bootdev) | |
7ac2fe2d | 30 | { |
6dca5e8a | 31 | struct image_header *header = (struct image_header *)load_addr; |
7ac2fe2d IY |
32 | int rv; |
33 | ||
34 | env_init(); | |
35 | env_relocate(); | |
382bee57 | 36 | env_set("autoload", "yes"); |
d2eaec60 | 37 | rv = eth_initialize(); |
7ac2fe2d IY |
38 | if (rv == 0) { |
39 | printf("No Ethernet devices found\n"); | |
36afd451 | 40 | return -ENODEV; |
7ac2fe2d | 41 | } |
ecdfd69a | 42 | if (bootdev->boot_device_name) |
382bee57 | 43 | env_set("ethact", bootdev->boot_device_name); |
bc0571fc | 44 | rv = net_loop(BOOTP); |
7ac2fe2d IY |
45 | if (rv < 0) { |
46 | printf("Problem booting with BOOTP\n"); | |
36afd451 | 47 | return rv; |
7ac2fe2d | 48 | } |
6dca5e8a AD |
49 | |
50 | if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && | |
51 | image_get_magic(header) == FDT_MAGIC) { | |
52 | struct spl_load_info load; | |
53 | ||
54 | debug("Found FIT\n"); | |
55 | load.bl_len = 1; | |
56 | load.read = spl_net_load_read; | |
57 | rv = spl_load_simple_fit(spl_image, &load, 0, header); | |
58 | } else { | |
59 | debug("Legacy image\n"); | |
60 | ||
61 | rv = spl_parse_image_header(spl_image, header); | |
62 | if (rv) | |
63 | return rv; | |
64 | ||
65 | memcpy((void *)spl_image->load_addr, header, spl_image->size); | |
66 | } | |
67 | ||
68 | return rv; | |
7ac2fe2d | 69 | } |
7ec03893 SG |
70 | #endif |
71 | ||
72 | #ifdef CONFIG_SPL_ETH_SUPPORT | |
2a2ee2ac SG |
73 | int spl_net_load_image_cpgmac(struct spl_image_info *spl_image, |
74 | struct spl_boot_device *bootdev) | |
7ec03893 SG |
75 | { |
76 | #ifdef CONFIG_SPL_ETH_DEVICE | |
77 | bootdev->boot_device_name = CONFIG_SPL_ETH_DEVICE; | |
78 | #endif | |
79 | ||
2a2ee2ac | 80 | return spl_net_load_image(spl_image, bootdev); |
7ec03893 | 81 | } |
ebc4ef61 SG |
82 | SPL_LOAD_IMAGE_METHOD("eth device", 0, BOOT_DEVICE_CPGMAC, |
83 | spl_net_load_image_cpgmac); | |
7ec03893 SG |
84 | #endif |
85 | ||
86 | #ifdef CONFIG_SPL_USBETH_SUPPORT | |
2a2ee2ac SG |
87 | int spl_net_load_image_usb(struct spl_image_info *spl_image, |
88 | struct spl_boot_device *bootdev) | |
7ec03893 SG |
89 | { |
90 | bootdev->boot_device_name = "usb_ether"; | |
91 | ||
2a2ee2ac | 92 | return spl_net_load_image(spl_image, bootdev); |
7ec03893 | 93 | } |
ebc4ef61 | 94 | SPL_LOAD_IMAGE_METHOD("USB eth", 0, BOOT_DEVICE_USBETH, spl_net_load_image_usb); |
7ec03893 | 95 | #endif |