Merge tag 'efi-2023-01-rc1-3' of https://source.denx.de/u-boot/custodians/u-boot-efi

Pull request for efi-2023-01-rc1-3

UEFI:
* replace EFI_CALL() by internal functions
* delete loadfile2 handle by uninstalling all protocols

Other:

* Provide spi_set_speed() needed for implementation of
  EFI SPI I/O protocol
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index b93c0d3..2a7d429 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -394,8 +394,10 @@
 out:
 	free(load_options);
 
-	if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD))
-		efi_initrd_deregister();
+	if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) {
+		if (efi_initrd_deregister() != EFI_SUCCESS)
+			log_err("Failed to remove loadfile2 for initrd\n");
+	}
 
 	/* Control is returned to U-Boot, disable EFI watchdog */
 	efi_set_watchdog(0);
diff --git a/cmd/efidebug.c b/cmd/efidebug.c
index 4b49f30..ef239bb 100644
--- a/cmd/efidebug.c
+++ b/cmd/efidebug.c
@@ -25,7 +25,6 @@
 #include <linux/err.h>
 
 #define BS systab.boottime
-#define RT systab.runtime
 
 #ifdef CONFIG_EFI_HAVE_CAPSULE_SUPPORT
 /**
@@ -76,7 +75,7 @@
 		       capsule->capsule_image_size);
 	}
 
-	ret = EFI_CALL(RT->update_capsule(&capsule, 1, 0));
+	ret = EFI_CALL(efi_update_capsule(&capsule, 1, 0));
 	if (ret) {
 		printf("Cannot handle a capsule at %p\n", capsule);
 		return CMD_RET_FAILURE;
@@ -995,17 +994,16 @@
 	efi_status_t ret;
 
 	size = 0;
-	ret = EFI_CALL(efi_get_variable(varname16, &efi_global_variable_guid,
-					NULL, &size, NULL));
+	ret = efi_get_variable_int(varname16, &efi_global_variable_guid,
+				   NULL, &size, NULL, NULL);
 	if (ret == EFI_BUFFER_TOO_SMALL) {
 		data = malloc(size);
 		if (!data) {
 			printf("ERROR: Out of memory\n");
 			return;
 		}
-		ret = EFI_CALL(efi_get_variable(varname16,
-						&efi_global_variable_guid,
-						NULL, &size, data));
+		ret = efi_get_variable_int(varname16, &efi_global_variable_guid,
+					   NULL, &size, data, NULL);
 		if (ret == EFI_SUCCESS)
 			show_efi_boot_opt_data(varname16, data, &size);
 		free(data);
@@ -1057,8 +1055,7 @@
 	var_name16[0] = 0;
 	for (;;) {
 		size = buf_size;
-		ret = EFI_CALL(efi_get_next_variable_name(&size, var_name16,
-							  &guid));
+		ret = efi_get_next_variable_name_int(&size, var_name16, &guid);
 		if (ret == EFI_NOT_FOUND)
 			break;
 		if (ret == EFI_BUFFER_TOO_SMALL) {
@@ -1069,9 +1066,8 @@
 				return CMD_RET_FAILURE;
 			}
 			var_name16 = p;
-			ret = EFI_CALL(efi_get_next_variable_name(&size,
-								  var_name16,
-								  &guid));
+			ret = efi_get_next_variable_name_int(&size, var_name16,
+							     &guid);
 		}
 		if (ret != EFI_SUCCESS) {
 			free(var_name16);
@@ -1114,8 +1110,8 @@
 	efi_status_t ret;
 
 	size = 0;
-	ret = EFI_CALL(efi_get_variable(u"BootOrder", &efi_global_variable_guid,
-					NULL, &size, NULL));
+	ret = efi_get_variable_int(u"BootOrder", &efi_global_variable_guid,
+				   NULL, &size, NULL, NULL);
 	if (ret != EFI_BUFFER_TOO_SMALL) {
 		if (ret == EFI_NOT_FOUND) {
 			printf("BootOrder not defined\n");
@@ -1129,8 +1125,8 @@
 		printf("ERROR: Out of memory\n");
 		return CMD_RET_FAILURE;
 	}
-	ret = EFI_CALL(efi_get_variable(u"BootOrder", &efi_global_variable_guid,
-					NULL, &size, bootorder));
+	ret = efi_get_variable_int(u"BootOrder", &efi_global_variable_guid,
+				   NULL, &size, bootorder, NULL);
 	if (ret != EFI_SUCCESS) {
 		ret = CMD_RET_FAILURE;
 		goto out;
@@ -1142,9 +1138,9 @@
 					"Boot", bootorder[i]);
 
 		size = 0;
-		ret = EFI_CALL(efi_get_variable(var_name16,
-						&efi_global_variable_guid, NULL,
-						&size, NULL));
+		ret = efi_get_variable_int(var_name16,
+					   &efi_global_variable_guid, NULL,
+					   &size, NULL, NULL);
 		if (ret != EFI_BUFFER_TOO_SMALL) {
 			printf("%2d: %ls: (not defined)\n", i + 1, var_name16);
 			continue;
@@ -1155,9 +1151,9 @@
 			ret = CMD_RET_FAILURE;
 			goto out;
 		}
-		ret = EFI_CALL(efi_get_variable(var_name16,
-						&efi_global_variable_guid, NULL,
-						&size, data));
+		ret = efi_get_variable_int(var_name16,
+					   &efi_global_variable_guid, NULL,
+					   &size, data, NULL);
 		if (ret != EFI_SUCCESS) {
 			free(data);
 			ret = CMD_RET_FAILURE;
@@ -1444,10 +1440,9 @@
 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
 	}
 
-	ret = EFI_CALL(efi_query_variable_info(attr,
-					       &max_variable_storage_size,
-					       &remain_variable_storage_size,
-					       &max_variable_size));
+	ret = efi_query_variable_info_int(attr, &max_variable_storage_size,
+					  &remain_variable_storage_size,
+					  &max_variable_size);
 	if (ret != EFI_SUCCESS) {
 		printf("Error: Cannot query UEFI variables, r = %lu\n",
 		       ret & ~EFI_ERROR_MASK);
diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c
index f2791c4..c929e7c 100644
--- a/drivers/spi/spi-uclass.c
+++ b/drivers/spi/spi-uclass.c
@@ -130,6 +130,21 @@
 	dm_spi_release_bus(slave->dev);
 }
 
+int spi_set_speed(struct spi_slave *slave, uint hz)
+{
+	struct dm_spi_ops *ops;
+	int ret;
+
+	ops = spi_get_ops(slave->dev->parent);
+	if (ops->set_speed)
+		ret = ops->set_speed(slave->dev->parent, hz);
+	else
+		ret = -EINVAL;
+	if (ret)
+		dev_err(slave->dev, "Cannot set speed (err=%d)\n", ret);
+	return ret;
+}
+
 int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
 	     const void *dout, void *din, unsigned long flags)
 {
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 1bac3f4..0c6c95b 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -570,7 +570,7 @@
 /* Called by bootefi to make the watchdog available */
 efi_status_t efi_watchdog_register(void);
 efi_status_t efi_initrd_register(void);
