Merge tag 'efi-2023-07-rc4' of https://source.denx.de/u-boot/custodians/u-boot-efi

Pull request efi-2023-07-rc4

Documentation:

* man pages for loadb, loadx

UEFI:

* check return value of part_get_info()
* improve unit test for RegisterProtocolNotify()
diff --git a/doc/android/boot-image.rst b/doc/android/boot-image.rst
index c719b4d..8f247c7 100644
--- a/doc/android/boot-image.rst
+++ b/doc/android/boot-image.rst
@@ -11,7 +11,7 @@
 (like ``zImage`` file) and ramdisk. Sometimes it can contain additional
 binaries. This image is built as a part of AOSP (called ``boot.img``), and being
 flashed into ``boot`` partition on eMMC. Bootloader then reads that image from
-``boot`` partition to RAM and boots the kernel from it. Kernel than starts
+``boot`` partition to RAM and boots the kernel from it. Kernel then starts
 ``init`` process from the ramdisk. It should be mentioned that recovery image
 (``recovery.img``) also has Android Boot Image format.
 
diff --git a/doc/usage/cmd/loadb.rst b/doc/usage/cmd/loadb.rst
new file mode 100644
index 0000000..b37d1d7
--- /dev/null
+++ b/doc/usage/cmd/loadb.rst
@@ -0,0 +1,70 @@
+.. SPDX-License-Identifier: GPL-2.0+:
+
+loadb command
+=============
+
+Synopsis
+--------
+
+::
+
+    loadb [addr [baud]]
+
+Description
+-----------
+
+The loady command is used to transfer a file to the device via the serial line
+using the Kermit protocol.
+
+The number of transferred bytes is saved in environment variable filesize.
+
+addr
+    load address, defaults to environment variable loadaddr or if loadaddr is
+    not set to configuration variable CONFIG_SYS_LOAD_ADDR
+
+baud
+    baud rate for the Kermit transmission. After the transmission the baud
+    rate is reset to the original value.
+
+Example
+-------
+
+In the example below the terminal emulation program picocom and G-Kermit
+serve to transfer a file to a device.
+
+.. code-block:: bash
+
+    picocom --baud 115200 --send-cmd "gkermit -iXvs" /dev/ttyUSB0
+
+After entering the loadb command the key sequence <CTRL-A><CTRL-S> is used to
+let picocom prompt for the file name. Picocom invokes G-Kermit for the file
+transfer.
+
+::
+
+    => loadb 60800000 115200
+    ## Ready for binary (kermit) download to 0x60800000 at 115200 bps...
+
+    *** file: helloworld.efi
+    $ gkermit -iXvs helloworld.efi
+    G-Kermit 2.01, The Kermit Project, 2021-11-15
+    Escape back to your local Kermit and give a RECEIVE command.
+
+    KERMIT READY TO SEND...
+    |
+    *** exit status: 0 ***
+    ## Total Size      = 0x00000c00 = 3072 Bytes
+    ## Start Addr      = 0x60800000
+    =>
+
+The transfer can be cancelled by pressing <CTRL+C>.
+
+Configuration
+-------------
+
+The command is only available if CONFIG_CMD_LOADB=y.
+
+Return value
+------------
+
+The return value $? is 0 (true) on success, 1 (false) on error.
diff --git a/doc/usage/cmd/loadx.rst b/doc/usage/cmd/loadx.rst
new file mode 100644
index 0000000..facca9b
--- /dev/null
+++ b/doc/usage/cmd/loadx.rst
@@ -0,0 +1,77 @@
+.. SPDX-License-Identifier: GPL-2.0+:
+
+loadx command
+=============
+
+Synopsis
+--------
+
+::
+
+    loadx [addr [baud]]
+
+Description
+-----------
+
+The loadx command is used to transfer a file to the device via the serial line
+using the XMODEM protocol.
+
+The number of transferred bytes is saved in environment variable filesize.
+
+addr
+    load address, defaults to environment variable loadaddr or if loadaddr is
+    not set to configuration variable CONFIG_SYS_LOAD_ADDR
+
+baud
+    baud rate for the ymodem transmission. After the transmission the baud
+    rate is reset to the original value.
+
+Example
+-------
+
+In the example below the terminal emulation program picocom was used to
+transfer a file to the device.
+
+.. code-block::
+
+    picocom --send-cmd 'sx -b vv' --baud 115200 /dev/ttyUSB0
+
+After entering the loadx command the key sequence <CTRL-A><CTRL-S> is used to
+let picocom prompt for the file name. Picocom invokes the program sx for the
+file transfer.
+
+::
+
+    => loadx 60800000 115200
+    ## Ready for binary (xmodem) download to 0x60800000 at 115200 bps...
+    C
+    *** file: helloworld.efi
+    $ sx -b vv helloworld.efi
+    sx: cannot open vv: No such file or directory
+    Sending helloworld.efi, 24 blocks: Give your local XMODEM receive command now.
+    Xmodem sectors/kbytes sent:   0/ 0kRetry 0: NAK on sector
+    Bytes Sent:   3072   BPS:1147
+
+    Transfer incomplete
+
+    *** exit status: 1 ***
+    ## Total Size      = 0x00000c00 = 3072 Bytes
+    ## Start Addr      = 0x60800000
+    =>
+
+The transfer can be cancelled by pressing 3 times <CTRL+C> after two seconds
+of inactivity on terminal.
+
+Configuration
+-------------
+
+The command is only available if CONFIG_CMD_LOADB=y.
+
+Initial timeout in seconds while waiting for transfer is configured by
+config option CMD_LOADXY_TIMEOUT or by env variable $loadxy_timeout.
+Setting it to 0 means infinite timeout.
+
+Return value
+------------
+
+The return value $? is 0 (true) on success, 1 (false) otherwise.
diff --git a/doc/usage/cmd/loady.rst b/doc/usage/cmd/loady.rst
index 718af6e..3f8227e 100644
--- a/doc/usage/cmd/loady.rst
+++ b/doc/usage/cmd/loady.rst
@@ -56,6 +56,9 @@
     6165f
     =>
 
