From 6ce6803ef8bab78b59fa7c2d9976ec001b9ac6f8 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Tue, 30 Oct 2018 13:31:34 +0000 Subject: [PATCH] 2018.11 RC3 --- aarch64-boards | 1 + dragonboard-fixes.patch | 43 +- ..._atf-fix-warning-unit_address_vs_reg.patch | 103 -- ...hip-make_fit_atf-use-elf-entry-point.patch | 81 -- sources | 2 +- tegra-efi_loader-simplify-ifdefs.patch | 194 ---- uboot-tools.spec | 27 +- uefi-fixes.patch | 1017 ----------------- 8 files changed, 36 insertions(+), 1432 deletions(-) delete mode 100644 rockchip-make_fit_atf-fix-warning-unit_address_vs_reg.patch delete mode 100644 rockchip-make_fit_atf-use-elf-entry-point.patch delete mode 100644 tegra-efi_loader-simplify-ifdefs.patch delete mode 100644 uefi-fixes.patch diff --git a/aarch64-boards b/aarch64-boards index 5e876fe..f882ee2 100644 --- a/aarch64-boards +++ b/aarch64-boards @@ -11,6 +11,7 @@ firefly-rk3399 geekbox hikey khadas-vim +khadas-vim2 libretech-cc libretech_all_h3_cc_h5 mvebu_espressobin-88f3720 diff --git a/dragonboard-fixes.patch b/dragonboard-fixes.patch index 10ee96b..c49ea50 100644 --- a/dragonboard-fixes.patch +++ b/dragonboard-fixes.patch @@ -1,17 +1,17 @@ -From fbd0bffb20ca5edd21bbeb7cc20e24d091ab4280 Mon Sep 17 00:00:00 2001 +From 8b0274a733cd1ce39ad9ad18e1bd8efdd02a40b7 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 21 Jun 2017 14:21:15 -0400 -Subject: [PATCH 1/4] WIP: fix usb +Subject: [PATCH 1/3] WIP: fix usb --- common/usb_storage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/usb_storage.c b/common/usb_storage.c -index a91b1c0d2f..caea87a09f 100644 +index d92ebb6eb19..9df3c3daaf4 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c -@@ -1018,7 +1018,7 @@ static int usb_request_sense(struct scsi_cmd *srb, struct us_data *ss) +@@ -1016,7 +1016,7 @@ static int usb_request_sense(struct scsi_cmd *srb, struct us_data *ss) static int usb_test_unit_ready(struct scsi_cmd *srb, struct us_data *ss) { @@ -20,7 +20,7 @@ index a91b1c0d2f..caea87a09f 100644 do { memset(&srb->cmd[0], 0, 12); -@@ -1041,7 +1041,7 @@ static int usb_test_unit_ready(struct scsi_cmd *srb, struct us_data *ss) +@@ -1039,7 +1039,7 @@ static int usb_test_unit_ready(struct scsi_cmd *srb, struct us_data *ss) if ((srb->sense_buf[2] == 0x02) && (srb->sense_buf[12] == 0x3a)) return -1; @@ -30,12 +30,12 @@ index a91b1c0d2f..caea87a09f 100644 return -1; -- -2.14.3 +2.19.1 -From d1b25b8d6461c5278228d657de9c24e0979e4b9d Mon Sep 17 00:00:00 2001 +From 7bf41d74ca9d58bc2243b7688f8987c1d373ea56 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 3 Jul 2017 08:34:37 -0400 -Subject: [PATCH 2/4] HACK: disable emmc +Subject: [PATCH 2/3] HACK: disable emmc Hitting some timeout which makes boot take much longer. And uefi/boot/rootfs partitions will be on sd-card or usb disk, etc, @@ -45,18 +45,18 @@ so we can just ignore emmc. 1 file changed, 2 insertions(+) diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts -index 5ccfe7f8c8..9e2d3f5d9b 100644 +index fa348bc621e..bfe7f15d5ed 100644 --- a/arch/arm/dts/dragonboard410c.dts +++ b/arch/arm/dts/dragonboard410c.dts -@@ -67,6 +67,7 @@ - reg = <0x78d9000 0x400>; +@@ -106,6 +106,7 @@ + #phy-cells = <0>; }; +/* sdhci@07824000 { compatible = "qcom,sdhci-msm-v4"; reg = <0x7824900 0x11c 0x7824000 0x800>; -@@ -76,6 +77,7 @@ +@@ -115,6 +116,7 @@ clock = <&clkc 0>; clock-frequency = <100000000>; }; @@ -65,22 +65,23 @@ index 5ccfe7f8c8..9e2d3f5d9b 100644 sdhci@07864000 { compatible = "qcom,sdhci-msm-v4"; -- -2.14.3 -From 6baac1d73a20f880cb91f3bc03fe4f9cf88c61f6 Mon Sep 17 00:00:00 2001 +2.19.1 + +From 871fe802cf3ab593b9332c4f36ab2b3f179d51ae Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Tue, 4 Sep 2018 12:21:59 +0100 -Subject: [PATCH] add options for dm410c config +Subject: [PATCH 3/3] add options for dm410c config --- configs/dragonboard410c_defconfig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/configs/dragonboard410c_defconfig b/configs/dragonboard410c_defconfig -index 96a831443a..d167c765b1 100644 +index a55abaf8df5..4ece0cafbe4 100644 --- a/configs/dragonboard410c_defconfig +++ b/configs/dragonboard410c_defconfig -@@ -6,6 +6,8 @@ CONFIG_DISTRO_DEFAULTS=y - CONFIG_NR_DRAM_BANKS=1 +@@ -7,6 +7,8 @@ CONFIG_NR_DRAM_BANKS=1 + # CONFIG_ANDROID_BOOT_IMAGE is not set CONFIG_FIT=y CONFIG_OF_BOARD_SETUP=y +CONFIG_FAT_WRITE=y @@ -88,7 +89,7 @@ index 96a831443a..d167c765b1 100644 CONFIG_MISC_INIT_R=y # CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set -@@ -35,6 +37,13 @@ CONFIG_DM_PMIC=y +@@ -41,6 +43,13 @@ CONFIG_DM_PMIC=y CONFIG_PMIC_PM8916=y CONFIG_MSM_SERIAL=y CONFIG_SPMI_MSM=y @@ -102,7 +103,7 @@ index 96a831443a..d167c765b1 100644 CONFIG_USB=y CONFIG_DM_USB=y CONFIG_USB_EHCI_HCD=y -@@ -46,5 +55,6 @@ CONFIG_USB_HOST_ETHER=y +@@ -57,5 +66,6 @@ CONFIG_USB_HOST_ETHER=y CONFIG_USB_ETHER_ASIX=y CONFIG_USB_ETHER_ASIX88179=y CONFIG_USB_ETHER_MCS7830=y @@ -110,5 +111,5 @@ index 96a831443a..d167c765b1 100644 CONFIG_USB_ETHER_SMSC95XX=y CONFIG_OF_LIBFDT_OVERLAY=y -- -2.19.0.rc0 +2.19.1 diff --git a/rockchip-make_fit_atf-fix-warning-unit_address_vs_reg.patch b/rockchip-make_fit_atf-fix-warning-unit_address_vs_reg.patch deleted file mode 100644 index d64cbb1..0000000 --- a/rockchip-make_fit_atf-fix-warning-unit_address_vs_reg.patch +++ /dev/null @@ -1,103 +0,0 @@ -From patchwork Thu Apr 26 06:43:06 2018 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [U-Boot] rockchip: make_fit_atf: fix warning unit_address_vs_reg -X-Patchwork-Submitter: Kever Yang -X-Patchwork-Id: 904884 -Message-Id: <1524724986-28497-1-git-send-email-kever.yang@rock-chips.com> -To: u-boot@lists.denx.de -Date: Thu, 26 Apr 2018 14:43:06 +0800 -From: Kever Yang -List-Id: U-Boot discussion - -Patch fix warning: -/builddir/BUILD/u-boot-2018.05-rc2/"arch/arm/mach-rockchip/make_fit_atf.py" \ -arch/arm/dts/rk3399-firefly.dtb > u-boot.its - ./tools/mkimage -f u-boot.its -E u-boot.itb >/dev/null && cat -/dev/null -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node /images/uboot@1 -has a unit name, but no reg property -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node /images/atf@1 has -a unit name, but no reg property -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node /images/atf@2 has -a unit name, but no reg property -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node /images/atf@3 has -a unit name, but no reg property -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node /images/fdt@1 has -a unit name, but no reg property -u-boot.itb.tmp: Warning (unit_address_vs_reg): Node -/configurations/config@1 has a unit name, but no reg property -make[1]: Leaving directory -'/builddir/BUILD/u-boot-2018.05-rc2/builds/firefly-rk3399' - -Reported-by: Peter Robinson -Signed-off-by: Kever Yang ---- - - arch/arm/mach-rockchip/make_fit_atf.py | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/arch/arm/mach-rockchip/make_fit_atf.py b/arch/arm/mach-rockchip/make_fit_atf.py -index 7c6dd57..513e088 100755 ---- a/arch/arm/mach-rockchip/make_fit_atf.py -+++ b/arch/arm/mach-rockchip/make_fit_atf.py -@@ -37,7 +37,7 @@ DT_HEADER="""/* - #address-cells = <1>; - - images { -- uboot@1 { -+ uboot { - description = "U-Boot (64-bit)"; - data = /incbin/("u-boot-nodtb.bin"); - type = "standalone"; -@@ -61,7 +61,7 @@ def append_atf_node(file, atf_index, phy_addr): - Append ATF DT node to input FIT dts file. - """ - data = 'bl31_0x%08x.bin' % phy_addr -- print >> file, '\t\tatf@%d {' % atf_index -+ print >> file, '\t\tatf_%d {' % atf_index - print >> file, '\t\t\tdescription = \"ARM Trusted Firmware\";' - print >> file, '\t\t\tdata = /incbin/("%s");' % data - print >> file, '\t\t\ttype = "firmware";' -@@ -81,7 +81,7 @@ def append_fdt_node(file, dtbs): - cnt = 1 - for dtb in dtbs: - dtname = os.path.basename(dtb) -- print >> file, '\t\tfdt@%d {' % cnt -+ print >> file, '\t\tfdt_%d {' % cnt - print >> file, '\t\t\tdescription = "%s";' % dtname - print >> file, '\t\t\tdata = /incbin/("%s");' % dtb - print >> file, '\t\t\ttype = "flat_dt";' -@@ -91,17 +91,17 @@ def append_fdt_node(file, dtbs): - cnt = cnt + 1 - - def append_conf_section(file, cnt, dtname, atf_cnt): -- print >> file, '\t\tconfig@%d {' % cnt -+ print >> file, '\t\tconfig_%d {' % cnt - print >> file, '\t\t\tdescription = "%s";' % dtname -- print >> file, '\t\t\tfirmware = "atf@1";' -- print >> file, '\t\t\tloadables = "uboot@1",', -+ print >> file, '\t\t\tfirmware = "atf_1";' -+ print >> file, '\t\t\tloadables = "uboot",', - for i in range(1, atf_cnt): -- print >> file, '"atf@%d"' % (i+1), -+ print >> file, '"atf_%d"' % (i+1), - if i != (atf_cnt - 1): - print >> file, ',', - else: - print >> file, ';' -- print >> file, '\t\t\tfdt = "fdt@1";' -+ print >> file, '\t\t\tfdt = "fdt_1";' - print >> file, '\t\t};' - print >> file, '' - -@@ -111,7 +111,7 @@ def append_conf_node(file, dtbs, atf_cnt): - """ - cnt = 1 - print >> file, '\tconfigurations {' -- print >> file, '\t\tdefault = "config@1";' -+ print >> file, '\t\tdefault = "config_1";' - for dtb in dtbs: - dtname = os.path.basename(dtb) - append_conf_section(file, cnt, dtname, atf_cnt) diff --git a/rockchip-make_fit_atf-use-elf-entry-point.patch b/rockchip-make_fit_atf-use-elf-entry-point.patch deleted file mode 100644 index fc2aa99..0000000 --- a/rockchip-make_fit_atf-use-elf-entry-point.patch +++ /dev/null @@ -1,81 +0,0 @@ -From patchwork Wed May 16 16:44:33 2018 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [U-Boot] rockchip: make_fit_atf: use elf entry point -X-Patchwork-Submitter: Mian Yousaf Kaukab -X-Patchwork-Id: 914901 -Message-Id: <20180516164433.30998-1-yousaf.kaukab@suse.com> -To: u-boot@lists.denx.de -Cc: Mian Yousaf Kaukab -Date: Wed, 16 May 2018 18:44:33 +0200 -From: Mian Yousaf Kaukab -List-Id: U-Boot discussion - -make_fit_atf.py uses physical address of first segment as the -entry point to bl31. It is incorrect and causes following abort -when bl31_entry() is called: - -U-Boot SPL board initTrying to boot from MMC1 -"Synchronous Abort" handler, esr 0x02000000 -elr: 0000000000000000 lr : 00000000ff8c7e8c -x 0: 00000000ff8e0000 x 1: 0000000000000000 -x 2: 0000000000000000 x 3: 00000000ff8e0180 -x 4: 0000000000000000 x 5: 0000000000000000 -x 6: 0000000000000030 x 7: 00000000ff8e0188 -x 8: 00000000000001e0 x 9: 0000000000000000 -x10: 000000000007fcdc x11: 00000000002881b8 -x12: 00000000000001a2 x13: 0000000000000198 -x14: 000000000007fdcc x15: 00000000002881b8 -x16: 00000000003c0724 x17: 00000000003c0718 -x18: 000000000007fe80 x19: 00000000ff8e0000 -x20: 0000000000200000 x21: 00000000ff8e0000 -x22: 0000000000000000 x23: 000000000007fe30 -x24: 00000000ff8d1c3c x25: 00000000ff8d5000 -x26: 00000000deadbeef x27: 00000000000004a0 -x28: 000000000000009c x29: 000000000007fd90 - -Fix it by using the entry point from the elf header. - -Signed-off-by: Mian Yousaf Kaukab ---- - arch/arm/mach-rockchip/make_fit_atf.py | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/arch/arm/mach-rockchip/make_fit_atf.py b/arch/arm/mach-rockchip/make_fit_atf.py -index 6b3d9201c9..b88a5e1f16 100755 ---- a/arch/arm/mach-rockchip/make_fit_atf.py -+++ b/arch/arm/mach-rockchip/make_fit_atf.py -@@ -53,7 +53,7 @@ DT_END=""" - }; - """ - --def append_atf_node(file, atf_index, phy_addr): -+def append_atf_node(file, atf_index, phy_addr, elf_entry): - """ - Append ATF DT node to input FIT dts file. - """ -@@ -67,7 +67,7 @@ def append_atf_node(file, atf_index, phy_addr): - print >> file, '\t\t\tcompression = "none";' - print >> file, '\t\t\tload = <0x%08x>;' % phy_addr - if atf_index == 1: -- print >> file, '\t\t\tentry = <0x%08x>;' % phy_addr -+ print >> file, '\t\t\tentry = <0x%08x>;' % elf_entry - print >> file, '\t\t};' - print >> file, '' - -@@ -141,12 +141,13 @@ def generate_atf_fit_dts(fit_file_name, bl31_file_name, uboot_file_name, dtbs_fi - - with open(bl31_file_name) as bl31_file: - bl31 = ELFFile(bl31_file) -+ elf_entry = bl31.header['e_entry'] - for i in range(bl31.num_segments()): - seg = bl31.get_segment(i) - if ('PT_LOAD' == seg.__getitem__(ELF_SEG_P_TYPE)): - paddr = seg.__getitem__(ELF_SEG_P_PADDR) - p= seg.__getitem__(ELF_SEG_P_PADDR) -- append_atf_node(fit_file, i+1, paddr) -+ append_atf_node(fit_file, i+1, paddr, elf_entry) - atf_cnt = i+1 - append_fdt_node(fit_file, dtbs_file_name) - print >> fit_file, '%s' % DT_IMAGES_NODE_END diff --git a/sources b/sources index d6e20e0..f83059a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2018.09.tar.bz2) = 48cb60a53450e2820eda706917b61dae053677fecfe177e0d07968313d25c7e9d5ab2d7cc5625b54e4c823f5c8852f88387b94f404e307e737aaa5a2c887ad4a +SHA512 (u-boot-2018.11-rc3.tar.bz2) = 013bf1be169eaea88e44dec187eabc1c5806c1e813f0bf0a28da17f67b4d72b30708e55cb31767ceb7a171f6e1be07f092941009cff8d2cfdc51d3189b89111f diff --git a/tegra-efi_loader-simplify-ifdefs.patch b/tegra-efi_loader-simplify-ifdefs.patch deleted file mode 100644 index 1b39a4a..0000000 --- a/tegra-efi_loader-simplify-ifdefs.patch +++ /dev/null @@ -1,194 +0,0 @@ -From patchwork Thu Aug 30 21:43:43 2018 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [U-Boot,V3,1/3] efi_loader: simplify ifdefs -X-Patchwork-Submitter: Stephen Warren -X-Patchwork-Id: 964248 -X-Patchwork-Delegate: agraf@suse.de -Message-Id: <20180830214345.2475-1-swarren@wwwdotorg.org> -To: Tom Rini -Cc: Stephen Warren , xypron.glpk@gmx.de, agraf@suse.de, - u-boot@lists.denx.de, Tom Warren -Date: Thu, 30 Aug 2018 15:43:43 -0600 -From: Stephen Warren -List-Id: U-Boot discussion - -From: Stephen Warren - -Use CONFIG_IS_ENABLED(EFI_LOADER) to avoid explicitly checking CONFIG_SPL -too. This simplifies the conditional. - -Signed-off-by: Stephen Warren ---- -v3: New patch. ---- - arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 2 +- - arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 2 +- - arch/x86/lib/e820.c | 4 ++-- - include/efi_loader.h | 6 +++--- - 4 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c -index 052e0708d454..be00bd55ab68 100644 ---- a/arch/arm/cpu/armv8/fsl-layerscape/cpu.c -+++ b/arch/arm/cpu/armv8/fsl-layerscape/cpu.c -@@ -835,7 +835,7 @@ int dram_init_banksize(void) - return 0; - } - --#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) -+#if CONFIG_IS_ENABLED(EFI_LOADER) - void efi_add_known_memory(void) - { - int i; -diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c -index fc9de73bcef4..c9c2c3f6d3e8 100644 ---- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c -+++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c -@@ -135,7 +135,7 @@ remove_psci_node: - - fdt_add_mem_rsv(blob, (uintptr_t)&secondary_boot_code, - *boot_code_size); --#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) -+#if CONFIG_IS_ENABLED(EFI_LOADER) - efi_add_memory_map((uintptr_t)&secondary_boot_code, - ALIGN(*boot_code_size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT, - EFI_RESERVED_MEMORY_TYPE, false); -diff --git a/arch/x86/lib/e820.c b/arch/x86/lib/e820.c -index 8b34f677d96d..d6ae2c4e9d77 100644 ---- a/arch/x86/lib/e820.c -+++ b/arch/x86/lib/e820.c -@@ -36,7 +36,7 @@ __weak unsigned int install_e820_map(unsigned int max_entries, - return 4; - } - --#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) -+#if CONFIG_IS_ENABLED(EFI_LOADER) - void efi_add_known_memory(void) - { - struct e820_entry e820[E820MAX]; -@@ -72,4 +72,4 @@ void efi_add_known_memory(void) - efi_add_memory_map(start, pages, type, false); - } - } --#endif /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */ -+#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */ -diff --git a/include/efi_loader.h b/include/efi_loader.h -index f162adfff7e2..b46babf9316f 100644 ---- a/include/efi_loader.h -+++ b/include/efi_loader.h -@@ -13,7 +13,7 @@ - #include - - /* No need for efi loader support in SPL */ --#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) -+#if CONFIG_IS_ENABLED(EFI_LOADER) - - #include - -@@ -460,7 +460,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, efi_guid_t *vendor, - void *efi_bootmgr_load(struct efi_device_path **device_path, - struct efi_device_path **file_path); - --#else /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */ -+#else /* CONFIG_IS_ENABLED(EFI_LOADER) */ - - /* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */ - #define __efi_runtime_data -@@ -477,6 +477,6 @@ static inline void efi_set_bootdev(const char *dev, const char *devnr, - static inline void efi_net_set_dhcp_ack(void *pkt, int len) { } - static inline void efi_print_image_infos(void *pc) { } - --#endif /* CONFIG_EFI_LOADER && !CONFIG_SPL_BUILD */ -+#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */ - - #endif /* _EFI_LOADER_H */ - -From patchwork Thu Aug 30 21:43:44 2018 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [U-Boot, V3, - 2/3] ARM: tegra: reserve unmapped RAM so EFI doesn't use it -X-Patchwork-Submitter: Stephen Warren -X-Patchwork-Id: 964249 -X-Patchwork-Delegate: agraf@suse.de -Message-Id: <20180830214345.2475-2-swarren@wwwdotorg.org> -To: Tom Rini -Cc: Stephen Warren , xypron.glpk@gmx.de, agraf@suse.de, - u-boot@lists.denx.de, Tom Warren -Date: Thu, 30 Aug 2018 15:43:44 -0600 -From: Stephen Warren -List-Id: U-Boot discussion - -From: Stephen Warren - -Tegra U-Boot ensures that board_get_usable_ram_top() never returns a value -over 4GB, since some peripherals can't access such addresses. However, on -systems with more than 2GB of RAM, RAM bank 1 does describe this extra -RAM, so that Linux (or whatever OS) can use it, subject to DMA -limitations. Since board_get_usable_ram_top() points at the top of RAM -bank 0, the memory locations describes by RAM bank 1 are not mapped by -U-Boot's MMU configuration, and so cannot be used for anything. - -For some completely inexplicable reason, U-Boot's EFI support ignores the -value returned by board_get_usable_ram_top(), and EFI memory allocation -routines will return values above U-Boot's RAM top. This causes U-Boot to -crash when it accesses that RAM, since it isn't mapped by the MMU. One -use-case where this happens is TFTP download of a file on Jetson TX1 -(p2371-2180). - -This change explicitly tells the EFI code that this extra RAM should not -be used, thus avoiding the crash. - -A previous attempt to make EFI honor board_get_usable_ram_top() was -rejected. So, this patch will need to be replicated for any board that -implements board_get_usable_ram_top(). - -Fixes: aa909462d018 ("efi_loader: efi_allocate_pages is too restrictive") -Signed-off-by: Stephen Warren ---- -v3: -- Use shift not divide for page count calculation. -- Enhance ifdef to avoid EFI references from SPL builds. -v2: -- Don't hard-code EFI page size. -- Register RAM as a boot services data rather than reserved. ---- - arch/arm/mach-tegra/board2.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c -index 421a71b3014d..12257a42b51b 100644 ---- a/arch/arm/mach-tegra/board2.c -+++ b/arch/arm/mach-tegra/board2.c -@@ -6,6 +6,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -210,6 +211,19 @@ int board_early_init_f(void) - - int board_late_init(void) - { -+#if CONFIG_IS_ENABLED(EFI_LOADER) -+ if (gd->bd->bi_dram[1].start) { -+ /* -+ * Only bank 0 is below board_get_usable_ram_top(), so all of -+ * bank 1 is not mapped by the U-Boot MMU configuration, and so -+ * we must prevent EFI from using it. -+ */ -+ efi_add_memory_map(gd->bd->bi_dram[1].start, -+ gd->bd->bi_dram[1].size >> EFI_PAGE_SHIFT, -+ EFI_BOOT_SERVICES_DATA, false); -+ } -+#endif -+ - #if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE) - if (tegra_cpu_is_non_secure()) { - printf("CPU is in NS mode\n"); - diff --git a/uboot-tools.spec b/uboot-tools.spec index 2ec81a8..4619abe 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,8 +1,8 @@ -#global candidate rc3 +%global candidate rc3 Name: uboot-tools -Version: 2018.09 -Release: 1%{?candidate:.%{candidate}}%{?dist} +Version: 2018.11 +Release: 0.1%{?candidate:.%{candidate}}%{?dist} Summary: U-Boot utilities License: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ URL: http://www.denx.de/wiki/U-Boot @@ -23,18 +23,12 @@ Patch3: usb-kbd-fixes.patch # Board fixes and enablement Patch10: rpi-Enable-using-the-DT-provided-by-the-Raspberry-Pi.patch -Patch11: rockchip-make_fit_atf-fix-warning-unit_address_vs_reg.patch -Patch12: rockchip-make_fit_atf-use-elf-entry-point.patch -Patch13: rk3399-Rock960-Ficus-board-support.patch -Patch14: dragonboard-fixes.patch -Patch15: tegra186-jetson-tx2-disable-onboard-emmc.patch -Patch16: tegra-efi_loader-simplify-ifdefs.patch -Patch17: tegra-TXx-Add-CONFIG_EFI_LOADER_BOUNCE_BUFFER.patch -Patch18: tegra-fix-tx1.patch -Patch19: sunxi-DT-A64-add-Pine64-LTS-support.patch - -# Upstream UEFI fixes -Patch20: uefi-fixes.patch +Patch11: rk3399-Rock960-Ficus-board-support.patch +Patch12: dragonboard-fixes.patch +Patch13: tegra186-jetson-tx2-disable-onboard-emmc.patch +Patch14: tegra-TXx-Add-CONFIG_EFI_LOADER_BOUNCE_BUFFER.patch +Patch15: tegra-fix-tx1.patch +Patch16: sunxi-DT-A64-add-Pine64-LTS-support.patch BuildRequires: bc BuildRequires: dtc @@ -321,6 +315,9 @@ cp -p board/warp7/README builds/docs/README.warp7 %endif %changelog +* Tue Oct 30 2018 Peter Robinson 2018.11-0.1.rc3 +- 2018.11 RC3 + * Sun Sep 30 2018 Pablo Greco - Added conditional to enable devtoolset-7-gcc for .el7 build (Arrfab) - Added conditional BR, python2-pyelftools is python-pyelftools in .el7 (Arrfab) diff --git a/uefi-fixes.patch b/uefi-fixes.patch deleted file mode 100644 index 8b53dc6..0000000 --- a/uefi-fixes.patch +++ /dev/null @@ -1,1017 +0,0 @@ -From 6aef5da1b5b6a649e64b00e3209a580359db9179 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Mon, 17 Sep 2018 13:54:33 +0200 -Subject: [PATCH 1/5] efi_loader: Align runtime section to 64kb - -The UEFI spec mandates that runtime sections are 64kb aligned to enable -support for 64kb page size OSs. - -This patch ensures that we extend the runtime section to 64kb to be spec -compliant. - -Signed-off-by: Alexander Graf ---- - lib/efi_loader/efi_memory.c | 20 +++++++++++++++++--- - 1 file changed, 17 insertions(+), 3 deletions(-) - -diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c -index e2b40aa85b5..50c3515f5e6 100644 ---- a/lib/efi_loader/efi_memory.c -+++ b/lib/efi_loader/efi_memory.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - - DECLARE_GLOBAL_DATA_PTR; - -@@ -519,6 +520,7 @@ __weak void efi_add_known_memory(void) - static void add_u_boot_and_runtime(void) - { - unsigned long runtime_start, runtime_end, runtime_pages; -+ unsigned long runtime_mask = EFI_PAGE_MASK; - unsigned long uboot_start, uboot_pages; - unsigned long uboot_stack_size = 16 * 1024 * 1024; - -@@ -527,10 +529,22 @@ static void add_u_boot_and_runtime(void) - uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT; - efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false); - -- /* Add Runtime Services */ -- runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK; -+#if defined(__aarch64__) -+ /* -+ * Runtime Services must be 64KiB aligned according to the -+ * "AArch64 Platforms" section in the UEFI spec (2.7+). -+ */ -+ -+ runtime_mask = SZ_64K - 1; -+#endif -+ -+ /* -+ * Add Runtime Services. We mark surrounding boottime code as runtime as -+ * well to fulfill the runtime alignment constraints but avoid padding. -+ */ -+ runtime_start = (ulong)&__efi_runtime_start & ~runtime_mask; - runtime_end = (ulong)&__efi_runtime_stop; -- runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK; -+ runtime_end = (runtime_end + runtime_mask) & ~runtime_mask; - runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT; - efi_add_memory_map(runtime_start, runtime_pages, - EFI_RUNTIME_SERVICES_CODE, false); --- -2.19.0 - -From af3ef8121fbfff175e963e03b3eedf13df5ce548 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Mon, 17 Sep 2018 04:35:10 +0200 -Subject: [PATCH 2/5] efi_loader: Merge memory map entries - -We currently do not combine memory entries that are adjacent and have -the same attributes. The problem with that is that our memory map can -easily grow multiple hundreds of entries in a simple UEFI Shell -environment. - -So let's make sure we always combine all entries to make the memory -map as small as possible. That way every other piece of code that -loops through it should also gain some nice speed ups. - -Signed-off-by: Alexander Graf ---- - lib/efi_loader/efi_memory.c | 45 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 45 insertions(+) - -diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c -index 50c3515f5e6..3fe014d9e72 100644 ---- a/lib/efi_loader/efi_memory.c -+++ b/lib/efi_loader/efi_memory.c -@@ -67,9 +67,54 @@ static int efi_mem_cmp(void *priv, struct list_head *a, struct list_head *b) - return -1; - } - -+static uint64_t desc_get_end(struct efi_mem_desc *desc) -+{ -+ return desc->physical_start + (desc->num_pages << EFI_PAGE_SHIFT); -+} -+ - static void efi_mem_sort(void) - { -+ struct list_head *lhandle; -+ struct efi_mem_list *prevmem = NULL; -+ bool merge_again = true; -+ - list_sort(NULL, &efi_mem, efi_mem_cmp); -+ -+ /* Now merge entries that can be merged */ -+ while (merge_again) { -+ merge_again = false; -+ list_for_each(lhandle, &efi_mem) { -+ struct efi_mem_list *lmem; -+ struct efi_mem_desc *prev = &prevmem->desc; -+ struct efi_mem_desc *cur; -+ uint64_t pages; -+ -+ lmem = list_entry(lhandle, struct efi_mem_list, link); -+ if (!prevmem) { -+ prevmem = lmem; -+ continue; -+ } -+ -+ cur = &lmem->desc; -+ -+ if ((desc_get_end(cur) == prev->physical_start) && -+ (prev->type == cur->type) && -+ (prev->attribute == cur->attribute)) { -+ /* There is an existing map before, reuse it */ -+ pages = cur->num_pages; -+ prev->num_pages += pages; -+ prev->physical_start -= pages << EFI_PAGE_SHIFT; -+ prev->virtual_start -= pages << EFI_PAGE_SHIFT; -+ list_del(&lmem->link); -+ free(lmem); -+ -+ merge_again = true; -+ break; -+ } -+ -+ prevmem = lmem; -+ } -+ } - } - - /** efi_mem_carve_out - unmap memory region --- -2.19.0 - -From 2b72b771cc760ca85f47a561c4055817e8bc8f25 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Sun, 23 Sep 2018 16:26:58 +0200 -Subject: [PATCH 3/5] efi_loader: Fix loaded_image handle passing from EL3 - -When running in EL3 mode on AArch64, we have to first drop to EL2 -to execute a UEFI payload. When dropping down, the arguments to -the entry point have to stay identical to the ones for normal entry -though. - -In commit ea54ad59286 ("efi_loader: pass handle of loaded image") -we incorrectly changed that logic and had the el3 entry path diverge. -Fix it up by syncing it back to what it's supposed to be. - -Fixes: ea54ad59286 ("efi_loader: pass handle of loaded image") -Signed-off-by: Alexander Graf ---- - cmd/bootefi.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cmd/bootefi.c b/cmd/bootefi.c -index b60c151fb4a..f2939da3e1a 100644 ---- a/cmd/bootefi.c -+++ b/cmd/bootefi.c -@@ -373,7 +373,7 @@ static efi_status_t do_bootefi_exec(void *efi, - - /* Move into EL2 and keep running there */ - armv8_switch_to_el2((ulong)entry, -- (ulong)&loaded_image_info_obj.handle, -+ (ulong)loaded_image_info_obj.handle, - (ulong)&systab, 0, (ulong)efi_run_in_el2, - ES_TO_AARCH64); - --- -2.19.0 - -From fdbf589100f6b1f9e4e12a53a0d370d88de5f7e3 Mon Sep 17 00:00:00 2001 -From: Stephen Warren -Date: Tue, 31 Jul 2018 13:44:12 -0600 -Subject: [PATCH 4/5] efi_loader: don't allocate unusable RAM - -Some boards define a maximum usable RAM top that's more restrictive than -the ranges defined by U-Boot's memory bank definitions[1]. In this case, -the unusable RAM isn't mapped in the page tables, and so the EFI code must -not attempt to allocate RAM from outside the usable regions. Fix -efi_find_free_memory() to detect when max_addr is unconstrained or out of -range, and substitue a valid value. - -[1] For example, when some peripherals can't access RAM above 4GiB, it's -simplest to force U-Boot's ram_top to a smaller value to avoid dealing -with this issue more explicitly. However, the RAM bank definitions still -describe the unusable RAM so that the booted OS has access to it, since -the OS can typically deal with such restrictions in a more complex -manner. - -Fixes: aa909462d018 "efi_loader: efi_allocate_pages is too restrictive" -Cc: Heinrich Schuchardt -Cc: Alexander Graf -Signed-off-by: Stephen Warren ---- - lib/efi_loader/efi_memory.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c -index 3fe014d9e72..bf9d6963cbe 100644 ---- a/lib/efi_loader/efi_memory.c -+++ b/lib/efi_loader/efi_memory.c -@@ -296,6 +296,9 @@ static uint64_t efi_find_free_memory(uint64_t len, uint64_t max_addr) - { - struct list_head *lhandle; - -+ if ((max_addr == -1ULL) || (max_addr > gd->ram_top)) -+ max_addr = gd->ram_top; -+ - list_for_each(lhandle, &efi_mem) { - struct efi_mem_list *lmem = list_entry(lhandle, - struct efi_mem_list, link); --- -2.19.0 - -From df3831a3833c2f477ef779a207cf973dd74ef0ee Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Fri, 28 Sep 2018 15:56:25 +0100 -Subject: [PATCH 5/5] efi_loader: remove efi_exit_caches() - -Since GRUB patch d0c070179d4d ("arm/efi: Switch to arm64 linux loader", -2018-07-09) we do not need a workaround for GRUB on 32bit ARM anymore. - -So let's eliminate function efi_exit_caches(). - -This will require Linux distributions to update grub-efi-arm to the GRUB -git HEAD (a tag containing the aforementioned GRUB patch is not available -yet). - -Signed-off-by: Heinrich Schuchardt -Signed-off-by: Peter Robinson ---- - lib/efi_loader/efi_boottime.c | 28 ---------------------------- - 1 file changed, 28 deletions(-) - -diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c -index 3935e4f1ce9..56557205d00 100644 ---- a/lib/efi_loader/efi_boottime.c -+++ b/lib/efi_loader/efi_boottime.c -@@ -27,14 +27,6 @@ LIST_HEAD(efi_obj_list); - /* List of all events */ - LIST_HEAD(efi_events); - --/* -- * If we're running on nasty systems (32bit ARM booting into non-EFI Linux) -- * we need to do trickery with caches. Since we don't want to break the EFI -- * aware boot path, only apply hacks when loading exiting directly (breaking -- * direct Linux EFI booting along the way - oh well). -- */ --static bool efi_is_direct_boot = true; -- - #ifdef CONFIG_ARM - /* - * The "gd" pointer lives in a register on ARM and AArch64 that we declare -@@ -1696,8 +1688,6 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, - EFI_ENTRY("%p, %p, %p", image_handle, exit_data_size, exit_data); - entry = info->reserved; - -- efi_is_direct_boot = false; -- - /* call the image! */ - if (setjmp(&info->exit_jmp)) { - /* -@@ -1811,21 +1801,6 @@ static efi_status_t EFIAPI efi_unload_image(efi_handle_t image_handle) - return EFI_EXIT(EFI_SUCCESS); - } - --/** -- * efi_exit_caches() - fix up caches for EFI payloads if necessary -- */ --static void efi_exit_caches(void) --{ --#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64) -- /* -- * Grub on 32bit ARM needs to have caches disabled before jumping into -- * a zImage, but does not know of all cache layers. Give it a hand. -- */ -- if (efi_is_direct_boot) -- cleanup_before_linux(); --#endif --} -- - /** - * efi_exit_boot_services() - stop all boot services - * @image_handle: handle of the loaded image -@@ -1879,9 +1854,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle, - - board_quiesce_devices(); - -- /* Fix up caches for EFI payloads if necessary */ -- efi_exit_caches(); -- - /* This stops all lingering devices */ - bootm_disable_interrupts(); - --- -2.19.0 -From 05e6d0b69f30c6b902ab9a343f4c4080a837ebd2 Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Thu, 4 Oct 2018 10:37:24 +0100 -Subject: [PATCH] efi_loader: fix simple network protocol - -We should not call eth_rx() before the network interface is initialized. -The services of the simple network protocol should check the state of -the network adapter. - -Provide a correctly aligned transmit buffer not depending on -CONFIG_EFI_LOADER_BOUNCE_BUFFER. - -Correct the unit test. - -Add and correct comments. - -Without this patch i.mx6 system Wandboard Quad rev B1 fails to execute -bootefi selftest. - -Signed-off-by: Heinrich Schuchardt -Signed-off-by: Peter Robinson ---- - lib/efi_loader/efi_net.c | 419 +++++++++++++++++++++++----- - lib/efi_selftest/efi_selftest_snp.c | 16 +- - 2 files changed, 359 insertions(+), 76 deletions(-) - -diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c -index 5a3d7be86cf..871c4c98228 100644 ---- a/lib/efi_loader/efi_net.c -+++ b/lib/efi_loader/efi_net.c -@@ -16,6 +16,8 @@ static const efi_guid_t efi_pxe_guid = EFI_PXE_GUID; - static struct efi_pxe_packet *dhcp_ack; - static bool new_rx_packet; - static void *new_tx_packet; -+static void *transmit_buffer; -+ - /* - * The notification function of this event is called in every timer cycle - * to check if a new network packet has been received. -@@ -37,22 +39,68 @@ struct efi_net_obj { - struct efi_pxe_mode pxe_mode; - }; - -+/* -+ * efi_net_start() - start the network interface -+ * -+ * This function implements the Start service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_start(struct efi_simple_network *this) - { -+ efi_status_t ret = EFI_SUCCESS; -+ - EFI_ENTRY("%p", this); - -- return EFI_EXIT(EFI_SUCCESS); -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ if (this->mode->state != EFI_NETWORK_STOPPED) -+ ret = EFI_ALREADY_STARTED; -+ else -+ this->mode->state = EFI_NETWORK_STARTED; -+out: -+ return EFI_EXIT(ret); - } - -+/* -+ * efi_net_stop() - stop the network interface -+ * -+ * This function implements the Stop service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this) - { -+ efi_status_t ret = EFI_SUCCESS; -+ - EFI_ENTRY("%p", this); - -- return EFI_EXIT(EFI_SUCCESS); -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ if (this->mode->state == EFI_NETWORK_STOPPED) -+ ret = EFI_NOT_STARTED; -+ else -+ this->mode->state = EFI_NETWORK_STOPPED; -+out: -+ return EFI_EXIT(ret); - } - - /* -- * Initialize network adapter and allocate transmit and receive buffers. -+ * efi_net_initialize() - initialize the network interface - * - * This function implements the Initialize service of the - * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -@@ -61,7 +109,7 @@ static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this) - * @this: pointer to the protocol instance - * @extra_rx: extra receive buffer to be allocated - * @extra_tx: extra transmit buffer to be allocated -- * @return: status code -+ * Return: status code - */ - static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this, - ulong extra_rx, ulong extra_tx) -@@ -71,9 +119,10 @@ static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this, - - EFI_ENTRY("%p, %lx, %lx", this, extra_rx, extra_tx); - -+ /* Check parameters */ - if (!this) { - r = EFI_INVALID_PARAMETER; -- goto error; -+ goto out; - } - - /* Setup packet buffers */ -@@ -86,32 +135,83 @@ static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this, - ret = eth_init(); - if (ret < 0) { - eth_halt(); -+ this->mode->state = EFI_NETWORK_STOPPED; - r = EFI_DEVICE_ERROR; -+ goto out; -+ } else { -+ this->mode->state = EFI_NETWORK_INITIALIZED; - } -- --error: -+out: - return EFI_EXIT(r); - } - -+/* -+ * efi_net_reset() - reinitialize the network interface -+ * -+ * This function implements the Reset service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * @extended_verification: execute exhaustive verification -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_reset(struct efi_simple_network *this, - int extended_verification) - { - EFI_ENTRY("%p, %x", this, extended_verification); - -- return EFI_EXIT(EFI_SUCCESS); -+ return EFI_EXIT(EFI_CALL(efi_net_initialize(this, 0, 0))); - } - -+/* -+ * efi_net_shutdown() - shut down the network interface -+ * -+ * This function implements the Shutdown service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_shutdown(struct efi_simple_network *this) - { -+ efi_status_t ret = EFI_SUCCESS; -+ - EFI_ENTRY("%p", this); - -- return EFI_EXIT(EFI_SUCCESS); -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ eth_halt(); -+ this->mode->state = EFI_NETWORK_STOPPED; -+ -+out: -+ return EFI_EXIT(ret); - } - --static efi_status_t EFIAPI efi_net_receive_filters( -- struct efi_simple_network *this, u32 enable, u32 disable, -- int reset_mcast_filter, ulong mcast_filter_count, -- struct efi_mac_address *mcast_filter) -+/* -+ * efi_net_receive_filters() - mange multicast receive filters -+ * -+ * This function implements the ReceiveFilters service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * @enable: bit mask of receive filters to enable -+ * @disable: bit mask of receive filters to disable -+ * @reset_mcast_filter: true resets contents of the filters -+ * @mcast_filter_count: number of hardware MAC addresses in the new filters list -+ * @mcast_filter: list of new filters -+ * Return: status code -+ */ -+static efi_status_t EFIAPI efi_net_receive_filters -+ (struct efi_simple_network *this, u32 enable, u32 disable, -+ int reset_mcast_filter, ulong mcast_filter_count, -+ struct efi_mac_address *mcast_filter) - { - EFI_ENTRY("%p, %x, %x, %x, %lx, %p", this, enable, disable, - reset_mcast_filter, mcast_filter_count, mcast_filter); -@@ -119,15 +219,40 @@ static efi_status_t EFIAPI efi_net_receive_filters( - return EFI_EXIT(EFI_UNSUPPORTED); - } - --static efi_status_t EFIAPI efi_net_station_address( -- struct efi_simple_network *this, int reset, -- struct efi_mac_address *new_mac) -+/* -+ * efi_net_station_address() - set the hardware MAC address -+ * -+ * This function implements the StationAddress service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * @reset: if true reset the address to default -+ * @new_mac: new MAC address -+ * Return: status code -+ */ -+static efi_status_t EFIAPI efi_net_station_address -+ (struct efi_simple_network *this, int reset, -+ struct efi_mac_address *new_mac) - { - EFI_ENTRY("%p, %x, %p", this, reset, new_mac); - - return EFI_EXIT(EFI_UNSUPPORTED); - } - -+/* -+ * efi_net_statistics() - reset or collect statistics of the network interface -+ * -+ * This function implements the Statistics service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * @reset: if true, the statistics are reset -+ * @stat_size: size of the statistics table -+ * @stat_table: table to receive the statistics -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_statistics(struct efi_simple_network *this, - int reset, ulong *stat_size, - void *stat_table) -@@ -137,6 +262,19 @@ static efi_status_t EFIAPI efi_net_statistics(struct efi_simple_network *this, - return EFI_EXIT(EFI_UNSUPPORTED); - } - -+/* -+ * efi_net_mcastiptomac() - translate multicast IP address to MAC address -+ * -+ * This function implements the Statistics service of the -+ * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface -+ * (UEFI) specification for details. -+ * -+ * @this: pointer to the protocol instance -+ * @ipv6: true if the IP address is an IPv6 address -+ * @ip: IP address -+ * @mac: MAC address -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_mcastiptomac(struct efi_simple_network *this, - int ipv6, - struct efi_ip_address *ip, -@@ -147,6 +285,19 @@ static efi_status_t EFIAPI efi_net_mcastiptomac(struct efi_simple_network *this, - return EFI_EXIT(EFI_INVALID_PARAMETER); - } - -+/** -+ * efi_net_nvdata() - read or write NVRAM -+ * -+ * This function implements the GetStatus service of the Simple Network -+ * Protocol. See the UEFI spec for details. -+ * -+ * @this: the instance of the Simple Network Protocol -+ * @readwrite: true for read, false for write -+ * @offset: offset in NVRAM -+ * @buffer_size: size of buffer -+ * @buffer: buffer -+ * Return: status code -+ */ - static efi_status_t EFIAPI efi_net_nvdata(struct efi_simple_network *this, - int read_write, ulong offset, - ulong buffer_size, char *buffer) -@@ -157,13 +308,42 @@ static efi_status_t EFIAPI efi_net_nvdata(struct efi_simple_network *this, - return EFI_EXIT(EFI_UNSUPPORTED); - } - -+/** -+ * efi_net_get_status() - get interrupt status -+ * -+ * This function implements the GetStatus service of the Simple Network -+ * Protocol. See the UEFI spec for details. -+ * -+ * @this: the instance of the Simple Network Protocol -+ * @int_status: interface status -+ * @txbuf: transmission buffer -+ */ - static efi_status_t EFIAPI efi_net_get_status(struct efi_simple_network *this, - u32 *int_status, void **txbuf) - { -+ efi_status_t ret = EFI_SUCCESS; -+ - EFI_ENTRY("%p, %p, %p", this, int_status, txbuf); - - efi_timer_check(); - -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ switch (this->mode->state) { -+ case EFI_NETWORK_STOPPED: -+ ret = EFI_NOT_STARTED; -+ goto out; -+ case EFI_NETWORK_STARTED: -+ ret = EFI_DEVICE_ERROR; -+ goto out; -+ default: -+ break; -+ } -+ - if (int_status) { - /* We send packets synchronously, so nothing is outstanding */ - *int_status = EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT; -@@ -174,65 +354,103 @@ static efi_status_t EFIAPI efi_net_get_status(struct efi_simple_network *this, - *txbuf = new_tx_packet; - - new_tx_packet = NULL; -- -- return EFI_EXIT(EFI_SUCCESS); -+out: -+ return EFI_EXIT(ret); - } - --static efi_status_t EFIAPI efi_net_transmit(struct efi_simple_network *this, -- size_t header_size, size_t buffer_size, void *buffer, -- struct efi_mac_address *src_addr, -- struct efi_mac_address *dest_addr, u16 *protocol) -+/** -+ * efi_net_transmit() - transmit a packet -+ * -+ * This function implements the Transmit service of the Simple Network Protocol. -+ * See the UEFI spec for details. -+ * -+ * @this: the instance of the Simple Network Protocol -+ * @header_size: size of the media header -+ * @buffer_size: size of the buffer to receive the packet -+ * @buffer: buffer to receive the packet -+ * @src_addr: source hardware MAC address -+ * @dest_addr: destination hardware MAC address -+ * @protocol: type of header to build -+ * Return: status code -+ */ -+static efi_status_t EFIAPI efi_net_transmit -+ (struct efi_simple_network *this, size_t header_size, -+ size_t buffer_size, void *buffer, -+ struct efi_mac_address *src_addr, -+ struct efi_mac_address *dest_addr, u16 *protocol) - { -+ efi_status_t ret = EFI_SUCCESS; -+ - EFI_ENTRY("%p, %lu, %lu, %p, %p, %p, %p", this, - (unsigned long)header_size, (unsigned long)buffer_size, - buffer, src_addr, dest_addr, protocol); - - efi_timer_check(); - -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ /* We do not support jumbo packets */ -+ if (buffer_size > PKTSIZE_ALIGN) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ - if (header_size) { -- /* We would need to create the header if header_size != 0 */ -- return EFI_EXIT(EFI_INVALID_PARAMETER); -+ /* -+ * TODO: We would need to create the header -+ * if header_size != 0 -+ */ -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ switch (this->mode->state) { -+ case EFI_NETWORK_STOPPED: -+ ret = EFI_NOT_STARTED; -+ goto out; -+ case EFI_NETWORK_STARTED: -+ ret = EFI_DEVICE_ERROR; -+ goto out; -+ default: -+ break; - } - --#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER - /* Ethernet packets always fit, just bounce */ -- memcpy(efi_bounce_buffer, buffer, buffer_size); -- net_send_packet(efi_bounce_buffer, buffer_size); --#else -- net_send_packet(buffer, buffer_size); --#endif -+ memcpy(transmit_buffer, buffer, buffer_size); -+ net_send_packet(transmit_buffer, buffer_size); - - new_tx_packet = buffer; - -- return EFI_EXIT(EFI_SUCCESS); -+out: -+ return EFI_EXIT(ret); - } - --static void efi_net_push(void *pkt, int len) --{ -- new_rx_packet = true; -- wait_for_packet->is_signaled = true; --} -- --/* -- * Receive a packet from a network interface. -+/** -+ * efi_net_receive() - receive a packet from a network interface - * - * This function implements the Receive service of the Simple Network Protocol. - * See the UEFI spec for details. - * -- * @this the instance of the Simple Network Protocol -- * @header_size size of the media header -- * @buffer_size size of the buffer to receive the packet -- * @buffer buffer to receive the packet -- * @src_addr source MAC address -- * @dest_addr destination MAC address -- * @protocol protocol -- * @return status code -+ * @this: the instance of the Simple Network Protocol -+ * @header_size: size of the media header -+ * @buffer_size: size of the buffer to receive the packet -+ * @buffer: buffer to receive the packet -+ * @src_addr: source MAC address -+ * @dest_addr: destination MAC address -+ * @protocol: protocol -+ * Return: status code - */ --static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, -- size_t *header_size, size_t *buffer_size, void *buffer, -- struct efi_mac_address *src_addr, -- struct efi_mac_address *dest_addr, u16 *protocol) -+static efi_status_t EFIAPI efi_net_receive -+ (struct efi_simple_network *this, size_t *header_size, -+ size_t *buffer_size, void *buffer, -+ struct efi_mac_address *src_addr, -+ struct efi_mac_address *dest_addr, u16 *protocol) - { -+ efi_status_t ret = EFI_SUCCESS; - struct ethernet_hdr *eth_hdr; - size_t hdr_size = sizeof(struct ethernet_hdr); - u16 protlen; -@@ -240,14 +458,35 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, - EFI_ENTRY("%p, %p, %p, %p, %p, %p, %p", this, header_size, - buffer_size, buffer, src_addr, dest_addr, protocol); - -+ /* Execute events */ - efi_timer_check(); - -- if (!new_rx_packet) -- return EFI_EXIT(EFI_NOT_READY); -+ /* Check parameters */ -+ if (!this) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ switch (this->mode->state) { -+ case EFI_NETWORK_STOPPED: -+ ret = EFI_NOT_STARTED; -+ goto out; -+ case EFI_NETWORK_STARTED: -+ ret = EFI_DEVICE_ERROR; -+ goto out; -+ default: -+ break; -+ } -+ -+ if (!new_rx_packet) { -+ ret = EFI_NOT_READY; -+ goto out; -+ } - /* Check that we at least received an Ethernet header */ - if (net_rx_packet_len < sizeof(struct ethernet_hdr)) { - new_rx_packet = false; -- return EFI_EXIT(EFI_NOT_READY); -+ ret = EFI_NOT_READY; -+ goto out; - } - /* Fill export parameters */ - eth_hdr = (struct ethernet_hdr *)net_rx_packet; -@@ -265,18 +504,24 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, - if (protocol) - *protocol = protlen; - if (*buffer_size < net_rx_packet_len) { -- /* Packet doesn't fit, try again with bigger buf */ -+ /* Packet doesn't fit, try again with bigger buffer */ - *buffer_size = net_rx_packet_len; -- return EFI_EXIT(EFI_BUFFER_TOO_SMALL); -+ ret = EFI_BUFFER_TOO_SMALL; -+ goto out; - } - /* Copy packet */ - memcpy(buffer, net_rx_packet, net_rx_packet_len); - *buffer_size = net_rx_packet_len; - new_rx_packet = false; -- -- return EFI_EXIT(EFI_SUCCESS); -+out: -+ return EFI_EXIT(ret); - } - -+/** -+ * efi_net_set_dhcp_ack() - take note of a selected DHCP IP address -+ * -+ * This function is called by dhcp_handler(). -+ */ - void efi_net_set_dhcp_ack(void *pkt, int len) - { - int maxsize = sizeof(*dhcp_ack); -@@ -287,8 +532,22 @@ void efi_net_set_dhcp_ack(void *pkt, int len) - memcpy(dhcp_ack, pkt, min(len, maxsize)); - } - --/* -- * Check if a new network packet has been received. -+/** -+ * efi_net_push() - callback for received network packet -+ * -+ * This function is called when a network packet is received by eth_rx(). -+ * -+ * @pkt: network packet -+ * @len: length -+ */ -+static void efi_net_push(void *pkt, int len) -+{ -+ new_rx_packet = true; -+ wait_for_packet->is_signaled = true; -+} -+ -+/** -+ * efi_network_timer_notify() - check if a new network packet has been received - * - * This notification function is called in every timer cycle. - * -@@ -298,20 +557,34 @@ void efi_net_set_dhcp_ack(void *pkt, int len) - static void EFIAPI efi_network_timer_notify(struct efi_event *event, - void *context) - { -+ struct efi_simple_network *this = (struct efi_simple_network *)context; -+ - EFI_ENTRY("%p, %p", event, context); - -+ /* -+ * Some network drivers do not support calling eth_rx() before -+ * initialization. -+ */ -+ if (!this || this->mode->state != EFI_NETWORK_INITIALIZED) -+ goto out; -+ - if (!new_rx_packet) { - push_packet = efi_net_push; - eth_rx(); - push_packet = NULL; - } -+out: - EFI_EXIT(EFI_SUCCESS); - } - --/* This gets called from do_bootefi_exec(). */ -+/** -+ * efi_net_register() - register the simple network protocol -+ * -+ * This gets called from do_bootefi_exec(). -+ */ - efi_status_t efi_net_register(void) - { -- struct efi_net_obj *netobj; -+ struct efi_net_obj *netobj = NULL; - efi_status_t r; - - if (!eth_get_dev()) { -@@ -321,10 +594,15 @@ efi_status_t efi_net_register(void) - - /* We only expose the "active" eth device, so one is enough */ - netobj = calloc(1, sizeof(*netobj)); -- if (!netobj) { -- printf("ERROR: Out of memory\n"); -- return EFI_OUT_OF_RESOURCES; -- } -+ if (!netobj) -+ goto out_of_resources; -+ -+ /* Allocate an aligned transmit buffer */ -+ transmit_buffer = calloc(1, PKTSIZE_ALIGN + ARCH_DMA_MINALIGN); -+ if (!transmit_buffer) -+ goto out_of_resources; -+ transmit_buffer = (void *)ALIGN((uintptr_t)transmit_buffer, -+ ARCH_DMA_MINALIGN); - - /* Hook net up to the device list */ - efi_add_handle(&netobj->parent); -@@ -387,13 +665,13 @@ efi_status_t efi_net_register(void) - * iPXE is running at TPL_CALLBACK most of the time. Use a higher TPL. - */ - r = efi_create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, -- efi_network_timer_notify, NULL, NULL, -+ efi_network_timer_notify, &netobj->net, NULL, - &network_timer_event); - if (r != EFI_SUCCESS) { - printf("ERROR: Failed to register network event\n"); - return r; - } -- /* Network is time critical, create event in every timer cyle */ -+ /* Network is time critical, create event in every timer cycle */ - r = efi_set_timer(network_timer_event, EFI_TIMER_PERIODIC, 0); - if (r != EFI_SUCCESS) { - printf("ERROR: Failed to set network timer\n"); -@@ -404,4 +682,9 @@ efi_status_t efi_net_register(void) - failure_to_add_protocol: - printf("ERROR: Failure to add protocol\n"); - return r; -+out_of_resources: -+ free(netobj); -+ /* free(transmit_buffer) not needed yet */ -+ printf("ERROR: Out of memory\n"); -+ return EFI_OUT_OF_RESOURCES; - } -diff --git a/lib/efi_selftest/efi_selftest_snp.c b/lib/efi_selftest/efi_selftest_snp.c -index 09bd53da82d..e10a34ba645 100644 ---- a/lib/efi_selftest/efi_selftest_snp.c -+++ b/lib/efi_selftest/efi_selftest_snp.c -@@ -103,7 +103,7 @@ static efi_status_t send_dhcp_discover(void) - struct dhcp p = {}; - - /* -- * Fill ethernet header -+ * Fill Ethernet header - */ - boottime->copy_mem(p.eth_hdr.et_dest, (void *)BROADCAST_MAC, ARP_HLEN); - boottime->copy_mem(p.eth_hdr.et_src, &net->mode->current_address, -@@ -229,19 +229,19 @@ static int setup(const efi_handle_t handle, - return EFI_ST_FAILURE; - } - /* -- * Initialize network adapter. -+ * Start network adapter. - */ -- ret = net->initialize(net, 0, 0); -- if (ret != EFI_SUCCESS) { -- efi_st_error("Failed to initialize network adapter\n"); -+ ret = net->start(net); -+ if (ret != EFI_SUCCESS && ret != EFI_ALREADY_STARTED) { -+ efi_st_error("Failed to start network adapter\n"); - return EFI_ST_FAILURE; - } - /* -- * Start network adapter. -+ * Initialize network adapter. - */ -- ret = net->start(net); -+ ret = net->initialize(net, 0, 0); - if (ret != EFI_SUCCESS) { -- efi_st_error("Failed to start network adapter\n"); -+ efi_st_error("Failed to initialize network adapter\n"); - return EFI_ST_FAILURE; - } - return EFI_ST_SUCCESS; --- -2.19.0 -