-void efi_initrd_deregister(void);
+efi_status_t efi_initrd_deregister(void);
 /* Called by bootefi to make SMBIOS tables available */
 /**
  * efi_acpi_register() - write out ACPI tables
diff --git a/include/spi.h b/include/spi.h
index 9a8c1fb..1bc18e6 100644
--- a/include/spi.h
+++ b/include/spi.h
@@ -352,8 +352,10 @@
  * This sets a new speed to be applied for next spi_xfer().
  * @slave:	The SPI slave
  * @hz:		The transfer speed
+ *
+ * Returns:	0 on success, or a negative value on error.
  */
-void spi_set_speed(struct spi_slave *slave, uint hz);
+int spi_set_speed(struct spi_slave *slave, uint hz);
 
 /**
  * Write 8 bits, then read 8 bits.
diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
index 3354b21..ab83f8b 100644
--- a/lib/efi_loader/efi_console.c
+++ b/lib/efi_loader/efi_console.c
@@ -462,6 +462,20 @@
 
 /**
  * efi_cout_clear_screen() - clear screen
+ */
+static void efi_clear_screen(void)
+{
+	/*
+	 * The Linux console wants both a clear and a home command. The video
+	 * uclass does not support <ESC>[H without coordinates, yet.
+	 */
+	printf(ESC "[2J" ESC "[1;1H");
+	efi_con_mode.cursor_column = 0;
+	efi_con_mode.cursor_row = 0;
+}
+
+/**
+ * efi_cout_clear_screen() - clear screen
  *
  * This function implements the ClearScreen service of the simple text output
  * protocol. See the Unified Extensible Firmware Interface (UEFI) specification
@@ -475,13 +489,7 @@
 {
 	EFI_ENTRY("%p", this);
 
-	/*
-	 * The Linux console wants both a clear and a home command. The video
-	 * uclass does not support <ESC>[H without coordinates, yet.
-	 */
-	printf(ESC "[2J" ESC "[1;1H");
-	efi_con_mode.cursor_column = 0;
-	efi_con_mode.cursor_row = 0;
+	efi_clear_screen();
 
 	return EFI_EXIT(EFI_SUCCESS);
 }