+Transfer can be cancelled by pressing 3 times <CTRL+C> after two seconds
+of inactivity on terminal.
+
 Configuration
 -------------
 
@@ -65,10 +68,7 @@
 config option CMD_LOADXY_TIMEOUT or by env variable $loadxy_timeout.
 Setting it to 0 means infinite timeout.
 
-Transfer can be cancelled by pressing 3 times <CTRL+C> after two seconds
-of inactivity on terminal.
-
 Return value
 ------------
 
-The return value $? is always 0 (true).
+The return value $? is 0 (true) on success, 1 (false) otherwise.
diff --git a/doc/usage/index.rst b/doc/usage/index.rst
index 0fde130..84ef8a9 100644
--- a/doc/usage/index.rst
+++ b/doc/usage/index.rst
@@ -63,7 +63,9 @@
    cmd/gpio
    cmd/host
    cmd/load
+   cmd/loadb
    cmd/loadm
+   cmd/loadx
    cmd/loady
    cmd/mbr
    cmd/md
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
index 71923b1..04ebb44 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -843,12 +843,17 @@
  * @buf		buffer to which the device path is written
  * @desc	block device descriptor
  * @part	partition number, 0 identifies a block device
+ *
+ * Return:	pointer to position after the node
  */
 static void *dp_part_node(void *buf, struct blk_desc *desc, int part)
 {
 	struct disk_partition info;
+	int ret;
 
-	part_get_info(desc, part, &info);
+	ret = part_get_info(desc, part, &info);
+	if (ret < 0)
+		return buf;
 
 	if (desc->part_type == PART_TYPE_ISO) {
 		struct efi_device_path_cdrom_path *cddp = buf;
diff --git a/lib/efi_selftest/efi_selftest_register_notify.c b/lib/efi_selftest/efi_selftest_register_notify.c
index ad763dd..ad4bcce 100644
--- a/lib/efi_selftest/efi_selftest_register_notify.c
+++ b/lib/efi_selftest/efi_selftest_register_notify.c
@@ -24,6 +24,7 @@
 	efi_uintn_t notify_count;
 	efi_uintn_t handle_count;
 	efi_handle_t *handles;
+	efi_status_t ret;
 };
 
 static struct efi_boot_services *boottime;
@@ -46,17 +47,18 @@
 static void EFIAPI notify(struct efi_event *event, void *context)
 {
 	struct context *cp = context;
-	efi_status_t ret;
 	efi_uintn_t handle_count;
 	efi_handle_t *handles;
 
 	cp->notify_count++;
 
 	for (;;) {
-		ret = boottime->locate_handle_buffer(BY_REGISTER_NOTIFY, NULL,
-						     cp->registration_key,
-						     &handle_count, &handles);
-		if (ret != EFI_SUCCESS)
+		cp->ret = boottime->locate_handle_buffer(BY_REGISTER_NOTIFY,
+							 NULL,
+							 cp->registration_key,
+							 &handle_count,
+							 &handles);
+		if (cp->ret != EFI_SUCCESS)
 			break;
 		cp->handle_count += handle_count;
 		cp->handles = handles;
@@ -204,6 +206,10 @@
 		efi_st_error("LocateHandle failed\n");
 		return EFI_ST_FAILURE;
 	}
+	if (context.ret != EFI_NOT_FOUND) {
+		efi_st_error("LocateHandle did not return EFI_NOT_FOUND\n");
+		return EFI_ST_FAILURE;
+	}
 	ret = boottime->free_pool(context.handles);
 	if (ret != EFI_SUCCESS) {
 		efi_st_error("FreePool failed\n");