@@ -510,7 +518,7 @@
 		return EFI_EXIT(EFI_UNSUPPORTED);
 
 	efi_con_mode.mode = mode_number;
-	EFI_CALL(efi_cout_clear_screen(this));
+	efi_clear_screen();
 
 	return EFI_EXIT(EFI_SUCCESS);
 }
@@ -536,7 +544,7 @@
 	efi_con_mode.attribute = 0x07;
 	printf(ESC "[0;37;40m");
 	/* Clear screen */
-	EFI_CALL(efi_cout_clear_screen(this));
+	efi_clear_screen();
 
 	return EFI_EXIT(EFI_SUCCESS);
 }
@@ -1351,9 +1359,7 @@
 	       ANSI_CLEAR_LINE_TO_END
 	       ANSI_CURSOR_SHOW, row, col);
 
-	ret = EFI_CALL(cin->reset(cin, false));
-	if (ret != EFI_SUCCESS)
-		return ret;
+	efi_cin_empty_buffer();
 
 	for (;;) {
 		do {
diff --git a/lib/efi_loader/efi_load_initrd.c b/lib/efi_loader/efi_load_initrd.c
index 87fde3f..1934337 100644
--- a/lib/efi_loader/efi_load_initrd.c
+++ b/lib/efi_loader/efi_load_initrd.c
@@ -213,7 +213,7 @@
 						       &efi_guid_device_path, &dp_lf2_handle,
 						       /* LOAD_FILE2 */
 						       &efi_guid_load_file2_protocol,
-						       (void *)&efi_lf2_protocol,
+						       &efi_lf2_protocol,
 						       NULL);
 
 	return ret;
@@ -227,11 +227,22 @@
  *
  * Return:	status code
  */
-void efi_initrd_deregister(void)
+efi_status_t efi_initrd_deregister(void)
 {
-	if (!efi_initrd_handle)
-		return;
+	efi_status_t ret;
 
-	efi_delete_handle(efi_initrd_handle);
+	if (!efi_initrd_handle)
+		return EFI_SUCCESS;
+
+	ret = efi_uninstall_multiple_protocol_interfaces(efi_initrd_handle,
+							 /* initramfs */
+							 &efi_guid_device_path,
+							 &dp_lf2_handle,
+							 /* LOAD_FILE2 */
+							 &efi_guid_load_file2_protocol,
+							 &efi_lf2_protocol,
+							 NULL);
 	efi_initrd_handle = NULL;
+
+	return ret;
 }