@@ -22,7 +22,7 @@ TFM_SIGN_PRIVATE_KEY = "${libdir}/tfm-scripts/root-RSA-3072_1.pem"
RE_IMAGE_OFFSET = "0x1000"
# u-boot
-PREFERRED_VERSION_u-boot ?= "2022.07"
+PREFERRED_VERSION_u-boot ?= "2022.10"
EXTRA_IMAGEDEPENDS += "u-boot"
UBOOT_CONFIG ??= "EFI"
similarity index 78%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm64-smccc-add-support-for-SMCCCv1.2-x0-x17-registe.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-arm64-smccc-add-support-for-SMCCCv1.2-x0-x17-registe.patch
@@ -1,7 +1,7 @@
-From 7afe2370bc24b9003be8184fbd3169ebca03165a Mon Sep 17 00:00:00 2001
+From 584e4952dca726c3dc9df319dffb37a518b65c14 Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Date: Fri, 29 Jul 2022 13:06:19 +0100
-Subject: [PATCH 06/26] arm64: smccc: add support for SMCCCv1.2 x0-x17
+Subject: [PATCH 01/25] arm64: smccc: add support for SMCCCv1.2 x0-x17
registers
add support for x0-x17 registers used by the SMC calls
@@ -16,13 +16,19 @@ arm64: smccc: Add support for SMCCCv1.2 extended input/output registers
[1]: https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6?token=
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
-
----
+Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v7:
+
+* improve indentation of ARM_SMCCC_1_2_REGS_Xn_OFFS
+
v4:
* rename the commit title and improve description
@@ -33,11 +39,11 @@ v3:
* port x0-x17 registers support from linux kernel as defined by SMCCCv1.2
commit title:
arm64: smccc: add Xn registers support used by SMC calls
-
+---
arch/arm/cpu/armv8/smccc-call.S | 53 +++++++++++++++++++++++++++++++++
- arch/arm/lib/asm-offsets.c | 13 ++++++++
+ arch/arm/lib/asm-offsets.c | 14 +++++++++
include/linux/arm-smccc.h | 43 ++++++++++++++++++++++++++
- 3 files changed, 109 insertions(+)
+ 3 files changed, 110 insertions(+)
diff --git a/arch/arm/cpu/armv8/smccc-call.S b/arch/arm/cpu/armv8/smccc-call.S
index dc92b28777..ec6f299bc9 100644
@@ -108,38 +114,39 @@ index dc92b28777..ec6f299bc9 100644
+
+#endif
diff --git a/arch/arm/lib/asm-offsets.c b/arch/arm/lib/asm-offsets.c
-index 22fd541f9a..b6bd1b32b0 100644
+index 22fd541f9a..db6d7ed234 100644
--- a/arch/arm/lib/asm-offsets.c
+++ b/arch/arm/lib/asm-offsets.c
-@@ -9,6 +9,8 @@
+@@ -9,6 +9,9 @@
* generate asm statements containing #defines,
* compile this file to assembler, and then extract the
* #defines from the assembly-language output.
+ *
+ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
*/
#include <common.h>
-@@ -117,6 +119,17 @@ int main(void)
+@@ -117,6 +120,17 @@ int main(void)
DEFINE(ARM_SMCCC_RES_X2_OFFS, offsetof(struct arm_smccc_res, a2));
DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id));
DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state));
-+ #ifdef CONFIG_ARM64
-+ DEFINE(ARM_SMCCC_1_2_REGS_X0_OFFS, offsetof(struct arm_smccc_1_2_regs, a0));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X2_OFFS, offsetof(struct arm_smccc_1_2_regs, a2));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X4_OFFS, offsetof(struct arm_smccc_1_2_regs, a4));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X6_OFFS, offsetof(struct arm_smccc_1_2_regs, a6));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X8_OFFS, offsetof(struct arm_smccc_1_2_regs, a8));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X10_OFFS, offsetof(struct arm_smccc_1_2_regs, a10));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X12_OFFS, offsetof(struct arm_smccc_1_2_regs, a12));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X14_OFFS, offsetof(struct arm_smccc_1_2_regs, a14));
-+ DEFINE(ARM_SMCCC_1_2_REGS_X16_OFFS, offsetof(struct arm_smccc_1_2_regs, a16));
-+ #endif
++#ifdef CONFIG_ARM64
++ DEFINE(ARM_SMCCC_1_2_REGS_X0_OFFS, offsetof(struct arm_smccc_1_2_regs, a0));
++ DEFINE(ARM_SMCCC_1_2_REGS_X2_OFFS, offsetof(struct arm_smccc_1_2_regs, a2));
++ DEFINE(ARM_SMCCC_1_2_REGS_X4_OFFS, offsetof(struct arm_smccc_1_2_regs, a4));
++ DEFINE(ARM_SMCCC_1_2_REGS_X6_OFFS, offsetof(struct arm_smccc_1_2_regs, a6));
++ DEFINE(ARM_SMCCC_1_2_REGS_X8_OFFS, offsetof(struct arm_smccc_1_2_regs, a8));
++ DEFINE(ARM_SMCCC_1_2_REGS_X10_OFFS, offsetof(struct arm_smccc_1_2_regs, a10));
++ DEFINE(ARM_SMCCC_1_2_REGS_X12_OFFS, offsetof(struct arm_smccc_1_2_regs, a12));
++ DEFINE(ARM_SMCCC_1_2_REGS_X14_OFFS, offsetof(struct arm_smccc_1_2_regs, a14));
++ DEFINE(ARM_SMCCC_1_2_REGS_X16_OFFS, offsetof(struct arm_smccc_1_2_regs, a16));
++#endif
#endif
return 0;
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
-index 7f2be23394..dae58d3476 100644
+index e1d09884a1..9105031d55 100644
--- a/include/linux/arm-smccc.h
+++ b/include/linux/arm-smccc.h
@@ -1,6 +1,8 @@
@@ -151,7 +158,7 @@ index 7f2be23394..dae58d3476 100644
*/
#ifndef __LINUX_ARM_SMCCC_H
#define __LINUX_ARM_SMCCC_H
-@@ -66,6 +68,47 @@ struct arm_smccc_res {
+@@ -70,6 +72,47 @@ struct arm_smccc_res {
unsigned long a3;
};
deleted file mode 100644
@@ -1,186 +0,0 @@
-From 910760408430de32ad08b1e5ddf894cc9f2f3d0c Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Thu, 24 Jun 2021 09:25:00 +0100
-Subject: [PATCH 01/26] cmd: load: add load command for memory mapped
-
-cp.b is used a lot as a way to load binaries to memory and execute
-them, however we may need to integrate this with the efi subsystem to
-set it up as a bootdev.
-
-So, introduce a loadm command that will be consistent with the other
-loadX commands and will call the efi API's.
-
-ex: loadm $kernel_addr $kernel_addr_r $kernel_size
-
-with this a kernel with CONFIG_EFI_STUB enabled will be loaded and
-then subsequently booted with bootefi command.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Accepted [2022.10-rc1]
----
- README | 1 +
- cmd/Kconfig | 6 ++++
- cmd/bootefi.c | 12 ++++++++
- cmd/load.c | 48 ++++++++++++++++++++++++++++++++
- include/efi_loader.h | 2 ++
- lib/efi_loader/efi_device_path.c | 9 ++++++
- 6 files changed, 78 insertions(+)
-
-diff --git a/README b/README
-index b7ab6e5070..cd76f95e74 100644
---- a/README
-+++ b/README
-@@ -2578,6 +2578,7 @@ rarpboot- boot image via network using RARP/TFTP protocol
- diskboot- boot from IDE devicebootd - boot default, i.e., run 'bootcmd'
- loads - load S-Record file over serial line
- loadb - load binary file over serial line (kermit mode)
-+loadm - load binary blob from source address to destination address
- md - memory display
- mm - memory modify (auto-incrementing)
- nm - memory modify (constant address)
-diff --git a/cmd/Kconfig b/cmd/Kconfig
-index 09193b61b9..ba2f321ae9 100644
---- a/cmd/Kconfig
-+++ b/cmd/Kconfig
-@@ -1143,6 +1143,12 @@ config CMD_LOADB
- help
- Load a binary file over serial line.
-
-+config CMD_LOADM
-+ bool "loadm"
-+ default y
-+ help
-+ Load a binary over memory mapped.
-+
- config CMD_LOADS
- bool "loads"
- default y
-diff --git a/cmd/bootefi.c b/cmd/bootefi.c
-index 827fcd97df..37ce659fa1 100644
---- a/cmd/bootefi.c
-+++ b/cmd/bootefi.c
-@@ -34,6 +34,18 @@ static struct efi_device_path *bootefi_device_path;
- static void *image_addr;
- static size_t image_size;
-
-+/**
-+ * efi_get_image_parameters() - return image parameters
-+ *
-+ * @img_addr: address of loaded image in memory
-+ * @img_size: size of loaded image
-+ */
-+void efi_get_image_parameters(void **img_addr, size_t *img_size)
-+{
-+ *img_addr = image_addr;
-+ *img_size = image_size;
-+}
-+
- /**
- * efi_clear_bootdev() - clear boot device
- */
-diff --git a/cmd/load.c b/cmd/load.c
-index 7e4a552d90..1224a7f85b 100644
---- a/cmd/load.c
-+++ b/cmd/load.c
-@@ -1063,6 +1063,44 @@ static ulong load_serial_ymodem(ulong offset, int mode)
-
- #endif
-
-+#if defined(CONFIG_CMD_LOADM)
-+static int do_load_memory_bin(struct cmd_tbl *cmdtp, int flag, int argc,
-+ char *const argv[])
-+{
-+ ulong addr, dest, size;
-+ void *src, *dst;
-+
-+ if (argc != 4)
-+ return CMD_RET_USAGE;
-+
-+ addr = simple_strtoul(argv[1], NULL, 16);
-+
-+ dest = simple_strtoul(argv[2], NULL, 16);
-+
-+ size = simple_strtoul(argv[3], NULL, 16);
-+
-+ if (!size) {
-+ printf("loadm: can not load zero bytes\n");
-+ return 1;
-+ }
-+
-+ src = map_sysmem(addr, size);
-+ dst = map_sysmem(dest, size);
-+
-+ memcpy(dst, src, size);
-+
-+ unmap_sysmem(src);
-+ unmap_sysmem(dst);
-+
-+ if (IS_ENABLED(CONFIG_CMD_BOOTEFI))
-+ efi_set_bootdev("Mem", "", "", map_sysmem(dest, 0), size);
-+
-+ printf("loaded bin to memory: size: %lu\n", size);
-+
-+ return 0;
-+}
-+#endif
-+
- /* -------------------------------------------------------------------- */
-
- #if defined(CONFIG_CMD_LOADS)
-@@ -1137,3 +1175,13 @@ U_BOOT_CMD(
- );
-
- #endif /* CONFIG_CMD_LOADB */
-+
-+#if defined(CONFIG_CMD_LOADM)
-+U_BOOT_CMD(
-+ loadm, 4, 0, do_load_memory_bin,
-+ "load binary blob from source address to destination address",
-+ "[src_addr] [dst_addr] [size]\n"
-+ " - load a binary blob from one memory location to other"
-+ " from src_addr to dst_addr by size bytes"
-+);
-+#endif /* CONFIG_CMD_LOADM */
-diff --git a/include/efi_loader.h b/include/efi_loader.h
-index 11930fbea8..5b41985244 100644
---- a/include/efi_loader.h
-+++ b/include/efi_loader.h
-@@ -591,6 +591,8 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
- void efi_save_gd(void);
- /* Call this to relocate the runtime section to an address space */
- void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
-+/* Call this to get image parameters */
-+void efi_get_image_parameters(void **img_addr, size_t *img_size);
- /* Add a new object to the object list. */
- void efi_add_handle(efi_handle_t obj);
- /* Create handle */
-diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
-index 171661b897..2493d74326 100644
---- a/lib/efi_loader/efi_device_path.c
-+++ b/lib/efi_loader/efi_device_path.c
-@@ -1158,6 +1158,8 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
- {
- struct blk_desc *desc = NULL;
- struct disk_partition fs_partition;
-+ size_t image_size;
-+ void *image_addr;
- int part = 0;
- char *filename;
- char *s;
-@@ -1173,6 +1175,13 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
- } else if (!strcmp(dev, "Uart")) {
- if (device)
- *device = efi_dp_from_uart();
-+ } else if (!strcmp(dev, "Mem")) {
-+ efi_get_image_parameters(&image_addr, &image_size);
-+
-+ if (device)
-+ *device = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
-+ (uintptr_t)image_addr,
-+ image_size);
- } else {
- part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
- 1);
-2.17.1
-
deleted file mode 100644
@@ -1,682 +0,0 @@
-From 3523b1bac430f10f02a31f7d013ea369e29656be Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Tue, 15 Feb 2022 09:44:10 +0000
-Subject: [PATCH 02/26] arm: add support to corstone1000 platform
-
-Corstone1000 is a platform from arm, which includes pre
-verified Corstone SSE710 sub-system that combines Cortex-A and
-Cortex-M processors [0].
-
-This code adds the support for the Cortex-A35 implementation
-at host side, it contains also the necessary bits to support
-the Corstone 1000 FVP (Fixed Virtual Platform) [1] and also the
-FPGA MPS3 board implementation of this platform. [2]
-
-0: https://documentation-service.arm.com/static/619e02b1f45f0b1fbf3a8f16
-1: https://developer.arm.com/tools-and-software/open-source-software/arm-platforms-software/arm-ecosystem-fvps
-2: https://documentation-service.arm.com/static/61f3f4d7fa8173727a1b71bf
-
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Accepted [2022.10-rc1]
----
- arch/arm/Kconfig | 8 ++
- arch/arm/dts/Makefile | 3 +
- arch/arm/dts/corstone1000-fvp.dts | 23 +++
- arch/arm/dts/corstone1000-mps3.dts | 32 +++++
- arch/arm/dts/corstone1000.dtsi | 169 +++++++++++++++++++++++
- board/armltd/corstone1000/Kconfig | 12 ++
- board/armltd/corstone1000/MAINTAINERS | 7 +
- board/armltd/corstone1000/Makefile | 7 +
- board/armltd/corstone1000/corstone1000.c | 125 +++++++++++++++++
- configs/corstone1000_defconfig | 80 +++++++++++
- include/configs/corstone1000.h | 86 ++++++++++++
- 11 files changed, 552 insertions(+)
- create mode 100644 arch/arm/dts/corstone1000-fvp.dts
- create mode 100644 arch/arm/dts/corstone1000-mps3.dts
- create mode 100644 arch/arm/dts/corstone1000.dtsi
- create mode 100644 board/armltd/corstone1000/Kconfig
- create mode 100644 board/armltd/corstone1000/MAINTAINERS
- create mode 100644 board/armltd/corstone1000/Makefile
- create mode 100644 board/armltd/corstone1000/corstone1000.c
- create mode 100644 configs/corstone1000_defconfig
- create mode 100644 include/configs/corstone1000.h
-
-diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 9898c7d68e..2fc2b7d20f 100644
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -1347,6 +1347,12 @@ config ARCH_VEXPRESS64
- select ENV_IS_IN_FLASH if MTD
- imply DISTRO_DEFAULTS
-
-+config TARGET_CORSTONE1000
-+ bool "Support Corstone1000 Platform"
-+ select ARM64
-+ select PL01X_SERIAL
-+ select DM
-+
- config TARGET_TOTAL_COMPUTE
- bool "Support Total Compute Platform"
- select ARM64
-@@ -2295,6 +2301,8 @@ source "arch/arm/mach-npcm/Kconfig"
-
- source "board/armltd/total_compute/Kconfig"
-
-+source "board/armltd/corstone1000/Kconfig"
-+
- source "board/bosch/shc/Kconfig"
- source "board/bosch/guardian/Kconfig"
- source "board/Marvell/octeontx/Kconfig"
-diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
-index a7e0d9f6c0..8c8f15b6a8 100644
---- a/arch/arm/dts/Makefile
-+++ b/arch/arm/dts/Makefile
-@@ -1265,6 +1265,9 @@ dtb-$(CONFIG_TARGET_EA_LPC3250DEVKITV2) += lpc3250-ea3250.dtb
-
- dtb-$(CONFIG_ARCH_QEMU) += qemu-arm.dtb qemu-arm64.dtb
-
-+dtb-$(CONFIG_TARGET_CORSTONE1000) += corstone1000-mps3.dtb \
-+ corstone1000-fvp.dtb
-+
- include $(srctree)/scripts/Makefile.dts
-
- targets += $(dtb-y)
-diff --git a/arch/arm/dts/corstone1000-fvp.dts b/arch/arm/dts/corstone1000-fvp.dts
-new file mode 100644
-index 0000000000..1fcc137a49
---- /dev/null
-+++ b/arch/arm/dts/corstone1000-fvp.dts
-@@ -0,0 +1,23 @@
-+// SPDX-License-Identifier: GPL-2.0 or MIT
-+/*
-+ * Copyright (c) 2022, Arm Limited. All rights reserved.
-+ * Copyright (c) 2022, Linaro Limited. All rights reserved.
-+ *
-+ */
-+
-+/dts-v1/;
-+
-+#include "corstone1000.dtsi"
-+
-+/ {
-+ model = "ARM Corstone1000 FVP (Fixed Virtual Platform)";
-+ compatible = "arm,corstone1000-fvp";
-+
-+ smsc: ethernet@4010000 {
-+ compatible = "smsc,lan91c111";
-+ reg = <0x40100000 0x10000>;
-+ phy-mode = "mii";
-+ interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-io-width = <2>;
-+ };
-+};
-diff --git a/arch/arm/dts/corstone1000-mps3.dts b/arch/arm/dts/corstone1000-mps3.dts
-new file mode 100644
-index 0000000000..e3146747c2
---- /dev/null
-+++ b/arch/arm/dts/corstone1000-mps3.dts
-@@ -0,0 +1,32 @@
-+// SPDX-License-Identifier: GPL-2.0 or MIT
-+/*
-+ * Copyright (c) 2022, Arm Limited. All rights reserved.
-+ * Copyright (c) 2022, Linaro Limited. All rights reserved.
-+ *
-+ */
-+
-+/dts-v1/;
-+
-+#include "corstone1000.dtsi"
-+
-+/ {
-+ model = "ARM Corstone1000 FPGA MPS3 board";
-+ compatible = "arm,corstone1000-mps3";
-+
-+ smsc: ethernet@4010000 {
-+ compatible = "smsc,lan9220", "smsc,lan9115";
-+ reg = <0x40100000 0x10000>;
-+ phy-mode = "mii";
-+ interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
-+ reg-io-width = <2>;
-+ smsc,irq-push-pull;
-+ };
-+
-+ usb_host: usb@40200000 {
-+ compatible = "nxp,usb-isp1763";
-+ reg = <0x40200000 0x100000>;
-+ interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
-+ bus-width = <16>;
-+ dr_mode = "host";
-+ };
-+};
-diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi
-new file mode 100644
-index 0000000000..d0194aa893
---- /dev/null
-+++ b/arch/arm/dts/corstone1000.dtsi
-@@ -0,0 +1,169 @@
-+// SPDX-License-Identifier: GPL-2.0 or MIT
-+/*
-+ * Copyright (c) 2022, Arm Limited. All rights reserved.
-+ * Copyright (c) 2022, Linaro Limited. All rights reserved.
-+ *
-+ */
-+
-+#include <dt-bindings/interrupt-controller/arm-gic.h>
-+
-+/ {
-+ interrupt-parent = <&gic>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ serial0 = &uart0;
-+ serial1 = &uart1;
-+ };
-+
-+ chosen {
-+ stdout-path = "serial0:115200n8";
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu: cpu@0 {
-+ device_type = "cpu";
-+ compatible = "arm,cortex-a35";
-+ reg = <0>;
-+ next-level-cache = <&L2_0>;
-+ };
-+ };
-+
-+ memory@88200000 {
-+ device_type = "memory";
-+ reg = <0x88200000 0x77e00000>;
-+ };
-+
-+ gic: interrupt-controller@1c000000 {
-+ compatible = "arm,gic-400";
-+ #interrupt-cells = <3>;
-+ #address-cells = <0>;
-+ interrupt-controller;
-+ reg = <0x1c010000 0x1000>,
-+ <0x1c02f000 0x2000>,
-+ <0x1c04f000 0x1000>,
-+ <0x1c06f000 0x2000>;
-+ interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(1) |
-+ IRQ_TYPE_LEVEL_LOW)>;
-+ };
-+
-+ L2_0: l2-cache0 {
-+ compatible = "cache";
-+ cache-level = <2>;
-+ cache-size = <0x80000>;
-+ cache-line-size = <64>;
-+ cache-sets = <1024>;
-+ };
-+
-+ refclk100mhz: refclk100mhz {
-+ compatible = "fixed-clock";
-+ #clock-cells = <0>;
-+ clock-frequency = <100000000>;
-+ clock-output-names = "apb_pclk";
-+ };
-+
-+ smbclk: refclk24mhzx2 {
-+ /* Reference 24MHz clock x 2 */
-+ compatible = "fixed-clock";
-+ #clock-cells = <0>;
-+ clock-frequency = <48000000>;
-+ clock-output-names = "smclk";
-+ };
-+
-+ timer {
-+ compatible = "arm,armv8-timer";
-+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(1) |
-+ IRQ_TYPE_LEVEL_LOW)>,
-+ <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(1) |
-+ IRQ_TYPE_LEVEL_LOW)>,
-+ <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(1) |
-+ IRQ_TYPE_LEVEL_LOW)>,
-+ <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(1) |
-+ IRQ_TYPE_LEVEL_LOW)>;
-+ };
-+
-+ uartclk: uartclk {
-+ /* UART clock - 50MHz */
-+ compatible = "fixed-clock";
-+ #clock-cells = <0>;
-+ clock-frequency = <50000000>;
-+ clock-output-names = "uartclk";
-+ };
-+
-+ psci {
-+ compatible = "arm,psci-1.0", "arm,psci-0.2";
-+ method = "smc";
-+ };
-+
-+ soc {
-+ compatible = "simple-bus";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ interrupt-parent = <&gic>;
-+ ranges;
-+
-+ timer@1a220000 {
-+ compatible = "arm,armv7-timer-mem";
-+ reg = <0x1a220000 0x1000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ clock-frequency = <50000000>;
-+ ranges;
-+
-+ frame@1a230000 {
-+ frame-number = <0>;
-+ interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-+ reg = <0x1a230000 0x1000>;
-+ };
-+ };
-+
-+ uart0: serial@1a510000 {
-+ compatible = "arm,pl011", "arm,primecell";
-+ reg = <0x1a510000 0x1000>;
-+ interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&uartclk>, <&refclk100mhz>;
-+ clock-names = "uartclk", "apb_pclk";
-+ };
-+
-+ uart1: serial@1a520000 {
-+ compatible = "arm,pl011", "arm,primecell";
-+ reg = <0x1a520000 0x1000>;
-+ interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
-+ clocks = <&uartclk>, <&refclk100mhz>;
-+ clock-names = "uartclk", "apb_pclk";
-+ };
-+
-+ mhu_hse1: mailbox@1b820000 {
-+ compatible = "arm,mhuv2-tx", "arm,primecell";
-+ reg = <0x1b820000 0x1000>;
-+ clocks = <&refclk100mhz>;
-+ clock-names = "apb_pclk";
-+ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
-+ #mbox-cells = <2>;
-+ arm,mhuv2-protocols = <0 0>;
-+ secure-status = "okay"; /* secure-world-only */
-+ status = "disabled";
-+ };
-+
-+ mhu_seh1: mailbox@1b830000 {
-+ compatible = "arm,mhuv2-rx", "arm,primecell";
-+ reg = <0x1b830000 0x1000>;
-+ clocks = <&refclk100mhz>;
-+ clock-names = "apb_pclk";
-+ interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
-+ #mbox-cells = <2>;
-+ arm,mhuv2-protocols = <0 0>;
-+ secure-status = "okay"; /* secure-world-only */
-+ status = "disabled";
-+ };
-+ };
-+
-+ arm_ffa: arm_ffa {
-+ compatible = "arm,ffa";
-+ method = "smc";
-+ };
-+};
-diff --git a/board/armltd/corstone1000/Kconfig b/board/armltd/corstone1000/Kconfig
-new file mode 100644
-index 0000000000..709674d4cf
---- /dev/null
-+++ b/board/armltd/corstone1000/Kconfig
-@@ -0,0 +1,12 @@
-+if TARGET_CORSTONE1000
-+
-+config SYS_BOARD
-+ default "corstone1000"
-+
-+config SYS_VENDOR
-+ default "armltd"
-+
-+config SYS_CONFIG_NAME
-+ default "corstone1000"
-+
-+endif
-diff --git a/board/armltd/corstone1000/MAINTAINERS b/board/armltd/corstone1000/MAINTAINERS
-new file mode 100644
-index 0000000000..8c905686de
---- /dev/null
-+++ b/board/armltd/corstone1000/MAINTAINERS
-@@ -0,0 +1,7 @@
-+CORSTONE1000 BOARD
-+M: Rui Miguel Silva <rui.silva@linaro.org>
-+M: Vishnu Banavath <vishnu.banavath@arm.com>
-+S: Maintained
-+F: board/armltd/corstone1000/
-+F: include/configs/corstone1000.h
-+F: configs/corstone1000_defconfig
-diff --git a/board/armltd/corstone1000/Makefile b/board/armltd/corstone1000/Makefile
-new file mode 100644
-index 0000000000..77a82c2892
---- /dev/null
-+++ b/board/armltd/corstone1000/Makefile
-@@ -0,0 +1,7 @@
-+# SPDX-License-Identifier: GPL-2.0+
-+#
-+# (C) Copyright 2022 Arm Limited
-+# (C) Copyright 2022 Linaro
-+# Rui Miguel Silva <rui.silva@linaro.org>
-+
-+obj-y := corstone1000.o
-diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
-new file mode 100644
-index 0000000000..2fa485ff37
---- /dev/null
-+++ b/board/armltd/corstone1000/corstone1000.c
-@@ -0,0 +1,125 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/*
-+ * (C) Copyright 2022 ARM Limited
-+ * (C) Copyright 2022 Linaro
-+ * Rui Miguel Silva <rui.silva@linaro.org>
-+ */
-+
-+#include <common.h>
-+#include <dm.h>
-+#include <dm/platform_data/serial_pl01x.h>
-+#include <asm/armv8/mmu.h>
-+#include <asm/global_data.h>
-+
-+
-+static const struct pl01x_serial_plat serial_plat = {
-+ .base = V2M_UART0,
-+ .type = TYPE_PL011,
-+ .clock = CONFIG_PL011_CLOCK,
-+};
-+
-+U_BOOT_DRVINFO(corstone1000_serials) = {
-+ .name = "serial_pl01x",
-+ .plat = &serial_plat,
-+};
-+
-+static struct mm_region corstone1000_mem_map[] = {
-+ {
-+ /* CVM */
-+ .virt = 0x02000000UL,
-+ .phys = 0x02000000UL,
-+ .size = 0x02000000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-+ PTE_BLOCK_INNER_SHARE
-+ }, {
-+ /* QSPI */
-+ .virt = 0x08000000UL,
-+ .phys = 0x08000000UL,
-+ .size = 0x08000000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-+ PTE_BLOCK_INNER_SHARE
-+ }, {
-+ /* Host Peripherals */
-+ .virt = 0x1A000000UL,
-+ .phys = 0x1A000000UL,
-+ .size = 0x26000000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* USB */
-+ .virt = 0x40200000UL,
-+ .phys = 0x40200000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* ethernet */
-+ .virt = 0x40100000UL,
-+ .phys = 0x40100000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* OCVM */
-+ .virt = 0x80000000UL,
-+ .phys = 0x80000000UL,
-+ .size = 0x80000000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-+ PTE_BLOCK_INNER_SHARE
-+ }, {
-+ /* List terminator */
-+ 0,
-+ }
-+};
-+
-+struct mm_region *mem_map = corstone1000_mem_map;
-+
-+void set_dfu_alt_info(char *interface, char *devstr)
-+{
-+}
-+
-+int board_init(void)
-+{
-+ return 0;
-+}
-+
-+int dram_init(void)
-+{
-+ gd->ram_size = PHYS_SDRAM_1_SIZE;
-+
-+ return 0;
-+}
-+
-+int dram_init_banksize(void)
-+{
-+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
-+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Board specific ethernet initialization routine.
-+ * */
-+int board_eth_init(struct bd_info *bis)
-+{
-+ int rc = 0;
-+
-+#ifndef CONFIG_DM_ETH
-+#ifdef CONFIG_SMC91111
-+ rc = smc91111_initialize(0, CONFIG_SMC91111_BASE);
-+#endif
-+#ifdef CONFIG_SMC911X
-+ rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
-+#endif
-+#endif
-+
-+ return rc;
-+}
-+
-+void reset_cpu(ulong addr)
-+{
-+}
-diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
-new file mode 100644
-index 0000000000..02f931b0d4
---- /dev/null
-+++ b/configs/corstone1000_defconfig
-@@ -0,0 +1,80 @@
-+CONFIG_ARM=y
-+CONFIG_TARGET_CORSTONE1000=y
-+CONFIG_SYS_TEXT_BASE=0x80000000
-+CONFIG_SYS_MALLOC_F_LEN=0x2000
-+CONFIG_SYS_MALLOC_LEN=0x2000000
-+CONFIG_SYS_LOAD_ADDR=0x82100000
-+CONFIG_NR_DRAM_BANKS=1
-+CONFIG_IDENT_STRING=" corstone1000 aarch64 "
-+CONFIG_FIT=y
-+CONFIG_BOOTDELAY=3
-+CONFIG_USE_BOOTARGS=y
-+CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk"
-+CONFIG_LOGLEVEL=7
-+# CONFIG_DISPLAY_CPUINFO is not set
-+# CONFIG_DISPLAY_BOARDINFO is not set
-+CONFIG_HUSH_PARSER=y
-+CONFIG_SYS_PROMPT="corstone1000# "
-+# CONFIG_CMD_CONSOLE is not set
-+CONFIG_CMD_BOOTZ=y
-+CONFIG_CMD_BOOTM=y
-+CONFIG_CMD_LOADM=y
-+CONFIG_CMD_BOOTEFI=y
-+CONFIG_EFI_LOADER=y
-+CONFIG_EFI_PARTITION=y
-+CONFIG_CMD_BOOTEFI_HELLO_COMPILE=y
-+CONFIG_CMD_BOOTEFI_HELLO=y
-+# CONFIG_CMD_XIMG is not set
-+# CONFIG_CMD_ENV_EXISTS is not set
-+CONFIG_CMD_NVEDIT_EFI=y
-+# CONFIG_CMD_LOADS is not set
-+CONFIG_CMD_USB=y
-+CONFIG_CMD_ITEST=y
-+# CONFIG_CMD_SETEXPR is not set
-+# CONFIG_CMD_NFS is not set
-+CONFIG_CMD_MII=y
-+CONFIG_CMD_CACHE=y
-+CONFIG_CMD_EFIDEBUG=y
-+CONFIG_CMD_FAT=y
-+CONFIG_OF_CONTROL=y
-+CONFIG_REGMAP=y
-+# CONFIG_MMC is not set
-+CONFIG_DM_SERIAL=y
-+CONFIG_USB=y
-+CONFIG_DM_USB=y
-+CONFIG_USB_STORAGE=y
-+CONFIG_EFI_MM_COMM_TEE=y
-+# CONFIG_OPTEE is not set
-+# CONFIG_GENERATE_SMBIOS_TABLE is not set
-+# CONFIG_HEXDUMP is not set
-+CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
-+CONFIG_EFI_CAPSULE_ON_DISK=y
-+# CONFIG_EFI_CAPSULE_ON_DISK_EARLY is not set
-+# CONFIG_EFI_CAPSULE_AUTHENTICATE is not set
-+CONFIG_EFI_HAVE_CAPSULE_SUPPORT=y
-+CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y
-+CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
-+CONFIG_EFI_SECURE_BOOT=y
-+CONFIG_DM_RTC=y
-+CONFIG_CMD_RTC=y
-+CONFIG_EFI_GET_TIME=y
-+CONFIG_EFI_SET_TIME=y
-+CONFIG_RTC_EMULATION=y
-+CONFIG_PSCI_RESET=y
-+CONFIG_DISTRO_DEFAULTS=y
-+CONFIG_CMD_DHCP=y
-+CONFIG_SMC911X=y
-+CONFIG_SMC911X_BASE=0x40100000
-+CONFIG_DM_ETH=y
-+CONFIG_PHY_SMSC=y
-+CONFIG_CMD_BOOTEFI_SELFTEST=y
-+CONFIG_CMD_TIME=y
-+CONFIG_CMD_GETTIME=y
-+CONFIG_NET_RANDOM_ETHADDR=y
-+CONFIG_VERSION_VARIABLE=y
-+CONFIG_PHYLIB=y
-+CONFIG_PHY=y
-+CONFIG_RAM=y
-+CONFIG_ERRNO_STR=y
-+CONFIG_CMD_EDITENV=y
-+CONFIG_MISC=y
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-new file mode 100644
-index 0000000000..cf166f107e
---- /dev/null
-+++ b/include/configs/corstone1000.h
-@@ -0,0 +1,86 @@
-+/* SPDX-License-Identifier: GPL-2.0+ */
-+/*
-+ * (C) Copyright 2022 ARM Limited
-+ * (C) Copyright 2022 Linaro
-+ * Rui Miguel Silva <rui.silva@linaro.org>
-+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-+ *
-+ * Configuration for Corstone1000. Parts were derived from other ARM
-+ * configurations.
-+ */
-+
-+#ifndef __CORSTONE1000_H
-+#define __CORSTONE1000_H
-+
-+#include <linux/sizes.h>
-+
-+#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x03f00000)
-+#define CONFIG_SKIP_LOWLEVEL_INIT
-+
-+#define CONFIG_SYS_HZ 1000
-+
-+#define V2M_SRAM0 0x02000000
-+#define V2M_QSPI 0x08000000
-+
-+#define V2M_DEBUG 0x10000000
-+#define V2M_BASE_PERIPH 0x1A000000
-+
-+#define V2M_BASE 0x80000000
-+
-+#define V2M_PERIPH_OFFSET(x) (x << 16)
-+
-+#define V2M_SYSID (V2M_BASE_PERIPH)
-+#define V2M_SYSCTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(1))
-+
-+#define V2M_COUNTER_CTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(32))
-+#define V2M_COUNTER_READ (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(33))
-+
-+#define V2M_TIMER_CTL (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(34))
-+#define V2M_TIMER_BASE0 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(35))
-+
-+#define V2M_UART0 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(81))
-+#define V2M_UART1 (V2M_BASE_PERIPH + V2M_PERIPH_OFFSET(82))
-+
-+#define CONFIG_PL011_CLOCK 50000000
-+
-+/* Physical Memory Map */
-+#define PHYS_SDRAM_1 (V2M_BASE)
-+#define PHYS_SDRAM_1_SIZE 0x80000000
-+
-+#define CONFIG_ENV_SECT_SIZE SZ_64K
-+
-+#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1
-+
-+/* Monitor Command Prompt */
-+#define CONFIG_SYS_CBSIZE 512 /* Console I/O Buffer Size */
-+#define CONFIG_SYS_MAXARGS 64 /* max command args */
-+
-+#define CONFIG_EXTRA_ENV_SETTINGS \
-+ "usb_pgood_delay=250\0" \
-+ "boot_bank_flag=0x08002000\0" \
-+ "kernel_addr_bank_0=0x083EE000\0" \
-+ "kernel_addr_bank_1=0x0936E000\0" \
-+ "retrieve_kernel_load_addr=" \
-+ "if itest.l *${boot_bank_flag} == 0; then " \
-+ "setenv kernel_addr $kernel_addr_bank_0;" \
-+ "else " \
-+ "setenv kernel_addr $kernel_addr_bank_1;" \
-+ "fi;" \
-+ "\0" \
-+ "kernel_addr_r=0x88200000\0" \
-+ "fdt_high=0xffffffff\0"
-+
-+/*
-+ * config_distro_bootcmd define the boot command to distro_bootcmd, but we here
-+ * want to first try to load a kernel if exists, override that config then
-+ */
-+#undef CONFIG_BOOTCOMMAND
-+
-+#define CONFIG_BOOTCOMMAND \
-+ "run retrieve_kernel_load_addr;" \
-+ "echo Loading kernel from $kernel_addr to memory ... ;" \
-+ "loadm $kernel_addr $kernel_addr_r 0xc00000;" \
-+ "usb start; usb reset;" \
-+ "run distro_bootcmd;" \
-+ "bootefi $kernel_addr_r $fdtcontroladdr;"
-+#endif
-2.17.1
-
new file mode 100644
@@ -0,0 +1,132 @@
+From b226e6000de0b1f55d56c1193d1fde028d64abd3 Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Thu, 4 Aug 2022 16:46:47 +0100
+Subject: [PATCH 02/25] lib: uuid: introduce uuid_str_to_le_bin function
+
+convert UUID string to little endian binary data
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
+
+Changelog:
+===============
+
+v8:
+
+* use simple_strtoull() in uuid_str_to_le_bin() to support 32-bit platforms
+
+v7:
+
+* rename be_uuid_str_to_le_bin() to uuid_str_to_le_bin()
+* make uuid_str_to_le_bin() implementation similar to uuid_str_to_bin()
+ by using same APIs
+
+v4:
+
+* rename ffa_uuid_str_to_bin to be_uuid_str_to_le_bin and put in
+ a standalone commit (the current)
+
+v3:
+
+* introduce ffa_uuid_str_to_bin (provided by
+ arm_ffa: introduce Arm FF-A low-level driver)
+---
+ include/uuid.h | 8 ++++++++
+ lib/uuid.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 54 insertions(+)
+
+diff --git a/include/uuid.h b/include/uuid.h
+index 4a4883d3b5..293a8eb0a5 100644
+--- a/include/uuid.h
++++ b/include/uuid.h
+@@ -2,6 +2,8 @@
+ /*
+ * Copyright (C) 2014 Samsung Electronics
+ * Przemyslaw Marczak <p.marczak@samsung.com>
++ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+ #ifndef __UUID_H__
+ #define __UUID_H__
+@@ -44,4 +46,10 @@ int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin);
+ const char *uuid_guid_get_str(const unsigned char *guid_bin);
+ void gen_rand_uuid(unsigned char *uuid_bin);
+ void gen_rand_uuid_str(char *uuid_str, int str_format);
++
++/**
++ * uuid_str_to_le_bin - Converts a UUID string to little endian binary data
++ */
++int uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin);
++
+ #endif
+diff --git a/lib/uuid.c b/lib/uuid.c
+index 465e1ac38f..d29f561a70 100644
+--- a/lib/uuid.c
++++ b/lib/uuid.c
+@@ -1,6 +1,8 @@
+ // SPDX-License-Identifier: GPL-2.0+
+ /*
+ * Copyright 2011 Calxeda, Inc.
++ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+ #include <common.h>
+@@ -346,6 +348,50 @@ int uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin,
+ return 0;
+ }
+
++/**
++ * uuid_str_to_le_bin() - Convert string UUID to little endian binary data.
++ * @uuid_str: pointer to UUID string
++ * @uuid_bin: pointer to allocated array for little endian output [16B]
++ *
++ * UUID string is 36 characters (36 bytes):
++ *
++ * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
++ *
++ * where x is a hexadecimal character. Fields are separated by '-'s.
++ * When converting to a little endian binary UUID, the string fields are reversed.
++ *
++ * Return:
++ *
++ * uuid_bin filled with little endian UUID data
++ * On success 0 is returned. Otherwise, failure code.
++ */
++int uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin)
++{
++ u16 tmp16;
++ u32 tmp32;
++ u64 tmp64;
++
++ if (!uuid_str_valid(uuid_str) || !uuid_bin)
++ return -EINVAL;
++
++ tmp32 = cpu_to_le32(hextoul(uuid_str, NULL));
++ memcpy(uuid_bin, &tmp32, 4);
++
++ tmp16 = cpu_to_le16(hextoul(uuid_str + 9, NULL));
++ memcpy(uuid_bin + 4, &tmp16, 2);
++
++ tmp16 = cpu_to_le16(hextoul(uuid_str + 14, NULL));
++ memcpy(uuid_bin + 6, &tmp16, 2);
++
++ tmp16 = cpu_to_le16(hextoul(uuid_str + 19, NULL));
++ memcpy(uuid_bin + 8, &tmp16, 2);
++
++ tmp64 = cpu_to_le64(simple_strtoull(uuid_str + 24, NULL, 16));
++ memcpy(uuid_bin + 10, &tmp64, 6);
++
++ return 0;
++}
++
+ /*
+ * uuid_bin_to_str() - convert big endian binary data to string UUID or GUID.
+ *
+--
+2.17.1
+
similarity index 69%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-introduce-Arm-FF-A-low-level-driver.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-arm_ffa-introduce-Arm-FF-A-low-level-driver.patch
@@ -1,11 +1,11 @@
-From 4729efd57e260b8c02d8cd1c30a443d29885dbd1 Mon Sep 17 00:00:00 2001
+From 93e3267b19c5c5d27664ef133121db4b678ad72d Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Mon, 15 Aug 2022 15:00:44 +0100
-Subject: [PATCH 09/26] arm_ffa: introduce Arm FF-A low-level driver
+Date: Tue, 29 Nov 2022 14:40:05 +0000
+Subject: [PATCH 03/25] arm_ffa: introduce Arm FF-A low-level driver
-Add the driver implementing Arm Firmware Framework for Armv8-A v1.0
+Add the core driver implementing Arm Firmware Framework for Armv8-A v1.0
-The Firmware Framework for Arm A-profile processors (FF-A)
+The Firmware Framework for Arm A-profile processors (FF-A v1.0) [1]
describes interfaces (ABIs) that standardize communication
between the Secure World and Normal World leveraging TrustZone
technology.
@@ -14,10 +14,16 @@ This driver uses 64-bit registers as per SMCCCv1.2 spec and comes
on top of the SMCCC layer. The driver provides the FF-A ABIs needed for
querying the FF-A framework from the secure world.
-32-bit version of the ABIs is supported and 64-bit version of FFA_RXTX_MAP
-and FFA_MSG_SEND_DIRECT_{REQ, RESP}.
+The driver uses SMC32 calling convention which means using the first
+32-bit data of the Xn registers.
-In u-boot FF-A design, FF-A is considered as a discoverable bus.
+All supported ABIs come with their 32-bit version except FFA_RXTX_MAP
+which has 64-bit version supported.
+
+Both 32-bit and 64-bit direct messaging are supported which allows both
+32-bit and 64-bit clients to use the FF-A bus.
+
+In U-Boot FF-A design, FF-A is considered as a discoverable bus.
The Secure World is considered as one entity to communicate with
using the FF-A bus. FF-A communication is handled by one device and
one instance (the bus). This FF-A driver takes care of all the
@@ -31,16 +37,45 @@ Exported operations:
- sync_send_receive
- rxtx_unmap
-This implementation provides an optional feature to copy the driver data
-to EFI runtime area.
+For more details please refer to the driver documentation [2].
+
+[1]: https://developer.arm.com/documentation/den0077/latest/
+[2]: doc/arch/arm64.ffa.rst
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v8:
+
+* make ffa_get_partitions_info() second argument to be an SP count in both
+ modes
+* update ffa_bus_prvdata_get() to return a pointer rather than a pointer
+ address
+* remove packing from ffa_partition_info and ffa_send_direct_data structures
+* pass the FF-A bus device to the bus operations
+
+v7:
+
+* add support for 32-bit direct messaging
+* rename be_uuid_str_to_le_bin() to uuid_str_to_le_bin()
+* improve the declaration of error handling mapping
+* stating in doc/arch/arm64.ffa.rst that EFI runtime is not supported
+
+v6:
+
+* drop use of EFI runtime support (We decided with Linaro to add this later)
+* drop discovery from initcalls (discovery will be on demand by FF-A users)
+* set the alignment of the RX/TX buffers to the larger translation granule size
+* move FF-A RX/TX buffers unmapping at ExitBootServices() to a separate commit
+* update the documentation and move it to doc/arch/arm64.ffa.rst
+
v4:
* add doc/README.ffa.drv
@@ -52,16 +87,16 @@ v4:
* replacing panics with an error log and returning an error code
* improving features discovery in FFA_FEATURES by introducing
rxtx_min_pages private data field
-* add ffa_remove and ffa_bind functions
+* add ffa_remove and ffa_unbind functions
* improve how the driver behaves when bus discovery is done more than
once
v3:
-* align the interfaces of the u-boot FF-A driver with those in the linux
+* align the interfaces of the U-Boot FF-A driver with those in the linux
FF-A driver
* remove the FF-A helper layer
-* make the u-boot FF-A driver independent from EFI
+* make the U-Boot FF-A driver independent from EFI
* provide an optional config that enables copying the driver data to EFI
runtime section at ExitBootServices service
* use 64-bit version of FFA_RXTX_MAP, FFA_MSG_SEND_DIRECT_{REQ, RESP}
@@ -74,113 +109,105 @@ v2:
v1:
* introduce FF-A bus driver with device tree support
-
- MAINTAINERS | 7 +
- common/board_r.c | 7 +
- doc/README.ffa.drv | 160 ++
- drivers/Kconfig | 2 +
- drivers/Makefile | 1 +
- drivers/firmware/arm-ffa/Kconfig | 39 +
- drivers/firmware/arm-ffa/Makefile | 7 +
- drivers/firmware/arm-ffa/arm-ffa-uclass.c | 16 +
- drivers/firmware/arm-ffa/arm_ffa_prv.h | 196 +++
- drivers/firmware/arm-ffa/core.c | 1344 +++++++++++++++++
- .../arm-ffa/efi_ffa_runtime_data_mgr.c | 94 ++
- include/arm_ffa.h | 127 ++
- include/dm/uclass-id.h | 1 +
- lib/efi_loader/efi_boottime.c | 12 +
- 14 files changed, 2013 insertions(+)
- create mode 100644 doc/README.ffa.drv
+---
+ MAINTAINERS | 7 +
+ doc/arch/arm64.ffa.rst | 218 ++++
+ doc/arch/index.rst | 1 +
+ drivers/Kconfig | 2 +
+ drivers/Makefile | 1 +
+ drivers/firmware/arm-ffa/Kconfig | 30 +
+ drivers/firmware/arm-ffa/Makefile | 6 +
+ drivers/firmware/arm-ffa/arm-ffa-uclass.c | 16 +
+ drivers/firmware/arm-ffa/arm_ffa_prv.h | 200 ++++
+ drivers/firmware/arm-ffa/core.c | 1315 +++++++++++++++++++++
+ include/arm_ffa.h | 97 ++
+ include/dm/uclass-id.h | 4 +
+ 12 files changed, 1897 insertions(+)
+ create mode 100644 doc/arch/arm64.ffa.rst
create mode 100644 drivers/firmware/arm-ffa/Kconfig
create mode 100644 drivers/firmware/arm-ffa/Makefile
create mode 100644 drivers/firmware/arm-ffa/arm-ffa-uclass.c
create mode 100644 drivers/firmware/arm-ffa/arm_ffa_prv.h
create mode 100644 drivers/firmware/arm-ffa/core.c
- create mode 100644 drivers/firmware/arm-ffa/efi_ffa_runtime_data_mgr.c
create mode 100644 include/arm_ffa.h
diff --git a/MAINTAINERS b/MAINTAINERS
-index 7f27ff4c20..e760b4ca3a 100644
+index 83346183ee..734fcb10c4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -244,6 +244,13 @@ F: board/CZ.NIC/
- F: configs/turris_*_defconfig
- F: include/configs/turris_*.h
+@@ -248,6 +248,13 @@ F: drivers/net/cortina_ni.h
+ F: drivers/net/phy/ca_phy.c
+ F: configs/cortina_presidio-asic-pnand_defconfig
+ARM FF-A
+M: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+S: Maintained
-+F: doc/README.ffa.drv
++F: doc/arch/arm64.ffa.rst
+F: drivers/firmware/arm-ffa/
+F: include/arm_ffa.h
+
ARM FREESCALE IMX
M: Stefano Babic <sbabic@denx.de>
M: Fabio Estevam <festevam@gmail.com>
-diff --git a/common/board_r.c b/common/board_r.c
-index 6f4aca2077..c75634286b 100644
---- a/common/board_r.c
-+++ b/common/board_r.c
-@@ -63,6 +63,10 @@
- #include <efi_loader.h>
- #include <relocate.h>
-
-+#ifdef CONFIG_ARM_FFA_TRANSPORT
-+#include <arm_ffa.h>
-+#endif
-+
- DECLARE_GLOBAL_DATA_PTR;
-
- ulong monitor_flash_len;
-@@ -779,6 +783,9 @@ static init_fnc_t init_sequence_r[] = {
- INIT_FUNC_WATCHDOG_RESET
- initr_net,
- #endif
-+#ifdef CONFIG_ARM_FFA_TRANSPORT
-+ ffa_bus_discover,
-+#endif
- #ifdef CONFIG_POST
- initr_post,
- #endif
-diff --git a/doc/README.ffa.drv b/doc/README.ffa.drv
+diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst
new file mode 100644
-index 0000000000..1c0a33deb8
+index 0000000000..dfcec82e45
--- /dev/null
-+++ b/doc/README.ffa.drv
-@@ -0,0 +1,160 @@
++++ b/doc/arch/arm64.ffa.rst
+@@ -0,0 +1,218 @@
++.. SPDX-License-Identifier: GPL-2.0+
++
+Arm FF-A Driver
-+====================
++===============
+
-+Introduction
-+--------------------
++Summary
++-------
+
+FF-A stands for Firmware Framework for Arm A-profile processors.
+
-+FF-A specifies interfaces that enable a pair of software sandboxes to communicate with each other. A sandbox aka partition could
-+be a VM in the Normal or Secure world, an application in S-EL0, or a Trusted OS in S-EL1.
++FF-A specifies interfaces that enable a pair of software sandboxes to
++communicate with each other. A sandbox aka partition could
++be a VM in the Normal or Secure world, an application in S-EL0, or a
++Trusted OS in S-EL1.
+
-+This FF-A driver implements the interfaces to communicate with partitions in the Secure world aka Secure partitions (SPs).
++This FF-A driver implements the interfaces to communicate with partitions in
++the Secure world aka Secure partitions (SPs).
+
-+The driver specifically focuses on communicating with SPs that isolate portions of EFI runtime services that must run in a
-+protected environment which is inaccessible by the Host OS or Hypervisor. Examples of such services are set/get variables.
++The driver specifically focuses on communicating with SPs that isolate portions
++of EFI runtime services that must run in a protected environment which is
++inaccessible by the Host OS or Hypervisor. Examples of such services are
++set/get variables.
+
+FF-A driver uses the SMC ABIs defined by the FF-A specification to:
+
-+- Discover the presence of SPs of interest.
-+- Access an SP's service through communication protocols e.g. EFI MM communication protocol.
++- Discover the presence of SPs of interest
++- Access an SP's service through communication protocols
++ e.g. EFI MM communication protocol
++
++At this stage of development the FF-A driver supports EFI boot time only.
++
++Runtime support will be added in future developments.
+
+FF-A and SMC specifications
+-------------------------------------------
+
-+The current implementation of the driver relies on FF-A specification v1.0 and uses SMC32 calling convention.
++The current implementation of the driver relies on FF-A specification v1.0
++and uses SMC32 calling convention which means using the first 32-bit data of the
++Xn registers.
+
-+The driver has been tested with Optee OS which supports SMC32 for most of the SMC ABIs.
++At this stage we only need the FF-A v1.0 features.
+
-+For more details please refer to: https://developer.arm.com/documentation/den0077/a/?lang=en
++The driver has been tested with OP-TEE which supports SMC32 calling convention.
++
++For more details please refer to the FF-A v1.0 spec:
++https://documentation-service.arm.com/static/5fb7e8a6ca04df4095c1d65e?token=
++
++Hypervisors are supported if they are configured to trap SMC calls.
+
+The FF-A driver uses 64-bit registers as per SMCCCv1.2 specification.
+
-+For more details please refer to: https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6?token=
++For more details please refer to the SMC Calling Convention v1.2 spec:
++https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6?token=
+
+Supported hardware
+--------------------------------
@@ -191,60 +218,90 @@ index 0000000000..1c0a33deb8
+----------------------
+
+CONFIG_ARM_FFA_TRANSPORT
-+ Enables the FF-A bus driver. Turn this on if you want to use FF-A communication.
-+
-+CONFIG_ARM_FFA_EFI_RUNTIME_MODE
-+ Optional config that enables EFI runtime support for FF-A data and code.
-+ ffa_copy_runtime_data allows to copy the FF-A driver data structures to EFI runtime data section.
-+ Turning the config on makes ffa_copy_runtime_data available for use and the driver code placed at EFI runtime code section.
-+ Call ffa_copy_runtime_data at the event on which you want the FF-A data to be copied (example: at ExitBootServices).
++ Enables the FF-A bus driver. Turn this on if you want to use FF-A
++ communication.
+
+CONFIG_SANDBOX_FFA
-+ Enables FF-A Sandbox driver. This emulates the FF-A ABIs handling under Sandbox and provides
-+ functional tests for FF-A.
++ Enables FF-A Sandbox driver. This emulates the FF-A ABIs handling under
++ Sandbox and provides functional tests for FF-A.
+
+FF-A ABIs under the hood
+---------------------------------------
+
-+Invoking an FF-A ABI involves providing to the secure world/hypervisor the expected arguments from the ABI.
++Invoking an FF-A ABI involves providing to the secure world/hypervisor the
++expected arguments from the ABI.
+
-+The ABI arguments are stored in x0 to x7 registers. Then, an SMC instruction is executed.
++The ABI arguments are stored in x0 to x7 registers. Then, an SMC instruction
++is executed.
+
-+At the secure side level or hypervisor the ABI is handled at a higher exception level and the arguments are read and processed.
++At the secure side level or hypervisor the ABI is handled at a higher exception
++level and the arguments are read and processed.
+
-+The response is put back through x0 to x7 registers and control is giving back to the u-boot FF-A driver (non secure world).
++The response is put back through x0 to x7 registers and control is given back
++to the U-Boot FF-A driver (non-secure world).
+
+The driver reads the response and processes it accordingly.
+
+This methodology applies to all the FF-A ABIs in the driver.
+
-+FF-A bus discovery in u-boot
++FF-A bus discovery in U-Boot
+-------------------------------------------
+
-+When CONFIG_ARM_FFA_TRANSPORT is enabled, the FF-A bus is automatically discovered at initcall level (after u-boot relocation).
++When CONFIG_ARM_FFA_TRANSPORT is enabled, the FF-A bus is discovered on
++demand by the clients (users).
++
++Clients can discover the FF-A bus using ffa_bus_discover() API which triggers the
++discovery process.
+
-+The function that triggers the discovery process is ffa_bus_discover.
++ffa_bus_discover() creates, binds and probes the arm_ffa device using
++device_{bind, probe} APIs.
+
-+ffa_bus_discover creates, binds and probes the arm_ffa device using device_{bind, probe} APIs.
++The discovery process consists in communicating with secure world (or hypervisor)
++and querying specific data.
+
-+When the device is probed, ffa_probe is called which tries to communicate with the secure world or hypervisor.
++The discovery process takes place during the arm_ffa device probing which is
++handled by ffa_probe().
+
-+The FF-A bus is usable when these checks succeed:
++The FF-A bus discovery is successful and the bus is ready for use when these
++operations succeed:
+
+- querying the FF-A framework version
-+- querying from secure world the u-boot endpoint ID
-+- querying from secure world the supported features of the specified FF-A calls
++- querying from secure world the U-Boot endpoint ID
++- querying from secure world the RX/TX mapping features
+- mapping the RX/TX buffers
+- querying from secure world all the partitions information
+
-+Probing fails when any of these operations fail. The FF-A bus discovery succeeds when probing is successful.
++Discovery failure results in a probing failure and the arm_ffa device is
++destroyed.
+
-+When discovery fails the arm_ffa device is destroyed.
++Requirements for clients
++-------------------------------------
++
++When using the FF-A bus with EFI, clients must:
++
++- Query SPs in EFI boot time mode using the service UUID.
++- Unmap RX/TX buffers before EFI runtime mode starts.
++
++The RX/TX buffers are only available at EFI boot time. Querying partitions is
++done at boot time and data is cached for future use.
++
++RX/TX buffers should be unmapped by the user before EFI runtime mode
++starts. The driver provides a bus operation for that: rxtx_unmap()
++
++If RX/TX buffers created by U-Boot are not unmapped and by
++consequence becoming available at EFI runtime, secure world will get confused
++about RX/TX buffers ownership (U-Boot vs kernel).
++
++When invoking FF-A direct messaging, clients should specify which ABI protocol
++they want to use (32-bit vs 64-bit). Selecting the protocol means using
++the 32-bit or 64-bit version of FFA_MSG_SEND_DIRECT_{REQ, RESP}.
++The calling convention stays the same: SMC32.
+
+The bus driver layer
+------------------------------
+
-+The driver comes on top of the SMCCC layer and is implemented in drivers/firmware/arm-ffa/core.c
++The driver comes on top of the SMCCC layer and is implemented in
++drivers/firmware/arm-ffa/core.c
+
+The driver provides the following features:
+
@@ -260,6 +317,8 @@ index 0000000000..1c0a33deb8
+FFA_ERROR
+FFA_SUCCESS
+FFA_INTERRUPT
++FFA_MSG_SEND_DIRECT_REQ
++FFA_MSG_SEND_DIRECT_RESP
+
+- Support for the 64-bit version of the following ABIs:
+
@@ -269,8 +328,9 @@ index 0000000000..1c0a33deb8
+
+- Processing the received data from the secure world/hypervisor and caching it
+
-+- Hiding from upper layers the FF-A protocol and registers details. Upper layers focus on exchanged data,
-+the driver takes care of how to transport that to the secure world/hypervisor using FF-A.
++- Hiding from upper layers the FF-A protocol and registers details. Upper
++ layers focus on exchanged data, the driver takes care of how to transport
++ that to the secure world/hypervisor using FF-A
+
+- The driver provides callbacks to be used by clients to access the FF-A bus:
+
@@ -278,18 +338,19 @@ index 0000000000..1c0a33deb8
+sync_send_receive
+rxtx_unmap
+
-+- FF-A bus discovery at initcalls level (after u-boot relocation). The bus is up and running if the FF-A framework is responsive and compatible with the driver.
++- FF-A bus discovery makes sure FF-A framework is responsive and compatible
++ with the driver
+
-+- When EFI is enabled, unmap the RX/TX buffers at ExitBootServices() level.
-+
-+- When CONFIG_ARM_FFA_EFI_RUNTIME_MODE enabled, ffa_copy_runtime_data function is available for use.
++- FF-A bus can be compiled and used without EFI
+
+Using armffa command
+-----------------------------------
+
-+armffa is a command showcasing how to use the FF-A driver and how to invoke its operations.
++armffa is an implementation defined command showcasing how to use the FF-A driver and how to invoke
++its operations.
+
-+This provides a guidance to the client developers on how to call the FF-A bus interfaces.
++This provides a guidance to the client developers on how to call the FF-A bus
++interfaces.
+
+Usage:
+
@@ -308,8 +369,24 @@ index 0000000000..1c0a33deb8
+ devlist
+
+ displays the arm_ffa device info
++
++Contributors
++------------
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+diff --git a/doc/arch/index.rst b/doc/arch/index.rst
+index 792d9182c3..8d1ab0ad4e 100644
+--- a/doc/arch/index.rst
++++ b/doc/arch/index.rst
+@@ -8,6 +8,7 @@ Architecture-specific doc
+
+ arc
+ arm64
++ arm64.ffa
+ m68k
+ mips
+ nios2
diff --git a/drivers/Kconfig b/drivers/Kconfig
-index b26ca8cf70..4a602517bf 100644
+index 8b6fead351..b06b1ae481 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -6,6 +6,8 @@ source "drivers/core/Kconfig"
@@ -322,10 +399,10 @@ index b26ca8cf70..4a602517bf 100644
source "drivers/axi/Kconfig"
diff --git a/drivers/Makefile b/drivers/Makefile
-index 67c8af7442..77db8736e6 100644
+index eba9940231..c3bfad94ac 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
-@@ -109,6 +109,7 @@ obj-y += iommu/
+@@ -110,6 +110,7 @@ obj-y += iommu/
obj-y += smem/
obj-y += thermal/
obj-$(CONFIG_TEE) += tee/
@@ -335,10 +412,10 @@ index 67c8af7442..77db8736e6 100644
obj-$(CONFIG_W1) += w1/
diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig
new file mode 100644
-index 0000000000..aceb61cf49
+index 0000000000..e4914b9bc7
--- /dev/null
+++ b/drivers/firmware/arm-ffa/Kconfig
-@@ -0,0 +1,39 @@
+@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config ARM_FFA_TRANSPORT
@@ -360,37 +437,27 @@ index 0000000000..aceb61cf49
+
+ https://developer.arm.com/documentation/den0077/a/?lang=en
+
-+ In u-boot FF-A design, FF-A is considered as a discoverable bus.
++ In U-Boot FF-A design, FF-A is considered as a discoverable bus.
+ The Secure World is considered as one entity to communicate with
+ using the FF-A bus.
+ FF-A communication is handled by one device and one instance (the bus).
+ This FF-A driver takes care of all the interactions between Normal world
+ and Secure World.
+
-+ For more details about the FF-A driver, please refer to doc/README.ffa.drv
++ For more details about the FF-A driver, please refer to doc/arch/arm64.ffa.rst
+
-+config ARM_FFA_EFI_RUNTIME_MODE
-+ bool "Enable EFI runtime support for FF-A data and code"
-+ depends on ARM_FFA_TRANSPORT && EFI_LOADER
-+ help
-+ Allows FF-A driver data structures and code to be accessible at EFI runtime.
-+ FF-A data is copied by ffa_copy_runtime_data function.
-+ The driver Code needed at runtime is placed at EFI runtime code section.
-+ Turning this on makes ffa_copy_runtime_data available for use and the driver
-+ code placed at EFI runtime code section.
diff --git a/drivers/firmware/arm-ffa/Makefile b/drivers/firmware/arm-ffa/Makefile
new file mode 100644
-index 0000000000..0b9b0a61b4
+index 0000000000..043a8915be
--- /dev/null
+++ b/drivers/firmware/arm-ffa/Makefile
-@@ -0,0 +1,7 @@
+@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
-+# (C) Copyright 2022 Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-+#
++# (C) Copyright 2022
++# Abdellatif El Khlifi, Arm Limited, abdellatif.elkhlifi@arm.com.
+
+obj-y += arm-ffa-uclass.o core.o
-+obj-$(CONFIG_ARM_FFA_EFI_RUNTIME_MODE) += efi_ffa_runtime_data_mgr.o
diff --git a/drivers/firmware/arm-ffa/arm-ffa-uclass.c b/drivers/firmware/arm-ffa/arm-ffa-uclass.c
new file mode 100644
index 0000000000..7d9695d289
@@ -415,10 +482,10 @@ index 0000000000..7d9695d289
+};
diff --git a/drivers/firmware/arm-ffa/arm_ffa_prv.h b/drivers/firmware/arm-ffa/arm_ffa_prv.h
new file mode 100644
-index 0000000000..7bc90f7f66
+index 0000000000..4eea7dc036
--- /dev/null
+++ b/drivers/firmware/arm-ffa/arm_ffa_prv.h
-@@ -0,0 +1,196 @@
+@@ -0,0 +1,200 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2022 ARM Limited
@@ -485,27 +552,36 @@ index 0000000000..7bc90f7f66
+#define FFA_SMC_64(func_num) FFA_SMC(ARM_SMCCC_SMC_64, (func_num))
+
+enum ffa_abis {
-+ FFA_ERROR = 0x60,
-+ FFA_SUCCESS = 0x61,
-+ FFA_INTERRUPT = 0x62,
-+ FFA_VERSION = 0x63,
-+ FFA_FEATURES = 0x64,
-+ FFA_RX_RELEASE = 0x65,
-+ FFA_RXTX_MAP = 0x66,
-+ FFA_RXTX_UNMAP = 0x67,
-+ FFA_PARTITION_INFO_GET = 0x68,
-+ FFA_ID_GET = 0x69,
-+ FFA_RUN = 0x6D,
-+ FFA_MSG_SEND_DIRECT_REQ = 0x6F,
-+ FFA_MSG_SEND_DIRECT_RESP = 0x70,
++ FFA_ERROR = 0x60,
++ FFA_SUCCESS = 0x61,
++ FFA_INTERRUPT = 0x62,
++ FFA_VERSION = 0x63,
++ FFA_FEATURES = 0x64,
++ FFA_RX_RELEASE = 0x65,
++ FFA_RXTX_MAP = 0x66,
++ FFA_RXTX_UNMAP = 0x67,
++ FFA_PARTITION_INFO_GET = 0x68,
++ FFA_ID_GET = 0x69,
++ FFA_RUN = 0x6D,
++ FFA_MSG_SEND_DIRECT_REQ = 0x6F,
++ FFA_MSG_SEND_DIRECT_RESP = 0x70,
+
+ /* to be updated when adding new FFA IDs */
-+ FFA_FIRST_ID = FFA_ERROR, /* lowest number ID*/
-+ FFA_LAST_ID = FFA_MSG_SEND_DIRECT_RESP, /* highest number ID*/
++ FFA_FIRST_ID = FFA_ERROR, /* lowest number ID*/
++ FFA_LAST_ID = FFA_MSG_SEND_DIRECT_RESP, /* highest number ID*/
+};
+
-+/* number of the errors supported by the FF-A specification */
-+#define MAX_NUMBER_FFA_ERR 9
++enum ffa_abi_errcode {
++ NOT_SUPPORTED = 1,
++ INVALID_PARAMETERS,
++ NO_MEMORY,
++ BUSY,
++ INTERRUPTED,
++ DENIED,
++ RETRY,
++ ABORTED,
++ MAX_NUMBER_FFA_ERR
++};
+
+/* container structure and helper macros to map between an FF-A error and relevant error log */
+struct ffa_abi_errmap {
@@ -605,22 +681,17 @@ index 0000000000..7bc90f7f66
+};
+
+/**
-+ * ffa_device_get - create, bind and probe the arm_ffa device
-+ */
-+int ffa_device_get(void);
-+
-+/**
+ * ffa_bus_prvdata_get - bus driver private data getter
+ */
-+struct ffa_prvdata **ffa_bus_prvdata_get(void);
++struct ffa_prvdata *ffa_bus_prvdata_get(void);
+
+#endif
diff --git a/drivers/firmware/arm-ffa/core.c b/drivers/firmware/arm-ffa/core.c
new file mode 100644
-index 0000000000..41c7b96e68
+index 0000000000..0b1f8e6a07
--- /dev/null
+++ b/drivers/firmware/arm-ffa/core.c
-@@ -0,0 +1,1344 @@
+@@ -0,0 +1,1315 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2022 ARM Limited
@@ -644,115 +715,83 @@ index 0000000000..41c7b96e68
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
-+ * The device private data structure containing all the resident
++ * The device private data structure containing all the
+ * data read from secure world
+ */
-+__ffa_runtime_data struct ffa_prvdata *ffa_priv_data;
++struct ffa_prvdata *ffa_priv_data;
+
+/* Error mapping declarations */
+
-+__ffa_runtime_data int ffa_to_std_errmap[MAX_NUMBER_FFA_ERR] = {
-+ 0,
-+ -EOPNOTSUPP, /* NOT_SUPPORTED */
-+ -EINVAL, /* INVALID_PARAMETERS */
-+ -ENOMEM, /* NO_MEMORY */
-+ -EBUSY, /* BUSY */
-+ -EINTR, /* INTERRUPTED */
-+ -EACCES, /* DENIED */
-+ -EAGAIN, /* RETRY */
-+ -ECANCELED, /* ABORTED */
++int ffa_to_std_errmap[MAX_NUMBER_FFA_ERR] = {
++ [NOT_SUPPORTED] = -EOPNOTSUPP,
++ [INVALID_PARAMETERS] = -EINVAL,
++ [NO_MEMORY] = -ENOMEM,
++ [BUSY] = -EBUSY,
++ [INTERRUPTED] = -EINTR,
++ [DENIED] = -EACCES,
++ [RETRY] = -EAGAIN,
++ [ABORTED] = -ECANCELED,
+};
+
+struct ffa_abi_errmap err_msg_map[FFA_ERRMAP_COUNT] = {
+ [FFA_ID_TO_ERRMAP_ID(FFA_VERSION)] = {
+ {
-+ "",
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: A Firmware Framework implementation does not exist",
-+ "", /* INVALID_PARAMETERS */
-+ "", /* NO_MEMORY */
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
-+ "", /* DENIED */
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_ID_GET)] = {
+ {
-+ "",
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance",
-+ "", /* INVALID_PARAMETERS */
-+ "", /* NO_MEMORY */
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
-+ "", /* DENIED */
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_FEATURES)] = {
+ {
-+ "",
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: FFA_RXTX_MAP is not implemented at this FF-A instance",
-+ "", /* INVALID_PARAMETERS */
-+ "", /* NO_MEMORY */
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
-+ "", /* DENIED */
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_PARTITION_INFO_GET)] = {
+ {
-+ "",
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance",
++ [INVALID_PARAMETERS] =
+ "INVALID_PARAMETERS: Unrecognized UUID",
++ [NO_MEMORY] =
+ "NO_MEMORY: Results cannot fit in RX buffer of the caller",
++ [BUSY] =
+ "BUSY: RX buffer of the caller is not free",
-+ "", /* INTERRUPTED */
++ [DENIED] =
+ "DENIED: Callee is not in a state to handle this request",
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_RXTX_UNMAP)] = {
-+ {
-+ "",
++ {
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: FFA_RXTX_UNMAP is not implemented at this FF-A instance",
++ [INVALID_PARAMETERS] =
+ "INVALID_PARAMETERS: No buffer pair registered on behalf of the caller",
-+ "", /* NO_MEMORY */
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
-+ "", /* DENIED */
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_RX_RELEASE)] = {
-+ {
-+ "",
++ {
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: FFA_RX_RELEASE is not implemented at this FF-A instance",
-+ "", /* INVALID_PARAMETERS */
-+ "", /* NO_MEMORY */
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
++ [DENIED] =
+ "DENIED: Caller did not have ownership of the RX buffer",
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+ [FFA_ID_TO_ERRMAP_ID(FFA_RXTX_MAP)] = {
-+ {
-+ "",
++ {
++ [NOT_SUPPORTED] =
+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance",
++ [INVALID_PARAMETERS] =
+ "INVALID_PARAMETERS: Field(s) in input parameters incorrectly encoded",
++ [NO_MEMORY] =
+ "NO_MEMORY: Not enough memory",
-+ "", /* BUSY */
-+ "", /* INTERRUPTED */
++ [DENIED] =
+ "DENIED: Buffer pair already registered",
-+ "", /* RETRY */
-+ "", /* ABORTED */
+ },
+ },
+};
@@ -761,14 +800,14 @@ index 0000000000..41c7b96e68
+ * ffa_to_std_errno - convert FF-A error code to standard error code
+ * @ffa_errno: Error code returned by the FF-A ABI
+ *
-+ * This runtime function maps the given FF-A error code as specified
++ * This function maps the given FF-A error code as specified
+ * by the spec to a u-boot standard error code.
+ *
+ * Return:
+ *
+ * The standard error code on success. . Otherwise, failure
+ */
-+__ffa_runtime int ffa_to_std_errno(int ffa_errno)
++int ffa_to_std_errno(int ffa_errno)
+{
+ int err_idx = -ffa_errno;
+
@@ -783,7 +822,7 @@ index 0000000000..41c7b96e68
+ * @ffa_id: FF-A ABI ID
+ * @ffa_errno: Error code returned by the FF-A ABI
+ *
-+ * This boot time function maps the FF-A error code to the error log relevant to the
++ * This function maps the FF-A error code to the error log relevant to the
+ * selected FF-A ABI. Then the error log is printed.
+ *
+ * Return:
@@ -806,7 +845,7 @@ index 0000000000..41c7b96e68
+ if (abi_idx < 0 || abi_idx >= FFA_ERRMAP_COUNT)
+ return -EINVAL;
+
-+ if (!err_msg_map[abi_idx].err_str || !err_msg_map[abi_idx].err_str[err_idx])
++ if (!err_msg_map[abi_idx].err_str[err_idx])
+ return -EINVAL;
+
+ ffa_err("%s", err_msg_map[abi_idx].err_str[err_idx]);
@@ -822,7 +861,7 @@ index 0000000000..41c7b96e68
+ * ffa_remove_device - removes the arm_ffa device
+ * @dev: the device to be removed
+ *
-+ * This boot time function makes sure the arm_ffa device is removed
++ * This function makes sure the arm_ffa device is removed
+ * No need to free the kmalloced data when the device is destroyed.
+ * It's automatically done by devm management by
+ * device_remove() -> device_free() -> devres_release_probe().
@@ -861,26 +900,24 @@ index 0000000000..41c7b96e68
+
+/**
+ * ffa_device_get - create, bind and probe the arm_ffa device
++ * @pdev: the address of a device pointer (to be filled when the arm_ffa bus device is created
++ * successfully)
+ *
-+ * This boot time function makes sure the arm_ffa device is
++ * This function makes sure the arm_ffa device is
+ * created, bound to this driver, probed and ready to use.
-+ * Arm FF-A transport is implemented through a single u-boot
++ * Arm FF-A transport is implemented through a single U-Boot
+ * device managing the FF-A bus (arm_ffa).
+ *
+ * Return:
+ *
+ * 0 on success. Otherwise, failure
+ */
-+int ffa_device_get(void)
++int ffa_device_get(struct udevice **pdev)
+{
+ int ret;
+ struct udevice *dev = NULL;
+
-+ ret = device_bind(dm_root(),
-+ DM_DRIVER_GET(arm_ffa),
-+ FFA_DRV_NAME,
-+ NULL,
-+ ofnode_null(),
++ ret = device_bind(dm_root(), DM_DRIVER_GET(arm_ffa), FFA_DRV_NAME, NULL, ofnode_null(),
+ &dev);
+ if (ret)
+ return ret;
@@ -893,13 +930,16 @@ index 0000000000..41c7b96e68
+ return ret;
+ }
+
++ if (pdev)
++ *pdev = dev;
++
+ return 0;
+}
+
+/**
+ * ffa_get_version - FFA_VERSION handler function
+ *
-+ * This is the boot time function that implements FFA_VERSION FF-A function
++ * This function implements FFA_VERSION FF-A function
+ * to get from the secure world the FF-A framework version
+ *
+ * Return:
@@ -913,18 +953,17 @@ index 0000000000..41c7b96e68
+ int ffa_errno;
+
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
-+ .a0 = FFA_SMC_32(FFA_VERSION),
-+ .a1 = FFA_VERSION_1_0, .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
++ .a0 = FFA_SMC_32(FFA_VERSION), .a1 = FFA_VERSION_1_0,
+ }, &res);
+
-+ ffa_errno = (int)res.a0;
++ ffa_errno = res.a0;
+ if (ffa_errno < 0) {
+ ffa_print_error_log(FFA_VERSION, ffa_errno);
+ return ffa_to_std_errno(ffa_errno);
+ }
+
-+ major = GET_FFA_MAJOR_VERSION((u32)res.a0);
-+ minor = GET_FFA_MINOR_VERSION((u32)res.a0);
++ major = GET_FFA_MAJOR_VERSION(res.a0);
++ minor = GET_FFA_MINOR_VERSION(res.a0);
+
+ ffa_info("FF-A driver %d.%d\nFF-A framework %d.%d",
+ FFA_MAJOR_VERSION, FFA_MINOR_VERSION, major, minor);
@@ -932,7 +971,7 @@ index 0000000000..41c7b96e68
+ if ((major == FFA_MAJOR_VERSION && minor >= FFA_MINOR_VERSION)) {
+ ffa_info("Versions are compatible ");
+
-+ ffa_priv_data->fwk_version = (u32)res.a0;
++ ffa_priv_data->fwk_version = res.a0;
+
+ return 0;
+ }
@@ -946,7 +985,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_get_endpoint_id - FFA_ID_GET handler function
+ *
-+ * This is the boot time function that implements FFA_ID_GET FF-A function
++ * This function implements FFA_ID_GET FF-A function
+ * to get from the secure world u-boot endpoint ID
+ *
+ * Return:
@@ -960,7 +999,6 @@ index 0000000000..41c7b96e68
+
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+ .a0 = FFA_SMC_32(FFA_ID_GET),
-+ .a1 = 0, .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) {
@@ -970,7 +1008,7 @@ index 0000000000..41c7b96e68
+ return 0;
+ }
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+
+ ffa_print_error_log(FFA_ID_GET, ffa_errno);
+
@@ -981,7 +1019,7 @@ index 0000000000..41c7b96e68
+ * ffa_set_rxtx_buffers_pages_cnt - sets the minimum number of pages in each of the RX/TX buffers
+ * @prop_field: properties field obtained from FFA_FEATURES ABI
+ *
-+ * This boot time function sets the minimum number of pages
++ * This function sets the minimum number of pages
+ * in each of the RX/TX buffers in the private data structure
+ *
+ * Return:
@@ -1015,7 +1053,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_get_rxtx_map_features - FFA_FEATURES handler function with FFA_RXTX_MAP argument
+ *
-+ * This is the boot time function that implements FFA_FEATURES FF-A function
++ * This function implements FFA_FEATURES FF-A function
+ * to retrieve the FFA_RXTX_MAP features
+ *
+ * Return:
@@ -1030,13 +1068,12 @@ index 0000000000..41c7b96e68
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+ .a0 = FFA_SMC_32(FFA_FEATURES),
+ .a1 = FFA_SMC_64(FFA_RXTX_MAP),
-+ .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS))
-+ return ffa_set_rxtx_buffers_pages_cnt((u32)res.a2);
++ return ffa_set_rxtx_buffers_pages_cnt(res.a2);
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ ffa_print_error_log(FFA_FEATURES, ffa_errno);
+
+ return ffa_to_std_errno(ffa_errno);
@@ -1045,7 +1082,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_free_rxtx_buffers - frees the RX/TX buffers
+ *
-+ * This is the boot time function used to free the RX/TX buffers
++ * This function frees the RX/TX buffers
+ *
+ */
+static void ffa_free_rxtx_buffers(void)
@@ -1066,7 +1103,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_alloc_rxtx_buffers - allocates the RX/TX buffers
+ *
-+ * This is the boot time function used by ffa_map_rxtx_buffers to allocate
++ * This function is used by ffa_map_rxtx_buffers to allocate
+ * the RX/TX buffers before mapping them. The allocated memory is physically
+ * contiguous since memalign ends up calling malloc which allocates
+ * contiguous memory in u-boot.
@@ -1084,9 +1121,12 @@ index 0000000000..41c7b96e68
+
+ bytes = ffa_priv_data->pair.rxtx_min_pages * SZ_4K;
+
-+ /* RX/TX buffers addresses should be PAGE_SIZE aligned */
++ /*
++ * The alignment of the RX and TX buffers must be equal
++ * to the larger translation granule size
++ */
+
-+ ffa_priv_data->pair.rxbuf = (u64)memalign(PAGE_SIZE, bytes);
++ ffa_priv_data->pair.rxbuf = (u64)memalign(bytes, bytes);
+ if (!ffa_priv_data->pair.rxbuf) {
+ ffa_err("failure to allocate RX buffer");
+ return -ENOBUFS;
@@ -1094,7 +1134,7 @@ index 0000000000..41c7b96e68
+
+ ffa_info("RX buffer at virtual address 0x%llx", ffa_priv_data->pair.rxbuf);
+
-+ ffa_priv_data->pair.txbuf = (u64)memalign(PAGE_SIZE, bytes);
++ ffa_priv_data->pair.txbuf = (u64)memalign(bytes, bytes);
+ if (!ffa_priv_data->pair.txbuf) {
+ free((void *)ffa_priv_data->pair.rxbuf);
+ ffa_priv_data->pair.rxbuf = 0;
@@ -1116,7 +1156,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_map_rxtx_buffers - FFA_RXTX_MAP handler function
+ *
-+ * This is the boot time function that implements FFA_RXTX_MAP FF-A function
++ * This function implements FFA_RXTX_MAP FF-A function
+ * to map the RX/TX buffers
+ *
+ * Return:
@@ -1136,7 +1176,7 @@ index 0000000000..41c7b96e68
+ /*
+ * we need to pass the physical addresses of the RX/TX buffers
+ * in u-boot physical/virtual mapping is 1:1
-+ *no need to convert from virtual to physical
++ * no need to convert from virtual to physical
+ */
+
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
@@ -1144,7 +1184,6 @@ index 0000000000..41c7b96e68
+ .a1 = ffa_priv_data->pair.txbuf,
+ .a2 = ffa_priv_data->pair.rxbuf,
+ .a3 = ffa_priv_data->pair.rxtx_min_pages,
-+ .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) {
@@ -1152,7 +1191,7 @@ index 0000000000..41c7b96e68
+ return 0;
+ }
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ ffa_print_error_log(FFA_RXTX_MAP, ffa_errno);
+
+ ffa_free_rxtx_buffers();
@@ -1162,15 +1201,16 @@ index 0000000000..41c7b96e68
+
+/**
+ * ffa_unmap_rxtx_buffers - FFA_RXTX_UNMAP handler function
++ * @dev: The arm_ffa bus device
+ *
-+ * This is the boot time function that implements FFA_RXTX_UNMAP FF-A function
++ * This function implements FFA_RXTX_UNMAP FF-A function
+ * to unmap the RX/TX buffers
+ *
+ * Return:
+ *
+ * 0 on success. Otherwise, failure
+ */
-+static int ffa_unmap_rxtx_buffers(void)
++static int ffa_unmap_rxtx_buffers(struct udevice *dev)
+{
+ ffa_value_t res = {0};
+ int ffa_errno;
@@ -1178,7 +1218,6 @@ index 0000000000..41c7b96e68
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+ .a0 = FFA_SMC_32(FFA_RXTX_UNMAP),
+ .a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data->id),
-+ .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) {
@@ -1186,7 +1225,7 @@ index 0000000000..41c7b96e68
+ return 0;
+ }
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ ffa_print_error_log(FFA_RXTX_UNMAP, ffa_errno);
+
+ return ffa_to_std_errno(ffa_errno);
@@ -1195,7 +1234,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_release_rx_buffer - FFA_RX_RELEASE handler function
+ *
-+ * This is the boot time function that invokes FFA_RX_RELEASE FF-A function
++ * This function invokes FFA_RX_RELEASE FF-A function
+ * to release the ownership of the RX buffer
+ *
+ * Return:
@@ -1209,13 +1248,12 @@ index 0000000000..41c7b96e68
+
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+ .a0 = FFA_SMC_32(FFA_RX_RELEASE),
-+ .a1 = 0, .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS))
+ return 0;
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ ffa_print_error_log(FFA_RX_RELEASE, ffa_errno);
+
+ return ffa_to_std_errno(ffa_errno);
@@ -1226,20 +1264,20 @@ index 0000000000..41c7b96e68
+ * @uuid1: first UUID
+ * @uuid2: second UUID
+ *
-+ * This is a boot time function used by ffa_read_partitions_info to search
++ * This function is used by ffa_read_partitions_info to search
+ * for a UUID in the partitions descriptors table
+ *
+ * Return:
+ *
+ * 1 when UUIDs match. Otherwise, 0
+ */
-+int ffa_uuid_are_identical(const struct ffa_partition_uuid *uuid1,
-+ const struct ffa_partition_uuid *uuid2)
++bool ffa_uuid_are_identical(const struct ffa_partition_uuid *uuid1,
++ const struct ffa_partition_uuid *uuid2)
+{
+ if (!uuid1 || !uuid2)
+ return 0;
+
-+ return (!memcmp(uuid1, uuid2, sizeof(struct ffa_partition_uuid)));
++ return !memcmp(uuid1, uuid2, sizeof(struct ffa_partition_uuid));
+}
+
+/**
@@ -1248,7 +1286,7 @@ index 0000000000..41c7b96e68
+ * @count: The number of partitions queried
+ * @part_uuid: Pointer to the partition(s) UUID
+ *
-+ * This is the boot time function that reads the partitions information
++ * This function reads the partitions information
+ * returned by the FFA_PARTITION_INFO_GET and saves it in the private
+ * data structure.
+ *
@@ -1288,8 +1326,8 @@ index 0000000000..41c7b96e68
+ return -ENOMEM;
+ }
+
-+ ffa_priv_data->partitions.descs = (struct ffa_partition_desc *)
-+ devm_kmalloc(ffa_priv_data->dev, data_bytes, __GFP_ZERO);
++ ffa_priv_data->partitions.descs = devm_kmalloc(ffa_priv_data->dev, data_bytes,
++ __GFP_ZERO);
+ if (!ffa_priv_data->partitions.descs) {
+ ffa_err("cannot allocate partitions data buffer");
+ return -ENOMEM;
@@ -1357,7 +1395,7 @@ index 0000000000..41c7b96e68
+ * @part_uuid: Pointer to the partition(s) UUID
+ * @pcount: Pointer to the number of partitions variable filled when querying
+ *
-+ * This is the boot time function that executes the FFA_PARTITION_INFO_GET
++ * This function executes the FFA_PARTITION_INFO_GET
+ * to query the partitions data. Then, it calls ffa_read_partitions_info
+ * to save the data in the private data structure.
+ *
@@ -1398,9 +1436,6 @@ index 0000000000..41c7b96e68
+ .a2 = query_uuid.a2,
+ .a3 = query_uuid.a3,
+ .a4 = query_uuid.a4,
-+ .a5 = 0,
-+ .a6 = 0,
-+ .a7 = 0,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) {
@@ -1435,7 +1470,7 @@ index 0000000000..41c7b96e68
+ return ret;
+ }
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ ffa_print_error_log(FFA_PARTITION_INFO_GET, ffa_errno);
+
+ return ffa_to_std_errno(ffa_errno);
@@ -1448,19 +1483,21 @@ index 0000000000..41c7b96e68
+ * Mode 1: When getting from the driver the number of
+ * secure partitions:
+ * @uuid_str: pointer to the UUID string
-+ * @parts_size: pointer to the variable that contains the number of partitions
++ * @sp_count: pointer to the variable that contains the number of partitions
+ * The variable will be set by the driver
+ * @buffer: NULL
+ *
+ * Mode 2: When requesting the driver to return the
+ * partitions information:
++ * @dev: The arm_ffa bus device
+ * @uuid_str: pointer to the UUID string
-+ * @parts_size: pointer to the size of the SPs information buffer in bytes
++ * @sp_count: pointer to the variable that contains the number of empty partition descriptors
++ * The variable will be read by the driver
+ * @buffer: pointer to SPs information buffer
-+ * (allocated by the client).
++ * (allocated by the client and contains empty @sp_count descriptors).
+ * The buffer will be filled by the driver
+ *
-+ * This is the boot time function that queries the secure partition data from
++ * This function queries the secure partition data from
+ * the private data structure. If not found, it invokes FFA_PARTITION_INFO_GET
+ * FF-A function to query the partition information from secure world.
+ *
@@ -1491,27 +1528,25 @@ index 0000000000..41c7b96e68
+ *
+ * Return:
+ *
-+ * @parts_size: When pointing to the number of partitions variable, the number is
++ * @sp_count: When pointing to the number of partitions variable, the number is
+ * set by the driver.
+ * When pointing to the partitions information buffer size, the buffer will be
+ * filled by the driver.
+ *
+ * On success 0 is returned. Otherwise, failure
+ */
-+static int ffa_get_partitions_info(const char *uuid_str,
-+ u32 *parts_size, struct ffa_partition_info *buffer)
++static int ffa_get_partitions_info(struct udevice *dev, const char *uuid_str,
++ u32 *sp_count, struct ffa_partition_info *buffer)
+{
+ /*
+ * fill_data:
+ * 0: return the SP count
+ * 1: fill SP data and return it to the caller
-+ * -1: undefined mode
+ */
-+ int fill_data = -1;
++ bool fill_data = 0;
+ u32 desc_idx, client_desc_idx;
+ struct ffa_partition_uuid part_uuid = {0};
-+ u32 client_desc_max_cnt;
-+ u32 parts_found = 0;
++ u32 sp_found = 0;
+
+ if (!ffa_priv_data->partitions.count || !ffa_priv_data->partitions.descs) {
+ ffa_err("no partition installed");
@@ -1523,12 +1558,12 @@ index 0000000000..41c7b96e68
+ return -EINVAL;
+ }
+
-+ if (!parts_size) {
++ if (!sp_count) {
+ ffa_err("no size/count provided");
+ return -EINVAL;
+ }
+
-+ if (be_uuid_str_to_le_bin(uuid_str, (unsigned char *)&part_uuid)) {
++ if (uuid_str_to_le_bin(uuid_str, (unsigned char *)&part_uuid)) {
+ ffa_err("invalid UUID");
+ return -EINVAL;
+ }
@@ -1540,19 +1575,13 @@ index 0000000000..41c7b96e68
+
+ ffa_info("Preparing for checking partitions count");
+
-+ } else if ((*parts_size >= sizeof(struct ffa_partition_info)) &&
-+ !(*parts_size % sizeof(struct ffa_partition_info))) {
++ } else if (*sp_count) {
+ /* Mode 2: retrieving the partitions information */
+
+ fill_data = 1;
+
+ client_desc_idx = 0;
+
-+ /*
-+ * number of empty descriptors preallocated by the caller
-+ */
-+ client_desc_max_cnt = *parts_size / sizeof(struct ffa_partition_info);
-+
+ ffa_info("Preparing for filling partitions info");
+
+ } else {
@@ -1573,14 +1602,14 @@ index 0000000000..41c7b96e68
+ ffa_info("Partition ID %x matches the provided UUID",
+ ffa_priv_data->partitions.descs[desc_idx].info.id);
+
-+ parts_found++;
++ sp_found++;
+
+ if (fill_data) {
+ /*
+ * trying to fill the partition info in the input buffer
+ */
+
-+ if (client_desc_idx < client_desc_max_cnt) {
++ if (client_desc_idx < *sp_count) {
+ buffer[client_desc_idx++] =
+ ffa_priv_data->partitions.descs[desc_idx].info;
+ continue;
@@ -1592,27 +1621,28 @@ index 0000000000..41c7b96e68
+ }
+ }
+
-+ if (!parts_found) {
++ if (!sp_found) {
+ int ret;
+
+ ffa_info("No partition found. Querying framework ...");
+
-+ ret = ffa_query_partitions_info(&part_uuid, &parts_found);
++ ret = ffa_query_partitions_info(&part_uuid, &sp_found);
+
+ if (ret == 0) {
+ if (!fill_data) {
-+ *parts_size = parts_found;
++ *sp_count = sp_found;
+
+ ffa_info("Number of partition(s) found matching the UUID: %d",
-+ parts_found);
++ sp_found);
+ } else {
+ /*
+ * If SPs data detected, they are already in the private data
+ * structure, retry searching SP data again to return them
+ * to the caller
+ */
-+ if (parts_found)
-+ ret = ffa_get_partitions_info(uuid_str, parts_size, buffer);
++ if (sp_found)
++ ret = ffa_get_partitions_info(dev, uuid_str, sp_count,
++ buffer);
+ else
+ ret = -ENODATA;
+ }
@@ -1623,7 +1653,7 @@ index 0000000000..41c7b96e68
+
+ /* partition(s) found */
+ if (!fill_data)
-+ *parts_size = parts_found;
++ *sp_count = sp_found;
+
+ return 0;
+}
@@ -1631,7 +1661,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_cache_partitions_info - Queries and saves all secure partitions data
+ *
-+ * This is a boot time function that invokes FFA_PARTITION_INFO_GET FF-A
++ * This function invokes FFA_PARTITION_INFO_GET FF-A
+ * function to query from secure world all partitions information.
+ *
+ * The FFA_PARTITION_INFO_GET call is issued with nil UUID as an argument.
@@ -1653,10 +1683,12 @@ index 0000000000..41c7b96e68
+
+/**
+ * ffa_msg_send_direct_req - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function
++ * @dev: The arm_ffa bus device
+ * @dst_part_id: destination partition ID
+ * @msg: pointer to the message data preallocated by the client (in/out)
++ * @is_smc64: select 64-bit or 32-bit FF-A ABI
+ *
-+ * This is the runtime function that implements FFA_MSG_SEND_DIRECT_{REQ,RESP}
++ * This function implements FFA_MSG_SEND_DIRECT_{REQ,RESP}
+ * FF-A functions.
+ *
+ * FFA_MSG_SEND_DIRECT_REQ is used to send the data to the secure partition.
@@ -1671,10 +1703,12 @@ index 0000000000..41c7b96e68
+ *
+ * 0 on success. Otherwise, failure
+ */
-+static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_send_direct_data *msg)
++static int ffa_msg_send_direct_req(struct udevice *dev, u16 dst_part_id,
++ struct ffa_send_direct_data *msg, bool is_smc64)
+{
+ ffa_value_t res = {0};
+ int ffa_errno;
++ u64 req_mode, resp_mode;
+
+ if (!ffa_priv_data || !ffa_priv_data->invoke_ffa_fn)
+ return -EINVAL;
@@ -1683,8 +1717,16 @@ index 0000000000..41c7b96e68
+ if (!ffa_priv_data->partitions.count || !ffa_priv_data->partitions.descs)
+ return -ENODEV;
+
++ if (is_smc64) {
++ req_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ);
++ resp_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP);
++ } else {
++ req_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_REQ);
++ resp_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_RESP);
++ }
++
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
-+ .a0 = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ),
++ .a0 = req_mode,
+ .a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data->id) |
+ PREP_PART_ENDPOINT_ID(dst_part_id),
+ .a2 = 0,
@@ -1698,7 +1740,7 @@ index 0000000000..41c7b96e68
+ while (res.a0 == FFA_SMC_32(FFA_INTERRUPT))
+ ffa_priv_data->invoke_ffa_fn((ffa_value_t){
+ .a0 = FFA_SMC_32(FFA_RUN),
-+ .a1 = res.a1, .a2 = 0, .a3 = 0, .a4 = 0, .a5 = 0, .a6 = 0, .a7 = 0,
++ .a1 = res.a1,
+ }, &res);
+
+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) {
@@ -1706,7 +1748,7 @@ index 0000000000..41c7b96e68
+ return 0;
+ }
+
-+ if (res.a0 == FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP)) {
++ if (res.a0 == resp_mode) {
+ /*
+ * Message sent with response
+ * extract the return data
@@ -1720,7 +1762,7 @@ index 0000000000..41c7b96e68
+ return 0;
+ }
+
-+ ffa_errno = (int)res.a2;
++ ffa_errno = res.a2;
+ return ffa_to_std_errno(ffa_errno);
+}
+
@@ -1733,7 +1775,7 @@ index 0000000000..41c7b96e68
+ *
+ * Return: void
+ */
-+void __ffa_runtime __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
++void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
+{
+ arm_smccc_1_2_smc(&args, res);
+}
@@ -1741,7 +1783,7 @@ index 0000000000..41c7b96e68
+/**
+ * ffa_set_smc_conduit - Set the SMC conduit
+ *
-+ * This boot time function selects the SMC conduit by setting the driver invoke function
++ * This function selects the SMC conduit by setting the driver invoke function
+ * to SMC assembly function
+ *
+ * Return:
@@ -1779,7 +1821,7 @@ index 0000000000..41c7b96e68
+ * ffa_alloc_prvdata - allocate the driver main data structure and sets the device
+ * @dev: the arm_ffa device
+ *
-+ * This boot time function creates the main data structure embedding all the driver data.
++ * This function creates the main data structure embedding all the driver data.
+ *
+ * Return:
+ *
@@ -1879,7 +1921,7 @@ index 0000000000..41c7b96e68
+{
+ ffa_info("removing the device");
+
-+ ffa_unmap_rxtx_buffers();
++ ffa_unmap_rxtx_buffers(dev);
+
+ if (ffa_priv_data->pair.rxbuf || ffa_priv_data->pair.txbuf)
+ ffa_free_rxtx_buffers();
@@ -1908,9 +1950,9 @@ index 0000000000..41c7b96e68
+ * ffa_bus_ops_get - bus driver operations getter
+ *
+ * Return:
-+ * This runtime function returns a pointer to the driver operations structure
++ * This function returns a pointer to the driver operations structure
+ */
-+const struct ffa_bus_ops * __ffa_runtime ffa_bus_ops_get(void)
++const struct ffa_bus_ops *ffa_bus_ops_get(void)
+{
+ return &ffa_priv_data->ffa_ops;
+}
@@ -1919,20 +1961,20 @@ index 0000000000..41c7b96e68
+ * ffa_bus_prvdata_get - bus driver private data getter
+ *
+ * Return:
-+ * This boot time function returns a pointer to the main private data structure
++ * This function returns a pointer to the main private data structure
+ */
-+struct ffa_prvdata **ffa_bus_prvdata_get(void)
++struct ffa_prvdata *ffa_bus_prvdata_get(void)
+{
-+ return &ffa_priv_data;
++ return ffa_priv_data;
+}
+
+/**
-+ * ffa_bus_discover - discover FF-A bus and probe the arm_ffa device
++ * ffa_bus_discover - discover FF-A bus and probe arm_ffa device
++ * @pdev: the address of a device pointer (to be filled when the arm_ffa bus device is created
++ * successfully)
+ *
-+ * This boot time function makes sure the FF-A bus is discoverable.
-+ * Then, the arm_ffa device is probed and ready to use.
-+ * This function is called automatically at initcalls
-+ * level (after u-boot relocation).
++ * This function makes sure the FF-A bus is discoverable.
++ * When probing succeeds FF-A discovery is done. The arm_ffa device is ready to use.
+ *
+ * When the bus was already discovered successfully the discovery will not run again.
+ *
@@ -1944,12 +1986,12 @@ index 0000000000..41c7b96e68
+ *
+ * 0 on success. Otherwise, failure
+ */
-+int ffa_bus_discover(void)
++int ffa_bus_discover(struct udevice **pdev)
+{
+ int ret = 0;
+
-+ if (!ffa_priv_data)
-+ ret = ffa_device_get();
++ if (!ffa_priv_data) {
++ ret = ffa_device_get(pdev);
+
+ return ret;
+}
@@ -1965,112 +2007,12 @@ index 0000000000..41c7b96e68
+ .remove = ffa_remove,
+ .unbind = ffa_unbind,
+};
-diff --git a/drivers/firmware/arm-ffa/efi_ffa_runtime_data_mgr.c b/drivers/firmware/arm-ffa/efi_ffa_runtime_data_mgr.c
-new file mode 100644
-index 0000000000..c76cf2147b
---- /dev/null
-+++ b/drivers/firmware/arm-ffa/efi_ffa_runtime_data_mgr.c
-@@ -0,0 +1,94 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/*
-+ * (C) Copyright 2022 ARM Limited
-+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-+ */
-+
-+#include "arm_ffa_prv.h"
-+
-+/**
-+ * ffa_copy_runtime_data - copy the private data structure to the runtime area
-+ *
-+ * This boot time function copies the arm_ffa driver data structures including
-+ * partitions data to the EFI runtime data section.
-+ *
-+ * Return:
-+ *
-+ * 0 on success. Otherwise, failure
-+ */
-+efi_status_t ffa_copy_runtime_data(void)
-+{
-+ efi_status_t efi_ret;
-+ efi_uintn_t prvdata_pages;
-+ efi_uintn_t descs_pages;
-+ struct ffa_prvdata **prvdata = NULL; /* Pointer to the current structure */
-+ struct ffa_prvdata *runtime_prvdata = NULL; /* Pointer to the structure runtime copy */
-+ u64 runtime_descs = 0;
-+
-+ prvdata = ffa_bus_prvdata_get();
-+
-+ printf("INFO: EFI: FFA: prv data area at 0x%llx\n", (u64)prvdata);
-+
-+ /* allocate private data runtime area */
-+
-+ prvdata_pages = efi_size_in_pages(sizeof(struct ffa_prvdata));
-+ efi_ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
-+ EFI_RUNTIME_SERVICES_DATA,
-+ prvdata_pages,
-+ (u64 *)&runtime_prvdata);
-+
-+ if (efi_ret != EFI_SUCCESS) {
-+ printf("ERROR: EFI: FFA: allocating runtime data (err: 0x%lx, addr 0x%llx)\n",
-+ efi_ret, (u64)runtime_prvdata);
-+
-+ return efi_ret;
-+ }
-+
-+ printf("INFO: EFI: FFA: runtime data area at 0x%llx\n", (u64)runtime_prvdata);
-+
-+ if (!runtime_prvdata)
-+ return EFI_INVALID_PARAMETER;
-+
-+ /* allocate the partition data runtime area */
-+
-+ descs_pages = efi_size_in_pages((*prvdata)->partitions.count *
-+ sizeof(struct ffa_partition_desc));
-+ efi_ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES,
-+ EFI_RUNTIME_SERVICES_DATA,
-+ descs_pages,
-+ &runtime_descs);
-+
-+ if (efi_ret != EFI_SUCCESS) {
-+ printf("ERROR: EFI: FFA: allocating runtime SPs data (err: 0x%lx, addr 0x%llx)\n",
-+ efi_ret, runtime_descs);
-+
-+ efi_free_pages((u64)runtime_prvdata, prvdata_pages);
-+
-+ return efi_ret;
-+ }
-+
-+ printf("INFO: EFI: FFA: SPs runtime area at 0x%llx\n", (u64)runtime_descs);
-+
-+ if (!runtime_descs)
-+ return EFI_INVALID_PARAMETER;
-+
-+ *runtime_prvdata = **prvdata;
-+
-+ runtime_prvdata->dev = NULL;
-+ runtime_prvdata->ffa_ops.partition_info_get = NULL;
-+ runtime_prvdata->ffa_ops.rxtx_unmap = NULL;
-+ runtime_prvdata->partitions.descs = (struct ffa_partition_desc *)runtime_descs;
-+ runtime_prvdata->pair.rxbuf = 0;
-+ runtime_prvdata->pair.txbuf = 0;
-+
-+ /*
-+ * Update the private data structure pointer in the driver
-+ * no need to free the old structure. devm takes care of that
-+ */
-+ *prvdata = runtime_prvdata;
-+
-+ printf("INFO: EFI: FFA: runtime prv data now at 0x%llx , SPs count %d\n",
-+ (u64)*prvdata, (*prvdata)->partitions.count);
-+
-+ return 0;
-+}
diff --git a/include/arm_ffa.h b/include/arm_ffa.h
new file mode 100644
-index 0000000000..f17b100497
+index 0000000000..74b16174c2
--- /dev/null
+++ b/include/arm_ffa.h
-@@ -0,0 +1,127 @@
+@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2022 ARM Limited
@@ -2103,7 +2045,7 @@ index 0000000000..f17b100497
+ * Data structure containing information about partitions instantiated in the system
+ * This structure is filled with the data queried by FFA_PARTITION_INFO_GET
+ */
-+struct __packed ffa_partition_info {
++struct ffa_partition_info {
+ u16 id;
+ u16 exec_ctxt;
+/* partition supports receipt of direct requests */
@@ -2125,7 +2067,7 @@ index 0000000000..f17b100497
+ */
+
+/* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */
-+struct __packed ffa_send_direct_data {
++struct ffa_send_direct_data {
+ unsigned long data0; /* w3/x3 */
+ unsigned long data1; /* w4/x4 */
+ unsigned long data2; /* w5/x5 */
@@ -2133,30 +2075,7 @@ index 0000000000..f17b100497
+ unsigned long data4; /* w7/x7 */
+};
+
-+#if CONFIG_IS_ENABLED(ARM_FFA_EFI_RUNTIME_MODE)
-+
-+#include <efi_loader.h>
-+
-+/*
-+ * __ffa_runtime - controls whether functions are
-+ * available after calling the EFI ExitBootServices service.
-+ * Functions tagged with these keywords are resident (available at boot time and
-+ * at runtime)
-+ */
-+
-+#define __ffa_runtime_data __efi_runtime_data
-+#define __ffa_runtime __efi_runtime
-+
-+#else
-+
-+/*
-+ * The FF-A driver is independent from EFI
-+ */
-+
-+#define __ffa_runtime_data
-+#define __ffa_runtime
-+
-+#endif
++struct udevice;
+
+/**
+ * struct ffa_bus_ops - The driver operations structure
@@ -2168,10 +2087,12 @@ index 0000000000..f17b100497
+ * This structure is EFI runtime resident.
+ */
+struct ffa_bus_ops {
-+ int (*partition_info_get)(const char *uuid_str,
-+ u32 *parts_size, struct ffa_partition_info *buffer);
-+ int (*sync_send_receive)(u16 dst_part_id, struct ffa_send_direct_data *msg);
-+ int (*rxtx_unmap)(void);
++ int (*partition_info_get)(struct udevice *dev, const char *uuid_str,
++ u32 *sp_count, struct ffa_partition_info *buffer);
++ int (*sync_send_receive)(struct udevice *dev, u16 dst_part_id,
++ struct ffa_send_direct_data *msg,
++ bool is_smc64);
++ int (*rxtx_unmap)(struct udevice *dev);
+};
+
+/**
@@ -2181,65 +2102,36 @@ index 0000000000..f17b100497
+/**
+ * ffa_bus_ops_get - driver operations getter
+ */
-+const struct ffa_bus_ops * __ffa_runtime ffa_bus_ops_get(void);
++const struct ffa_bus_ops *ffa_bus_ops_get(void);
+
+/**
+ * ffa_bus_discover - discover FF-A bus and probes the arm_ffa device
+ */
-+int ffa_bus_discover(void);
-+
-+#if CONFIG_IS_ENABLED(ARM_FFA_EFI_RUNTIME_MODE)
-+
-+/**
-+ * ffa_copy_runtime_data - copy the private data structure and the SPs data to the runtime area
-+ */
-+efi_status_t ffa_copy_runtime_data(void);
-+
-+#endif
++int ffa_bus_discover(struct udevice **pdev);
+
+#endif
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
-index 3ba69ad9a0..7324418245 100644
+index a432e43871..5dd698b7a9 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
-@@ -55,6 +55,7 @@ enum uclass_id {
+@@ -4,6 +4,9 @@
+ *
+ * (C) Copyright 2012
+ * Pavel Herrmann <morpheus.ibis@gmail.com>
++ *
++ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+ #ifndef _DM_UCLASS_ID_H
+@@ -55,6 +58,7 @@ enum uclass_id {
UCLASS_EFI_MEDIA, /* Devices provided by UEFI firmware */
UCLASS_ETH, /* Ethernet device */
UCLASS_ETH_PHY, /* Ethernet PHY device */
+ UCLASS_FFA, /* Arm Firmware Framework for Armv8-A */
UCLASS_FIRMWARE, /* Firmware */
+ UCLASS_FUZZING_ENGINE, /* Fuzzing engine */
UCLASS_FS_FIRMWARE_LOADER, /* Generic loader */
- UCLASS_GPIO, /* Bank of general-purpose I/O pins */
-diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 4da64b5d29..0ec002ac8b 100644
---- a/lib/efi_loader/efi_boottime.c
-+++ b/lib/efi_loader/efi_boottime.c
-@@ -23,6 +23,10 @@
- #include <asm/setjmp.h>
- #include <linux/libfdt_env.h>
-
-+#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
-+#include <arm_ffa.h>
-+#endif
-+
- DECLARE_GLOBAL_DATA_PTR;
-
- /* Task priority level */
-@@ -2173,6 +2177,14 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
- dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
- }
-
-+#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
-+ /* unmap FF-A RX/TX buffers */
-+ if (ffa_bus_ops_get()->rxtx_unmap())
-+ debug("[efi_boottime][ERROR]: can not unmap FF-A RX/TX buffers\n");
-+ else
-+ debug("[efi_boottime][INFO]: FF-A RX/TX buffers unmapped\n");
-+#endif
-+
- /* Patch out unsupported runtime function */
- efi_runtime_detach();
-
--
2.17.1
deleted file mode 100644
@@ -1,498 +0,0 @@
-From 178da5bee196f44c4c10e9804674fe5ac0bc1176 Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Mon, 28 Jun 2021 23:20:55 +0100
-Subject: [PATCH 03/26] usb: common: move urb code to common
-
-Move urb code from musb only use to a more common scope, so other
-drivers in the future can use the handling of urb in usb.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Accepted [2022.10-rc1]
----
- drivers/usb/common/Makefile | 2 +
- drivers/usb/common/usb_urb.c | 160 ++++++++++++++++++
- drivers/usb/host/r8a66597-hcd.c | 30 +---
- drivers/usb/musb-new/musb_core.c | 2 +-
- drivers/usb/musb-new/musb_host.c | 2 +-
- drivers/usb/musb-new/musb_host.h | 2 +-
- drivers/usb/musb-new/musb_uboot.c | 38 +----
- drivers/usb/musb-new/musb_uboot.h | 2 +-
- .../linux/usb/usb_urb_compat.h | 46 ++++-
- include/usb_defs.h | 32 ++++
- 10 files changed, 240 insertions(+), 76 deletions(-)
- create mode 100644 drivers/usb/common/usb_urb.c
- rename drivers/usb/musb-new/usb-compat.h => include/linux/usb/usb_urb_compat.h (60%)
-
-diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
-index 3bedbf213f..dc05cb0a50 100644
---- a/drivers/usb/common/Makefile
-+++ b/drivers/usb/common/Makefile
-@@ -4,5 +4,7 @@
- #
-
- obj-$(CONFIG_$(SPL_)DM_USB) += common.o
-+obj-$(CONFIG_USB_MUSB_HCD) += usb_urb.o
-+obj-$(CONFIG_USB_MUSB_UDC) += usb_urb.o
- obj-$(CONFIG_USB_EHCI_FSL) += fsl-dt-fixup.o fsl-errata.o
- obj-$(CONFIG_USB_XHCI_FSL) += fsl-dt-fixup.o fsl-errata.o
-diff --git a/drivers/usb/common/usb_urb.c b/drivers/usb/common/usb_urb.c
-new file mode 100644
-index 0000000000..be3b6b9f32
---- /dev/null
-+++ b/drivers/usb/common/usb_urb.c
-@@ -0,0 +1,160 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Common code for usb urb handling, based on the musb-new code
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ */
-+
-+#include <dm/device.h>
-+#include <dm/device_compat.h>
-+#include <linux/usb/usb_urb_compat.h>
-+
-+#include <time.h>
-+#include <usb.h>
-+
-+#if CONFIG_IS_ENABLED(DM_USB)
-+struct usb_device *usb_dev_get_parent(struct usb_device *udev)
-+{
-+ struct udevice *parent = udev->dev->parent;
-+
-+ /*
-+ * When called from usb-uclass.c: usb_scan_device() udev->dev points
-+ * to the parent udevice, not the actual udevice belonging to the
-+ * udev as the device is not instantiated yet.
-+ *
-+ * If dev is an usb-bus, then we are called from usb_scan_device() for
-+ * an usb-device plugged directly into the root port, return NULL.
-+ */
-+ if (device_get_uclass_id(udev->dev) == UCLASS_USB)
-+ return NULL;
-+
-+ /*
-+ * If these 2 are not the same we are being called from
-+ * usb_scan_device() and udev itself is the parent.
-+ */
-+ if (dev_get_parent_priv(udev->dev) != udev)
-+ return udev;
-+
-+ /* We are being called normally, use the parent pointer */
-+ if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
-+ return dev_get_parent_priv(parent);
-+
-+ return NULL;
-+}
-+#else
-+struct usb_device *usb_dev_get_parent(struct usb_device *udev)
-+{
-+ return udev->parent;
-+}
-+#endif
-+
-+static void usb_urb_complete(struct urb *urb)
-+{
-+ urb->dev->status &= ~USB_ST_NOT_PROC;
-+ urb->dev->act_len = urb->actual_length;
-+
-+ if (urb->status == -EINPROGRESS)
-+ urb->status = 0;
-+}
-+
-+void usb_urb_fill(struct urb *urb, struct usb_host_endpoint *hep,
-+ struct usb_device *dev, int endpoint_type,
-+ unsigned long pipe, void *buffer, int len,
-+ struct devrequest *setup, int interval)
-+{
-+ int epnum = usb_pipeendpoint(pipe);
-+ int is_in = usb_pipein(pipe);
-+ u16 maxpacketsize = is_in ? dev->epmaxpacketin[epnum] :
-+ dev->epmaxpacketout[epnum];
-+
-+ memset(urb, 0, sizeof(struct urb));
-+ memset(hep, 0, sizeof(struct usb_host_endpoint));
-+ INIT_LIST_HEAD(&hep->urb_list);
-+ INIT_LIST_HEAD(&urb->urb_list);
-+ urb->ep = hep;
-+ urb->complete = usb_urb_complete;
-+ urb->status = -EINPROGRESS;
-+ urb->dev = dev;
-+ urb->pipe = pipe;
-+ urb->transfer_buffer = buffer;
-+ urb->transfer_dma = (unsigned long)buffer;
-+ urb->transfer_buffer_length = len;
-+ urb->setup_packet = (unsigned char *)setup;
-+
-+ urb->ep->desc.wMaxPacketSize = __cpu_to_le16(maxpacketsize);
-+ urb->ep->desc.bmAttributes = endpoint_type;
-+ urb->ep->desc.bEndpointAddress = ((is_in ? USB_DIR_IN : USB_DIR_OUT) |
-+ epnum);
-+ urb->ep->desc.bInterval = interval;
-+}
-+
-+int usb_urb_submit(struct usb_hcd *hcd, struct urb *urb)
-+{
-+ const struct usb_urb_ops *ops = hcd->urb_ops;
-+ unsigned long timeout;
-+ int ret;
-+
-+ if (!ops)
-+ return -EINVAL;
-+
-+ ret = ops->urb_enqueue(hcd, urb, 0);
-+ if (ret < 0) {
-+ printf("Failed to enqueue URB to controller\n");
-+ return ret;
-+ }
-+
-+ timeout = get_timer(0) + USB_TIMEOUT_MS(urb->pipe);
-+ do {
-+ if (ctrlc())
-+ return -EIO;
-+ ops->isr(0, hcd);
-+ } while (urb->status == -EINPROGRESS && get_timer(0) < timeout);
-+
-+ if (urb->status == -EINPROGRESS)
-+ ops->urb_dequeue(hcd, urb, -ETIME);
-+
-+ return urb->status;
-+}
-+
-+int usb_urb_submit_control(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep,
-+ struct usb_device *dev, unsigned long pipe,
-+ void *buffer, int len, struct devrequest *setup,
-+ int interval, enum usb_device_speed speed)
-+{
-+ const struct usb_urb_ops *ops = hcd->urb_ops;
-+
-+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_CONTROL, pipe, buffer,
-+ len, setup, 0);
-+
-+ /* Fix speed for non hub-attached devices */
-+ if (!usb_dev_get_parent(dev)) {
-+ dev->speed = speed;
-+ if (ops->hub_control)
-+ return ops->hub_control(hcd, dev, pipe, buffer, len,
-+ setup);
-+ }
-+
-+ return usb_urb_submit(hcd, urb);
-+}
-+
-+int usb_urb_submit_bulk(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int len)
-+{
-+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_BULK, pipe, buffer, len,
-+ NULL, 0);
-+
-+ return usb_urb_submit(hcd, urb);
-+}
-+
-+int usb_urb_submit_irq(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int len, int interval)
-+{
-+ usb_urb_fill(urb, hep, dev, USB_ENDPOINT_XFER_INT, pipe, buffer, len,
-+ NULL, interval);
-+
-+ return usb_urb_submit(hcd, urb);
-+}
-diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
-index f1fc93f3d4..3ccbc16da3 100644
---- a/drivers/usb/host/r8a66597-hcd.c
-+++ b/drivers/usb/host/r8a66597-hcd.c
-@@ -14,6 +14,7 @@
- #include <dm/device_compat.h>
- #include <linux/delay.h>
- #include <linux/iopoll.h>
-+#include <linux/usb/usb_urb_compat.h>
- #include <power/regulator.h>
-
- #include "r8a66597.h"
-@@ -24,35 +25,6 @@
- #define R8A66597_DPRINT(...)
- #endif
-
--static inline struct usb_device *usb_dev_get_parent(struct usb_device *udev)
--{
-- struct udevice *parent = udev->dev->parent;
--
-- /*
-- * When called from usb-uclass.c: usb_scan_device() udev->dev points
-- * to the parent udevice, not the actual udevice belonging to the
-- * udev as the device is not instantiated yet.
-- *
-- * If dev is an usb-bus, then we are called from usb_scan_device() for
-- * an usb-device plugged directly into the root port, return NULL.
-- */
-- if (device_get_uclass_id(udev->dev) == UCLASS_USB)
-- return NULL;
--
-- /*
-- * If these 2 are not the same we are being called from
-- * usb_scan_device() and udev itself is the parent.
-- */
-- if (dev_get_parent_priv(udev->dev) != udev)
-- return udev;
--
-- /* We are being called normally, use the parent pointer */
-- if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
-- return dev_get_parent_priv(parent);
--
-- return NULL;
--}
--
- static void get_hub_data(struct usb_device *dev, u16 *hub_devnum, u16 *hubport)
- {
- struct usb_device *parent = usb_dev_get_parent(dev);
-diff --git a/drivers/usb/musb-new/musb_core.c b/drivers/usb/musb-new/musb_core.c
-index 18d9bc805f..fc7af7484e 100644
---- a/drivers/usb/musb-new/musb_core.c
-+++ b/drivers/usb/musb-new/musb_core.c
-@@ -89,9 +89,9 @@
- #include <linux/usb/ch9.h>
- #include <linux/usb/gadget.h>
- #include <linux/usb/musb.h>
-+#include <linux/usb/usb_urb_compat.h>
- #include <asm/io.h>
- #include "linux-compat.h"
--#include "usb-compat.h"
- #endif
-
- #include "musb_core.h"
-diff --git a/drivers/usb/musb-new/musb_host.c b/drivers/usb/musb-new/musb_host.c
-index acb2d40f3b..e5905d90d6 100644
---- a/drivers/usb/musb-new/musb_host.c
-+++ b/drivers/usb/musb-new/musb_host.c
-@@ -26,8 +26,8 @@
- #include <dm/device_compat.h>
- #include <usb.h>
- #include <linux/bug.h>
-+#include <linux/usb/usb_urb_compat.h>
- #include "linux-compat.h"
--#include "usb-compat.h"
- #endif
-
- #include "musb_core.h"
-diff --git a/drivers/usb/musb-new/musb_host.h b/drivers/usb/musb-new/musb_host.h
-index afc8fa35a7..5a604bdb0c 100644
---- a/drivers/usb/musb-new/musb_host.h
-+++ b/drivers/usb/musb-new/musb_host.h
-@@ -10,7 +10,7 @@
- #ifndef _MUSB_HOST_H
- #define _MUSB_HOST_H
- #ifdef __UBOOT__
--#include "usb-compat.h"
-+#include <linux/usb/usb_urb_compat.h>
- #endif
-
- static inline struct usb_hcd *musb_to_hcd(struct musb *musb)
-diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c
-index 61ff68def2..d186facc7e 100644
---- a/drivers/usb/musb-new/musb_uboot.c
-+++ b/drivers/usb/musb-new/musb_uboot.c
-@@ -8,10 +8,10 @@
- #include <linux/errno.h>
- #include <linux/usb/ch9.h>
- #include <linux/usb/gadget.h>
-+#include <linux/usb/usb_urb_compat.h>
-
- #include <usb.h>
- #include "linux-compat.h"
--#include "usb-compat.h"
- #include "musb_core.h"
- #include "musb_host.h"
- #include "musb_gadget.h"
-@@ -453,39 +453,3 @@ struct musb *musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
-
- return *musbp;
- }
--
--#if CONFIG_IS_ENABLED(DM_USB)
--struct usb_device *usb_dev_get_parent(struct usb_device *udev)
--{
-- struct udevice *parent = udev->dev->parent;
--
-- /*
-- * When called from usb-uclass.c: usb_scan_device() udev->dev points
-- * to the parent udevice, not the actual udevice belonging to the
-- * udev as the device is not instantiated yet.
-- *
-- * If dev is an usb-bus, then we are called from usb_scan_device() for
-- * an usb-device plugged directly into the root port, return NULL.
-- */
-- if (device_get_uclass_id(udev->dev) == UCLASS_USB)
-- return NULL;
--
-- /*
-- * If these 2 are not the same we are being called from
-- * usb_scan_device() and udev itself is the parent.
-- */
-- if (dev_get_parent_priv(udev->dev) != udev)
-- return udev;
--
-- /* We are being called normally, use the parent pointer */
-- if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
-- return dev_get_parent_priv(parent);
--
-- return NULL;
--}
--#else
--struct usb_device *usb_dev_get_parent(struct usb_device *udev)
--{
-- return udev->parent;
--}
--#endif
-diff --git a/drivers/usb/musb-new/musb_uboot.h b/drivers/usb/musb-new/musb_uboot.h
-index 18282efccc..6b162f03b1 100644
---- a/drivers/usb/musb-new/musb_uboot.h
-+++ b/drivers/usb/musb-new/musb_uboot.h
-@@ -8,8 +8,8 @@
- #define __MUSB_UBOOT_H__
-
- #include <usb.h>
-+#include <linux/usb/usb_urb_compat.h>
- #include "linux-compat.h"
--#include "usb-compat.h"
- #include "musb_core.h"
-
- struct musb_host_data {
-diff --git a/drivers/usb/musb-new/usb-compat.h b/include/linux/usb/usb_urb_compat.h
-similarity index 60%
-rename from drivers/usb/musb-new/usb-compat.h
-rename to include/linux/usb/usb_urb_compat.h
-index df68c9220a..5ed96fa64e 100644
---- a/drivers/usb/musb-new/usb-compat.h
-+++ b/include/linux/usb/usb_urb_compat.h
-@@ -1,16 +1,31 @@
--#ifndef __USB_COMPAT_H__
--#define __USB_COMPAT_H__
-+#ifndef __USB_URB_COMPAT_H__
-+#define __USB_URB_COMPAT_H__
-
--#include "usb.h"
-+#include <linux/compat.h>
-+#include <usb.h>
-
- struct udevice;
-+struct urb;
-+struct usb_hcd;
-+
-+
-+struct usb_urb_ops {
-+ int (*urb_enqueue)(struct usb_hcd *hcd, struct urb *urb,
-+ gfp_t mem_flags);
-+ int (*urb_dequeue)(struct usb_hcd *hcd, struct urb *urb, int status);
-+ int (*hub_control)(struct usb_hcd *hcd, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int len,
-+ struct devrequest *setup);
-+ irqreturn_t (*isr)(int irq, void *priv);
-+};
-
- struct usb_hcd {
- void *hcd_priv;
-+ const struct usb_urb_ops *urb_ops;
- };
-
- struct usb_host_endpoint {
-- struct usb_endpoint_descriptor desc;
-+ struct usb_endpoint_descriptor desc;
- struct list_head urb_list;
- void *hcpriv;
- };
-@@ -23,8 +38,6 @@ struct usb_host_endpoint {
- #define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */
- #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */
-
--struct urb;
--
- typedef void (*usb_complete_t)(struct urb *);
-
- struct urb {
-@@ -76,4 +89,25 @@ static inline int usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd,
- */
- struct usb_device *usb_dev_get_parent(struct usb_device *udev);
-
-+int usb_urb_submit_control(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep,
-+ struct usb_device *dev, unsigned long pipe,
-+ void *buffer, int len, struct devrequest *setup,
-+ int interval, enum usb_device_speed speed);
-+
-+int usb_urb_submit_bulk(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int len);
-+
-+int usb_urb_submit_irq(struct usb_hcd *hcd, struct urb *urb,
-+ struct usb_host_endpoint *hep, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int len, int interval);
-+
-+void usb_urb_fill(struct urb *urb, struct usb_host_endpoint *hep,
-+ struct usb_device *dev, int endpoint_type,
-+ unsigned long pipe, void *buffer, int len,
-+ struct devrequest *setup, int interval);
-+
-+int usb_urb_submit(struct usb_hcd *hcd, struct urb *urb);
-+
- #endif /* __USB_COMPAT_H__ */
-diff --git a/include/usb_defs.h b/include/usb_defs.h
-index 6dd2c997f9..ec00161710 100644
---- a/include/usb_defs.h
-+++ b/include/usb_defs.h
-@@ -81,6 +81,32 @@
- #define EndpointOutRequest \
- ((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
-
-+/* class requests from the USB 2.0 hub spec, table 11-15 */
-+#define HUB_CLASS_REQ(dir, type, request) ((((dir) | (type)) << 8) | (request))
-+/* GetBusState and SetHubDescriptor are optional, omitted */
-+#define ClearHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \
-+ USB_REQ_CLEAR_FEATURE)
-+#define ClearPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
-+ USB_REQ_CLEAR_FEATURE)
-+#define GetHubDescriptor HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \
-+ USB_REQ_GET_DESCRIPTOR)
-+#define GetHubStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, \
-+ USB_REQ_GET_STATUS)
-+#define GetPortStatus HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \
-+ USB_REQ_GET_STATUS)
-+#define SetHubFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, \
-+ USB_REQ_SET_FEATURE)
-+#define SetPortFeature HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
-+ USB_REQ_SET_FEATURE)
-+#define ClearTTBuffer HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
-+ HUB_CLEAR_TT_BUFFER)
-+#define ResetTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
-+ HUB_RESET_TT)
-+#define GetTTState HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, \
-+ HUB_GET_TT_STATE)
-+#define StopTT HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, \
-+ HUB_STOP_TT)
-+
- /* Descriptor types */
- #define USB_DT_DEVICE 0x01
- #define USB_DT_CONFIG 0x02
-@@ -289,10 +315,16 @@
- #define USB_SS_PORT_STAT_C_CONFIG_ERROR 0x0080
-
- /* wHubCharacteristics (masks) */
-+#define HUB_CHAR_COMMON_OCPM 0x0000 /* All ports Over-Current reporting */
-+#define HUB_CHAR_INDV_PORT_LPSM 0x0001 /* per-port power control */
-+#define HUB_CHAR_NO_LPSM 0x0002 /* no power switching */
- #define HUB_CHAR_LPSM 0x0003
- #define HUB_CHAR_COMPOUND 0x0004
-+#define HUB_CHAR_INDV_PORT_OCPM 0x0008 /* per-port Over-current reporting */
-+#define HUB_CHAR_NO_OCPM 0x0010 /* No Over-current Protection support */
- #define HUB_CHAR_OCPM 0x0018
- #define HUB_CHAR_TTTT 0x0060 /* TT Think Time mask */
-+#define HUB_CHAR_PORTIND 0x0080 /* per-port indicators (LEDs) */
-
- /*
- * Hub Status & Hub Change bit masks
-2.17.1
-
new file mode 100644
@@ -0,0 +1,73 @@
+From 3035651bfc0dcdfd48d28acff6efe2f29bbe9439 Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Thu, 6 Oct 2022 15:04:25 +0100
+Subject: [PATCH 04/25] arm_ffa: efi: unmap RX/TX buffers
+
+unmap RX/TX buffers at ExitBootServices()
+
+Unmapping the RX/TX buffers created by u-boot is needed before EFI
+runtime.
+
+At EFI runtime the linux kernel takes care of allocating its own RX/TX
+buffers and registering them with the secure world.
+
+Secure world should be using the RX/TX buffers created by the kernel.
+So, RX/TX buffers created by u-boot must be unmapped.
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
+
+Changelog:
+===============
+
+v8: pass NULL device pointer to the FF-A bus operation
+v7: replace debug() by log_err()
+---
+ lib/efi_loader/efi_boottime.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
+index 6f7333638a..caa64028be 100644
+--- a/lib/efi_loader/efi_boottime.c
++++ b/lib/efi_loader/efi_boottime.c
+@@ -3,6 +3,9 @@
+ * EFI application boot time services
+ *
+ * Copyright (c) 2016 Alexander Graf
++ *
++ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+ #include <common.h>
+@@ -23,6 +26,10 @@
+ #include <asm/setjmp.h>
+ #include <linux/libfdt_env.h>
+
++#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
++#include <arm_ffa.h>
++#endif
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ /* Task priority level */
+@@ -2178,6 +2185,12 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+ dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
+ }
+
++#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
++ /* unmap FF-A RX/TX buffers */
++ if (ffa_bus_ops_get()->rxtx_unmap(NULL))
++ log_err("Can't unmap FF-A RX/TX buffers\n");
++#endif
++
+ /* Patch out unsupported runtime function */
+ efi_runtime_detach();
+
+--
+2.17.1
+
deleted file mode 100644
@@ -1,3806 +0,0 @@
-From 83ba88292211394ce6b3a21fbc0f702dae543290 Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Mon, 28 Jun 2021 23:31:25 +0100
-Subject: [PATCH 04/26] usb: add isp1760 family driver
-
-ISP1760/61/63 are a family of usb controllers, blah, blah, more info
-here.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Accepted [2022.10-rc1]
----
- Makefile | 1 +
- drivers/usb/Kconfig | 2 +
- drivers/usb/common/Makefile | 1 +
- drivers/usb/isp1760/Kconfig | 12 +
- drivers/usb/isp1760/Makefile | 6 +
- drivers/usb/isp1760/isp1760-core.c | 378 ++++
- drivers/usb/isp1760/isp1760-core.h | 96 +
- drivers/usb/isp1760/isp1760-hcd.c | 2574 +++++++++++++++++++++++++++
- drivers/usb/isp1760/isp1760-hcd.h | 82 +
- drivers/usb/isp1760/isp1760-if.c | 127 ++
- drivers/usb/isp1760/isp1760-regs.h | 292 +++
- drivers/usb/isp1760/isp1760-uboot.c | 76 +
- drivers/usb/isp1760/isp1760-uboot.h | 27 +
- 13 files changed, 3674 insertions(+)
- create mode 100644 drivers/usb/isp1760/Kconfig
- create mode 100644 drivers/usb/isp1760/Makefile
- create mode 100644 drivers/usb/isp1760/isp1760-core.c
- create mode 100644 drivers/usb/isp1760/isp1760-core.h
- create mode 100644 drivers/usb/isp1760/isp1760-hcd.c
- create mode 100644 drivers/usb/isp1760/isp1760-hcd.h
- create mode 100644 drivers/usb/isp1760/isp1760-if.c
- create mode 100644 drivers/usb/isp1760/isp1760-regs.h
- create mode 100644 drivers/usb/isp1760/isp1760-uboot.c
- create mode 100644 drivers/usb/isp1760/isp1760-uboot.h
-
-diff --git a/Makefile b/Makefile
-index 98867fbe06..67851020f5 100644
---- a/Makefile
-+++ b/Makefile
-@@ -841,6 +841,7 @@ libs-y += drivers/usb/host/
- libs-y += drivers/usb/mtu3/
- libs-y += drivers/usb/musb/
- libs-y += drivers/usb/musb-new/
-+libs-y += drivers/usb/isp1760/
- libs-y += drivers/usb/phy/
- libs-y += drivers/usb/ulpi/
- ifdef CONFIG_POST
-diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
-index ab1d061bd0..bbe07be02c 100644
---- a/drivers/usb/Kconfig
-+++ b/drivers/usb/Kconfig
-@@ -78,6 +78,8 @@ source "drivers/usb/musb/Kconfig"
-
- source "drivers/usb/musb-new/Kconfig"
-
-+source "drivers/usb/isp1760/Kconfig"
-+
- source "drivers/usb/emul/Kconfig"
-
- source "drivers/usb/phy/Kconfig"
-diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
-index dc05cb0a50..f08b064d24 100644
---- a/drivers/usb/common/Makefile
-+++ b/drivers/usb/common/Makefile
-@@ -4,6 +4,7 @@
- #
-
- obj-$(CONFIG_$(SPL_)DM_USB) += common.o
-+obj-$(CONFIG_USB_ISP1760) += usb_urb.o
- obj-$(CONFIG_USB_MUSB_HCD) += usb_urb.o
- obj-$(CONFIG_USB_MUSB_UDC) += usb_urb.o
- obj-$(CONFIG_USB_EHCI_FSL) += fsl-dt-fixup.o fsl-errata.o
-diff --git a/drivers/usb/isp1760/Kconfig b/drivers/usb/isp1760/Kconfig
-new file mode 100644
-index 0000000000..993d71e74c
---- /dev/null
-+++ b/drivers/usb/isp1760/Kconfig
-@@ -0,0 +1,12 @@
-+# SPDX-License-Identifier: GPL-2.0
-+
-+config USB_ISP1760
-+ tristate "NXP ISP 1760/1761/1763 support"
-+ select DM_USB
-+ select USB_HOST
-+ help
-+ Say Y or M here if your system as an ISP1760/1761/1763 USB host
-+ controller.
-+
-+ This USB controller is usually attached to a non-DMA-Master
-+ capable bus.
-diff --git a/drivers/usb/isp1760/Makefile b/drivers/usb/isp1760/Makefile
-new file mode 100644
-index 0000000000..2c809c01b1
---- /dev/null
-+++ b/drivers/usb/isp1760/Makefile
-@@ -0,0 +1,6 @@
-+# SPDX-License-Identifier: GPL-2.0
-+isp1760-y := isp1760-core.o isp1760-if.o isp1760-uboot.o isp1760-hcd.o
-+
-+#isp1760-hcd.o
-+
-+obj-$(CONFIG_USB_ISP1760) += isp1760.o
-diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
-new file mode 100644
-index 0000000000..3080595549
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-core.c
-@@ -0,0 +1,378 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ * This is based on linux kernel driver, original developed:
-+ * Copyright 2014 Laurent Pinchart
-+ * Copyright 2007 Sebastian Siewior
-+ *
-+ */
-+
-+#include <dm.h>
-+#include <dm/device-internal.h>
-+#include <dm/device_compat.h>
-+#include <dm/devres.h>
-+#include <linux/compat.h>
-+#include <linux/delay.h>
-+#include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <regmap.h>
-+#include <usb.h>
-+
-+#include "isp1760-core.h"
-+#include "isp1760-hcd.h"
-+#include "isp1760-regs.h"
-+
-+#define msleep(a) udelay(a * 1000)
-+
-+static int isp1760_init_core(struct isp1760_device *isp)
-+{
-+ struct isp1760_hcd *hcd = &isp->hcd;
-+
-+ /*
-+ * Reset the host controller, including the CPU interface
-+ * configuration.
-+ */
-+ isp1760_field_set(hcd->fields, SW_RESET_RESET_ALL);
-+ msleep(100);
-+
-+ /* Setup HW Mode Control: This assumes a level active-low interrupt */
-+ if ((isp->devflags & ISP1760_FLAG_ANALOG_OC) && hcd->is_isp1763)
-+ return -EINVAL;
-+
-+ if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_16)
-+ isp1760_field_clear(hcd->fields, HW_DATA_BUS_WIDTH);
-+ if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_8)
-+ isp1760_field_set(hcd->fields, HW_DATA_BUS_WIDTH);
-+ if (isp->devflags & ISP1760_FLAG_ANALOG_OC)
-+ isp1760_field_set(hcd->fields, HW_ANA_DIGI_OC);
-+ if (isp->devflags & ISP1760_FLAG_DACK_POL_HIGH)
-+ isp1760_field_set(hcd->fields, HW_DACK_POL_HIGH);
-+ if (isp->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
-+ isp1760_field_set(hcd->fields, HW_DREQ_POL_HIGH);
-+ if (isp->devflags & ISP1760_FLAG_INTR_POL_HIGH)
-+ isp1760_field_set(hcd->fields, HW_INTR_HIGH_ACT);
-+ if (isp->devflags & ISP1760_FLAG_INTR_EDGE_TRIG)
-+ isp1760_field_set(hcd->fields, HW_INTR_EDGE_TRIG);
-+
-+ /*
-+ * The ISP1761 has a dedicated DC IRQ line but supports sharing the HC
-+ * IRQ line for both the host and device controllers. Hardcode IRQ
-+ * sharing for now and disable the DC interrupts globally to avoid
-+ * spurious interrupts during HCD registration.
-+ */
-+ if (isp->devflags & ISP1760_FLAG_ISP1761) {
-+ isp1760_reg_write(hcd->regs, ISP176x_DC_MODE, 0);
-+ isp1760_field_set(hcd->fields, HW_COMN_IRQ);
-+ }
-+
-+ /*
-+ * PORT 1 Control register of the ISP1760 is the OTG control register
-+ * on ISP1761.
-+ *
-+ * TODO: Really support OTG. For now we configure port 1 in device mode
-+ */
-+ if (((isp->devflags & ISP1760_FLAG_ISP1761) ||
-+ (isp->devflags & ISP1760_FLAG_ISP1763)) &&
-+ (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) {
-+ isp1760_field_set(hcd->fields, HW_DM_PULLDOWN);
-+ isp1760_field_set(hcd->fields, HW_DP_PULLDOWN);
-+ isp1760_field_set(hcd->fields, HW_OTG_DISABLE);
-+ } else {
-+ isp1760_field_set(hcd->fields, HW_SW_SEL_HC_DC);
-+ isp1760_field_set(hcd->fields, HW_VBUS_DRV);
-+ isp1760_field_set(hcd->fields, HW_SEL_CP_EXT);
-+ }
-+
-+ printf( "%s bus width: %u, oc: %s\n",
-+ hcd->is_isp1763 ? "isp1763" : "isp1760",
-+ isp->devflags & ISP1760_FLAG_BUS_WIDTH_8 ? 8 :
-+ isp->devflags & ISP1760_FLAG_BUS_WIDTH_16 ? 16 : 32,
-+ hcd->is_isp1763 ? "not available" :
-+ isp->devflags & ISP1760_FLAG_ANALOG_OC ? "analog" : "digital");
-+
-+ return 0;
-+}
-+
-+void isp1760_set_pullup(struct isp1760_device *isp, bool enable)
-+{
-+ struct isp1760_hcd *hcd = &isp->hcd;
-+
-+ if (enable)
-+ isp1760_field_set(hcd->fields, HW_DP_PULLUP);
-+ else
-+ isp1760_field_set(hcd->fields, HW_DP_PULLUP_CLEAR);
-+}
-+
-+/*
-+ * ISP1760/61:
-+ *
-+ * 60kb divided in:
-+ * - 32 blocks @ 256 bytes
-+ * - 20 blocks @ 1024 bytes
-+ * - 4 blocks @ 8192 bytes
-+ */
-+static const struct isp1760_memory_layout isp176x_memory_conf = {
-+ .blocks[0] = 32,
-+ .blocks_size[0] = 256,
-+ .blocks[1] = 20,
-+ .blocks_size[1] = 1024,
-+ .blocks[2] = 4,
-+ .blocks_size[2] = 8192,
-+
-+ .slot_num = 32,
-+ .payload_blocks = 32 + 20 + 4,
-+ .payload_area_size = 0xf000,
-+};
-+
-+/*
-+ * ISP1763:
-+ *
-+ * 20kb divided in:
-+ * - 8 blocks @ 256 bytes
-+ * - 2 blocks @ 1024 bytes
-+ * - 4 blocks @ 4096 bytes
-+ */
-+static const struct isp1760_memory_layout isp1763_memory_conf = {
-+ .blocks[0] = 8,
-+ .blocks_size[0] = 256,
-+ .blocks[1] = 2,
-+ .blocks_size[1] = 1024,
-+ .blocks[2] = 4,
-+ .blocks_size[2] = 4096,
-+
-+ .slot_num = 16,
-+ .payload_blocks = 8 + 2 + 4,
-+ .payload_area_size = 0x5000,
-+};
-+
-+static const struct regmap_config isp1760_hc_regmap_conf = {
-+ .width = REGMAP_SIZE_16,
-+};
-+
-+static const struct reg_field isp1760_hc_reg_fields[] = {
-+ [HCS_PPC] = REG_FIELD(ISP176x_HC_HCSPARAMS, 4, 4),
-+ [HCS_N_PORTS] = REG_FIELD(ISP176x_HC_HCSPARAMS, 0, 3),
-+ [HCC_ISOC_CACHE] = REG_FIELD(ISP176x_HC_HCCPARAMS, 7, 7),
-+ [HCC_ISOC_THRES] = REG_FIELD(ISP176x_HC_HCCPARAMS, 4, 6),
-+ [CMD_LRESET] = REG_FIELD(ISP176x_HC_USBCMD, 7, 7),
-+ [CMD_RESET] = REG_FIELD(ISP176x_HC_USBCMD, 1, 1),
-+ [CMD_RUN] = REG_FIELD(ISP176x_HC_USBCMD, 0, 0),
-+ [STS_PCD] = REG_FIELD(ISP176x_HC_USBSTS, 2, 2),
-+ [HC_FRINDEX] = REG_FIELD(ISP176x_HC_FRINDEX, 0, 13),
-+ [FLAG_CF] = REG_FIELD(ISP176x_HC_CONFIGFLAG, 0, 0),
-+ [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_DONEMAP, 0, 31),
-+ [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_SKIPMAP, 0, 31),
-+ [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ISO_PTD_LASTPTD, 0, 31),
-+ [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_INT_PTD_DONEMAP, 0, 31),
-+ [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_INT_PTD_SKIPMAP, 0, 31),
-+ [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_INT_PTD_LASTPTD, 0, 31),
-+ [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_DONEMAP, 0, 31),
-+ [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_SKIPMAP, 0, 31),
-+ [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ATL_PTD_LASTPTD, 0, 31),
-+ [PORT_OWNER] = REG_FIELD(ISP176x_HC_PORTSC1, 13, 13),
-+ [PORT_POWER] = REG_FIELD(ISP176x_HC_PORTSC1, 12, 12),
-+ [PORT_LSTATUS] = REG_FIELD(ISP176x_HC_PORTSC1, 10, 11),
-+ [PORT_RESET] = REG_FIELD(ISP176x_HC_PORTSC1, 8, 8),
-+ [PORT_SUSPEND] = REG_FIELD(ISP176x_HC_PORTSC1, 7, 7),
-+ [PORT_RESUME] = REG_FIELD(ISP176x_HC_PORTSC1, 6, 6),
-+ [PORT_PE] = REG_FIELD(ISP176x_HC_PORTSC1, 2, 2),
-+ [PORT_CSC] = REG_FIELD(ISP176x_HC_PORTSC1, 1, 1),
-+ [PORT_CONNECT] = REG_FIELD(ISP176x_HC_PORTSC1, 0, 0),
-+ [ALL_ATX_RESET] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 31, 31),
-+ [HW_ANA_DIGI_OC] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 15, 15),
-+ [HW_COMN_IRQ] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 10, 10),
-+ [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 8, 8),
-+ [HW_DACK_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 6, 6),
-+ [HW_DREQ_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 5, 5),
-+ [HW_INTR_HIGH_ACT] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 2, 2),
-+ [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 1, 1),
-+ [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 0, 0),
-+ [HC_CHIP_REV] = REG_FIELD(ISP176x_HC_CHIP_ID, 16, 31),
-+ [HC_CHIP_ID_HIGH] = REG_FIELD(ISP176x_HC_CHIP_ID, 8, 15),
-+ [HC_CHIP_ID_LOW] = REG_FIELD(ISP176x_HC_CHIP_ID, 0, 7),
-+ [HC_SCRATCH] = REG_FIELD(ISP176x_HC_SCRATCH, 0, 31),
-+ [SW_RESET_RESET_ALL] = REG_FIELD(ISP176x_HC_RESET, 0, 0),
-+ [ISO_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 2, 2),
-+ [INT_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 1, 1),
-+ [ATL_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 0, 0),
-+ [MEM_BANK_SEL] = REG_FIELD(ISP176x_HC_MEMORY, 16, 17),
-+ [MEM_START_ADDR] = REG_FIELD(ISP176x_HC_MEMORY, 0, 15),
-+ [HC_INTERRUPT] = REG_FIELD(ISP176x_HC_INTERRUPT, 0, 9),
-+ [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 8, 8),
-+ [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 7, 7),
-+ [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_OR, 0, 31),
-+ [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_OR, 0, 31),
-+ [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_OR, 0, 31),
-+ [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_AND, 0, 31),
-+ [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_AND, 0, 31),
-+ [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_AND, 0, 31),
-+ [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 10, 10),
-+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 7, 7),
-+ [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 4, 4),
-+ [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 3, 3),
-+ [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 2, 2),
-+ [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 1, 1),
-+ [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 0, 0),
-+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 10, 10),
-+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 7, 7),
-+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 4, 4),
-+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 3, 3),
-+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 2, 2),
-+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 1, 1),
-+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 0, 0),
-+};
-+
-+static const struct regmap_config isp1763_hc_regmap_conf = {
-+ .width = REGMAP_SIZE_16,
-+};
-+
-+static const struct reg_field isp1763_hc_reg_fields[] = {
-+ [CMD_LRESET] = REG_FIELD(ISP1763_HC_USBCMD, 7, 7),
-+ [CMD_RESET] = REG_FIELD(ISP1763_HC_USBCMD, 1, 1),
-+ [CMD_RUN] = REG_FIELD(ISP1763_HC_USBCMD, 0, 0),
-+ [STS_PCD] = REG_FIELD(ISP1763_HC_USBSTS, 2, 2),
-+ [HC_FRINDEX] = REG_FIELD(ISP1763_HC_FRINDEX, 0, 13),
-+ [FLAG_CF] = REG_FIELD(ISP1763_HC_CONFIGFLAG, 0, 0),
-+ [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_DONEMAP, 0, 15),
-+ [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_SKIPMAP, 0, 15),
-+ [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ISO_PTD_LASTPTD, 0, 15),
-+ [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_INT_PTD_DONEMAP, 0, 15),
-+ [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_INT_PTD_SKIPMAP, 0, 15),
-+ [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_INT_PTD_LASTPTD, 0, 15),
-+ [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_DONEMAP, 0, 15),
-+ [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_SKIPMAP, 0, 15),
-+ [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ATL_PTD_LASTPTD, 0, 15),
-+ [PORT_OWNER] = REG_FIELD(ISP1763_HC_PORTSC1, 13, 13),
-+ [PORT_POWER] = REG_FIELD(ISP1763_HC_PORTSC1, 12, 12),
-+ [PORT_LSTATUS] = REG_FIELD(ISP1763_HC_PORTSC1, 10, 11),
-+ [PORT_RESET] = REG_FIELD(ISP1763_HC_PORTSC1, 8, 8),
-+ [PORT_SUSPEND] = REG_FIELD(ISP1763_HC_PORTSC1, 7, 7),
-+ [PORT_RESUME] = REG_FIELD(ISP1763_HC_PORTSC1, 6, 6),
-+ [PORT_PE] = REG_FIELD(ISP1763_HC_PORTSC1, 2, 2),
-+ [PORT_CSC] = REG_FIELD(ISP1763_HC_PORTSC1, 1, 1),
-+ [PORT_CONNECT] = REG_FIELD(ISP1763_HC_PORTSC1, 0, 0),
-+ [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 4, 4),
-+ [HW_DACK_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 6, 6),
-+ [HW_DREQ_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 5, 5),
-+ [HW_INTF_LOCK] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 3, 3),
-+ [HW_INTR_HIGH_ACT] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 2, 2),
-+ [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 1, 1),
-+ [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 0, 0),
-+ [SW_RESET_RESET_ATX] = REG_FIELD(ISP1763_HC_RESET, 3, 3),
-+ [SW_RESET_RESET_ALL] = REG_FIELD(ISP1763_HC_RESET, 0, 0),
-+ [HC_CHIP_ID_HIGH] = REG_FIELD(ISP1763_HC_CHIP_ID, 0, 15),
-+ [HC_CHIP_ID_LOW] = REG_FIELD(ISP1763_HC_CHIP_REV, 8, 15),
-+ [HC_CHIP_REV] = REG_FIELD(ISP1763_HC_CHIP_REV, 0, 7),
-+ [HC_SCRATCH] = REG_FIELD(ISP1763_HC_SCRATCH, 0, 15),
-+ [ISO_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 2, 2),
-+ [INT_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 1, 1),
-+ [ATL_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 0, 0),
-+ [MEM_START_ADDR] = REG_FIELD(ISP1763_HC_MEMORY, 0, 15),
-+ [HC_DATA] = REG_FIELD(ISP1763_HC_DATA, 0, 15),
-+ [HC_INTERRUPT] = REG_FIELD(ISP1763_HC_INTERRUPT, 0, 10),
-+ [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 8, 8),
-+ [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 7, 7),
-+ [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_OR, 0, 15),
-+ [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_OR, 0, 15),
-+ [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_OR, 0, 15),
-+ [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_AND, 0, 15),
-+ [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_AND, 0, 15),
-+ [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_AND, 0, 15),
-+ [HW_HC_2_DIS] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 15, 15),
-+ [HW_OTG_DISABLE] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 10, 10),
-+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 7, 7),
-+ [HW_VBUS_DRV] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 4, 4),
-+ [HW_SEL_CP_EXT] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 3, 3),
-+ [HW_DM_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 2, 2),
-+ [HW_DP_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 1, 1),
-+ [HW_DP_PULLUP] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 0, 0),
-+ [HW_HC_2_DIS_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 15, 15),
-+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 10, 10),
-+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 7, 7),
-+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 4, 4),
-+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 3, 3),
-+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 2, 2),
-+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 1, 1),
-+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 0, 0),
-+};
-+
-+int isp1760_register(struct isp1760_device *isp, struct resource *mem, int irq,
-+ unsigned long irqflags)
-+{
-+ const struct regmap_config *hc_regmap;
-+ const struct reg_field *hc_reg_fields;
-+ struct isp1760_hcd *hcd;
-+ struct regmap_field *f;
-+ unsigned int devflags;
-+ struct udevice *dev;
-+ int ret;
-+ int i;
-+
-+ hcd = &isp->hcd;
-+ devflags = isp->devflags;
-+ dev = isp->dev;
-+
-+ hcd->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763);
-+
-+ if (!hcd->is_isp1763 && (devflags & ISP1760_FLAG_BUS_WIDTH_8)) {
-+ dev_err(dev, "isp1760/61 do not support data width 8\n");
-+ return -EINVAL;
-+ }
-+
-+ if (hcd->is_isp1763) {
-+ hc_regmap = &isp1763_hc_regmap_conf;
-+ hc_reg_fields = &isp1763_hc_reg_fields[0];
-+ } else {
-+ hc_regmap = &isp1760_hc_regmap_conf;
-+ hc_reg_fields = &isp1760_hc_reg_fields[0];
-+ }
-+
-+ hcd->base = devm_ioremap(dev, mem->start, resource_size(mem));
-+ if (IS_ERR(hcd->base))
-+ return PTR_ERR(hcd->base);
-+
-+ hcd->regs = devm_regmap_init(dev, NULL, NULL, hc_regmap);
-+ if (IS_ERR(hcd->regs))
-+ return PTR_ERR(hcd->regs);
-+
-+ for (i = 0; i < HC_FIELD_MAX; i++) {
-+ f = devm_regmap_field_alloc(dev, hcd->regs, hc_reg_fields[i]);
-+ if (IS_ERR(f))
-+ return PTR_ERR(f);
-+
-+ hcd->fields[i] = f;
-+ }
-+
-+ if (hcd->is_isp1763)
-+ hcd->memory_layout = &isp1763_memory_conf;
-+ else
-+ hcd->memory_layout = &isp176x_memory_conf;
-+
-+ ret = isp1760_init_core(isp);
-+ if (ret < 0)
-+ return ret;
-+
-+ hcd->dev = dev;
-+
-+ ret = isp1760_hcd_register(hcd, mem, irq, irqflags, dev);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = isp1760_hcd_lowlevel_init(hcd);
-+ if (ret < 0)
-+ return ret;
-+
-+ dev_set_drvdata(dev, isp);
-+
-+ return 0;
-+}
-+
-+void isp1760_unregister(struct isp1760_device *isp)
-+{
-+ isp1760_hcd_unregister(&isp->hcd);
-+
-+ return;
-+}
-diff --git a/drivers/usb/isp1760/isp1760-core.h b/drivers/usb/isp1760/isp1760-core.h
-new file mode 100644
-index 0000000000..0a60e30b5f
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-core.h
-@@ -0,0 +1,96 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva
-+ * Copyright 2014 Laurent Pinchart
-+ * Copyright 2007 Sebastian Siewior
-+ *
-+ * Contacts:
-+ * Sebastian Siewior <bigeasy@linutronix.de>
-+ * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-+ * Rui Miguel Silva <rui.silva@linaro.org>
-+ */
-+
-+#ifndef _ISP1760_CORE_H_
-+#define _ISP1760_CORE_H_
-+
-+#include <linux/compat.h>
-+#include <linux/ioport.h>
-+#include <regmap.h>
-+
-+#include "isp1760-hcd.h"
-+
-+struct device;
-+struct gpio_desc;
-+
-+/*
-+ * Device flags that can vary from board to board. All of these
-+ * indicate the most "atypical" case, so that a devflags of 0 is
-+ * a sane default configuration.
-+ */
-+#define ISP1760_FLAG_BUS_WIDTH_16 0x00000002 /* 16-bit data bus width */
-+#define ISP1760_FLAG_PERIPHERAL_EN 0x00000004 /* Port 1 supports Peripheral mode*/
-+#define ISP1760_FLAG_ANALOG_OC 0x00000008 /* Analog overcurrent */
-+#define ISP1760_FLAG_DACK_POL_HIGH 0x00000010 /* DACK active high */
-+#define ISP1760_FLAG_DREQ_POL_HIGH 0x00000020 /* DREQ active high */
-+#define ISP1760_FLAG_ISP1761 0x00000040 /* Chip is ISP1761 */
-+#define ISP1760_FLAG_INTR_POL_HIGH 0x00000080 /* Interrupt polarity active high */
-+#define ISP1760_FLAG_INTR_EDGE_TRIG 0x00000100 /* Interrupt edge triggered */
-+#define ISP1760_FLAG_ISP1763 0x00000200 /* Chip is ISP1763 */
-+#define ISP1760_FLAG_BUS_WIDTH_8 0x00000400 /* 8-bit data bus width */
-+
-+struct isp1760_device {
-+ struct udevice *dev;
-+
-+ unsigned int devflags;
-+ struct gpio_desc *rst_gpio;
-+
-+ struct isp1760_hcd hcd;
-+};
-+
-+int isp1760_register(struct isp1760_device *isp, struct resource *mem, int irq,
-+ unsigned long irqflags);
-+void isp1760_unregister(struct isp1760_device *isp);
-+
-+void isp1760_set_pullup(struct isp1760_device *isp, bool enable);
-+
-+static inline u32 isp1760_field_read(struct regmap_field **fields, u32 field)
-+{
-+ unsigned int val;
-+
-+ regmap_field_read(fields[field], &val);
-+
-+ return val;
-+}
-+
-+static inline void isp1760_field_write(struct regmap_field **fields, u32 field,
-+ u32 val)
-+{
-+ regmap_field_write(fields[field], val);
-+}
-+
-+static inline void isp1760_field_set(struct regmap_field **fields, u32 field)
-+{
-+ isp1760_field_write(fields, field, 0xFFFFFFFF);
-+}
-+
-+static inline void isp1760_field_clear(struct regmap_field **fields, u32 field)
-+{
-+ isp1760_field_write(fields, field, 0);
-+}
-+
-+static inline u32 isp1760_reg_read(struct regmap *regs, u32 reg)
-+{
-+ unsigned int val;
-+
-+ regmap_read(regs, reg, &val);
-+
-+ return val;
-+}
-+
-+static inline void isp1760_reg_write(struct regmap *regs, u32 reg, u32 val)
-+{
-+ regmap_write(regs, reg, val);
-+}
-+#endif
-diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
-new file mode 100644
-index 0000000000..b1d86dd69b
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-hcd.c
-@@ -0,0 +1,2574 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ */
-+
-+#include <hexdump.h>
-+#include <common.h>
-+#include <asm/cache.h>
-+#include <cpu_func.h>
-+#include <dm.h>
-+#include <dm/device-internal.h>
-+#include <dm/device_compat.h>
-+#include <linux/bug.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/usb/usb_urb_compat.h>
-+#include <usb.h>
-+#include <linux/io.h>
-+#include <linux/iopoll.h>
-+#include <asm/unaligned.h>
-+
-+#include "isp1760-core.h"
-+#include "isp1760-hcd.h"
-+#include "isp1760-regs.h"
-+#include "isp1760-uboot.h"
-+
-+static struct kmem_cache *qtd_cachep;
-+static struct kmem_cache *qh_cachep;
-+static struct kmem_cache *urb_listitem_cachep;
-+
-+typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
-+ struct isp1760_qtd *qtd);
-+
-+static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd)
-+{
-+ return hcd->hcd_priv;
-+}
-+
-+#define dw_to_le32(x) (cpu_to_le32((__force u32)x))
-+#define le32_to_dw(x) ((__force __dw)(le32_to_cpu(x)))
-+
-+/* urb state*/
-+#define DELETE_URB (0x0008)
-+#define NO_TRANSFER_ACTIVE (0xffffffff)
-+
-+/* Philips Proprietary Transfer Descriptor (PTD) */
-+typedef __u32 __bitwise __dw;
-+struct ptd {
-+ __dw dw0;
-+ __dw dw1;
-+ __dw dw2;
-+ __dw dw3;
-+ __dw dw4;
-+ __dw dw5;
-+ __dw dw6;
-+ __dw dw7;
-+};
-+
-+struct ptd_le32 {
-+ __le32 dw0;
-+ __le32 dw1;
-+ __le32 dw2;
-+ __le32 dw3;
-+ __le32 dw4;
-+ __le32 dw5;
-+ __le32 dw6;
-+ __le32 dw7;
-+};
-+
-+#define PTD_OFFSET 0x0400
-+#define ISO_PTD_OFFSET 0x0400
-+#define INT_PTD_OFFSET 0x0800
-+#define ATL_PTD_OFFSET 0x0c00
-+#define PAYLOAD_OFFSET 0x1000
-+
-+#define ISP_BANK_0 0x00
-+#define ISP_BANK_1 0x01
-+#define ISP_BANK_2 0x02
-+#define ISP_BANK_3 0x03
-+
-+#define TO_DW(x) ((__force __dw)x)
-+#define TO_U32(x) ((__force u32)x)
-+
-+ /* ATL */
-+ /* DW0 */
-+#define DW0_VALID_BIT TO_DW(1)
-+#define FROM_DW0_VALID(x) (TO_U32(x) & 0x01)
-+#define TO_DW0_LENGTH(x) TO_DW((((u32)x) << 3))
-+#define TO_DW0_MAXPACKET(x) TO_DW((((u32)x) << 18))
-+#define TO_DW0_MULTI(x) TO_DW((((u32)x) << 29))
-+#define TO_DW0_ENDPOINT(x) TO_DW((((u32)x) << 31))
-+/* DW1 */
-+#define TO_DW1_DEVICE_ADDR(x) TO_DW((((u32)x) << 3))
-+#define TO_DW1_PID_TOKEN(x) TO_DW((((u32)x) << 10))
-+#define DW1_TRANS_BULK TO_DW(((u32)2 << 12))
-+#define DW1_TRANS_INT TO_DW(((u32)3 << 12))
-+#define DW1_TRANS_SPLIT TO_DW(((u32)1 << 14))
-+#define DW1_SE_USB_LOSPEED TO_DW(((u32)2 << 16))
-+#define TO_DW1_PORT_NUM(x) TO_DW((((u32)x) << 18))
-+#define TO_DW1_HUB_NUM(x) TO_DW((((u32)x) << 25))
-+/* DW2 */
-+#define TO_DW2_DATA_START_ADDR(x) TO_DW((((u32)x) << 8))
-+#define TO_DW2_RL(x) TO_DW(((x) << 25))
-+#define FROM_DW2_RL(x) ((TO_U32(x) >> 25) & 0xf)
-+/* DW3 */
-+#define FROM_DW3_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x3fff)
-+#define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x07ff)
-+#define TO_DW3_NAKCOUNT(x) TO_DW(((x) << 19))
-+#define FROM_DW3_NAKCOUNT(x) ((TO_U32(x) >> 19) & 0xf)
-+#define TO_DW3_CERR(x) TO_DW(((x) << 23))
-+#define FROM_DW3_CERR(x) ((TO_U32(x) >> 23) & 0x3)
-+#define TO_DW3_DATA_TOGGLE(x) TO_DW(((x) << 25))
-+#define FROM_DW3_DATA_TOGGLE(x) ((TO_U32(x) >> 25) & 0x1)
-+#define TO_DW3_PING(x) TO_DW(((x) << 26))
-+#define FROM_DW3_PING(x) ((TO_U32(x) >> 26) & 0x1)
-+#define DW3_ERROR_BIT TO_DW((1 << 28))
-+#define DW3_BABBLE_BIT TO_DW((1 << 29))
-+#define DW3_HALT_BIT TO_DW((1 << 30))
-+#define DW3_ACTIVE_BIT TO_DW((1 << 31))
-+#define FROM_DW3_ACTIVE(x) ((TO_U32(x) >> 31) & 0x01)
-+
-+#define INT_UNDERRUN (1 << 2)
-+#define INT_BABBLE (1 << 1)
-+#define INT_EXACT (1 << 0)
-+
-+#define SETUP_PID (2)
-+#define IN_PID (1)
-+#define OUT_PID (0)
-+
-+/* Errata 1 */
-+#define RL_COUNTER (0)
-+#define NAK_COUNTER (0)
-+#define ERR_COUNTER (3)
-+
-+struct isp1760_qtd {
-+ u8 packet_type;
-+ void *data_buffer;
-+ u32 payload_addr;
-+
-+ /* the rest is HCD-private */
-+ struct list_head qtd_list;
-+ struct urb *urb;
-+ size_t length;
-+ size_t actual_length;
-+
-+ /* QTD_ENQUEUED: waiting for transfer (inactive) */
-+ /* QTD_PAYLOAD_ALLOC: chip mem has been allocated for payload */
-+ /* QTD_XFER_STARTED: valid ptd has been written to isp176x - only
-+ interrupt handler may touch this qtd! */
-+ /* QTD_XFER_COMPLETE: payload has been transferred successfully */
-+ /* QTD_RETIRE: transfer error/abort qtd */
-+#define QTD_ENQUEUED 0
-+#define QTD_PAYLOAD_ALLOC 1
-+#define QTD_XFER_STARTED 2
-+#define QTD_XFER_COMPLETE 3
-+#define QTD_RETIRE 4
-+ u32 status;
-+};
-+
-+/* Queue head, one for each active endpoint */
-+struct isp1760_qh {
-+ struct list_head qh_list;
-+ struct list_head qtd_list;
-+ int epnum;
-+ u32 toggle;
-+ u32 ping;
-+ int slot;
-+ int tt_buffer_dirty; /* See USB2.0 spec section 11.17.5 */
-+};
-+
-+struct urb_listitem {
-+ struct list_head urb_list;
-+ struct urb *urb;
-+};
-+
-+static const u32 isp1763_hc_portsc1_fields[] = {
-+ [PORT_OWNER] = BIT(13),
-+ [PORT_POWER] = BIT(12),
-+ [PORT_LSTATUS] = BIT(10),
-+ [PORT_RESET] = BIT(8),
-+ [PORT_SUSPEND] = BIT(7),
-+ [PORT_RESUME] = BIT(6),
-+ [PORT_PE] = BIT(2),
-+ [PORT_CSC] = BIT(1),
-+ [PORT_CONNECT] = BIT(0),
-+};
-+
-+static struct descriptor {
-+ struct usb_device_descriptor device;
-+ struct usb_config_descriptor config;
-+ struct usb_interface_descriptor interface;
-+ struct usb_endpoint_descriptor endpoint;
-+} __packed rh_descriptor = {
-+ {
-+ /* usb 2.0 root hub device descriptor */
-+ 0x12, /* __u8 bLength; */
-+ USB_DT_DEVICE, /* __u8 bDescriptorType; Device */
-+ 0x0002, /* __le16 bcdUSB; v2.0 */
-+
-+ 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */
-+ 0x00, /* __u8 bDeviceSubClass; */
-+ 0x00, /* __u8 bDeviceProtocol; [ usb 2.0 no TT ] */
-+ 0x40, /* __u8 bMaxPacketSize0; 64 Bytes */
-+
-+ 0x6b1d, /* __le16 idVendor; Linux Foundation 0x1d6b */
-+ 0x0200, /* __le16 idProduct; device 0x0002 */
-+ 0x0001, /* __le16 bcdDevice */
-+
-+ 0x03, /* __u8 iManufacturer; */
-+ 0x02, /* __u8 iProduct; */
-+ 0x01, /* __u8 iSerialNumber; */
-+ 0x01 /* __u8 bNumConfigurations; */
-+ }, {
-+ /* one configuration */
-+ 0x09, /* __u8 bLength; */
-+ USB_DT_CONFIG, /* __u8 bDescriptorType; Configuration */
-+ 0x1900, /* __le16 wTotalLength; */
-+ 0x01, /* __u8 bNumInterfaces; (1) */
-+ 0x01, /* __u8 bConfigurationValue; */
-+ 0x00, /* __u8 iConfiguration; */
-+ 0xc0, /* __u8 bmAttributes;
-+ Bit 7: must be set,
-+ 6: Self-powered,
-+ 5: Remote wakeup,
-+ 4..0: resvd */
-+ 0x00, /* __u8 MaxPower; */
-+ }, {
-+ /* one interface */
-+ 0x09, /* __u8 if_bLength; */
-+ USB_DT_INTERFACE, /* __u8 if_bDescriptorType; Interface */
-+ 0x00, /* __u8 if_bInterfaceNumber; */
-+ 0x00, /* __u8 if_bAlternateSetting; */
-+ 0x01, /* __u8 if_bNumEndpoints; */
-+ 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */
-+ 0x00, /* __u8 if_bInterfaceSubClass; */
-+ 0x00, /* __u8 if_bInterfaceProtocol; [usb1.1 or single tt] */
-+ 0x00, /* __u8 if_iInterface; */
-+ }, {
-+ /* one endpoint (status change endpoint) */
-+ 0x07, /* __u8 ep_bLength; */
-+ USB_DT_ENDPOINT, /* __u8 ep_bDescriptorType; Endpoint */
-+ 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */
-+ 0x03, /* __u8 ep_bmAttributes; Interrupt */
-+ /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8)
-+ * see hub.c:hub_configure() for details. */
-+ (USB_MAXCHILDREN + 1 + 7) / 8, 0x00,
-+ 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */
-+ },
-+};
-+
-+/*
-+ * Access functions for isp176x registers regmap fields
-+ */
-+static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ return isp1760_field_read(priv->fields, field);
-+}
-+
-+/*
-+ * We need, in isp1763, to write directly the values to the portsc1
-+ * register so it will make the other values to trigger.
-+ */
-+static void isp1760_hcd_portsc1_set_clear(struct isp1760_hcd *priv, u32 field,
-+ u32 val)
-+{
-+ u32 bit = isp1763_hc_portsc1_fields[field];
-+ u32 port_status = readl(priv->base + ISP1763_HC_PORTSC1);
-+
-+ if (val)
-+ writel(port_status | bit, priv->base + ISP1763_HC_PORTSC1);
-+ else
-+ writel(port_status & ~bit, priv->base + ISP1763_HC_PORTSC1);
-+}
-+
-+static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (unlikely(priv->is_isp1763 &&
-+ (field >= PORT_OWNER && field <= PORT_CONNECT)))
-+ return isp1760_hcd_portsc1_set_clear(priv, field, val);
-+
-+ isp1760_field_write(priv->fields, field, val);
-+}
-+
-+static void isp1760_hcd_set(struct usb_hcd *hcd, u32 field)
-+{
-+ isp1760_hcd_write(hcd, field, 0xFFFFFFFF);
-+}
-+
-+static void isp1760_hcd_clear(struct usb_hcd *hcd, u32 field)
-+{
-+ isp1760_hcd_write(hcd, field, 0);
-+}
-+
-+static int isp1760_hcd_set_and_wait(struct usb_hcd *hcd, u32 field,
-+ u32 timeout_us)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 val;
-+
-+ isp1760_hcd_set(hcd, field);
-+
-+ return regmap_field_read_poll_timeout(priv->fields[field], val,
-+ val, 10, timeout_us);
-+}
-+
-+static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field,
-+ u32 timeout_us)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 val;
-+
-+ isp1760_hcd_set(hcd, field);
-+
-+ return regmap_field_read_poll_timeout(priv->fields[field], val,
-+ !val, 10, timeout_us);
-+}
-+
-+static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field,
-+ u32 timeout_us)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 val;
-+
-+ isp1760_hcd_clear(hcd, field);
-+
-+ return regmap_field_read_poll_timeout(priv->fields[field], val,
-+ !val, 10, timeout_us);
-+}
-+
-+static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field)
-+{
-+ return !!isp1760_hcd_read(hcd, field);
-+}
-+
-+static bool isp1760_hcd_ppc_is_set(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (priv->is_isp1763)
-+ return true;
-+
-+ return isp1760_hcd_is_set(hcd, HCS_PPC);
-+}
-+
-+static u32 isp1760_hcd_n_ports(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (priv->is_isp1763)
-+ return 1;
-+
-+ return isp1760_hcd_read(hcd, HCS_N_PORTS);
-+}
-+
-+/*
-+ * Access functions for isp176x memory (offset >= 0x0400).
-+ *
-+ * bank_reads8() reads memory locations prefetched by an earlier write to
-+ * HC_MEMORY_REG (see isp176x datasheet). Unless you want to do fancy multi-
-+ * bank optimizations, you should use the more generic mem_read() below.
-+ *
-+ * For access to ptd memory, use the specialized ptd_read() and ptd_write()
-+ * below.
-+ *
-+ * These functions copy via MMIO data to/from the device. memcpy_{to|from}io()
-+ * doesn't quite work because some people have to enforce 32-bit access
-+ */
-+static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
-+ __u32 *dst, u32 bytes)
-+{
-+ __u32 __iomem *src;
-+ u32 val;
-+ __u8 *src_byteptr;
-+ __u8 *dst_byteptr;
-+
-+ src = src_base + (bank_addr | src_offset);
-+
-+ if (src_offset < PAYLOAD_OFFSET) {
-+ while (bytes >= 4) {
-+ *dst = readl_relaxed(src);
-+ bytes -= 4;
-+ src++;
-+ dst++;
-+ }
-+ } else {
-+ while (bytes >= 4) {
-+ *dst = __raw_readl(src);
-+ bytes -= 4;
-+ src++;
-+ dst++;
-+ }
-+ }
-+
-+ if (!bytes)
-+ return;
-+
-+ /* in case we have 3, 2 or 1 by left. The dst buffer may not be fully
-+ * allocated.
-+ */
-+ if (src_offset < PAYLOAD_OFFSET)
-+ val = readl_relaxed(src);
-+ else
-+ val = __raw_readl(src);
-+
-+ dst_byteptr = (void *) dst;
-+ src_byteptr = (void *) &val;
-+ while (bytes > 0) {
-+ *dst_byteptr = *src_byteptr;
-+ dst_byteptr++;
-+ src_byteptr++;
-+ bytes--;
-+ }
-+}
-+
-+static void isp1760_mem_read(struct usb_hcd *hcd, u32 src_offset, void *dst,
-+ u32 bytes)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
-+ isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
-+ ndelay(100);
-+
-+ bank_reads8(priv->base, src_offset, ISP_BANK_0, dst, bytes);
-+}
-+
-+/*
-+ * ISP1763 does not have the banks direct host controller memory access,
-+ * needs to use the HC_DATA register. Add data read/write according to this,
-+ * and also adjust 16bit access.
-+ */
-+static void isp1763_mem_read(struct usb_hcd *hcd, u16 srcaddr,
-+ u16 *dstptr, u32 bytes)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+
-+ /* Write the starting device address to the hcd memory register */
-+ isp1760_reg_write(priv->regs, ISP1763_HC_MEMORY, srcaddr);
-+ ndelay(100); /* Delay between consecutive access */
-+
-+ /* As long there are at least 16-bit to read ... */
-+ while (bytes >= 2) {
-+ *dstptr = __raw_readw(priv->base + ISP1763_HC_DATA);
-+ bytes -= 2;
-+ dstptr++;
-+ }
-+
-+ /* If there are no more bytes to read, return */
-+ if (bytes <= 0)
-+ return;
-+
-+ *((u8 *)dstptr) = (u8)(readw(priv->base + ISP1763_HC_DATA) & 0xFF);
-+}
-+
-+static void mem_read(struct usb_hcd *hcd, u32 src_offset, __u32 *dst,
-+ u32 bytes)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (!priv->is_isp1763)
-+ return isp1760_mem_read(hcd, src_offset, (u16 *)dst, bytes);
-+
-+ isp1763_mem_read(hcd, (u16)src_offset, (u16 *)dst, bytes);
-+}
-+
-+static void isp1760_mem_write(void __iomem *dst_base, u32 dst_offset,
-+ __u32 const *src, u32 bytes)
-+{
-+ __u32 __iomem *dst;
-+
-+ dst = dst_base + dst_offset;
-+
-+ if (dst_offset < PAYLOAD_OFFSET) {
-+ while (bytes >= 4) {
-+ writel_relaxed(*src, dst);
-+ bytes -= 4;
-+ src++;
-+ dst++;
-+ }
-+ } else {
-+ while (bytes >= 4) {
-+ __raw_writel(*src, dst);
-+ bytes -= 4;
-+ src++;
-+ dst++;
-+ }
-+ }
-+
-+ if (!bytes)
-+ return;
-+ /* in case we have 3, 2 or 1 bytes left. The buffer is allocated and the
-+ * extra bytes should not be read by the HW.
-+ */
-+
-+ if (dst_offset < PAYLOAD_OFFSET)
-+ writel_relaxed(*src, dst);
-+ else
-+ __raw_writel(*src, dst);
-+}
-+
-+static void isp1763_mem_write(struct usb_hcd *hcd, u16 dstaddr, u16 *src,
-+ u32 bytes)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ /* Write the starting device address to the hcd memory register */
-+ isp1760_reg_write(priv->regs, ISP1763_HC_MEMORY, dstaddr);
-+ ndelay(100); /* Delay between consecutive access */
-+
-+ while (bytes >= 2) {
-+ /* Get and write the data; then adjust the data ptr and len */
-+ __raw_writew(*src, priv->base + ISP1763_HC_DATA);
-+ bytes -= 2;
-+ src++;
-+ }
-+
-+ /* If there are no more bytes to process, return */
-+ if (bytes <= 0)
-+ return;
-+
-+ /*
-+ * The only way to get here is if there is a single byte left,
-+ * get it and write it to the data reg;
-+ */
-+ writew(*((u8 *)src), priv->base + ISP1763_HC_DATA);
-+}
-+
-+static void mem_write(struct usb_hcd *hcd, u32 dst_offset, __u32 *src,
-+ u32 bytes)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (!priv->is_isp1763)
-+ return isp1760_mem_write(priv->base, dst_offset, src, bytes);
-+
-+ isp1763_mem_write(hcd, dst_offset, (u16 *)src, bytes);
-+}
-+
-+/*
-+ * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET,
-+ * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32.
-+ */
-+static void isp1760_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
-+ struct ptd *ptd)
-+{
-+ u16 src_offset = ptd_offset + slot * sizeof(*ptd);
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
-+ isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
-+ ndelay(90);
-+
-+ bank_reads8(priv->base, src_offset, ISP_BANK_0, (void *)ptd,
-+ sizeof(*ptd));
-+}
-+
-+static void isp1763_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
-+ struct ptd *ptd)
-+{
-+ u16 src_offset = ptd_offset + slot * sizeof(*ptd);
-+ struct ptd_le32 le32_ptd;
-+
-+ isp1763_mem_read(hcd, src_offset, (u16 *)&le32_ptd, sizeof(le32_ptd));
-+ /* Normalize the data obtained */
-+ ptd->dw0 = le32_to_dw(le32_ptd.dw0);
-+ ptd->dw1 = le32_to_dw(le32_ptd.dw1);
-+ ptd->dw2 = le32_to_dw(le32_ptd.dw2);
-+ ptd->dw3 = le32_to_dw(le32_ptd.dw3);
-+ ptd->dw4 = le32_to_dw(le32_ptd.dw4);
-+ ptd->dw5 = le32_to_dw(le32_ptd.dw5);
-+ ptd->dw6 = le32_to_dw(le32_ptd.dw6);
-+ ptd->dw7 = le32_to_dw(le32_ptd.dw7);
-+}
-+
-+static void ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
-+ struct ptd *ptd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (!priv->is_isp1763)
-+ return isp1760_ptd_read(hcd, ptd_offset, slot, ptd);
-+
-+ isp1763_ptd_read(hcd, ptd_offset, slot, ptd);
-+}
-+
-+static void isp1763_ptd_write(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
-+ struct ptd *cpu_ptd)
-+{
-+ u16 dst_offset = ptd_offset + slot * sizeof(*cpu_ptd);
-+ struct ptd_le32 ptd;
-+
-+ ptd.dw0 = dw_to_le32(cpu_ptd->dw0);
-+ ptd.dw1 = dw_to_le32(cpu_ptd->dw1);
-+ ptd.dw2 = dw_to_le32(cpu_ptd->dw2);
-+ ptd.dw3 = dw_to_le32(cpu_ptd->dw3);
-+ ptd.dw4 = dw_to_le32(cpu_ptd->dw4);
-+ ptd.dw5 = dw_to_le32(cpu_ptd->dw5);
-+ ptd.dw6 = dw_to_le32(cpu_ptd->dw6);
-+ ptd.dw7 = dw_to_le32(cpu_ptd->dw7);
-+
-+ isp1763_mem_write(hcd, dst_offset, (u16 *)&ptd.dw0,
-+ 8 * sizeof(ptd.dw0));
-+}
-+
-+static void isp1760_ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
-+ struct ptd *ptd)
-+{
-+ u32 dst_offset = ptd_offset + slot * sizeof(*ptd);
-+
-+ /*
-+ * Make sure dw0 gets written last (after other dw's and after payload)
-+ * since it contains the enable bit
-+ */
-+ isp1760_mem_write(base, dst_offset + sizeof(ptd->dw0),
-+ (__force u32 *)&ptd->dw1, 7 * sizeof(ptd->dw1));
-+ wmb();
-+ isp1760_mem_write(base, dst_offset, (__force u32 *)&ptd->dw0,
-+ sizeof(ptd->dw0));
-+}
-+
-+static void ptd_write(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
-+ struct ptd *ptd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ if (!priv->is_isp1763)
-+ return isp1760_ptd_write(priv->base, ptd_offset, slot, ptd);
-+
-+ isp1763_ptd_write(hcd, ptd_offset, slot, ptd);
-+}
-+
-+/* memory management of the 60kb on the chip from 0x1000 to 0xffff */
-+static void init_memory(struct isp1760_hcd *priv)
-+{
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ int i, j, curr;
-+ u32 payload_addr;
-+
-+ payload_addr = PAYLOAD_OFFSET;
-+
-+ for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++) {
-+ for (j = 0; j < mem->blocks[i]; j++, curr++) {
-+ priv->memory_pool[curr + j].start = payload_addr;
-+ priv->memory_pool[curr + j].size = mem->blocks_size[i];
-+ priv->memory_pool[curr + j].free = 1;
-+ payload_addr += priv->memory_pool[curr + j].size;
-+ }
-+ }
-+
-+ WARN_ON(payload_addr - priv->memory_pool[0].start >
-+ mem->payload_area_size);
-+}
-+
-+static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ int i;
-+
-+ WARN_ON(qtd->payload_addr);
-+
-+ if (!qtd->length)
-+ return;
-+
-+ for (i = 0; i < mem->payload_blocks; i++) {
-+ if (priv->memory_pool[i].size >= qtd->length &&
-+ priv->memory_pool[i].free) {
-+ priv->memory_pool[i].free = 0;
-+ qtd->payload_addr = priv->memory_pool[i].start;
-+ return;
-+ }
-+ }
-+}
-+
-+static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ int i;
-+
-+ if (!qtd->payload_addr)
-+ return;
-+
-+ for (i = 0; i < mem->payload_blocks; i++) {
-+ if (priv->memory_pool[i].start == qtd->payload_addr) {
-+ WARN_ON(priv->memory_pool[i].free);
-+ priv->memory_pool[i].free = 1;
-+ qtd->payload_addr = 0;
-+ return;
-+ }
-+ }
-+
-+ WARN_ON(1);
-+ qtd->payload_addr = 0;
-+}
-+
-+/* reset a non-running (STS_HALT == 1) controller */
-+static int ehci_reset(struct usb_hcd *hcd)
-+{
-+ return isp1760_hcd_set_and_wait_swap(hcd, CMD_RESET, 250 * 1000);
-+}
-+
-+static struct isp1760_qh *qh_alloc(gfp_t flags)
-+{
-+ struct isp1760_qh *qh;
-+
-+ qh = kmem_cache_alloc(qh_cachep, flags);
-+ if (!qh)
-+ return NULL;
-+
-+ memset(qh, '\0', qh_cachep->sz);
-+ INIT_LIST_HEAD(&qh->qh_list);
-+ INIT_LIST_HEAD(&qh->qtd_list);
-+ qh->slot = -1;
-+
-+ return qh;
-+}
-+
-+static void qh_free(struct isp1760_qh *qh)
-+{
-+ WARN_ON(!list_empty(&qh->qtd_list));
-+ WARN_ON(qh->slot > -1);
-+ kmem_cache_free(qh_cachep, qh);
-+}
-+
-+/* one-time init, only for memory state */
-+static int priv_init(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 isoc_cache;
-+ u32 isoc_thres;
-+ int i;
-+
-+ spin_lock_init(&priv->lock);
-+
-+ for (i = 0; i < QH_END; i++)
-+ INIT_LIST_HEAD(&priv->qh_list[i]);
-+
-+ /*
-+ * hw default: 1K periodic list heads, one per frame.
-+ * periodic_size can shrink by USBCMD update if hcc_params allows.
-+ */
-+ priv->periodic_size = DEFAULT_I_TDPS;
-+
-+ if (priv->is_isp1763) {
-+ priv->i_thresh = 2;
-+ return 0;
-+ }
-+
-+ /* controllers may cache some of the periodic schedule ... */
-+ isoc_cache = isp1760_hcd_read(hcd, HCC_ISOC_CACHE);
-+ isoc_thres = isp1760_hcd_read(hcd, HCC_ISOC_THRES);
-+
-+ /* full frame cache */
-+ if (isoc_cache)
-+ priv->i_thresh = 8;
-+ else /* N microframes cached */
-+ priv->i_thresh = 2 + isoc_thres;
-+
-+ return 0;
-+}
-+
-+static int isp1760_hc_setup(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 atx_reset;
-+ int result;
-+ u32 scratch;
-+ u32 pattern;
-+
-+ if (priv->is_isp1763)
-+ pattern = 0xcafe;
-+ else
-+ pattern = 0xdeadcafe;
-+
-+ isp1760_hcd_write(hcd, HC_SCRATCH, pattern);
-+
-+ /* Change bus pattern */
-+ scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
-+ scratch = isp1760_hcd_read(hcd, HC_SCRATCH);
-+ if (scratch != pattern) {
-+ printf("Scratch test failed. 0x%08x\n", scratch);
-+ return -ENODEV;
-+ }
-+
-+ /*
-+ * The RESET_HC bit in the SW_RESET register is supposed to reset the
-+ * host controller without touching the CPU interface registers, but at
-+ * least on the ISP1761 it seems to behave as the RESET_ALL bit and
-+ * reset the whole device. We thus can't use it here, so let's reset
-+ * the host controller through the EHCI USB Command register. The device
-+ * has been reset in core code anyway, so this shouldn't matter.
-+ */
-+ isp1760_hcd_clear(hcd, ISO_BUF_FILL);
-+ isp1760_hcd_clear(hcd, INT_BUF_FILL);
-+ isp1760_hcd_clear(hcd, ATL_BUF_FILL);
-+
-+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP);
-+
-+ result = ehci_reset(hcd);
-+ if (result)
-+ return result;
-+
-+ /* Step 11 passed */
-+
-+ /* ATL reset */
-+ if (priv->is_isp1763)
-+ atx_reset = SW_RESET_RESET_ATX;
-+ else
-+ atx_reset = ALL_ATX_RESET;
-+
-+ isp1760_hcd_set(hcd, atx_reset);
-+ mdelay(10);
-+ isp1760_hcd_clear(hcd, atx_reset);
-+
-+ if (priv->is_isp1763) {
-+ isp1760_hcd_set(hcd, HW_OTG_DISABLE);
-+ isp1760_hcd_set(hcd, HW_SW_SEL_HC_DC_CLEAR);
-+ isp1760_hcd_set(hcd, HW_HC_2_DIS_CLEAR);
-+ isp1760_hcd_set(hcd, HW_DM_PULLDOWN);
-+ isp1760_hcd_set(hcd, HW_DP_PULLDOWN);
-+ mdelay(10);
-+
-+ isp1760_hcd_set(hcd, HW_INTF_LOCK);
-+ }
-+
-+ isp1760_hcd_set(hcd, HC_INT_IRQ_ENABLE);
-+ isp1760_hcd_set(hcd, HC_ATL_IRQ_ENABLE);
-+
-+ return priv_init(hcd);
-+}
-+
-+static u32 base_to_chip(u32 base)
-+{
-+ return ((base - 0x400) >> 3);
-+}
-+
-+static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh)
-+{
-+ struct urb *urb;
-+
-+ if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
-+ return 1;
-+
-+ urb = qtd->urb;
-+ qtd = list_entry(qtd->qtd_list.next, typeof(*qtd), qtd_list);
-+
-+ return (qtd->urb != urb);
-+}
-+
-+/* magic numbers that can affect system performance */
-+#define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
-+#define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
-+#define EHCI_TUNE_RL_TT 0
-+#define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
-+#define EHCI_TUNE_MULT_TT 1
-+#define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
-+
-+static void create_ptd_atl(struct isp1760_qh *qh, struct isp1760_qtd *qtd,
-+ struct ptd *ptd)
-+{
-+ u32 maxpacket;
-+ u32 multi;
-+ u32 rl = RL_COUNTER;
-+ u32 nak = NAK_COUNTER;
-+ u8 portnr;
-+ u8 hubaddr;
-+
-+ memset(ptd, 0, sizeof(*ptd));
-+
-+ /* according to 3.6.2, max packet len can not be > 0x400 */
-+ maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe);
-+ multi = 1 + ((maxpacket >> 11) & 0x3);
-+ maxpacket &= 0x7ff;
-+
-+ /* DW0 */
-+ ptd->dw0 = DW0_VALID_BIT;
-+ ptd->dw0 |= TO_DW0_LENGTH(qtd->length);
-+ ptd->dw0 |= TO_DW0_MAXPACKET(maxpacket);
-+ ptd->dw0 |= TO_DW0_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe));
-+
-+ /* DW1 */
-+ ptd->dw1 = TO_DW((usb_pipeendpoint(qtd->urb->pipe) >> 1));
-+ ptd->dw1 |= TO_DW1_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe));
-+ ptd->dw1 |= TO_DW1_PID_TOKEN(qtd->packet_type);
-+
-+ if (usb_pipebulk(qtd->urb->pipe))
-+ ptd->dw1 |= DW1_TRANS_BULK;
-+ else if (usb_pipeint(qtd->urb->pipe))
-+ ptd->dw1 |= DW1_TRANS_INT;
-+
-+ if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
-+ /* split transaction */
-+
-+ ptd->dw1 |= DW1_TRANS_SPLIT;
-+ if (qtd->urb->dev->speed == USB_SPEED_LOW)
-+ ptd->dw1 |= DW1_SE_USB_LOSPEED;
-+
-+ if (!qtd->urb->dev->dev->parent_priv_) {
-+ portnr = qtd->urb->dev->portnr;
-+ hubaddr = qtd->urb->dev->devnum;
-+ } else {
-+ usb_find_usb2_hub_address_port(qtd->urb->dev, &hubaddr,
-+ &portnr);
-+ }
-+
-+ ptd->dw1 |= TO_DW1_PORT_NUM(portnr);
-+ ptd->dw1 |= TO_DW1_HUB_NUM(hubaddr);
-+
-+ /* SE bit for Split INT transfers */
-+ if (usb_pipeint(qtd->urb->pipe) &&
-+ (qtd->urb->dev->speed == USB_SPEED_LOW))
-+ ptd->dw1 |= DW1_SE_USB_LOSPEED;
-+
-+ rl = 0;
-+ nak = 0;
-+ } else {
-+ ptd->dw0 |= TO_DW0_MULTI(multi);
-+ if (usb_pipecontrol(qtd->urb->pipe) ||
-+ usb_pipebulk(qtd->urb->pipe))
-+ ptd->dw3 |= TO_DW3_PING(qh->ping);
-+ }
-+ /* DW2 */
-+ ptd->dw2 = 0;
-+ ptd->dw2 |= TO_DW2_DATA_START_ADDR(base_to_chip(qtd->payload_addr));
-+ ptd->dw2 |= TO_DW2_RL(rl);
-+
-+ /* DW3 */
-+ ptd->dw3 |= TO_DW3_NAKCOUNT(nak);
-+ ptd->dw3 |= TO_DW3_DATA_TOGGLE(qh->toggle);
-+
-+ if (usb_pipecontrol(qtd->urb->pipe)) {
-+ if (qtd->data_buffer == qtd->urb->setup_packet) {
-+ ptd->dw3 &= ~TO_DW3_DATA_TOGGLE(1);
-+ } else if (last_qtd_of_urb(qtd, qh)) {
-+ ptd->dw3 |= TO_DW3_DATA_TOGGLE(1);
-+ }
-+ }
-+
-+ ptd->dw3 |= DW3_ACTIVE_BIT;
-+ /* Cerr */
-+ ptd->dw3 |= TO_DW3_CERR(ERR_COUNTER);
-+}
-+
-+static void transform_add_int(struct isp1760_qh *qh, struct isp1760_qtd *qtd,
-+ struct ptd *ptd)
-+{
-+ struct usb_host_endpoint *hep = qtd->urb->ep;
-+ struct usb_endpoint_descriptor *epd = &hep->desc;
-+ u32 usof;
-+ u32 period;
-+
-+ /*
-+ * Most of this is guessing. ISP1761 datasheet is quite unclear, and
-+ * the algorithm from the original Philips driver code, which was
-+ * pretty much used in this driver before as well, is quite horrendous
-+ * and, i believe, incorrect. The code below follows the datasheet and
-+ * USB2.0 spec as far as I can tell, and plug/unplug seems to be much
-+ * more reliable this way (fingers crossed...).
-+ */
-+
-+ if (qtd->urb->dev->speed == USB_SPEED_HIGH) {
-+ /* urb->interval is in units of microframes (1/8 ms) */
-+ period = epd->bInterval >> 3;
-+
-+ if (epd->bInterval > 4)
-+ usof = 0x01; /* One bit set =>
-+ interval 1 ms * uFrame-match */
-+ else if (epd->bInterval > 2)
-+ usof = 0x22; /* Two bits set => interval 1/2 ms */
-+ else if (epd->bInterval > 1)
-+ usof = 0x55; /* Four bits set => interval 1/4 ms */
-+ else
-+ usof = 0xff; /* All bits set => interval 1/8 ms */
-+ } else {
-+ /* urb->interval is in units of frames (1 ms) */
-+ period = epd->bInterval;
-+ usof = 0x0f; /* Execute Start Split on any of the
-+ four first uFrames */
-+
-+ /*
-+ * First 8 bits in dw5 is uSCS and "specifies which uSOF the
-+ * complete split needs to be sent. Valid only for IN." Also,
-+ * "All bits can be set to one for every transfer." (p 82,
-+ * ISP1761 data sheet.) 0x1c is from Philips driver. Where did
-+ * that number come from? 0xff seems to work fine...
-+ */
-+ /* ptd->dw5 = 0x1c; */
-+ ptd->dw5 = TO_DW(0xff); /* Execute Complete Split on any uFrame */
-+ }
-+
-+ period = period >> 1;/* Ensure equal or shorter period than requested */
-+ period &= 0xf8; /* Mask off too large values and lowest unused 3 bits */
-+
-+ ptd->dw2 |= TO_DW(period);
-+ ptd->dw4 = TO_DW(usof);
-+}
-+
-+static void create_ptd_int(struct isp1760_qh *qh, struct isp1760_qtd *qtd,
-+ struct ptd *ptd)
-+{
-+ create_ptd_atl(qh, qtd, ptd);
-+ transform_add_int(qh, qtd, ptd);
-+}
-+
-+static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb)
-+{
-+ if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
-+ void *ptr;
-+ for (ptr = urb->transfer_buffer;
-+ ptr < urb->transfer_buffer + urb->transfer_buffer_length;
-+ ptr += PAGE_SIZE)
-+ flush_dcache_range((unsigned long)ptr,
-+ (unsigned long)ptr + PAGE_SIZE);
-+ }
-+
-+ /* complete() can reenter this HCD */
-+ usb_hcd_unlink_urb_from_ep(hcd, urb);
-+ usb_hcd_giveback_urb(hcd, urb, urb->status);
-+}
-+
-+static struct isp1760_qtd *qtd_alloc(gfp_t flags, struct urb *urb,
-+ u8 packet_type)
-+{
-+ struct isp1760_qtd *qtd;
-+
-+ qtd = kmem_cache_alloc(qtd_cachep, flags);
-+ if (!qtd)
-+ return NULL;
-+
-+ memset(qtd, '\0', sizeof(*qtd));
-+ INIT_LIST_HEAD(&qtd->qtd_list);
-+ qtd->urb = urb;
-+ qtd->packet_type = packet_type;
-+ qtd->status = QTD_ENQUEUED;
-+ qtd->actual_length = 0;
-+
-+ return qtd;
-+}
-+
-+static void qtd_free(struct isp1760_qtd *qtd)
-+{
-+ WARN_ON(qtd->payload_addr);
-+ kmem_cache_free(qtd_cachep, qtd);
-+}
-+
-+static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot,
-+ struct isp1760_slotinfo *slots,
-+ struct isp1760_qtd *qtd, struct isp1760_qh *qh,
-+ struct ptd *ptd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ int skip_map;
-+
-+ WARN_ON((slot < 0) || (slot > mem->slot_num - 1));
-+ WARN_ON(qtd->length && !qtd->payload_addr);
-+ WARN_ON(slots[slot].qtd);
-+ WARN_ON(slots[slot].qh);
-+ WARN_ON(qtd->status != QTD_PAYLOAD_ALLOC);
-+
-+ if (priv->is_isp1763)
-+ ndelay(100);
-+
-+ /* Make sure done map has not triggered from some unlinked transfer */
-+ if (ptd_offset == ATL_PTD_OFFSET) {
-+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP);
-+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP,
-+ skip_map | (1 << slot));
-+ priv->atl_done_map |= isp1760_hcd_read(hcd, HC_ATL_PTD_DONEMAP);
-+ priv->atl_done_map &= ~(1 << slot);
-+ } else {
-+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP);
-+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP,
-+ skip_map | (1 << slot));
-+ priv->int_done_map |= isp1760_hcd_read(hcd, HC_INT_PTD_DONEMAP);
-+ priv->int_done_map &= ~(1 << slot);
-+ }
-+
-+ skip_map &= ~(1 << slot);
-+ qh->slot = slot;
-+ qtd->status = QTD_XFER_STARTED;
-+ slots[slot].qtd = qtd;
-+ slots[slot].qh = qh;
-+
-+ ptd_write(hcd, ptd_offset, slot, ptd);
-+
-+ if (ptd_offset == ATL_PTD_OFFSET)
-+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map);
-+ else
-+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map);
-+}
-+
-+static int is_short_bulk(struct isp1760_qtd *qtd)
-+{
-+ return (usb_pipebulk(qtd->urb->pipe) &&
-+ (qtd->actual_length < qtd->length));
-+}
-+
-+static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh,
-+ struct list_head *urb_list)
-+{
-+ struct isp1760_qtd *qtd, *qtd_next;
-+ struct urb_listitem *urb_listitem;
-+ int last_qtd;
-+
-+ list_for_each_entry_safe(qtd, qtd_next, &qh->qtd_list, qtd_list) {
-+ if (qtd->status < QTD_XFER_COMPLETE)
-+ break;
-+
-+ last_qtd = last_qtd_of_urb(qtd, qh);
-+
-+ if ((!last_qtd) && (qtd->status == QTD_RETIRE))
-+ qtd_next->status = QTD_RETIRE;
-+
-+ if (qtd->status == QTD_XFER_COMPLETE) {
-+ if (qtd->actual_length) {
-+ switch (qtd->packet_type) {
-+ case IN_PID:
-+ mem_read(hcd, qtd->payload_addr,
-+ qtd->data_buffer,
-+ qtd->actual_length);
-+ fallthrough;
-+ case OUT_PID:
-+ qtd->urb->actual_length +=
-+ qtd->actual_length;
-+ fallthrough;
-+ case SETUP_PID:
-+ break;
-+ }
-+ }
-+
-+ if (is_short_bulk(qtd)) {
-+ if (qtd->urb->transfer_flags & URB_SHORT_NOT_OK)
-+ qtd->urb->status = -EREMOTEIO;
-+ if (!last_qtd)
-+ qtd_next->status = QTD_RETIRE;
-+ }
-+ }
-+
-+ if (qtd->payload_addr)
-+ free_mem(hcd, qtd);
-+
-+ if (last_qtd) {
-+ if ((qtd->status == QTD_RETIRE) &&
-+ (qtd->urb->status == -EINPROGRESS))
-+ qtd->urb->status = -EPIPE;
-+ /* Defer calling of urb_done() since it releases lock */
-+ urb_listitem = kmem_cache_alloc(urb_listitem_cachep,
-+ GFP_ATOMIC);
-+ if (unlikely(!urb_listitem))
-+ break; /* Try again on next call */
-+ urb_listitem->urb = qtd->urb;
-+ list_add_tail(&urb_listitem->urb_list, urb_list);
-+ }
-+
-+ list_del(&qtd->qtd_list);
-+ qtd_free(qtd);
-+ }
-+}
-+
-+#define ENQUEUE_DEPTH 2
-+static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ int slot_num = mem->slot_num;
-+ int ptd_offset;
-+ struct isp1760_slotinfo *slots;
-+ int curr_slot, free_slot;
-+ int n;
-+ struct ptd ptd;
-+ struct isp1760_qtd *qtd;
-+
-+ if (unlikely(list_empty(&qh->qtd_list)))
-+ return;
-+
-+ /* Make sure this endpoint's TT buffer is clean before queueing ptds */
-+ if (qh->tt_buffer_dirty)
-+ return;
-+
-+ if (usb_pipeint(list_entry(qh->qtd_list.next, struct isp1760_qtd,
-+ qtd_list)->urb->pipe)) {
-+ ptd_offset = INT_PTD_OFFSET;
-+ slots = priv->int_slots;
-+ } else {
-+ ptd_offset = ATL_PTD_OFFSET;
-+ slots = priv->atl_slots;
-+ }
-+
-+ free_slot = -1;
-+ for (curr_slot = 0; curr_slot < slot_num; curr_slot++) {
-+ if ((free_slot == -1) && (slots[curr_slot].qtd == NULL))
-+ free_slot = curr_slot;
-+ if (slots[curr_slot].qh == qh)
-+ break;
-+ }
-+
-+ n = 0;
-+ list_for_each_entry(qtd, &qh->qtd_list, qtd_list) {
-+ if (qtd->status == QTD_ENQUEUED) {
-+ WARN_ON(qtd->payload_addr);
-+ alloc_mem(hcd, qtd);
-+ if ((qtd->length) && (!qtd->payload_addr))
-+ break;
-+
-+ if (qtd->length && (qtd->packet_type == SETUP_PID ||
-+ qtd->packet_type == OUT_PID)) {
-+ mem_write(hcd, qtd->payload_addr,
-+ qtd->data_buffer, qtd->length);
-+ }
-+
-+ qtd->status = QTD_PAYLOAD_ALLOC;
-+ }
-+
-+ if (qtd->status == QTD_PAYLOAD_ALLOC) {
-+/*
-+ if ((curr_slot > 31) && (free_slot == -1))
-+ printf("%s: No slot "
-+ "available for transfer\n", __func__);
-+*/
-+ /* Start xfer for this endpoint if not already done */
-+ if ((curr_slot > slot_num - 1) && (free_slot > -1)) {
-+ if (usb_pipeint(qtd->urb->pipe))
-+ create_ptd_int(qh, qtd, &ptd);
-+ else
-+ create_ptd_atl(qh, qtd, &ptd);
-+
-+ start_bus_transfer(hcd, ptd_offset, free_slot,
-+ slots, qtd, qh, &ptd);
-+ curr_slot = free_slot;
-+ }
-+
-+ n++;
-+ if (n >= ENQUEUE_DEPTH)
-+ break;
-+ }
-+ }
-+}
-+
-+static void schedule_ptds(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv;
-+ struct isp1760_qh *qh, *qh_next;
-+ struct list_head *ep_queue;
-+ LIST_HEAD(urb_list);
-+ struct urb_listitem *urb_listitem, *urb_listitem_next;
-+ int i;
-+
-+ if (!hcd) {
-+ WARN_ON(1);
-+ return;
-+ }
-+
-+ priv = hcd_to_priv(hcd);
-+
-+ /*
-+ * check finished/retired xfers, transfer payloads, call urb_done()
-+ */
-+ for (i = 0; i < QH_END; i++) {
-+ ep_queue = &priv->qh_list[i];
-+ list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list)
-+ collect_qtds(hcd, qh, &urb_list);
-+ }
-+
-+ list_for_each_entry_safe(urb_listitem, urb_listitem_next, &urb_list,
-+ urb_list) {
-+ isp1760_urb_done(hcd, urb_listitem->urb);
-+ kmem_cache_free(urb_listitem_cachep, urb_listitem);
-+ }
-+
-+ /*
-+ * Schedule packets for transfer.
-+ *
-+ * According to USB2.0 specification:
-+ *
-+ * 1st prio: interrupt xfers, up to 80 % of bandwidth
-+ * 2nd prio: control xfers
-+ * 3rd prio: bulk xfers
-+ *
-+ * ... but let's use a simpler scheme here (mostly because ISP1761 doc
-+ * is very unclear on how to prioritize traffic):
-+ *
-+ * 1) Enqueue any queued control transfers, as long as payload chip mem
-+ * and PTD ATL slots are available.
-+ * 2) Enqueue any queued INT transfers, as long as payload chip mem
-+ * and PTD INT slots are available.
-+ * 3) Enqueue any queued bulk transfers, as long as payload chip mem
-+ * and PTD ATL slots are available.
-+ *
-+ * Use double buffering (ENQUEUE_DEPTH==2) as a compromise between
-+ * conservation of chip mem and performance.
-+ *
-+ * I'm sure this scheme could be improved upon!
-+ */
-+ for (i = 0; i < QH_END; i++) {
-+ ep_queue = &priv->qh_list[i];
-+ list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list)
-+ enqueue_qtds(hcd, qh);
-+ }
-+}
-+
-+#define PTD_STATE_QTD_DONE 1
-+#define PTD_STATE_QTD_RELOAD 2
-+#define PTD_STATE_URB_RETIRE 3
-+
-+static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd,
-+ struct urb *urb)
-+{
-+ u32 dw4;
-+ int i;
-+
-+ dw4 = TO_U32(ptd->dw4);
-+ dw4 >>= 8;
-+
-+ /* FIXME: ISP1761 datasheet does not say what to do with these. Do we
-+ need to handle these errors? Is it done in hardware? */
-+ if (ptd->dw3 & DW3_HALT_BIT) {
-+
-+ urb->status = -EPROTO; /* Default unknown error */
-+
-+ for (i = 0; i < 8; i++) {
-+ switch (dw4 & 0x7) {
-+ case INT_UNDERRUN:
-+ printf("underrun during uFrame %d\n", i);
-+ urb->status = -ECOMM; /* Could not write data */
-+ break;
-+ case INT_EXACT:
-+ printf("transaction error uFrame %d\n", i);
-+ urb->status = -EPROTO; /* timeout, bad CRC, PID
-+ error etc. */
-+ break;
-+ case INT_BABBLE:
-+ printf("babble error during uFrame %d\n", i);
-+ urb->status = -EOVERFLOW;
-+ break;
-+ }
-+ dw4 >>= 3;
-+ }
-+
-+ return PTD_STATE_URB_RETIRE;
-+ }
-+
-+ return PTD_STATE_QTD_DONE;
-+}
-+
-+static int check_atl_transfer(struct usb_hcd *hcd, struct ptd *ptd,
-+ struct urb *urb)
-+{
-+ WARN_ON(!ptd);
-+ if (ptd->dw3 & DW3_HALT_BIT) {
-+ if (ptd->dw3 & DW3_BABBLE_BIT)
-+ urb->status = -EOVERFLOW;
-+ else if (FROM_DW3_CERR(ptd->dw3))
-+ urb->status = -EPIPE; /* Stall */
-+ else
-+ urb->status = -EPROTO; /* Unknown */
-+
-+ /* usefull debug
-+ printf("%s: ptd error:\n"
-+ " dw0: %08x dw1: %08x dw2: %08x dw3: %08x\n"
-+ " dw4: %08x dw5: %08x dw6: %08x dw7: %08x\n",
-+ __func__,
-+ ptd->dw0, ptd->dw1, ptd->dw2, ptd->dw3,
-+ ptd->dw4, ptd->dw5, ptd->dw6, ptd->dw7);
-+ */
-+
-+ return PTD_STATE_URB_RETIRE;
-+ }
-+
-+ /* Transfer Error, *but* active and no HALT -> reload */
-+ if ((ptd->dw3 & DW3_ERROR_BIT) && (ptd->dw3 & DW3_ACTIVE_BIT))
-+ return PTD_STATE_QTD_RELOAD;
-+
-+ /*
-+ * NAKs are handled in HW by the chip. Usually if the
-+ * device is not able to send data fast enough.
-+ * This happens mostly on slower hardware.
-+ */
-+ if (!FROM_DW3_NAKCOUNT(ptd->dw3) && (ptd->dw3 & DW3_ACTIVE_BIT))
-+ return PTD_STATE_QTD_RELOAD;
-+
-+ return PTD_STATE_QTD_DONE;
-+}
-+
-+static void handle_done_ptds(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ struct isp1760_slotinfo *slots;
-+ struct isp1760_qtd *qtd;
-+ struct isp1760_qh *qh;
-+ struct ptd ptd;
-+ u32 ptd_offset;
-+ int modified;
-+ int skip_map;
-+ int state;
-+ int slot;
-+
-+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP);
-+ priv->int_done_map &= ~skip_map;
-+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP);
-+ priv->atl_done_map &= ~skip_map;
-+
-+ modified = priv->int_done_map || priv->atl_done_map;
-+
-+ while (priv->int_done_map || priv->atl_done_map) {
-+ if (priv->int_done_map) {
-+ /* INT ptd */
-+ slot = __ffs(priv->int_done_map);
-+ priv->int_done_map &= ~(1 << slot);
-+ slots = priv->int_slots;
-+ /* This should not trigger, and could be removed if
-+ noone have any problems with it triggering: */
-+ if (!slots[slot].qh) {
-+ WARN_ON(1);
-+ continue;
-+ }
-+ ptd_offset = INT_PTD_OFFSET;
-+ ptd_read(hcd, INT_PTD_OFFSET, slot, &ptd);
-+ state = check_int_transfer(hcd, &ptd,
-+ slots[slot].qtd->urb);
-+ } else {
-+ /* ATL ptd */
-+ slot = __ffs(priv->atl_done_map);
-+ priv->atl_done_map &= ~(1 << slot);
-+ slots = priv->atl_slots;
-+ /* This should not trigger, and could be removed if
-+ noone have any problems with it triggering: */
-+ if (!slots[slot].qh) {
-+ WARN_ON(1);
-+ continue;
-+ }
-+ ptd_offset = ATL_PTD_OFFSET;
-+ ptd_read(hcd, ATL_PTD_OFFSET, slot, &ptd);
-+ state = check_atl_transfer(hcd, &ptd,
-+ slots[slot].qtd->urb);
-+ }
-+
-+ qtd = slots[slot].qtd;
-+ slots[slot].qtd = NULL;
-+ qh = slots[slot].qh;
-+ slots[slot].qh = NULL;
-+ qh->slot = -1;
-+
-+ WARN_ON(qtd->status != QTD_XFER_STARTED);
-+
-+ switch (state) {
-+ case PTD_STATE_QTD_DONE:
-+ if ((usb_pipeint(qtd->urb->pipe)) &&
-+ (qtd->urb->dev->speed != USB_SPEED_HIGH))
-+ qtd->actual_length =
-+ FROM_DW3_SCS_NRBYTESTRANSFERRED(ptd.dw3);
-+ else
-+ qtd->actual_length =
-+ FROM_DW3_NRBYTESTRANSFERRED(ptd.dw3);
-+
-+ qtd->status = QTD_XFER_COMPLETE;
-+
-+ if (list_is_last(&qtd->qtd_list, &qh->qtd_list) ||
-+ is_short_bulk(qtd))
-+ qtd = NULL;
-+ else
-+ qtd = list_entry(qtd->qtd_list.next,
-+ typeof(*qtd), qtd_list);
-+
-+ qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3);
-+ qh->ping = FROM_DW3_PING(ptd.dw3);
-+
-+ break;
-+
-+ case PTD_STATE_QTD_RELOAD: /* QTD_RETRY, for atls only */
-+ qtd->status = QTD_PAYLOAD_ALLOC;
-+ ptd.dw0 |= DW0_VALID_BIT;
-+ /* RL counter = ERR counter */
-+ ptd.dw3 &= ~TO_DW3_NAKCOUNT(0xf);
-+ ptd.dw3 |= TO_DW3_NAKCOUNT(FROM_DW2_RL(ptd.dw2));
-+ ptd.dw3 &= ~TO_DW3_CERR(3);
-+ ptd.dw3 |= TO_DW3_CERR(ERR_COUNTER);
-+
-+ qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3);
-+ qh->ping = FROM_DW3_PING(ptd.dw3);
-+ break;
-+
-+ case PTD_STATE_URB_RETIRE:
-+ qtd->status = QTD_RETIRE;
-+ qtd = NULL;
-+ qh->toggle = 0;
-+ qh->ping = 0;
-+ break;
-+
-+ default:
-+ WARN_ON(1);
-+ continue;
-+ }
-+
-+ if (qtd && (qtd->status == QTD_PAYLOAD_ALLOC)) {
-+ if (slots == priv->int_slots) {
-+ if (state == PTD_STATE_QTD_RELOAD)
-+ dev_err(priv->dev,
-+ "%s: PTD_STATE_QTD_RELOAD on "
-+ "interrupt packet\n", __func__);
-+ if (state != PTD_STATE_QTD_RELOAD)
-+ create_ptd_int(qh, qtd, &ptd);
-+ } else {
-+ if (state != PTD_STATE_QTD_RELOAD)
-+ create_ptd_atl(qh, qtd, &ptd);
-+ }
-+
-+ start_bus_transfer(hcd, ptd_offset, slot, slots, qtd,
-+ qh, &ptd);
-+ }
-+ }
-+
-+ if (modified)
-+ schedule_ptds(hcd);
-+}
-+
-+static irqreturn_t isp1760_irq(int irq, void *__hci)
-+{
-+ struct usb_hcd *hcd = __hci;
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ irqreturn_t irqret = IRQ_NONE;
-+ u32 int_reg;
-+ u32 imask;
-+
-+ imask = isp1760_hcd_read(hcd, HC_INTERRUPT);
-+ if (unlikely(!imask))
-+ return irqret;
-+
-+ int_reg = priv->is_isp1763 ? ISP1763_HC_INTERRUPT :
-+ ISP176x_HC_INTERRUPT;
-+ isp1760_reg_write(priv->regs, int_reg, imask);
-+
-+ priv->int_done_map |= isp1760_hcd_read(hcd, HC_INT_PTD_DONEMAP);
-+ priv->atl_done_map |= isp1760_hcd_read(hcd, HC_ATL_PTD_DONEMAP);
-+
-+ handle_done_ptds(hcd);
-+
-+ irqret = IRQ_HANDLED;
-+
-+ return irqret;
-+}
-+
-+static int isp1763_run(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ int retval;
-+ u32 chipid_h;
-+ u32 chipid_l;
-+ u32 chip_rev;
-+ u32 ptd_atl_int;
-+ u32 ptd_iso;
-+
-+ chipid_h = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
-+ chipid_l = isp1760_hcd_read(hcd, HC_CHIP_ID_LOW);
-+ chip_rev = isp1760_hcd_read(hcd, HC_CHIP_REV);
-+ printf("USB ISP %02x%02x HW rev. %d started\n", chipid_h,
-+ chipid_l, chip_rev);
-+
-+ isp1760_hcd_clear(hcd, ISO_BUF_FILL);
-+ isp1760_hcd_clear(hcd, INT_BUF_FILL);
-+ isp1760_hcd_clear(hcd, ATL_BUF_FILL);
-+
-+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP);
-+ ndelay(100);
-+ isp1760_hcd_clear(hcd, HC_ATL_PTD_DONEMAP);
-+ isp1760_hcd_clear(hcd, HC_INT_PTD_DONEMAP);
-+ isp1760_hcd_clear(hcd, HC_ISO_PTD_DONEMAP);
-+
-+ isp1760_hcd_set(hcd, HW_OTG_DISABLE);
-+ isp1760_reg_write(priv->regs, ISP1763_HC_OTG_CTRL_CLEAR, BIT(7));
-+ isp1760_reg_write(priv->regs, ISP1763_HC_OTG_CTRL_CLEAR, BIT(15));
-+ mdelay(10);
-+
-+ isp1760_hcd_set(hcd, HC_INT_IRQ_ENABLE);
-+ isp1760_hcd_set(hcd, HC_ATL_IRQ_ENABLE);
-+
-+ isp1760_hcd_set(hcd, HW_GLOBAL_INTR_EN);
-+
-+ isp1760_hcd_clear(hcd, HC_ATL_IRQ_MASK_AND);
-+ isp1760_hcd_clear(hcd, HC_INT_IRQ_MASK_AND);
-+ isp1760_hcd_clear(hcd, HC_ISO_IRQ_MASK_AND);
-+
-+ isp1760_hcd_set(hcd, HC_ATL_IRQ_MASK_OR);
-+ isp1760_hcd_set(hcd, HC_INT_IRQ_MASK_OR);
-+ isp1760_hcd_set(hcd, HC_ISO_IRQ_MASK_OR);
-+
-+ ptd_atl_int = 0x8000;
-+ ptd_iso = 0x0001;
-+
-+ isp1760_hcd_write(hcd, HC_ATL_PTD_LASTPTD, ptd_atl_int);
-+ isp1760_hcd_write(hcd, HC_INT_PTD_LASTPTD, ptd_atl_int);
-+ isp1760_hcd_write(hcd, HC_ISO_PTD_LASTPTD, ptd_iso);
-+
-+ isp1760_hcd_set(hcd, ATL_BUF_FILL);
-+ isp1760_hcd_set(hcd, INT_BUF_FILL);
-+
-+ isp1760_hcd_clear(hcd, CMD_LRESET);
-+ isp1760_hcd_clear(hcd, CMD_RESET);
-+
-+ retval = isp1760_hcd_set_and_wait(hcd, CMD_RUN, 250 * 1000);
-+ if (retval)
-+ return retval;
-+
-+ down_write(&ehci_cf_port_reset_rwsem);
-+ retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000);
-+ up_write(&ehci_cf_port_reset_rwsem);
-+ retval = 0;
-+ if (retval)
-+ return retval;
-+
-+ return 0;
-+}
-+
-+static int isp1760_run(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ int retval;
-+ u32 chipid_h;
-+ u32 chipid_l;
-+ u32 chip_rev;
-+ u32 ptd_atl_int;
-+ u32 ptd_iso;
-+
-+ /*
-+ * ISP1763 have some differences in the setup and order to enable
-+ * the ports, disable otg, setup buffers, and ATL, INT, ISO status.
-+ * So, just handle it a separate sequence.
-+ */
-+ if (priv->is_isp1763)
-+ return isp1763_run(hcd);
-+
-+ /* Set PTD interrupt AND & OR maps */
-+ isp1760_hcd_clear(hcd, HC_ATL_IRQ_MASK_AND);
-+ isp1760_hcd_clear(hcd, HC_INT_IRQ_MASK_AND);
-+ isp1760_hcd_clear(hcd, HC_ISO_IRQ_MASK_AND);
-+
-+ isp1760_hcd_set(hcd, HC_ATL_IRQ_MASK_OR);
-+ isp1760_hcd_set(hcd, HC_INT_IRQ_MASK_OR);
-+ isp1760_hcd_set(hcd, HC_ISO_IRQ_MASK_OR);
-+
-+ /* step 23 passed */
-+
-+ isp1760_hcd_set(hcd, HW_GLOBAL_INTR_EN);
-+
-+ isp1760_hcd_clear(hcd, CMD_LRESET);
-+ isp1760_hcd_clear(hcd, CMD_RESET);
-+
-+ retval = isp1760_hcd_set_and_wait(hcd, CMD_RUN, 250 * 1000);
-+ if (retval)
-+ return retval;
-+
-+ /*
-+ * XXX
-+ * Spec says to write FLAG_CF as last config action, priv code grabs
-+ * the semaphore while doing so.
-+ */
-+ down_write(&ehci_cf_port_reset_rwsem);
-+
-+ retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000);
-+ up_write(&ehci_cf_port_reset_rwsem);
-+ if (retval)
-+ return retval;
-+
-+ chipid_h = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH);
-+ chipid_l = isp1760_hcd_read(hcd, HC_CHIP_ID_LOW);
-+ chip_rev = isp1760_hcd_read(hcd, HC_CHIP_REV);
-+ dev_info(priv->dev, "USB ISP %02x%02x HW rev. %d started\n",
-+ chipid_h, chipid_l, chip_rev);
-+
-+ /* PTD Register Init Part 2, Step 28 */
-+
-+ /* Setup registers controlling PTD checking */
-+ ptd_atl_int = 0x80000000;
-+ ptd_iso = 0x00000001;
-+
-+ isp1760_hcd_write(hcd, HC_ATL_PTD_LASTPTD, ptd_atl_int);
-+ isp1760_hcd_write(hcd, HC_INT_PTD_LASTPTD, ptd_atl_int);
-+ isp1760_hcd_write(hcd, HC_ISO_PTD_LASTPTD, ptd_iso);
-+
-+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP);
-+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP);
-+
-+ isp1760_hcd_set(hcd, ATL_BUF_FILL);
-+ isp1760_hcd_set(hcd, INT_BUF_FILL);
-+
-+ /* GRR this is run-once init(), being done every time the HC starts.
-+ * So long as they're part of class devices, we can't do it init()
-+ * since the class device isn't created that early.
-+ */
-+ return 0;
-+}
-+
-+static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len)
-+{
-+ qtd->data_buffer = databuffer;
-+
-+ qtd->length = len;
-+
-+ return qtd->length;
-+}
-+
-+static void qtd_list_free(struct list_head *qtd_list)
-+{
-+ struct isp1760_qtd *qtd, *qtd_next;
-+
-+ list_for_each_entry_safe(qtd, qtd_next, qtd_list, qtd_list) {
-+ list_del(&qtd->qtd_list);
-+ qtd_free(qtd);
-+ }
-+}
-+
-+/*
-+ * Packetize urb->transfer_buffer into list of packets of size wMaxPacketSize.
-+ * Also calculate the PID type (SETUP/IN/OUT) for each packet.
-+ */
-+#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
-+static void packetize_urb(struct usb_hcd *hcd,
-+ struct urb *urb, struct list_head *head, gfp_t flags)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+ struct isp1760_qtd *qtd;
-+ void *buf;
-+ int len, maxpacketsize;
-+ u8 packet_type;
-+
-+ /*
-+ * URBs map to sequences of QTDs: one logical transaction
-+ */
-+
-+ if (!urb->transfer_buffer && urb->transfer_buffer_length) {
-+ /* XXX This looks like usb storage / SCSI bug */
-+ dev_err(priv->dev, "buf is null, dma is %08lx len is %d\n",
-+ (long unsigned)urb->transfer_dma,
-+ urb->transfer_buffer_length);
-+ WARN_ON(1);
-+ }
-+
-+ if (usb_pipein(urb->pipe))
-+ packet_type = IN_PID;
-+ else
-+ packet_type = OUT_PID;
-+
-+ if (usb_pipecontrol(urb->pipe)) {
-+ qtd = qtd_alloc(flags, urb, SETUP_PID);
-+ if (!qtd)
-+ goto cleanup;
-+ qtd_fill(qtd, urb->setup_packet, sizeof(struct usb_ctrlrequest));
-+ list_add_tail(&qtd->qtd_list, head);
-+
-+ /* for zero length DATA stages, STATUS is always IN */
-+ if (urb->transfer_buffer_length == 0)
-+ packet_type = IN_PID;
-+ }
-+
-+ maxpacketsize = max_packet(usb_maxpacket(urb->dev, urb->pipe));
-+
-+ /*
-+ * buffer gets wrapped in one or more qtds;
-+ * last one may be "short" (including zero len)
-+ * and may serve as a control status ack
-+ */
-+ buf = urb->transfer_buffer;
-+ len = urb->transfer_buffer_length;
-+
-+ for (;;) {
-+ int this_qtd_len;
-+
-+ qtd = qtd_alloc(flags, urb, packet_type);
-+ if (!qtd)
-+ goto cleanup;
-+
-+ if (len > mem->blocks_size[ISP176x_BLOCK_NUM - 1])
-+ len = mem->blocks_size[ISP176x_BLOCK_NUM - 1];
-+
-+ this_qtd_len = qtd_fill(qtd, buf, len);
-+ list_add_tail(&qtd->qtd_list, head);
-+
-+ len -= this_qtd_len;
-+ buf += this_qtd_len;
-+
-+ if (len <= 0)
-+ break;
-+ }
-+
-+ /*
-+ * control requests may need a terminating data "status" ack;
-+ * bulk ones may need a terminating short packet (zero length).
-+ */
-+ if (urb->transfer_buffer_length != 0) {
-+ int one_more = 0;
-+
-+ if (usb_pipecontrol(urb->pipe)) {
-+ one_more = 1;
-+ if (packet_type == IN_PID)
-+ packet_type = OUT_PID;
-+ else
-+ packet_type = IN_PID;
-+ } else if (usb_pipebulk(urb->pipe)
-+ && (urb->transfer_flags & URB_ZERO_PACKET)
-+ && !(urb->transfer_buffer_length %
-+ maxpacketsize)) {
-+ one_more = 1;
-+ }
-+ if (one_more) {
-+ qtd = qtd_alloc(flags, urb, packet_type);
-+ if (!qtd)
-+ goto cleanup;
-+
-+ /* never any data in such packets */
-+ qtd_fill(qtd, NULL, 0);
-+ list_add_tail(&qtd->qtd_list, head);
-+ }
-+ }
-+
-+ return;
-+
-+cleanup:
-+ qtd_list_free(head);
-+}
-+
-+static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
-+ gfp_t mem_flags)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ struct isp1760_qh *qh = NULL;
-+ struct list_head *ep_queue;
-+ LIST_HEAD(new_qtds);
-+ int qh_in_queue;
-+ int retval;
-+ int epnum;
-+
-+ switch (usb_pipetype(urb->pipe)) {
-+ case PIPE_CONTROL:
-+ ep_queue = &priv->qh_list[QH_CONTROL];
-+ break;
-+ case PIPE_BULK:
-+ ep_queue = &priv->qh_list[QH_BULK];
-+ break;
-+ case PIPE_INTERRUPT:
-+ ep_queue = &priv->qh_list[QH_INTERRUPT];
-+ break;
-+ case PIPE_ISOCHRONOUS:
-+ printf("isochronous USB packets not yet supported\n");
-+ return -EPIPE;
-+ default:
-+ printf("unknown pipe type\n");
-+ return -EPIPE;
-+ }
-+
-+ if (usb_pipein(urb->pipe))
-+ urb->actual_length = 0;
-+
-+ packetize_urb(hcd, urb, &new_qtds, mem_flags);
-+ if (list_empty(&new_qtds))
-+ return -ENOMEM;
-+
-+ retval = usb_hcd_link_urb_to_ep(hcd, urb);
-+ if (retval) {
-+ qtd_list_free(&new_qtds);
-+ goto out;
-+ }
-+
-+ epnum = usb_pipeendpoint(urb->pipe);
-+
-+ qh_in_queue = 0;
-+ list_for_each_entry(qh, ep_queue, qh_list) {
-+ if (qh->epnum == epnum) {
-+ qh_in_queue = 1;
-+ break;
-+ }
-+ }
-+
-+ if (!qh_in_queue) {
-+ qh = qh_alloc(GFP_ATOMIC);
-+ if (!qh) {
-+ retval = -ENOMEM;
-+ usb_hcd_unlink_urb_from_ep(hcd, urb);
-+ qtd_list_free(&new_qtds);
-+ goto out;
-+ }
-+
-+ qh->epnum = epnum;
-+ list_add_tail(&qh->qh_list, ep_queue);
-+ urb->ep->hcpriv = qh;
-+ }
-+
-+ list_splice_tail(&new_qtds, &qh->qtd_list);
-+ schedule_ptds(hcd);
-+
-+out:
-+ return retval;
-+}
-+
-+static void kill_transfer(struct usb_hcd *hcd, struct urb *urb,
-+ struct isp1760_qh *qh)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ int skip_map;
-+
-+ WARN_ON(qh->slot == -1);
-+
-+ /* We need to forcefully reclaim the slot since some transfers never
-+ return, e.g. interrupt transfers and NAKed bulk transfers. */
-+ if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) {
-+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP);
-+ skip_map |= (1 << qh->slot);
-+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map);
-+ ndelay(100);
-+ priv->atl_slots[qh->slot].qh = NULL;
-+ priv->atl_slots[qh->slot].qtd = NULL;
-+ } else {
-+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP);
-+ skip_map |= (1 << qh->slot);
-+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map);
-+ priv->int_slots[qh->slot].qh = NULL;
-+ priv->int_slots[qh->slot].qtd = NULL;
-+ }
-+
-+ qh->slot = -1;
-+}
-+
-+/*
-+ * Retire the qtds beginning at 'qtd' and belonging all to the same urb, killing
-+ * any active transfer belonging to the urb in the process.
-+ */
-+static void dequeue_urb_from_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh,
-+ struct isp1760_qtd *qtd)
-+{
-+ struct urb *urb;
-+ int urb_was_running;
-+
-+ urb = qtd->urb;
-+ urb_was_running = 0;
-+ list_for_each_entry_from(qtd, &qh->qtd_list, qtd_list) {
-+ if (qtd->urb != urb)
-+ break;
-+
-+ if (qtd->status >= QTD_XFER_STARTED)
-+ urb_was_running = 1;
-+ if (last_qtd_of_urb(qtd, qh) &&
-+ (qtd->status >= QTD_XFER_COMPLETE))
-+ urb_was_running = 0;
-+
-+ if (qtd->status == QTD_XFER_STARTED)
-+ kill_transfer(hcd, urb, qh);
-+ qtd->status = QTD_RETIRE;
-+ }
-+}
-+
-+int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
-+{
-+ struct isp1760_qtd *qtd;
-+ struct isp1760_qh *qh;
-+ int retval = 0;
-+
-+ retval = usb_hcd_check_unlink_urb(hcd, urb, status);
-+ if (retval)
-+ goto out;
-+
-+ qh = urb->ep->hcpriv;
-+ if (!qh) {
-+ retval = -EINVAL;
-+ goto out;
-+ }
-+
-+ list_for_each_entry(qtd, &qh->qtd_list, qtd_list)
-+ if (qtd->urb == urb) {
-+ dequeue_urb_from_qtd(hcd, qh, qtd);
-+ list_move(&qtd->qtd_list, &qh->qtd_list);
-+ break;
-+ }
-+
-+ urb->status = status;
-+ schedule_ptds(hcd);
-+
-+out:
-+ return retval;
-+}
-+
-+static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
-+ struct usb_hub_descriptor *desc)
-+{
-+ int ports;
-+ u16 temp;
-+
-+ ports = isp1760_hcd_n_ports(priv->hcd);
-+
-+ desc->bDescriptorType = USB_DT_HUB;
-+ /* priv 1.0, 2.3.9 says 20ms max */
-+ desc->bPwrOn2PwrGood = 10;
-+ desc->bHubContrCurrent = 0;
-+
-+ desc->bNbrPorts = ports;
-+ temp = 1 + (ports / 8);
-+ desc->bLength = 7 + 2 * temp;
-+
-+ /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
-+ memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
-+ memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
-+
-+ /* per-port overcurrent reporting */
-+ temp = HUB_CHAR_INDV_PORT_OCPM;
-+ if (isp1760_hcd_ppc_is_set(priv->hcd))
-+ /* per-port power control */
-+ temp |= HUB_CHAR_INDV_PORT_LPSM;
-+ else
-+ /* no power switching */
-+ temp |= HUB_CHAR_NO_LPSM;
-+ desc->wHubCharacteristics = cpu_to_le16(temp);
-+}
-+
-+#define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
-+
-+static void check_reset_complete(struct usb_hcd *hcd, int index)
-+{
-+ if (!(isp1760_hcd_is_set(hcd, PORT_CONNECT)))
-+ return;
-+
-+ /* if reset finished and it's still not enabled -- handoff */
-+ if (!isp1760_hcd_is_set(hcd, PORT_PE)) {
-+ printf("port %d full speed --> companion\n", index + 1);
-+
-+ isp1760_hcd_set(hcd, PORT_OWNER);
-+
-+ isp1760_hcd_clear(hcd, PORT_CSC);
-+ } else {
-+ printf("port %d high speed\n", index + 1);
-+ }
-+
-+ return;
-+}
-+
-+static int isp1760_hub_control(struct usb_hcd *hcd, struct usb_device *dev,
-+ unsigned long pipe, void *buffer, int length,
-+ struct devrequest *setup)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u16 typeReq, wValue, wIndex;
-+ unsigned long flags;
-+ char *buf = buffer;
-+ void *src = NULL;
-+ int src_len = 0;
-+ int retval = 0;
-+ u32 status;
-+ int ports;
-+
-+ if (!setup)
-+ return -EINVAL;
-+
-+ ports = isp1760_hcd_n_ports(hcd);
-+
-+ typeReq = setup->request | (setup->requesttype << 8);
-+ wValue = le16_to_cpu(setup->value);
-+ wIndex = le16_to_cpu(setup->index);
-+
-+ /*
-+ * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
-+ * HCS_INDICATOR may say we can change LEDs to off/amber/green.
-+ * (track current state ourselves) ... blink for diagnostics,
-+ * power, "this is the one", etc. EHCI spec supports this.
-+ */
-+
-+ switch (typeReq) {
-+ case DeviceOutRequest | USB_REQ_SET_ADDRESS:
-+ break;
-+ case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
-+ /* Nothing to do */
-+ break;
-+ case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
-+ switch (wValue & 0xff00) {
-+ case USB_DT_DEVICE << 8:
-+ src = &rh_descriptor.device;
-+ src_len = 0x12;
-+ break;
-+ case USB_DT_CONFIG << 8:
-+ src = &rh_descriptor.config;
-+ src_len = 0x09;
-+ break;
-+ case USB_DT_STRING << 8:
-+ switch (wValue & 0xff) {
-+ case 0: /* Language */
-+ src = "\4\3\19\4";
-+ src_len = 4;
-+ break;
-+ case 1: /* Vendor String */
-+ src = "\16\3U\0-\0B\0o\0o\0t\0";
-+ src_len = 14;
-+ break;
-+ case 2: /* Product Name */
-+ src = "\52\3I\0S\0P\0-\0 "
-+ "\0H\0o\0s\0t\0 "
-+ "\0C\0o\0n\0t\0r\0o\0l\0l\0e\0r\0";
-+ src_len = 42;
-+ break;
-+ default:
-+ goto error;
-+ }
-+ break;
-+ }
-+ break;
-+ case ClearHubFeature:
-+ switch (wValue) {
-+ case C_HUB_LOCAL_POWER:
-+ case C_HUB_OVER_CURRENT:
-+ /* no hub-wide feature/status flags */
-+ break;
-+ default:
-+ goto error;
-+ }
-+ break;
-+ case ClearPortFeature:
-+ if (!wIndex || wIndex > ports)
-+ goto error;
-+ wIndex--;
-+
-+ /*
-+ * Even if OWNER is set, so the port is owned by the
-+ * companion controller, hub_wq needs to be able to clear
-+ * the port-change status bits (especially
-+ * USB_PORT_STAT_C_CONNECTION).
-+ */
-+
-+ switch (wValue) {
-+ case USB_PORT_FEAT_ENABLE:
-+ isp1760_hcd_clear(hcd, PORT_PE);
-+ break;
-+ case USB_PORT_FEAT_C_ENABLE:
-+ /* XXX error? */
-+ break;
-+ case USB_PORT_FEAT_SUSPEND:
-+ if (isp1760_hcd_is_set(hcd, PORT_RESET))
-+ goto error;
-+
-+ if (isp1760_hcd_is_set(hcd, PORT_SUSPEND)) {
-+ if (!isp1760_hcd_is_set(hcd, PORT_PE))
-+ goto error;
-+ /* resume signaling for 20 msec */
-+ isp1760_hcd_clear(hcd, PORT_CSC);
-+ isp1760_hcd_set(hcd, PORT_RESUME);
-+
-+ priv->reset_done = get_timer(0) + 40;
-+ }
-+ break;
-+ case USB_PORT_FEAT_C_SUSPEND:
-+ /* we auto-clear this feature */
-+ break;
-+ case USB_PORT_FEAT_POWER:
-+ if (isp1760_hcd_ppc_is_set(hcd))
-+ isp1760_hcd_clear(hcd, PORT_POWER);
-+ break;
-+ case USB_PORT_FEAT_C_CONNECTION:
-+ isp1760_hcd_set(hcd, PORT_CSC);
-+ break;
-+ case USB_PORT_FEAT_C_OVER_CURRENT:
-+ /* XXX error ?*/
-+ break;
-+ case USB_PORT_FEAT_C_RESET:
-+ /* GetPortStatus clears reset */
-+ break;
-+ default:
-+ goto error;
-+ }
-+ isp1760_hcd_read(hcd, CMD_RUN);
-+ break;
-+ case GetHubDescriptor:
-+ isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *) buf);
-+ break;
-+ case GetHubStatus:
-+ /* no hub-wide feature/status flags */
-+ memset(buf, 0, 4);
-+ break;
-+ case GetPortStatus:
-+ if (!wIndex || wIndex > ports)
-+ goto error;
-+ wIndex--;
-+ status = 0;
-+
-+ /* wPortChange bits */
-+ if (isp1760_hcd_is_set(hcd, PORT_CSC))
-+ status |= USB_PORT_STAT_C_CONNECTION << 16;
-+
-+ /* whoever resumes must GetPortStatus to complete it!! */
-+ if (isp1760_hcd_is_set(hcd, PORT_RESUME)) {
-+ status |= USB_PORT_STAT_C_SUSPEND << 16;
-+
-+ if (!priv->reset_done) {
-+ priv->reset_done = get_timer(0) + 20;
-+ } else if (get_timer(0) > priv->reset_done) {
-+ /* stop resume signaling */
-+ isp1760_hcd_clear(hcd, PORT_CSC);
-+
-+ retval = isp1760_hcd_clear_and_wait(hcd,
-+ PORT_RESUME, 2000);
-+ if (retval != 0) {
-+ printf("port %d resume error %d\n",
-+ wIndex + 1, retval);
-+ goto error;
-+ }
-+ }
-+ }
-+
-+ /* whoever resets must GetPortStatus to complete it!! */
-+ if (isp1760_hcd_is_set(hcd, PORT_RESET) &&
-+ get_timer(0) > priv->reset_done) {
-+ status |= USB_PORT_STAT_C_RESET << 16;
-+ priv->reset_done = 0;
-+
-+ /* force reset to complete */
-+ /* REVISIT: some hardware needs 550+ usec to clear
-+ * this bit; seems too long to spin routinely...
-+ */
-+ retval = isp1760_hcd_clear_and_wait(hcd, PORT_RESET,
-+ 750);
-+ if (retval != 0) {
-+ printf("port %d reset error %d\n", wIndex + 1,
-+ retval);
-+ goto error;
-+ }
-+
-+ /* see what we found out */
-+ check_reset_complete(hcd, wIndex);
-+ }
-+ /*
-+ * Even if OWNER is set, there's no harm letting hub_wq
-+ * see the wPortStatus values (they should all be 0 except
-+ * for PORT_POWER anyway).
-+ */
-+
-+ if (isp1760_hcd_is_set(hcd, PORT_OWNER))
-+ printf("PORT_OWNER is set\n");
-+
-+ if (isp1760_hcd_is_set(hcd, PORT_CONNECT)) {
-+ status |= USB_PORT_STAT_CONNECTION;
-+
-+ /* status may be from integrated TT */
-+ status |= USB_PORT_STAT_HIGH_SPEED;
-+ }
-+ if (isp1760_hcd_is_set(hcd, PORT_PE))
-+ status |= USB_PORT_STAT_ENABLE;
-+ if (isp1760_hcd_is_set(hcd, PORT_SUSPEND) &&
-+ isp1760_hcd_is_set(hcd, PORT_RESUME))
-+ status |= USB_PORT_STAT_SUSPEND;
-+ if (isp1760_hcd_is_set(hcd, PORT_RESET))
-+ status |= USB_PORT_STAT_RESET;
-+ if (isp1760_hcd_is_set(hcd, PORT_POWER))
-+ status |= USB_PORT_STAT_POWER;
-+
-+ put_unaligned(cpu_to_le32(status), (__le32 *) buf);
-+ break;
-+ case SetHubFeature:
-+ switch (wValue) {
-+ case C_HUB_LOCAL_POWER:
-+ case C_HUB_OVER_CURRENT:
-+ /* no hub-wide feature/status flags */
-+ break;
-+ default:
-+ goto error;
-+ }
-+ break;
-+ case SetPortFeature:
-+ wIndex &= 0xff;
-+ if (!wIndex || wIndex > ports)
-+ goto error;
-+ wIndex--;
-+
-+ if (isp1760_hcd_is_set(hcd, PORT_OWNER))
-+ break;
-+
-+ switch (wValue) {
-+ case USB_PORT_FEAT_ENABLE:
-+ isp1760_hcd_set(hcd, PORT_PE);
-+ break;
-+
-+ case USB_PORT_FEAT_SUSPEND:
-+ if (!isp1760_hcd_is_set(hcd, PORT_PE) ||
-+ isp1760_hcd_is_set(hcd, PORT_RESET))
-+ goto error;
-+
-+ isp1760_hcd_set(hcd, PORT_SUSPEND);
-+ break;
-+ case USB_PORT_FEAT_POWER:
-+ if (isp1760_hcd_ppc_is_set(hcd))
-+ isp1760_hcd_set(hcd, PORT_POWER);
-+ break;
-+ case USB_PORT_FEAT_RESET:
-+ if (isp1760_hcd_is_set(hcd, PORT_RESUME))
-+ goto error;
-+ /* line status bits may report this as low speed,
-+ * which can be fine if this root hub has a
-+ * transaction translator built in.
-+ */
-+ if ((isp1760_hcd_is_set(hcd, PORT_CONNECT) &&
-+ !isp1760_hcd_is_set(hcd, PORT_PE)) &&
-+ (isp1760_hcd_read(hcd, PORT_LSTATUS) == 1)) {
-+ isp1760_hcd_set(hcd, PORT_OWNER);
-+ } else {
-+ isp1760_hcd_set(hcd, PORT_RESET);
-+ isp1760_hcd_clear(hcd, PORT_PE);
-+
-+ priv->reset_done = get_timer(0) + 50;
-+ }
-+ break;
-+ default:
-+ goto error;
-+ }
-+ break;
-+
-+ default:
-+ printf("root: unknown request: 0x%0x\n", typeReq);
-+ goto error;
-+ }
-+ spin_unlock_irqrestore(&priv->lock, flags);
-+
-+ if (src_len) {
-+ length = min(src_len, length);
-+
-+ if (src != NULL && length > 0)
-+ memcpy(buffer, src, length);
-+ else
-+ printf("zero copy USB descriptor\n");
-+ }
-+
-+ dev->act_len = length;
-+ dev->status = 0;
-+
-+ return 0;
-+
-+error:
-+ /* "stall" on error */
-+ dev->act_len = 0;
-+ dev->status = USB_ST_STALLED;
-+ return -EPIPE;
-+}
-+
-+#ifndef __UBOOT__
-+static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
-+{
-+ u32 status = 0;
-+ int retval = 1;
-+
-+ /* init status to no-changes */
-+ buf[0] = 0;
-+
-+ if (isp1760_hcd_is_set(hcd, PORT_OWNER) &&
-+ isp1760_hcd_is_set(hcd, PORT_CSC)) {
-+ isp1760_hcd_clear(hcd, PORT_CSC);
-+ goto done;
-+ }
-+
-+done:
-+ return status ? retval : 0;
-+}
-+
-+static void isp1760_endpoint_disable(struct usb_hcd *hcd,
-+ struct usb_host_endpoint *ep)
-+{
-+ struct isp1760_qh *qh, *qh_iter;
-+ unsigned long spinflags;
-+ int i;
-+
-+ qh = ep->hcpriv;
-+ if (!qh)
-+ return;
-+
-+ WARN_ON(!list_empty(&qh->qtd_list));
-+
-+ for (i = 0; i < QH_END; i++)
-+ list_for_each_entry(qh_iter, &priv->qh_list[i], qh_list)
-+ if (qh_iter == qh) {
-+ list_del(&qh_iter->qh_list);
-+ i = QH_END;
-+ break;
-+ }
-+ qh_free(qh);
-+ ep->hcpriv = NULL;
-+
-+ schedule_ptds(hcd);
-+}
-+
-+static int isp1760_get_frame(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+ u32 fr;
-+
-+ fr = isp1760_hcd_read(hcd, HC_FRINDEX);
-+ return (fr >> 3) % priv->periodic_size;
-+}
-+
-+static void isp1760_stop(struct usb_hcd *hcd)
-+{
-+ struct isp1760_hcd *priv = hcd_to_priv(hcd);
-+
-+ msleep(20);
-+
-+ spin_lock_irq(&priv->lock);
-+ ehci_reset(hcd);
-+ /* Disable IRQ */
-+ isp1760_hcd_clear(hcd, HW_GLOBAL_INTR_EN);
-+ spin_unlock_irq(&priv->lock);
-+
-+ isp1760_hcd_clear(hcd, FLAG_CF);
-+}
-+
-+static void isp1760_shutdown(struct usb_hcd *hcd)
-+{
-+ isp1760_stop(hcd);
-+
-+ isp1760_hcd_clear(hcd, HW_GLOBAL_INTR_EN);
-+
-+ isp1760_hcd_clear(hcd, CMD_RUN);
-+}
-+
-+static void isp1760_clear_tt_buffer_complete(struct usb_hcd *hcd,
-+ struct usb_host_endpoint *ep)
-+{
-+ struct isp1760_qh *qh = ep->hcpriv;
-+ unsigned long spinflags;
-+
-+ if (!qh)
-+ return;
-+
-+ qh->tt_buffer_dirty = 0;
-+ schedule_ptds(hcd);
-+}
-+
-+
-+static const struct hc_driver isp1760_hc_driver = {
-+ .description = "isp1760-hcd",
-+ .product_desc = "NXP ISP1760 USB Host Controller",
-+ .hcd_priv_size = sizeof(struct isp1760_hcd *),
-+ .irq = isp1760_irq,
-+ .flags = HCD_MEMORY | HCD_USB2,
-+ .reset = isp1760_hc_setup,
-+ .start = isp1760_run,
-+ .stop = isp1760_stop,
-+ .shutdown = isp1760_shutdown,
-+ .urb_enqueue = isp1760_urb_enqueue,
-+ .urb_dequeue = isp1760_urb_dequeue,
-+ .endpoint_disable = isp1760_endpoint_disable,
-+ .get_frame_number = isp1760_get_frame,
-+ .hub_status_data = isp1760_hub_status_data,
-+ .hub_control = isp1760_hub_control,
-+ .clear_tt_buffer_complete = isp1760_clear_tt_buffer_complete,
-+};
-+#endif // __UBOOT__
-+
-+int __init isp1760_init_kmem_once(void)
-+{
-+ urb_listitem_cachep = kmem_cache_create("isp1760_urb_listitem",
-+ sizeof(struct urb_listitem), 0, SLAB_TEMPORARY |
-+ SLAB_MEM_SPREAD, NULL);
-+
-+ if (!urb_listitem_cachep)
-+ return -ENOMEM;
-+
-+ qtd_cachep = kmem_cache_create("isp1760_qtd",
-+ sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY |
-+ SLAB_MEM_SPREAD, NULL);
-+
-+ if (!qtd_cachep)
-+ return -ENOMEM;
-+
-+ qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
-+ 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
-+
-+ if (!qh_cachep) {
-+ kmem_cache_destroy(qtd_cachep);
-+ return -ENOMEM;
-+ }
-+
-+ return 0;
-+}
-+
-+void isp1760_deinit_kmem_cache(void)
-+{
-+ kmem_cache_destroy(qtd_cachep);
-+ kmem_cache_destroy(qh_cachep);
-+ kmem_cache_destroy(urb_listitem_cachep);
-+}
-+
-+int isp1760_hcd_lowlevel_init(struct isp1760_hcd *priv)
-+{
-+ int ret;
-+
-+ ret = isp1760_hc_setup(priv->hcd);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = isp1760_run(priv->hcd);
-+ if (ret < 0)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static const struct usb_urb_ops isp1760_urb_ops = {
-+ .urb_enqueue = isp1760_urb_enqueue,
-+ .urb_dequeue = isp1760_urb_dequeue,
-+ .hub_control = isp1760_hub_control,
-+ .isr = isp1760_irq,
-+};
-+
-+int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
-+ int irq, unsigned long irqflags,
-+ struct udevice *dev)
-+{
-+ const struct isp1760_memory_layout *mem_layout = priv->memory_layout;
-+ struct isp1760_host_data *host = dev_get_priv(dev);
-+ struct usb_hcd *hcd = &host->hcd;
-+ int ret;
-+
-+ priv->hcd = hcd;
-+
-+ hcd->hcd_priv = priv;
-+
-+ priv->hcd = hcd;
-+
-+ hcd->urb_ops = &isp1760_urb_ops;
-+
-+ priv->atl_slots = kcalloc(mem_layout->slot_num,
-+ sizeof(struct isp1760_slotinfo), GFP_KERNEL);
-+ if (!priv->atl_slots)
-+ return -ENOMEM;
-+
-+ priv->int_slots = kcalloc(mem_layout->slot_num,
-+ sizeof(struct isp1760_slotinfo), GFP_KERNEL);
-+ if (!priv->int_slots) {
-+ ret = -ENOMEM;
-+ goto free_atl_slots;
-+ }
-+
-+ host->host_speed = USB_SPEED_HIGH;
-+
-+ init_memory(priv);
-+
-+ return 0;
-+
-+free_atl_slots:
-+ kfree(priv->atl_slots);
-+
-+ return ret;
-+}
-+
-+void isp1760_hcd_unregister(struct isp1760_hcd *priv)
-+{
-+ struct isp1760_qh *qh, *qh_next;
-+ int i;
-+
-+ for (i = 0; i < QH_END; i++)
-+ list_for_each_entry_safe(qh, qh_next, &priv->qh_list[i],
-+ qh_list) {
-+ qtd_list_free(&qh->qtd_list);
-+ list_del(&qh->qh_list);
-+ qh_free(qh);
-+ }
-+
-+ kfree(priv->atl_slots);
-+ kfree(priv->int_slots);
-+}
-diff --git a/drivers/usb/isp1760/isp1760-hcd.h b/drivers/usb/isp1760/isp1760-hcd.h
-new file mode 100644
-index 0000000000..00f5ca8c1f
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-hcd.h
-@@ -0,0 +1,82 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+#ifndef _ISP1760_HCD_H_
-+#define _ISP1760_HCD_H_
-+
-+#include <regmap.h>
-+
-+#include "isp1760-regs.h"
-+
-+struct isp1760_qh;
-+struct isp1760_qtd;
-+struct resource;
-+struct usb_hcd;
-+
-+struct isp1760_slotinfo {
-+ struct isp1760_qh *qh;
-+ struct isp1760_qtd *qtd;
-+ unsigned long timestamp;
-+};
-+
-+/* chip memory management */
-+#define ISP176x_BLOCK_MAX (32 + 20 + 4)
-+#define ISP176x_BLOCK_NUM 3
-+
-+struct isp1760_memory_layout {
-+ unsigned int blocks[ISP176x_BLOCK_NUM];
-+ unsigned int blocks_size[ISP176x_BLOCK_NUM];
-+
-+ unsigned int slot_num;
-+ unsigned int payload_blocks;
-+ unsigned int payload_area_size;
-+};
-+
-+struct isp1760_memory_chunk {
-+ unsigned int start;
-+ unsigned int size;
-+ unsigned int free;
-+};
-+
-+enum isp1760_queue_head_types {
-+ QH_CONTROL,
-+ QH_BULK,
-+ QH_INTERRUPT,
-+ QH_END
-+};
-+
-+struct isp1760_hcd {
-+ struct usb_hcd *hcd;
-+ struct udevice *dev;
-+
-+ void __iomem *base;
-+
-+ struct regmap *regs;
-+ struct regmap_field *fields[HC_FIELD_MAX];
-+
-+ bool is_isp1763;
-+ const struct isp1760_memory_layout *memory_layout;
-+
-+ spinlock_t lock;
-+ struct isp1760_slotinfo *atl_slots;
-+ int atl_done_map;
-+ struct isp1760_slotinfo *int_slots;
-+ int int_done_map;
-+ struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
-+ struct list_head qh_list[QH_END];
-+
-+ /* periodic schedule support */
-+#define DEFAULT_I_TDPS 1024
-+ unsigned periodic_size;
-+ unsigned i_thresh;
-+ unsigned long reset_done;
-+ unsigned long next_statechange;
-+};
-+
-+int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
-+ int irq, unsigned long irqflags, struct udevice *dev);
-+void isp1760_hcd_unregister(struct isp1760_hcd *priv);
-+int isp1760_hcd_lowlevel_init(struct isp1760_hcd *priv);
-+
-+int isp1760_init_kmem_once(void);
-+void isp1760_deinit_kmem_cache(void);
-+
-+#endif /* _ISP1760_HCD_H_ */
-diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c
-new file mode 100644
-index 0000000000..c610da6b23
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-if.c
-@@ -0,0 +1,127 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ * based on original code from:
-+ * (c) 2007 Sebastian Siewior <bigeasy@linutronix.de>
-+ */
-+
-+#include <common.h>
-+#include <dm.h>
-+#include <dm/device-internal.h>
-+#include <dm/device_compat.h>
-+#include <dm/devres.h>
-+#include <dm/lists.h>
-+#include <linux/bug.h>
-+#include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <linux/usb/otg.h>
-+#include <log.h>
-+#include <usb.h>
-+
-+#include "isp1760-core.h"
-+#include "isp1760-regs.h"
-+#include "isp1760-uboot.h"
-+
-+
-+static int isp1760_of_to_plat(struct udevice *dev)
-+{
-+ struct isp1760_device *isp = dev_get_plat(dev);
-+ unsigned int devflags = 0;
-+ u32 bus_width = 0;
-+ ofnode dp;
-+
-+
-+ if (!dev_has_ofnode(dev)) {
-+ /* select isp1763 as the default device */
-+ devflags = ISP1760_FLAG_ISP1763 | ISP1760_FLAG_BUS_WIDTH_16;
-+ pr_err("isp1760: no platform data\n");
-+ goto isp_setup;
-+ }
-+
-+ dp = dev_ofnode(dev);
-+
-+ if (ofnode_device_is_compatible(dp, "nxp,usb-isp1761"))
-+ devflags |= ISP1760_FLAG_ISP1761;
-+
-+ if (ofnode_device_is_compatible(dp, "nxp,usb-isp1763"))
-+ devflags |= ISP1760_FLAG_ISP1763;
-+
-+ /*
-+ * Some systems wire up only 8 of 16 data lines or
-+ * 16 of the 32 data lines
-+ */
-+ bus_width = ofnode_read_u32_default(dp, "bus-width", 16);
-+ if (bus_width == 16)
-+ devflags |= ISP1760_FLAG_BUS_WIDTH_16;
-+ else if (bus_width == 8)
-+ devflags |= ISP1760_FLAG_BUS_WIDTH_8;
-+
-+ if (usb_get_dr_mode(dev_ofnode(dev)) == USB_DR_MODE_PERIPHERAL)
-+ devflags |= ISP1760_FLAG_PERIPHERAL_EN;
-+
-+ if (ofnode_read_bool(dp, "analog-oc"))
-+ devflags |= ISP1760_FLAG_ANALOG_OC;
-+
-+ if (ofnode_read_bool(dp, "dack-polarity"))
-+ devflags |= ISP1760_FLAG_DACK_POL_HIGH;
-+
-+ if (ofnode_read_bool(dp, "dreq-polarity"))
-+ devflags |= ISP1760_FLAG_DREQ_POL_HIGH;
-+
-+isp_setup:
-+ isp->devflags = devflags;
-+ isp->dev = dev;
-+
-+ return 0;
-+}
-+
-+static int isp1760_plat_probe(struct udevice *dev)
-+{
-+ struct isp1760_device *isp = dev_get_plat(dev);
-+ struct resource mem_res;
-+ struct resource irq_res;
-+ int ret;
-+
-+ dev_read_resource(dev, 0, &mem_res);
-+ dev_read_resource(dev, 1, &irq_res);
-+
-+ isp1760_init_kmem_once();
-+
-+ ret = isp1760_register(isp, &mem_res, irq_res.start, irq_res.flags);
-+ if (ret < 0) {
-+ isp1760_deinit_kmem_cache();
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int isp1760_plat_remove(struct udevice *dev)
-+{
-+ struct isp1760_device *isp = dev_get_plat(dev);
-+
-+ isp1760_deinit_kmem_cache();
-+ isp1760_unregister(isp);
-+
-+ return 0;
-+}
-+
-+static const struct udevice_id isp1760_ids[] = {
-+ { .compatible = "nxp,usb-isp1760", },
-+ { .compatible = "nxp,usb-isp1761", },
-+ { .compatible = "nxp,usb-isp1763", },
-+ { },
-+};
-+
-+U_BOOT_DRIVER(isp1760) = {
-+ .name = "isp1760",
-+ .id = UCLASS_USB,
-+ .of_match = isp1760_ids,
-+ .of_to_plat = isp1760_of_to_plat,
-+ .ops = &isp1760_usb_ops,
-+ .probe = isp1760_plat_probe,
-+ .remove = isp1760_plat_remove,
-+ .plat_auto = sizeof(struct isp1760_device),
-+ .priv_auto = sizeof(struct isp1760_host_data),
-+};
-diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h
-new file mode 100644
-index 0000000000..94ea60c20b
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-regs.h
-@@ -0,0 +1,292 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva
-+ * Copyright 2014 Laurent Pinchart
-+ * Copyright 2007 Sebastian Siewior
-+ *
-+ * Contacts:
-+ * Sebastian Siewior <bigeasy@linutronix.de>
-+ * Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-+ * Rui Miguel Silva <rui.silva@linaro.org>
-+ */
-+
-+#ifndef _ISP176x_REGS_H_
-+#define _ISP176x_REGS_H_
-+
-+/* -----------------------------------------------------------------------------
-+ * Host Controller
-+ */
-+
-+/* ISP1760/31 */
-+/* EHCI capability registers */
-+#define ISP176x_HC_VERSION 0x002
-+#define ISP176x_HC_HCSPARAMS 0x004
-+#define ISP176x_HC_HCCPARAMS 0x008
-+
-+/* EHCI operational registers */
-+#define ISP176x_HC_USBCMD 0x020
-+#define ISP176x_HC_USBSTS 0x024
-+#define ISP176x_HC_FRINDEX 0x02c
-+
-+#define ISP176x_HC_CONFIGFLAG 0x060
-+#define ISP176x_HC_PORTSC1 0x064
-+
-+#define ISP176x_HC_ISO_PTD_DONEMAP 0x130
-+#define ISP176x_HC_ISO_PTD_SKIPMAP 0x134
-+#define ISP176x_HC_ISO_PTD_LASTPTD 0x138
-+#define ISP176x_HC_INT_PTD_DONEMAP 0x140
-+#define ISP176x_HC_INT_PTD_SKIPMAP 0x144
-+#define ISP176x_HC_INT_PTD_LASTPTD 0x148
-+#define ISP176x_HC_ATL_PTD_DONEMAP 0x150
-+#define ISP176x_HC_ATL_PTD_SKIPMAP 0x154
-+#define ISP176x_HC_ATL_PTD_LASTPTD 0x158
-+
-+/* Configuration Register */
-+#define ISP176x_HC_HW_MODE_CTRL 0x300
-+#define ISP176x_HC_CHIP_ID 0x304
-+#define ISP176x_HC_SCRATCH 0x308
-+#define ISP176x_HC_RESET 0x30c
-+#define ISP176x_HC_BUFFER_STATUS 0x334
-+#define ISP176x_HC_MEMORY 0x33c
-+
-+/* Interrupt Register */
-+#define ISP176x_HC_INTERRUPT 0x310
-+#define ISP176x_HC_INTERRUPT_ENABLE 0x314
-+#define ISP176x_HC_ISO_IRQ_MASK_OR 0x318
-+#define ISP176x_HC_INT_IRQ_MASK_OR 0x31c
-+#define ISP176x_HC_ATL_IRQ_MASK_OR 0x320
-+#define ISP176x_HC_ISO_IRQ_MASK_AND 0x324
-+#define ISP176x_HC_INT_IRQ_MASK_AND 0x328
-+#define ISP176x_HC_ATL_IRQ_MASK_AND 0x32c
-+
-+#define ISP176x_HC_OTG_CTRL_SET 0x374
-+#define ISP176x_HC_OTG_CTRL_CLEAR 0x376
-+
-+enum isp176x_host_controller_fields {
-+ /* HC_PORTSC1 */
-+ PORT_OWNER, PORT_POWER, PORT_LSTATUS, PORT_RESET, PORT_SUSPEND,
-+ PORT_RESUME, PORT_PE, PORT_CSC, PORT_CONNECT,
-+ /* HC_HCSPARAMS */
-+ HCS_PPC, HCS_N_PORTS,
-+ /* HC_HCCPARAMS */
-+ HCC_ISOC_CACHE, HCC_ISOC_THRES,
-+ /* HC_USBCMD */
-+ CMD_LRESET, CMD_RESET, CMD_RUN,
-+ /* HC_USBSTS */
-+ STS_PCD,
-+ /* HC_FRINDEX */
-+ HC_FRINDEX,
-+ /* HC_CONFIGFLAG */
-+ FLAG_CF,
-+ /* ISO/INT/ATL PTD */
-+ HC_ISO_PTD_DONEMAP, HC_ISO_PTD_SKIPMAP, HC_ISO_PTD_LASTPTD,
-+ HC_INT_PTD_DONEMAP, HC_INT_PTD_SKIPMAP, HC_INT_PTD_LASTPTD,
-+ HC_ATL_PTD_DONEMAP, HC_ATL_PTD_SKIPMAP, HC_ATL_PTD_LASTPTD,
-+ /* HC_HW_MODE_CTRL */
-+ ALL_ATX_RESET, HW_ANA_DIGI_OC, HW_DEV_DMA, HW_COMN_IRQ, HW_COMN_DMA,
-+ HW_DATA_BUS_WIDTH, HW_DACK_POL_HIGH, HW_DREQ_POL_HIGH, HW_INTR_HIGH_ACT,
-+ HW_INTF_LOCK, HW_INTR_EDGE_TRIG, HW_GLOBAL_INTR_EN,
-+ /* HC_CHIP_ID */
-+ HC_CHIP_ID_HIGH, HC_CHIP_ID_LOW, HC_CHIP_REV,
-+ /* HC_SCRATCH */
-+ HC_SCRATCH,
-+ /* HC_RESET */
-+ SW_RESET_RESET_ATX, SW_RESET_RESET_HC, SW_RESET_RESET_ALL,
-+ /* HC_BUFFER_STATUS */
-+ ISO_BUF_FILL, INT_BUF_FILL, ATL_BUF_FILL,
-+ /* HC_MEMORY */
-+ MEM_BANK_SEL, MEM_START_ADDR,
-+ /* HC_DATA */
-+ HC_DATA,
-+ /* HC_INTERRUPT */
-+ HC_INTERRUPT,
-+ /* HC_INTERRUPT_ENABLE */
-+ HC_INT_IRQ_ENABLE, HC_ATL_IRQ_ENABLE,
-+ /* INTERRUPT MASKS */
-+ HC_ISO_IRQ_MASK_OR, HC_INT_IRQ_MASK_OR, HC_ATL_IRQ_MASK_OR,
-+ HC_ISO_IRQ_MASK_AND, HC_INT_IRQ_MASK_AND, HC_ATL_IRQ_MASK_AND,
-+ /* HW_OTG_CTRL_SET */
-+ HW_OTG_DISABLE, HW_SW_SEL_HC_DC, HW_VBUS_DRV, HW_SEL_CP_EXT,
-+ HW_DM_PULLDOWN, HW_DP_PULLDOWN, HW_DP_PULLUP, HW_HC_2_DIS,
-+ /* HW_OTG_CTRL_CLR */
-+ HW_OTG_DISABLE_CLEAR, HW_SW_SEL_HC_DC_CLEAR, HW_VBUS_DRV_CLEAR,
-+ HW_SEL_CP_EXT_CLEAR, HW_DM_PULLDOWN_CLEAR, HW_DP_PULLDOWN_CLEAR,
-+ HW_DP_PULLUP_CLEAR, HW_HC_2_DIS_CLEAR,
-+ /* Last element */
-+ HC_FIELD_MAX,
-+};
-+
-+/* ISP1763 */
-+/* EHCI operational registers */
-+#define ISP1763_HC_USBCMD 0x8c
-+#define ISP1763_HC_USBSTS 0x90
-+#define ISP1763_HC_FRINDEX 0x98
-+
-+#define ISP1763_HC_CONFIGFLAG 0x9c
-+#define ISP1763_HC_PORTSC1 0xa0
-+
-+#define ISP1763_HC_ISO_PTD_DONEMAP 0xa4
-+#define ISP1763_HC_ISO_PTD_SKIPMAP 0xa6
-+#define ISP1763_HC_ISO_PTD_LASTPTD 0xa8
-+#define ISP1763_HC_INT_PTD_DONEMAP 0xaa
-+#define ISP1763_HC_INT_PTD_SKIPMAP 0xac
-+#define ISP1763_HC_INT_PTD_LASTPTD 0xae
-+#define ISP1763_HC_ATL_PTD_DONEMAP 0xb0
-+#define ISP1763_HC_ATL_PTD_SKIPMAP 0xb2
-+#define ISP1763_HC_ATL_PTD_LASTPTD 0xb4
-+
-+/* Configuration Register */
-+#define ISP1763_HC_HW_MODE_CTRL 0xb6
-+#define ISP1763_HC_CHIP_REV 0x70
-+#define ISP1763_HC_CHIP_ID 0x72
-+#define ISP1763_HC_SCRATCH 0x78
-+#define ISP1763_HC_RESET 0xb8
-+#define ISP1763_HC_BUFFER_STATUS 0xba
-+#define ISP1763_HC_MEMORY 0xc4
-+#define ISP1763_HC_DATA 0xc6
-+
-+/* Interrupt Register */
-+#define ISP1763_HC_INTERRUPT 0xd4
-+#define ISP1763_HC_INTERRUPT_ENABLE 0xd6
-+#define ISP1763_HC_ISO_IRQ_MASK_OR 0xd8
-+#define ISP1763_HC_INT_IRQ_MASK_OR 0xda
-+#define ISP1763_HC_ATL_IRQ_MASK_OR 0xdc
-+#define ISP1763_HC_ISO_IRQ_MASK_AND 0xde
-+#define ISP1763_HC_INT_IRQ_MASK_AND 0xe0
-+#define ISP1763_HC_ATL_IRQ_MASK_AND 0xe2
-+
-+#define ISP1763_HC_OTG_CTRL_SET 0xe4
-+#define ISP1763_HC_OTG_CTRL_CLEAR 0xe6
-+
-+/* -----------------------------------------------------------------------------
-+ * Peripheral Controller
-+ */
-+
-+#define DC_IEPTX(n) (1 << (11 + 2 * (n)))
-+#define DC_IEPRX(n) (1 << (10 + 2 * (n)))
-+#define DC_IEPRXTX(n) (3 << (10 + 2 * (n)))
-+
-+#define ISP176x_DC_CDBGMOD_ACK BIT(6)
-+#define ISP176x_DC_DDBGMODIN_ACK BIT(4)
-+#define ISP176x_DC_DDBGMODOUT_ACK BIT(2)
-+
-+#define ISP176x_DC_IEP0SETUP BIT(8)
-+#define ISP176x_DC_IEVBUS BIT(7)
-+#define ISP176x_DC_IEHS_STA BIT(5)
-+#define ISP176x_DC_IERESM BIT(4)
-+#define ISP176x_DC_IESUSP BIT(3)
-+#define ISP176x_DC_IEBRST BIT(0)
-+
-+#define ISP176x_DC_ENDPTYP_ISOC 0x01
-+#define ISP176x_DC_ENDPTYP_BULK 0x02
-+#define ISP176x_DC_ENDPTYP_INTERRUPT 0x03
-+
-+/* Initialization Registers */
-+#define ISP176x_DC_ADDRESS 0x0200
-+#define ISP176x_DC_MODE 0x020c
-+#define ISP176x_DC_INTCONF 0x0210
-+#define ISP176x_DC_DEBUG 0x0212
-+#define ISP176x_DC_INTENABLE 0x0214
-+
-+/* Data Flow Registers */
-+#define ISP176x_DC_EPMAXPKTSZ 0x0204
-+#define ISP176x_DC_EPTYPE 0x0208
-+
-+#define ISP176x_DC_BUFLEN 0x021c
-+#define ISP176x_DC_BUFSTAT 0x021e
-+#define ISP176x_DC_DATAPORT 0x0220
-+
-+#define ISP176x_DC_CTRLFUNC 0x0228
-+#define ISP176x_DC_EPINDEX 0x022c
-+
-+/* DMA Registers */
-+#define ISP176x_DC_DMACMD 0x0230
-+#define ISP176x_DC_DMATXCOUNT 0x0234
-+#define ISP176x_DC_DMACONF 0x0238
-+#define ISP176x_DC_DMAHW 0x023c
-+#define ISP176x_DC_DMAINTREASON 0x0250
-+#define ISP176x_DC_DMAINTEN 0x0254
-+#define ISP176x_DC_DMAEP 0x0258
-+#define ISP176x_DC_DMABURSTCOUNT 0x0264
-+
-+/* General Registers */
-+#define ISP176x_DC_INTERRUPT 0x0218
-+#define ISP176x_DC_CHIPID 0x0270
-+#define ISP176x_DC_FRAMENUM 0x0274
-+#define ISP176x_DC_SCRATCH 0x0278
-+#define ISP176x_DC_UNLOCKDEV 0x027c
-+#define ISP176x_DC_INTPULSEWIDTH 0x0280
-+#define ISP176x_DC_TESTMODE 0x0284
-+
-+enum isp176x_device_controller_fields {
-+ /* DC_ADDRESS */
-+ DC_DEVEN, DC_DEVADDR,
-+ /* DC_MODE */
-+ DC_VBUSSTAT, DC_SFRESET, DC_GLINTENA,
-+ /* DC_INTCONF */
-+ DC_CDBGMOD_ACK, DC_DDBGMODIN_ACK, DC_DDBGMODOUT_ACK, DC_INTPOL,
-+ /* DC_INTENABLE */
-+ DC_IEPRXTX_7, DC_IEPRXTX_6, DC_IEPRXTX_5, DC_IEPRXTX_4, DC_IEPRXTX_3,
-+ DC_IEPRXTX_2, DC_IEPRXTX_1, DC_IEPRXTX_0,
-+ DC_IEP0SETUP, DC_IEVBUS, DC_IEHS_STA, DC_IERESM, DC_IESUSP, DC_IEBRST,
-+ /* DC_EPINDEX */
-+ DC_EP0SETUP, DC_ENDPIDX, DC_EPDIR,
-+ /* DC_CTRLFUNC */
-+ DC_CLBUF, DC_VENDP, DC_DSEN, DC_STATUS, DC_STALL,
-+ /* DC_BUFLEN */
-+ DC_BUFLEN,
-+ /* DC_EPMAXPKTSZ */
-+ DC_FFOSZ,
-+ /* DC_EPTYPE */
-+ DC_EPENABLE, DC_ENDPTYP,
-+ /* DC_FRAMENUM */
-+ DC_FRAMENUM, DC_UFRAMENUM,
-+ /* DC_CHIP_ID */
-+ DC_CHIP_ID_HIGH, DC_CHIP_ID_LOW,
-+ /* DC_SCRATCH */
-+ DC_SCRATCH,
-+ /* Last element */
-+ DC_FIELD_MAX,
-+};
-+
-+/* ISP1763 */
-+/* Initialization Registers */
-+#define ISP1763_DC_ADDRESS 0x00
-+#define ISP1763_DC_MODE 0x0c
-+#define ISP1763_DC_INTCONF 0x10
-+#define ISP1763_DC_INTENABLE 0x14
-+
-+/* Data Flow Registers */
-+#define ISP1763_DC_EPMAXPKTSZ 0x04
-+#define ISP1763_DC_EPTYPE 0x08
-+
-+#define ISP1763_DC_BUFLEN 0x1c
-+#define ISP1763_DC_BUFSTAT 0x1e
-+#define ISP1763_DC_DATAPORT 0x20
-+
-+#define ISP1763_DC_CTRLFUNC 0x28
-+#define ISP1763_DC_EPINDEX 0x2c
-+
-+/* DMA Registers */
-+#define ISP1763_DC_DMACMD 0x30
-+#define ISP1763_DC_DMATXCOUNT 0x34
-+#define ISP1763_DC_DMACONF 0x38
-+#define ISP1763_DC_DMAHW 0x3c
-+#define ISP1763_DC_DMAINTREASON 0x50
-+#define ISP1763_DC_DMAINTEN 0x54
-+#define ISP1763_DC_DMAEP 0x58
-+#define ISP1763_DC_DMABURSTCOUNT 0x64
-+
-+/* General Registers */
-+#define ISP1763_DC_INTERRUPT 0x18
-+#define ISP1763_DC_CHIPID_LOW 0x70
-+#define ISP1763_DC_CHIPID_HIGH 0x72
-+#define ISP1763_DC_FRAMENUM 0x74
-+#define ISP1763_DC_SCRATCH 0x78
-+#define ISP1763_DC_UNLOCKDEV 0x7c
-+#define ISP1763_DC_INTPULSEWIDTH 0x80
-+#define ISP1763_DC_TESTMODE 0x84
-+
-+#endif
-diff --git a/drivers/usb/isp1760/isp1760-uboot.c b/drivers/usb/isp1760/isp1760-uboot.c
-new file mode 100644
-index 0000000000..7635210fe2
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-uboot.c
-@@ -0,0 +1,76 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ */
-+
-+#include <common.h>
-+#include <dm.h>
-+#include <dm/device-internal.h>
-+#include <dm/device_compat.h>
-+#include <dm/devres.h>
-+#include <dm/lists.h>
-+#include <linux/bug.h>
-+#include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <linux/usb/otg.h>
-+#include <linux/usb/usb_urb_compat.h>
-+#include <log.h>
-+#include <usb.h>
-+
-+#include "isp1760-core.h"
-+#include "isp1760-hcd.h"
-+#include "isp1760-regs.h"
-+#include "isp1760-uboot.h"
-+
-+static int isp1760_msg_submit_control(struct udevice *dev,
-+ struct usb_device *udev,
-+ unsigned long pipe, void *buffer,
-+ int length, struct devrequest *setup)
-+{
-+ struct isp1760_host_data *host = dev_get_priv(dev);
-+
-+ return usb_urb_submit_control(&host->hcd, &host->urb, &host->hep, udev,
-+ pipe, buffer, length, setup, 0,
-+ host->host_speed);
-+}
-+
-+static int isp1760_msg_submit_bulk(struct udevice *dev, struct usb_device *udev,
-+ unsigned long pipe, void *buffer, int length)
-+{
-+ struct isp1760_host_data *host = dev_get_priv(dev);
-+
-+ return usb_urb_submit_bulk(&host->hcd, &host->urb, &host->hep, udev,
-+ pipe, buffer, length);
-+}
-+
-+static int isp1760_msg_submit_irq(struct udevice *dev, struct usb_device *udev,
-+ unsigned long pipe, void *buffer, int length,
-+ int interval, bool nonblock)
-+{
-+ struct isp1760_host_data *host = dev_get_priv(dev);
-+
-+ return usb_urb_submit_irq(&host->hcd, &host->urb, &host->hep, udev,
-+ pipe, buffer, length, interval);
-+}
-+
-+static int isp1760_get_max_xfer_size(struct udevice *dev, size_t *size)
-+{
-+ struct isp1760_host_data *host = dev_get_priv(dev);
-+ struct isp1760_hcd *priv = host->hcd.hcd_priv;
-+ const struct isp1760_memory_layout *mem = priv->memory_layout;
-+
-+ *size = mem->blocks_size[ISP176x_BLOCK_NUM - 1];
-+
-+ return 0;
-+}
-+
-+
-+struct dm_usb_ops isp1760_usb_ops = {
-+ .control = isp1760_msg_submit_control,
-+ .bulk = isp1760_msg_submit_bulk,
-+ .interrupt = isp1760_msg_submit_irq,
-+ .get_max_xfer_size = isp1760_get_max_xfer_size,
-+};
-diff --git a/drivers/usb/isp1760/isp1760-uboot.h b/drivers/usb/isp1760/isp1760-uboot.h
-new file mode 100644
-index 0000000000..2486de6f9e
---- /dev/null
-+++ b/drivers/usb/isp1760/isp1760-uboot.h
-@@ -0,0 +1,27 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Driver for the NXP ISP1760 chip
-+ *
-+ * Copyright 2021 Linaro, Rui Miguel Silva <rui.silva@linaro.org>
-+ *
-+ */
-+
-+#ifndef __ISP1760_UBOOT_H__
-+#define __ISP1760_UBOOT_H__
-+
-+#include <linux/usb/usb_urb_compat.h>
-+#include <usb.h>
-+
-+#include "isp1760-core.h"
-+
-+struct isp1760_host_data {
-+ struct isp1760_hcd *priv;
-+ struct usb_hcd hcd;
-+ enum usb_device_speed host_speed;
-+ struct usb_host_endpoint hep;
-+ struct urb urb;
-+};
-+
-+extern struct dm_usb_ops isp1760_usb_ops;
-+
-+#endif
-2.17.1
-
similarity index 83%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-arm_ffa-introduce-armffa-command.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-arm_ffa-introduce-armffa-command.patch
@@ -1,20 +1,35 @@
-From a09ed2542f4d991fef61bd51f87d373f44ad1ff3 Mon Sep 17 00:00:00 2001
+From e9ec690a3f0d34631729a17c1734d66111e768e1 Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Date: Mon, 6 Jun 2022 12:46:38 +0100
-Subject: [PATCH 10/26] arm_ffa: introduce armffa command
+Subject: [PATCH 05/25] arm_ffa: introduce armffa command
Provide armffa command showcasing the use of the FF-A driver
The armffa command allows to query secure partitions data from
-the secure world and exchanging messages with the partitions.
+the secure world and exchanging messages with the partitions
+using 64-bit FF-A direct messaging.
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v8:
+
+* update partition_info_get() second argument to be an SP count
+* pass NULL device pointer to the FF-A bus discovery and operations
+
+v7:
+
+* adapt do_ffa_dev_list() following the recent update on
+ uclass_first_device/uclass_next_device functions (they return void now)
+* set armffa command to use 64-bit direct messaging
+
v4:
* remove pattern data in do_ffa_msg_send_direct_req
@@ -32,32 +47,32 @@ v2:
v1:
* introduce armffa command
-
+---
MAINTAINERS | 1 +
cmd/Kconfig | 10 ++
cmd/Makefile | 2 +
- cmd/armffa.c | 242 +++++++++++++++++++++++++++++++
+ cmd/armffa.c | 237 +++++++++++++++++++++++++++++++
drivers/firmware/arm-ffa/Kconfig | 1 +
- 5 files changed, 256 insertions(+)
+ 5 files changed, 251 insertions(+)
create mode 100644 cmd/armffa.c
diff --git a/MAINTAINERS b/MAINTAINERS
-index e760b4ca3a..9f0a1b7387 100644
+index 734fcb10c4..d50bdddea8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -247,6 +247,7 @@ F: include/configs/turris_*.h
+@@ -251,6 +251,7 @@ F: configs/cortina_presidio-asic-pnand_defconfig
ARM FF-A
M: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
S: Maintained
+F: cmd/armffa.c
- F: doc/README.ffa.drv
+ F: doc/arch/arm64.ffa.rst
F: drivers/firmware/arm-ffa/
F: include/arm_ffa.h
diff --git a/cmd/Kconfig b/cmd/Kconfig
-index ba2f321ae9..090e668125 100644
+index 0e0be94f41..013d4c3da7 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
-@@ -873,6 +873,16 @@ endmenu
+@@ -912,6 +912,16 @@ endmenu
menu "Device access commands"
@@ -75,7 +90,7 @@ index ba2f321ae9..090e668125 100644
#depends on FLASH_CFI_DRIVER
bool "armflash"
diff --git a/cmd/Makefile b/cmd/Makefile
-index 5e43a1e022..e40f52f1e4 100644
+index 6e87522b62..979c6d59df 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -12,6 +12,8 @@ obj-y += panic.o
@@ -89,10 +104,10 @@ index 5e43a1e022..e40f52f1e4 100644
obj-$(CONFIG_CMD_AES) += aes.o
diff --git a/cmd/armffa.c b/cmd/armffa.c
new file mode 100644
-index 0000000000..9b56e8a830
+index 0000000000..d2e8687bfb
--- /dev/null
+++ b/cmd/armffa.c
-@@ -0,0 +1,242 @@
+@@ -0,0 +1,237 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2022 ARM Limited
@@ -126,7 +141,7 @@ index 0000000000..9b56e8a830
+static int do_ffa_get_singular_partition_info(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
-+ u32 count = 0, size = 0;
++ u32 count = 0;
+ int ret;
+ struct ffa_partition_info *parts_info;
+ u32 info_idx;
@@ -135,7 +150,7 @@ index 0000000000..9b56e8a830
+ return -EINVAL;
+
+ /* Mode 1: getting the number of secure partitions */
-+ ret = ffa_bus_ops_get()->partition_info_get(argv[0], &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, argv[0], &count, NULL);
+ if (ret != 0) {
+ ffa_err("Failure in querying partitions count (error code: %d)", ret);
+ return ret;
@@ -157,13 +172,11 @@ index 0000000000..9b56e8a830
+ if (!parts_info)
+ return -EINVAL;
+
-+ size = count * sizeof(struct ffa_partition_info);
-+
+ /*
+ * ask the driver to fill the buffer with the SPs info
+ */
+
-+ ret = ffa_bus_ops_get()->partition_info_get(argv[0], &size, parts_info);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, argv[0], &count, parts_info);
+ if (ret != 0) {
+ ffa_err("Failure in querying partition(s) info (error code: %d)", ret);
+ free(parts_info);
@@ -224,7 +237,7 @@ index 0000000000..9b56e8a830
+ return -EINVAL;
+ }
+
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(NULL, part_id, &msg, 1);
+ if (ret == 0) {
+ u8 cnt;
+
@@ -257,16 +270,13 @@ index 0000000000..9b56e8a830
+int do_ffa_dev_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ struct udevice *dev = NULL;
-+ int i, ret;
++ int i;
+
+ ffa_info("arm_ffa uclass entries:");
+
-+ for (i = 0, ret = uclass_first_device(UCLASS_FFA, &dev);
++ for (i = 0, uclass_first_device(UCLASS_FFA, &dev);
+ dev;
-+ ret = uclass_next_device(&dev), i++) {
-+ if (ret)
-+ break;
-+
++ uclass_next_device(&dev), i++) {
+ ffa_info("entry %d - instance %08x, ops %08x, plat %08x",
+ i,
+ (u32)map_to_sysmem(dev),
@@ -274,7 +284,7 @@ index 0000000000..9b56e8a830
+ (u32)map_to_sysmem(dev_get_plat(dev)));
+ }
+
-+ return cmd_process_error(cmdtp, ret);
++ return 0;
+}
+
+static struct cmd_tbl armffa_commands[] = {
@@ -315,7 +325,7 @@ index 0000000000..9b56e8a830
+ if (!armffa_cmd || argc > armffa_cmd->maxargs)
+ return CMD_RET_USAGE;
+
-+ ret = ffa_bus_discover();
++ ret = ffa_bus_discover(NULL);
+ if (ret != 0)
+ return cmd_process_error(cmdtp, ret);
+
@@ -336,7 +346,7 @@ index 0000000000..9b56e8a830
+ "devlist\n"
+ " - displays the arm_ffa device info\n");
diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig
-index aceb61cf49..40b467b0a5 100644
+index e4914b9bc7..be4df89d23 100644
--- a/drivers/firmware/arm-ffa/Kconfig
+++ b/drivers/firmware/arm-ffa/Kconfig
@@ -4,6 +4,7 @@ config ARM_FFA_TRANSPORT
deleted file mode 100644
@@ -1,49 +0,0 @@
-From 8717357eff3f4172c74f0b10078c31cdff9bcc41 Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Thu, 3 Mar 2022 16:52:02 +0000
-Subject: [PATCH 05/26] corstone1000: enable isp1763 usb controller
-
-MPS3 board have a ISP1763 usb controller, add the
-correspondent mmio area and enable it to be used for mass
-storage access for example.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Accepted [2022.10-rc1]
----
- configs/corstone1000_defconfig | 1 +
- include/configs/corstone1000.h | 6 ++++++
- 2 files changed, 7 insertions(+)
-
-diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
-index 02f931b0d4..e573fe6fe6 100644
---- a/configs/corstone1000_defconfig
-+++ b/configs/corstone1000_defconfig
-@@ -42,6 +42,7 @@ CONFIG_REGMAP=y
- CONFIG_DM_SERIAL=y
- CONFIG_USB=y
- CONFIG_DM_USB=y
-+CONFIG_USB_ISP1760=y
- CONFIG_USB_STORAGE=y
- CONFIG_EFI_MM_COMM_TEE=y
- # CONFIG_OPTEE is not set
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index cf166f107e..8ba0effb0a 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -55,7 +55,13 @@
- #define CONFIG_SYS_CBSIZE 512 /* Console I/O Buffer Size */
- #define CONFIG_SYS_MAXARGS 64 /* max command args */
-
-+#define BOOT_TARGET_DEVICES(func) \
-+ func(USB, usb, 0)
-+
-+#include <config_distro_bootcmd.h>
-+
- #define CONFIG_EXTRA_ENV_SETTINGS \
-+ BOOTENV \
- "usb_pgood_delay=250\0" \
- "boot_bank_flag=0x08002000\0" \
- "kernel_addr_bank_0=0x083EE000\0" \
-2.17.1
-
similarity index 91%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-arm_ffa-introduce-the-FF-A-Sandbox-driver.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-introduce-the-FF-A-Sandbox-driver.patch
@@ -1,7 +1,7 @@
-From 553b57e39808ef04bc6aa54e0324f92b0175e476 Mon Sep 17 00:00:00 2001
+From 6d28dcdc36ad87b6987c7f920e06165c74eca59d Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Mon, 6 Jun 2022 12:55:08 +0100
-Subject: [PATCH 11/26] arm_ffa: introduce the FF-A Sandbox driver
+Date: Tue, 29 Nov 2022 14:44:36 +0000
+Subject: [PATCH 06/25] arm_ffa: introduce the FF-A Sandbox driver
Provide a Sandbox driver to emulate the FF-A ABIs
@@ -12,67 +12,63 @@ The Sandbox driver provides operations allowing the test
application to read the status of all the inspected ABIs
and perform functional tests based on that.
+sandbox driver supports only 64-bit direct messaging.
+
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v8: update ffa_bus_prvdata_get() to return a pointer rather than
+ a pointer address
+
+v7: state that sandbox driver supports only 64-bit direct messaging
+
v4: align sandbox driver with the new FF-A driver interfaces
- and new way of error handling
+ and new way of error handling
v1: introduce the sandbox driver
-
+---
MAINTAINERS | 1 +
- common/board_r.c | 2 +-
configs/sandbox64_defconfig | 2 +
configs/sandbox_defconfig | 2 +
doc/arch/sandbox.rst | 1 +
- drivers/firmware/arm-ffa/Kconfig | 10 +-
+ drivers/firmware/arm-ffa/Kconfig | 9 +-
drivers/firmware/arm-ffa/Makefile | 1 +
drivers/firmware/arm-ffa/arm_ffa_prv.h | 15 +-
- drivers/firmware/arm-ffa/core.c | 24 +-
+ drivers/firmware/arm-ffa/core.c | 22 +-
drivers/firmware/arm-ffa/sandbox.c | 659 ++++++++++++++++++
.../firmware/arm-ffa/sandbox_arm_ffa_prv.h | 144 ++++
include/arm_ffa.h | 2 +-
include/sandbox_arm_ffa.h | 91 +++
lib/efi_loader/efi_boottime.c | 2 +-
- 14 files changed, 941 insertions(+), 15 deletions(-)
+ 13 files changed, 938 insertions(+), 13 deletions(-)
create mode 100644 drivers/firmware/arm-ffa/sandbox.c
create mode 100644 drivers/firmware/arm-ffa/sandbox_arm_ffa_prv.h
create mode 100644 include/sandbox_arm_ffa.h
diff --git a/MAINTAINERS b/MAINTAINERS
-index 9f0a1b7387..96157db6b6 100644
+index d50bdddea8..23cebbd526 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -251,6 +251,7 @@ F: cmd/armffa.c
- F: doc/README.ffa.drv
+@@ -255,6 +255,7 @@ F: cmd/armffa.c
+ F: doc/arch/arm64.ffa.rst
F: drivers/firmware/arm-ffa/
F: include/arm_ffa.h
+F: include/sandbox_arm_ffa.h
ARM FREESCALE IMX
M: Stefano Babic <sbabic@denx.de>
-diff --git a/common/board_r.c b/common/board_r.c
-index c75634286b..f838cd5958 100644
---- a/common/board_r.c
-+++ b/common/board_r.c
-@@ -783,7 +783,7 @@ static init_fnc_t init_sequence_r[] = {
- INIT_FUNC_WATCHDOG_RESET
- initr_net,
- #endif
--#ifdef CONFIG_ARM_FFA_TRANSPORT
-+#if defined(CONFIG_ARM_FFA_TRANSPORT) && !defined(CONFIG_SANDBOX_FFA)
- ffa_bus_discover,
- #endif
- #ifdef CONFIG_POST
diff --git a/configs/sandbox64_defconfig b/configs/sandbox64_defconfig
-index d7f22b39ae..78bc5aaa96 100644
+index 290d1506c2..36e6448968 100644
--- a/configs/sandbox64_defconfig
+++ b/configs/sandbox64_defconfig
-@@ -250,3 +250,5 @@ CONFIG_TEST_FDTDEC=y
+@@ -248,3 +248,5 @@ CONFIG_TEST_FDTDEC=y
CONFIG_UNIT_TEST=y
CONFIG_UT_TIME=y
CONFIG_UT_DM=y
@@ -80,10 +76,10 @@ index d7f22b39ae..78bc5aaa96 100644
+CONFIG_SANDBOX_FFA=y
\ No newline at end of file
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
-index c509a924e6..8942aa7157 100644
+index ab5d3f19bf..8bf3848788 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
-@@ -327,3 +327,5 @@ CONFIG_TEST_FDTDEC=y
+@@ -328,3 +328,5 @@ CONFIG_TEST_FDTDEC=y
CONFIG_UNIT_TEST=y
CONFIG_UT_TIME=y
CONFIG_UT_DM=y
@@ -103,7 +99,7 @@ index 068d4a3be4..5d7e1b2c48 100644
- Chrome OS EC
- GPIO
diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig
-index 40b467b0a5..263481de96 100644
+index be4df89d23..b86f16d778 100644
--- a/drivers/firmware/arm-ffa/Kconfig
+++ b/drivers/firmware/arm-ffa/Kconfig
@@ -2,8 +2,8 @@
@@ -117,27 +113,26 @@ index 40b467b0a5..263481de96 100644
select CMD_ARMFFA
select LIB_UUID
select DEVRES
-@@ -38,3 +38,9 @@ config ARM_FFA_EFI_RUNTIME_MODE
- The driver Code needed at runtime is placed at EFI runtime code section.
- Turning this on makes ffa_copy_runtime_data available for use and the driver
- code placed at EFI runtime code section.
-+
+@@ -29,3 +29,8 @@ config ARM_FFA_TRANSPORT
+
+ For more details about the FF-A driver, please refer to doc/arch/arm64.ffa.rst
+
+config SANDBOX_FFA
+ bool "FF-A Sandbox driver"
+ depends on ARM_FFA_TRANSPORT && SANDBOX
+ help
+ This emulates the FF-A handling under Sandbox and allows to test the FF-A driver
diff --git a/drivers/firmware/arm-ffa/Makefile b/drivers/firmware/arm-ffa/Makefile
-index 0b9b0a61b4..d50060b836 100644
+index 043a8915be..0d21d6b47a 100644
--- a/drivers/firmware/arm-ffa/Makefile
+++ b/drivers/firmware/arm-ffa/Makefile
-@@ -5,3 +5,4 @@
+@@ -4,3 +4,4 @@
+ # Abdellatif El Khlifi, Arm Limited, abdellatif.elkhlifi@arm.com.
obj-y += arm-ffa-uclass.o core.o
- obj-$(CONFIG_ARM_FFA_EFI_RUNTIME_MODE) += efi_ffa_runtime_data_mgr.o
+obj-$(CONFIG_SANDBOX_FFA) += sandbox.o
diff --git a/drivers/firmware/arm-ffa/arm_ffa_prv.h b/drivers/firmware/arm-ffa/arm_ffa_prv.h
-index 7bc90f7f66..3e0d4c112c 100644
+index 4eea7dc036..bbc8b87069 100644
--- a/drivers/firmware/arm-ffa/arm_ffa_prv.h
+++ b/drivers/firmware/arm-ffa/arm_ffa_prv.h
@@ -19,6 +19,16 @@
@@ -157,7 +152,7 @@ index 7bc90f7f66..3e0d4c112c 100644
/* FF-A driver version definitions */
#define MAJOR_VERSION_MASK GENMASK(30, 16)
-@@ -94,11 +104,6 @@ struct ffa_abi_errmap {
+@@ -103,11 +113,6 @@ struct ffa_abi_errmap {
#define FFA_ERRMAP_COUNT (FFA_LAST_ID - FFA_FIRST_ID + 1)
#define FFA_ID_TO_ERRMAP_ID(ffa_id) ((ffa_id) - FFA_FIRST_ID)
@@ -170,10 +165,10 @@ index 7bc90f7f66..3e0d4c112c 100644
* struct ffa_partition_uuid - 16 bytes UUID transmitted by FFA_PARTITION_INFO_GET
* @a1-4: 32-bit words access to the UUID data
diff --git a/drivers/firmware/arm-ffa/core.c b/drivers/firmware/arm-ffa/core.c
-index 41c7b96e68..caba10caae 100644
+index 0b1f8e6a07..560603b28b 100644
--- a/drivers/firmware/arm-ffa/core.c
+++ b/drivers/firmware/arm-ffa/core.c
-@@ -1101,6 +1101,7 @@ static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_sen
+@@ -1072,6 +1072,7 @@ static int ffa_msg_send_direct_req(struct udevice *dev, u16 dst_part_id,
return ffa_to_std_errno(ffa_errno);
}
@@ -181,7 +176,7 @@ index 41c7b96e68..caba10caae 100644
/**
* __arm_ffa_fn_smc - SMC wrapper
* @args: FF-A ABI arguments to be copied to Xn registers
-@@ -1114,6 +1115,7 @@ void __ffa_runtime __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
+@@ -1085,6 +1086,7 @@ void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
{
arm_smccc_1_2_smc(&args, res);
}
@@ -189,7 +184,7 @@ index 41c7b96e68..caba10caae 100644
/**
* ffa_set_smc_conduit - Set the SMC conduit
-@@ -1127,7 +1129,12 @@ void __ffa_runtime __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
+@@ -1098,7 +1100,12 @@ void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
*/
static int ffa_set_smc_conduit(void)
{
@@ -203,19 +198,19 @@ index 41c7b96e68..caba10caae 100644
if (!ffa_priv_data->invoke_ffa_fn) {
ffa_err("failure to set the invoke function");
-@@ -1304,17 +1311,18 @@ struct ffa_prvdata **ffa_bus_prvdata_get(void)
+@@ -1275,17 +1282,18 @@ struct ffa_prvdata *ffa_bus_prvdata_get(void)
}
/**
-- * ffa_bus_discover - discover FF-A bus and probe the arm_ffa device
+- * ffa_bus_discover - discover FF-A bus and probe arm_ffa device
+ * ffa_bus_discover - discover FF-A bus and probe arm_ffa and sandbox_arm_ffa devices
+ * @pdev: the address of a device pointer (to be filled when the arm_ffa bus device is created
+ * successfully)
*
- * This boot time function makes sure the FF-A bus is discoverable.
-- * Then, the arm_ffa device is probed and ready to use.
-+ * Then, the arm_ffa and sandbox_arm_ffa devices are ready to use.
-+ *
- * This function is called automatically at initcalls
- * level (after u-boot relocation).
+ * This function makes sure the FF-A bus is discoverable.
+- * When probing succeeds FF-A discovery is done. The arm_ffa device is ready to use.
++ * When probing succeeds FF-A discovery is done. The arm_ffa and sandbox_arm_ffa devices
++ * are ready to use.
*
* When the bus was already discovered successfully the discovery will not run again.
*
@@ -225,13 +220,9 @@ index 41c7b96e68..caba10caae 100644
* All FF-A clients should use the arm_ffa device to use the FF-A transport.
*
* Return:
-@@ -1325,9 +1333,15 @@ int ffa_bus_discover(void)
- {
- int ret = 0;
-
-- if (!ffa_priv_data)
-+ if (!ffa_priv_data) {
- ret = ffa_device_get();
+@@ -1299,6 +1307,12 @@ int ffa_bus_discover(struct udevice **pdev)
+ if (!ffa_priv_data) {
+ ret = ffa_device_get(pdev);
+#if CONFIG_IS_ENABLED(SANDBOX_FFA)
+ if (ret == 0)
@@ -244,7 +235,7 @@ index 41c7b96e68..caba10caae 100644
diff --git a/drivers/firmware/arm-ffa/sandbox.c b/drivers/firmware/arm-ffa/sandbox.c
new file mode 100644
-index 0000000000..16e1fdc809
+index 0000000000..16f1ca926e
--- /dev/null
+++ b/drivers/firmware/arm-ffa/sandbox.c
@@ -0,0 +1,659 @@
@@ -680,7 +671,7 @@ index 0000000000..16e1fdc809
+ * @{a0-a7} , res: The SMC call arguments and return structure.
+ *
+ * This is the function that emulates FFA_MSG_SEND_DIRECT_{REQ,RESP}
-+ * FF-A functions.
++ * FF-A functions. Only SMC 64-bit is supported in Sandbox.
+ *
+ * Emulating interrupts is not supported. So, FFA_RUN and FFA_INTERRUPT are not supported.
+ * In case of success FFA_MSG_SEND_DIRECT_RESP is returned with default pattern data (0xff).
@@ -743,13 +734,13 @@ index 0000000000..16e1fdc809
+ if (!func_data)
+ return -EINVAL;
+
-+ if (!func_data->data0 || func_data->data0_size != sizeof(struct ffa_prvdata **))
++ if (!func_data->data0 || func_data->data0_size != sizeof(struct ffa_prvdata *))
+ return -EINVAL;
+
-+ if (!func_data->data1 || func_data->data1_size != sizeof(struct sandbox_ffa_prvdata **))
++ if (!func_data->data1 || func_data->data1_size != sizeof(struct sandbox_ffa_prvdata *))
+ return -EINVAL;
+
-+ *((struct ffa_prvdata **)func_data->data0) = *(ffa_bus_prvdata_get());
++ *((struct ffa_prvdata **)func_data->data0) = ffa_bus_prvdata_get();
+ *((struct sandbox_ffa_prvdata **)func_data->data1) = &sandbox_ffa_priv_data;
+
+ return 0;
@@ -1058,17 +1049,17 @@ index 0000000000..4db57f5092
+
+#endif
diff --git a/include/arm_ffa.h b/include/arm_ffa.h
-index f17b100497..665413a0c5 100644
+index 74b16174c2..b88904fe50 100644
--- a/include/arm_ffa.h
+++ b/include/arm_ffa.h
-@@ -111,7 +111,7 @@ struct ffa_bus_ops {
- const struct ffa_bus_ops * __ffa_runtime ffa_bus_ops_get(void);
+@@ -90,7 +90,7 @@ struct ffa_bus_ops {
+ const struct ffa_bus_ops *ffa_bus_ops_get(void);
/**
- * ffa_bus_discover - discover FF-A bus and probes the arm_ffa device
+ * ffa_bus_discover - discover FF-A bus and probes the arm_ffa and sandbox_arm_ffa devices
*/
- int ffa_bus_discover(void);
+ int ffa_bus_discover(struct udevice **pdev);
diff --git a/include/sandbox_arm_ffa.h b/include/sandbox_arm_ffa.h
new file mode 100644
@@ -1168,18 +1159,18 @@ index 0000000000..d5df16f282
+
+#endif
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 0ec002ac8b..8fa9a58d76 100644
+index caa64028be..1099ccc800 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
-@@ -2177,7 +2177,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2185,7 +2185,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
}
-#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
+#if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT) && !CONFIG_IS_ENABLED(SANDBOX_FFA)
/* unmap FF-A RX/TX buffers */
- if (ffa_bus_ops_get()->rxtx_unmap())
- debug("[efi_boottime][ERROR]: can not unmap FF-A RX/TX buffers\n");
+ if (ffa_bus_ops_get()->rxtx_unmap(NULL))
+ log_err("Can't unmap FF-A RX/TX buffers\n");
--
2.17.1
deleted file mode 100644
@@ -1,59 +0,0 @@
-From 83f9da30247c2d021658bc1b595c59ecc35eadf5 Mon Sep 17 00:00:00 2001
-From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Fri, 29 Jul 2022 13:07:43 +0100
-Subject: [PATCH 07/26] arm64: smccc: clear the Xn registers after SMC calls
-
-set to zero the x0-x17 registers
-
-As per the SMCCC v1.2 spec, unused result and scratch registers can leak
-information after an SMC call. We can mitigate against this risk by
-returning zero in each register.
-
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
-
-Changelog:
-===============
-
-v4:
-
-* move the clearing code into a new macro: clear_gp_regs
-
-v3:
-
-* clear the Xn registers after SMC calls
-
- arch/arm/cpu/armv8/smccc-call.S | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/arch/arm/cpu/armv8/smccc-call.S b/arch/arm/cpu/armv8/smccc-call.S
-index ec6f299bc9..32f3eb8eeb 100644
---- a/arch/arm/cpu/armv8/smccc-call.S
-+++ b/arch/arm/cpu/armv8/smccc-call.S
-@@ -50,6 +50,12 @@ ENDPROC(__arm_smccc_hvc)
-
- #ifdef CONFIG_ARM64
-
-+ .macro clear_gp_regs
-+ .irp n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
-+ mov x\n, xzr
-+ .endr
-+ .endm
-+
- .macro SMCCC_1_2 instr
- /* Save `res` and free a GPR that won't be clobbered */
- stp x1, x19, [sp, #-16]!
-@@ -84,6 +90,9 @@ ENDPROC(__arm_smccc_hvc)
- stp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS]
- stp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS]
-
-+ /* x0-x17 registers can leak information after an SMC or HVC call. Let's clear them */
-+ clear_gp_regs
-+
- /* Restore original x19 */
- ldp xzr, x19, [sp], #16
- ret
-2.17.1
-
similarity index 85%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm_ffa-introduce-Sandbox-test-cases-for-UCLASS_FFA.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-introduce-Sandbox-test-cases-for-UCLASS_FFA.patch
@@ -1,7 +1,7 @@
-From dbc51066367481b5a45ce24f91571f83a022576e Mon Sep 17 00:00:00 2001
+From de26427c9f9b450ab4a18352fa51f46b3b585bc1 Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Date: Mon, 6 Jun 2022 17:26:06 +0100
-Subject: [PATCH 12/26] arm_ffa: introduce Sandbox test cases for UCLASS_FFA
+Subject: [PATCH 07/25] arm_ffa: introduce Sandbox test cases for UCLASS_FFA
Add functional test cases for the FF-A core driver
@@ -9,28 +9,38 @@ These tests rely on the FF-A Sandbox driver which helps in
inspecting the FF-A core driver.
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v8:
+
+ * update partition_info_get() second argument to be an SP count
+ * pass NULL device pointer to the FF-A bus discovery and operations
+
+v7: set the tests to use 64-bit direct messaging
+
v4: align sandbox tests with the new FF-A driver interfaces
and new way of error handling
v1: introduce sandbox tests
-
+---
MAINTAINERS | 1 +
- test/dm/Makefile | 1 +
- test/dm/ffa.c | 394 +++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 396 insertions(+)
+ test/dm/Makefile | 2 +
+ test/dm/ffa.c | 392 +++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 395 insertions(+)
create mode 100644 test/dm/ffa.c
diff --git a/MAINTAINERS b/MAINTAINERS
-index 96157db6b6..e5b71b0ade 100644
+index 23cebbd526..e682db8d8f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -252,6 +252,7 @@ F: doc/README.ffa.drv
+@@ -256,6 +256,7 @@ F: doc/arch/arm64.ffa.rst
F: drivers/firmware/arm-ffa/
F: include/arm_ffa.h
F: include/sandbox_arm_ffa.h
@@ -39,10 +49,18 @@ index 96157db6b6..e5b71b0ade 100644
ARM FREESCALE IMX
M: Stefano Babic <sbabic@denx.de>
diff --git a/test/dm/Makefile b/test/dm/Makefile
-index f0a7c97e3d..f96f848046 100644
+index 7543df8823..e5a791768e 100644
--- a/test/dm/Makefile
+++ b/test/dm/Makefile
-@@ -79,6 +79,7 @@ obj-$(CONFIG_POWER_DOMAIN) += power-domain.o
+@@ -1,6 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0+
+ #
+ # Copyright (c) 2013 Google, Inc
++# (C) Copyright 2022 ARM Limited
+
+ obj-$(CONFIG_UT_DM) += test-dm.o
+
+@@ -81,6 +82,7 @@ obj-$(CONFIG_POWER_DOMAIN) += power-domain.o
obj-$(CONFIG_ACPI_PMC) += pmc.o
obj-$(CONFIG_DM_PMIC) += pmic.o
obj-$(CONFIG_DM_PWM) += pwm.o
@@ -52,10 +70,10 @@ index f0a7c97e3d..f96f848046 100644
obj-y += regmap.o
diff --git a/test/dm/ffa.c b/test/dm/ffa.c
new file mode 100644
-index 0000000000..052d5fc3f4
+index 0000000000..128d8626a7
--- /dev/null
+++ b/test/dm/ffa.c
-@@ -0,0 +1,394 @@
+@@ -0,0 +1,392 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Functional tests for UCLASS_FFA class
@@ -228,7 +246,7 @@ index 0000000000..052d5fc3f4
+ struct ffa_send_direct_data msg = {0};
+ u8 cnt;
+
-+ ut_assertok(ffa_bus_ops_get()->sync_send_receive(part_id, &msg));
++ ut_assertok(ffa_bus_ops_get()->sync_send_receive(NULL, part_id, &msg, 1));
+
+ for (cnt = 0; cnt < sizeof(struct ffa_send_direct_data) / sizeof(u64); cnt++)
+ ut_assertok(((u64 *)&msg)[cnt] != 0xffffffffffffffff);
@@ -240,7 +258,7 @@ index 0000000000..052d5fc3f4
+ struct sandbox_ffa_prvdata *sdx_prvdata,
+ struct unit_test_state *uts)
+{
-+ u32 count = 0, size = 0;
++ u32 count = 0;
+ struct ffa_partition_info *parts_info;
+ u32 info_idx, exp_info_idx;
+ int ret;
@@ -248,7 +266,7 @@ index 0000000000..052d5fc3f4
+ /*
+ * get from the driver the count of the SPs matching the UUID
+ */
-+ ret = ffa_bus_ops_get()->partition_info_get(service_uuid, &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, service_uuid, &count, NULL);
+ /* make sure partitions are detected */
+ ut_assertok(ret != 0);
+ ut_assertok(count != SANDBOX_SP_COUNT_PER_VALID_SERVICE);
@@ -261,12 +279,10 @@ index 0000000000..052d5fc3f4
+ parts_info = calloc(count, sizeof(struct ffa_partition_info));
+ ut_assertok(!parts_info);
+
-+ size = count * sizeof(struct ffa_partition_info);
-+
+ /*
+ * ask the driver to fill the buffer with the SPs info
+ */
-+ ret = ffa_bus_ops_get()->partition_info_get(service_uuid, &size, parts_info);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, service_uuid, &count, parts_info);
+ if (ret != 0) {
+ free(parts_info);
+ ut_assertok(ret != 0);
@@ -317,7 +333,7 @@ index 0000000000..052d5fc3f4
+ int ret;
+
+ /* test probing FF-A devices */
-+ ut_assertok(ffa_bus_discover());
++ ut_assertok(ffa_bus_discover(NULL));
+
+ /* get a pointer to the FF-A core and sandbox drivers private data */
+ func_data.data0 = &prvdata;
@@ -374,7 +390,7 @@ index 0000000000..052d5fc3f4
+ ut_assertok(check_rxbuf_release_flag(rxbuf_flag, uts));
+
+ /* test FFA_RXTX_UNMAP */
-+ ut_assertok(ffa_bus_ops_get()->rxtx_unmap());
++ ut_assertok(ffa_bus_ops_get()->rxtx_unmap(NULL));
+
+ rxbuf_flag = 1;
+ ut_assertok(sandbox_ffa_query_core_state(FFA_RXTX_UNMAP, &func_data));
@@ -399,7 +415,7 @@ index 0000000000..052d5fc3f4
+ u16 part_id = 0;
+
+ /* test probing FF-A devices */
-+ ut_assertok(ffa_bus_discover());
++ ut_assertok(ffa_bus_discover(NULL));
+
+ /* get a pointer to the FF-A core and sandbox drivers private data */
+ func_data.data0 = &prvdata;
@@ -418,32 +434,32 @@ index 0000000000..052d5fc3f4
+ ut_assertok(check_sandbox_dev(sdx_prvdata, uts));
+
+ /* query partitions count using invalid arguments */
-+ ret = ffa_bus_ops_get()->partition_info_get(unvalid_svc_uuid, NULL, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, unvalid_svc_uuid, NULL, NULL);
+ ut_assertok(ret != -EINVAL);
+
+ /* query partitions count using an invalid UUID string */
-+ ret = ffa_bus_ops_get()->partition_info_get(unvalid_svc_uuid_str, &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, unvalid_svc_uuid_str, &count, NULL);
+ ut_assertok(ret != -EINVAL);
+
+ /* query partitions count using an invalid UUID (no matching SP) */
+ count = 0;
-+ ret = ffa_bus_ops_get()->partition_info_get(unvalid_svc_uuid, &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, unvalid_svc_uuid, &count, NULL);
+ ut_assertok(count != 0);
+
+ /* query partitions count using a valid UUID */
+ count = 0;
-+ ret = ffa_bus_ops_get()->partition_info_get(valid_svc_uuid, &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, valid_svc_uuid, &count, NULL);
+ /* make sure partitions are detected */
+ ut_assertok(ret != 0);
+ ut_assertok(count != SANDBOX_SP_COUNT_PER_VALID_SERVICE);
+
+ /* send data to an invalid partition */
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(NULL, part_id, &msg, 1);
+ ut_assertok(ret != -EINVAL);
+
+ /* send data to a valid partition */
+ part_id = prvdata->partitions.descs[0].info.id;
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(NULL, part_id, &msg, 1);
+ ut_assertok(ret != 0);
+
+ return CMD_RET_SUCCESS;
similarity index 67%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-arm_ffa-introduce-armffa-command-Sandbox-test.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-introduce-armffa-command-Sandbox-test.patch
@@ -1,13 +1,16 @@
-From 5be8c1d52045cbdc1adf79299792a6a49fef66c3 Mon Sep 17 00:00:00 2001
+From 5507189fe37f1243d685c59ea52fa5643d3cc50c Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Mon, 6 Jun 2022 17:30:44 +0100
-Subject: [PATCH 13/26] arm_ffa: introduce armffa command Sandbox test
+Date: Tue, 29 Nov 2022 14:48:34 +0000
+Subject: [PATCH 08/25] arm_ffa: introduce armffa command Sandbox test
Add Sandbox test for the armffa command
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
@@ -15,18 +18,18 @@ Changelog:
v4: drop use of helper APIs
v1: introduce armffa command sandbox test
-
+---
MAINTAINERS | 1 +
- test/cmd/Makefile | 1 +
- test/cmd/armffa.c | 40 ++++++++++++++++++++++++++++++++++++++++
+ test/cmd/Makefile | 2 ++
+ test/cmd/armffa.c | 39 +++++++++++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+)
create mode 100644 test/cmd/armffa.c
diff --git a/MAINTAINERS b/MAINTAINERS
-index e5b71b0ade..505fffff14 100644
+index e682db8d8f..72f01769c9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -252,6 +252,7 @@ F: doc/README.ffa.drv
+@@ -256,6 +256,7 @@ F: doc/arch/arm64.ffa.rst
F: drivers/firmware/arm-ffa/
F: include/arm_ffa.h
F: include/sandbox_arm_ffa.h
@@ -35,20 +38,28 @@ index e5b71b0ade..505fffff14 100644
ARM FREESCALE IMX
diff --git a/test/cmd/Makefile b/test/cmd/Makefile
-index a59adb1e6d..d9dc0809d6 100644
+index c331757425..19e9d0a995 100644
--- a/test/cmd/Makefile
+++ b/test/cmd/Makefile
-@@ -11,3 +11,4 @@ obj-$(CONFIG_CMD_MEM_SEARCH) += mem_search.o
+@@ -1,6 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0+
+ #
+ # Copyright (c) 2013 Google, Inc
++# (C) Copyright 2022 ARM Limited
+
+ ifdef CONFIG_HUSH_PARSER
+ obj-$(CONFIG_CONSOLE_RECORD) += test_echo.o
+@@ -13,3 +14,4 @@ obj-$(CONFIG_CMD_MEM_SEARCH) += mem_search.o
obj-$(CONFIG_CMD_PINMUX) += pinmux.o
obj-$(CONFIG_CMD_PWM) += pwm.o
obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
+obj-$(CONFIG_SANDBOX_FFA) += armffa.o
diff --git a/test/cmd/armffa.c b/test/cmd/armffa.c
new file mode 100644
-index 0000000000..531f82066e
+index 0000000000..e04363ba63
--- /dev/null
+++ b/test/cmd/armffa.c
-@@ -0,0 +1,40 @@
+@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test for armffa command
@@ -58,7 +69,6 @@ index 0000000000..531f82066e
+ */
+
+#include <common.h>
-+#include <dm.h>
+#include <dm/test.h>
+#include <sandbox_arm_ffa.h>
+#include <string.h>
@@ -72,7 +82,7 @@ index 0000000000..531f82066e
+{
+ char ping_cmd[PING_CMD_SIZE] = {0};
+
-+ ut_assertok(ffa_bus_discover());
++ ut_assertok(ffa_bus_discover(NULL));
+
+ /* armffa getpart <UUID> */
+ ut_assertok(run_command("armffa getpart " SANDBOX_SERVICE1_UUID, 0));
deleted file mode 100644
@@ -1,127 +0,0 @@
-From af17d357674393565c8be15f21c86cba972963e7 Mon Sep 17 00:00:00 2001
-From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Thu, 4 Aug 2022 16:46:47 +0100
-Subject: [PATCH 08/26] lib: uuid: introduce be_uuid_str_to_le_bin function
-
-convert big endian UUID string to little endian buffer
-
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
-
-Changelog:
-===============
-
-v4:
-
-* rename ffa_uuid_str_to_bin to be_uuid_str_to_le_bin and put in
- a standalone commit (the current)
-
-v3:
-
-* introduce ffa_uuid_str_to_bin (provided by
- arm_ffa: introduce Arm FF-A low-level driver)
-
- include/uuid.h | 6 +++++
- lib/uuid.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 69 insertions(+)
-
-diff --git a/include/uuid.h b/include/uuid.h
-index 4a4883d3b5..5355230b5e 100644
---- a/include/uuid.h
-+++ b/include/uuid.h
-@@ -44,4 +44,10 @@ int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin);
- const char *uuid_guid_get_str(const unsigned char *guid_bin);
- void gen_rand_uuid(unsigned char *uuid_bin);
- void gen_rand_uuid_str(char *uuid_str, int str_format);
-+
-+/**
-+ * be_uuid_str_to_le_bin - Converts a big endian UUID string to a little endian buffer
-+ */
-+int be_uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin);
-+
- #endif
-diff --git a/lib/uuid.c b/lib/uuid.c
-index 284f8113ff..d0fa51d0bf 100644
---- a/lib/uuid.c
-+++ b/lib/uuid.c
-@@ -1,6 +1,7 @@
- // SPDX-License-Identifier: GPL-2.0+
- /*
- * Copyright 2011 Calxeda, Inc.
-+ * Copyright 2022 ARM Limited
- */
-
- #include <common.h>
-@@ -342,6 +343,68 @@ int uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin,
- return 0;
- }
-
-+/**
-+ * be_uuid_str_to_le_bin - Converts a big endian UUID string to a little endian buffer
-+ * @uuid_str: UUID string in big endian format (36 bytes wide + '/0')
-+ * @uuid_bin: preallocated 16 bytes UUID buffer in little endian format
-+ *
-+ * UUID string is 36 characters (36 bytes):
-+ *
-+ * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-+ * be be be be be
-+ *
-+ * where x is a hexadecimal character. Fields are separated by '-'s.
-+ * When converting to a binary UUID, these endianness rules apply:
-+ * be: means the field in the string is considered a big endian hex number
-+ * and should be converted to little endian binary format
-+ *
-+ * Return:
-+ *
-+ * uuid_bin filled with little endian UUID data
-+ * On success 0 is returned. Otherwise, failure code.
-+ */
-+int be_uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin)
-+{
-+ u16 tmp16 = 0;
-+ u32 tmp32 = 0;
-+ u64 tmp64 = 0;
-+
-+ if (!uuid_str_valid(uuid_str) || !uuid_bin)
-+ return -EINVAL;
-+
-+ /*
-+ * reverse bytes from big to little endian
-+ */
-+ tmp32 = simple_strtoul(uuid_str, NULL, 16);
-+ memcpy(uuid_bin, &tmp32, 4);
-+
-+ /*
-+ * reverse bytes from big to little endian
-+ */
-+ tmp16 = simple_strtoul(uuid_str + 9, NULL, 16);
-+ memcpy(uuid_bin + 4, &tmp16, 2);
-+
-+ /*
-+ * reverse bytes from big to little endian
-+ */
-+ tmp16 = simple_strtoul(uuid_str + 14, NULL, 16);
-+ memcpy(uuid_bin + 6, &tmp16, 2);
-+
-+ /*
-+ * reverse bytes from big to little endian
-+ */
-+ tmp16 = simple_strtoul(uuid_str + 19, NULL, 16);
-+ memcpy(uuid_bin + 8, &tmp16, 2);
-+
-+ /*
-+ * reverse bytes from big to little endian
-+ */
-+ tmp64 = simple_strtoull(uuid_str + 24, NULL, 16);
-+ memcpy(uuid_bin + 10, (char *)&tmp64, 6);
-+
-+ return 0;
-+}
-+
- /*
- * uuid_bin_to_str() - convert big endian binary data to string UUID or GUID.
- *
-2.17.1
-
similarity index 61%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-arm_ffa-introduce-FF-A-MM-communication.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-efi-introduce-FF-A-MM-communication.patch
@@ -1,12 +1,10 @@
-From b3c7d84dcde6ee1cbc13e10664d24ffa220f5fb3 Mon Sep 17 00:00:00 2001
+From cefc1d101c62e62e66f9cbf1775defde7d2c3d27 Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Date: Mon, 15 Aug 2022 15:12:49 +0100
-Subject: [PATCH 14/26] arm_ffa: introduce FF-A MM communication
+Subject: [PATCH 09/25] arm_ffa: efi: introduce FF-A MM communication
Add MM communication support using FF-A transport
-Access an SP's service through EFI MM communication protocol.
-
This feature allows accessing MM partitions services through
EFI MM communication protocol. MM partitions such as StandAlonneMM
or smm-gateway secure partitions which reside in secure world.
@@ -26,18 +24,41 @@ buffer with the response data.
The response data is copied back to the communication buffer and
consumed by the EFI subsystem.
-FF-A driver private data is copied to EFI runtime section at
-ExitBootServices(). This garantees secure world partitions data are
-available at EFI runtime level.
+MM communication protocol supports FF-A 64-bit direct messaging.
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
Changelog:
===============
+v8:
+
+* isolate the compilation choices between FF-A and OP-TEE
+* update partition_info_get() second argument to be an SP count
+* pass NULL device pointer to the FF-A bus discovery and operations
+
+v7:
+
+* set the MM door bell event to use 64-bit direct messaging
+* issue a compile time error when one of these macros are not found :
+ FFA_SHARED_MM_BUFFER_SIZE, FFA_SHARED_MM_BUFFER_OFFSET, FFA_SHARED_MM_BUFFER_ADDR
+* make mm_sp_svc_uuid static
+* replace EINVAL with ENOMEM in ffa_discover_mm_sp_id() when calloc() fails
+* improve use of unmap_sysmem() in ffa_mm_communicate()
+
+v6:
+
+* add FF-A runtime discovery at MM communication level
+* drop EFI runtime support for FF-A MM communication
+* revert the changes in include/mm_communication.h for
+ efi_mm_communicate_header and smm_variable_access structures
+
v4:
* use the new FF-A driver interfaces
@@ -45,7 +66,7 @@ v4:
* copy FF-A driver private data to EFI runtime section at
ExitBootServices()
* drop use of FFA_ERR_STAT_SUCCESS error code
-* replace EFI_BUFFER_TOO_SMALL by EFI_OUT_OF_RESOURCES
+* replace EFI_BUFFER_TOO_SMALL with EFI_OUT_OF_RESOURCES
in ffa_mm_communicate(). No need for efi_memcpy_runtime() anymore
* revert the error log in mm_communicate() in case of failure
* remove packed attribute from efi_mm_communicate_header and
@@ -58,93 +79,26 @@ v2:
v1:
* introduce FF-A MM communication
-
- arch/arm/cpu/armv8/cache.S | 16 ++
- arch/arm/cpu/armv8/cache_v8.c | 3 +-
- include/mm_communication.h | 7 +-
+---
+ include/mm_communication.h | 5 +
lib/efi_loader/Kconfig | 14 +-
- lib/efi_loader/efi_boottime.c | 7 +
- lib/efi_loader/efi_variable_tee.c | 261 +++++++++++++++++++++++++++++-
- 6 files changed, 299 insertions(+), 9 deletions(-)
+ lib/efi_loader/efi_variable_tee.c | 294 +++++++++++++++++++++++++++++-
+ 3 files changed, 307 insertions(+), 6 deletions(-)
-diff --git a/arch/arm/cpu/armv8/cache.S b/arch/arm/cpu/armv8/cache.S
-index d1cee23437..f69ef64ed6 100644
---- a/arch/arm/cpu/armv8/cache.S
-+++ b/arch/arm/cpu/armv8/cache.S
-@@ -21,7 +21,11 @@
- * x1: 0 clean & invalidate, 1 invalidate only
- * x2~x9: clobbered
- */
-+#ifdef CONFIG_EFI_LOADER
-+.pushsection .text.efi_runtime, "ax"
-+#else
- .pushsection .text.__asm_dcache_level, "ax"
-+#endif
- ENTRY(__asm_dcache_level)
- lsl x12, x0, #1
- msr csselr_el1, x12 /* select cache level */
-@@ -65,7 +69,11 @@ ENDPROC(__asm_dcache_level)
- *
- * flush or invalidate all data cache by SET/WAY.
- */
-+#ifdef CONFIG_EFI_LOADER
-+.pushsection .text.efi_runtime, "ax"
-+#else
- .pushsection .text.__asm_dcache_all, "ax"
-+#endif
- ENTRY(__asm_dcache_all)
- mov x1, x0
- dsb sy
-@@ -109,7 +117,11 @@ ENTRY(__asm_flush_dcache_all)
- ENDPROC(__asm_flush_dcache_all)
- .popsection
-
-+#ifdef CONFIG_EFI_LOADER
-+.pushsection .text.efi_runtime, "ax"
-+#else
- .pushsection .text.__asm_invalidate_dcache_all, "ax"
-+#endif
- ENTRY(__asm_invalidate_dcache_all)
- mov x0, #0x1
- b __asm_dcache_all
-@@ -182,7 +194,11 @@ ENTRY(__asm_invalidate_icache_all)
- ENDPROC(__asm_invalidate_icache_all)
- .popsection
-
-+#ifdef CONFIG_EFI_LOADER
-+.pushsection .text.efi_runtime, "ax"
-+#else
- .pushsection .text.__asm_invalidate_l3_dcache, "ax"
-+#endif
- WEAK(__asm_invalidate_l3_dcache)
- mov x0, #0 /* return status as success */
- ret
-diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c
-index e4736e5643..afbc487fa1 100644
---- a/arch/arm/cpu/armv8/cache_v8.c
-+++ b/arch/arm/cpu/armv8/cache_v8.c
-@@ -9,6 +9,7 @@
-
- #include <common.h>
- #include <cpu_func.h>
-+#include <efi_loader.h>
- #include <hang.h>
- #include <log.h>
- #include <asm/cache.h>
-@@ -445,7 +446,7 @@ __weak void mmu_setup(void)
- /*
- * Performs a invalidation of the entire data cache at all levels
- */
--void invalidate_dcache_all(void)
-+void __efi_runtime invalidate_dcache_all(void)
- {
- __asm_invalidate_dcache_all();
- __asm_invalidate_l3_dcache();
diff --git a/include/mm_communication.h b/include/mm_communication.h
-index e65fbde60d..32dc5dbac8 100644
+index e65fbde60d..d409bed777 100644
--- a/include/mm_communication.h
+++ b/include/mm_communication.h
-@@ -13,6 +13,9 @@
+@@ -6,6 +6,8 @@
+ * Copyright (c) 2017, Intel Corporation. All rights reserved.
+ * Copyright (C) 2020 Linaro Ltd. <sughosh.ganu@linaro.org>
+ * Copyright (C) 2020 Linaro Ltd. <ilias.apalodimas@linaro.org>
++ * (C) Copyright 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+ #ifndef _MM_COMMUNICATION_H_
+@@ -13,6 +15,9 @@
#include <part_efi.h>
@@ -154,29 +108,11 @@ index e65fbde60d..32dc5dbac8 100644
/*
* Interface to the pseudo Trusted Application (TA), which provides a
* communication channel with the Standalone MM (Management Mode)
-@@ -43,7 +46,7 @@
- * To avoid confusion in interpreting frames, the communication buffer should
- * always begin with efi_mm_communicate_header.
- */
--struct __packed efi_mm_communicate_header {
-+struct efi_mm_communicate_header {
- efi_guid_t header_guid;
- size_t message_len;
- u8 data[];
-@@ -145,7 +148,7 @@ struct smm_variable_communicate_header {
- * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
- *
- */
--struct smm_variable_access {
-+struct __packed smm_variable_access {
- efi_guid_t guid;
- efi_uintn_t data_size;
- efi_uintn_t name_size;
diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
-index e3f2402d0e..2a6d70f862 100644
+index b8fb2701a7..d292f57244 100644
--- a/lib/efi_loader/Kconfig
+++ b/lib/efi_loader/Kconfig
-@@ -60,13 +60,23 @@ config EFI_VARIABLE_FILE_STORE
+@@ -61,13 +61,23 @@ config EFI_VARIABLE_FILE_STORE
stored as file /ubootefi.var on the EFI system partition.
config EFI_MM_COMM_TEE
@@ -202,29 +138,24 @@ index e3f2402d0e..2a6d70f862 100644
config EFI_VARIABLE_NO_STORE
bool "Don't persist non-volatile UEFI variables"
help
-diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 8fa9a58d76..cede7826bd 100644
---- a/lib/efi_loader/efi_boottime.c
-+++ b/lib/efi_loader/efi_boottime.c
-@@ -2185,6 +2185,13 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
- debug("[efi_boottime][INFO]: FF-A RX/TX buffers unmapped\n");
- #endif
-
-+#if CONFIG_IS_ENABLED(ARM_FFA_EFI_RUNTIME_MODE) && !CONFIG_IS_ENABLED(SANDBOX_FFA)
-+ if (ffa_copy_runtime_data())
-+ printf("ERROR: EFI: FFA: copying runtime data\n");
-+ else
-+ printf("INFO: EFI: FFA: runtime data copied\n");
-+#endif
-+
- /* Patch out unsupported runtime function */
- efi_runtime_detach();
-
diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
-index dfef18435d..7d9d577281 100644
+index dfef18435d..3933a24e8c 100644
--- a/lib/efi_loader/efi_variable_tee.c
+++ b/lib/efi_loader/efi_variable_tee.c
-@@ -15,6 +15,36 @@
+@@ -4,9 +4,12 @@
+ *
+ * Copyright (C) 2019 Linaro Ltd. <sughosh.ganu@linaro.org>
+ * Copyright (C) 2019 Linaro Ltd. <ilias.apalodimas@linaro.org>
++ * Copyright (C) 2022 ARM Limited
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ */
+
+ #include <common.h>
++#include <dm.h>
+ #include <efi.h>
+ #include <efi_api.h>
+ #include <efi_loader.h>
+@@ -15,6 +18,36 @@
#include <malloc.h>
#include <mm_communication.h>
@@ -235,33 +166,33 @@ index dfef18435d..7d9d577281 100644
+#include <mapmem.h>
+
+#ifndef FFA_SHARED_MM_BUFFER_SIZE
-+#warning "FFA_SHARED_MM_BUFFER_SIZE must be defined in include/configs/<board>.h"
++#error "FFA_SHARED_MM_BUFFER_SIZE must be defined in include/configs/<board>.h"
+#define FFA_SHARED_MM_BUFFER_SIZE 0
+#endif
+
+#ifndef FFA_SHARED_MM_BUFFER_OFFSET
-+#warning "FFA_SHARED_MM_BUFFER_OFFSET must be defined in include/configs/<board>.h"
++#error "FFA_SHARED_MM_BUFFER_OFFSET must be defined in include/configs/<board>.h"
+#define FFA_SHARED_MM_BUFFER_OFFSET 0
+#endif
+
+#ifndef FFA_SHARED_MM_BUFFER_ADDR
-+#warning "FFA_SHARED_MM_BUFFER_ADDR must be defined in include/configs/<board>.h"
++#error "FFA_SHARED_MM_BUFFER_ADDR must be defined in include/configs/<board>.h"
+#define FFA_SHARED_MM_BUFFER_ADDR 0
+#endif
+
+/* MM return codes */
+#define MM_SUCCESS (0)
+
-+const char *mm_sp_svc_uuid = MM_SP_UUID;
++static const char *mm_sp_svc_uuid = MM_SP_UUID;
+
-+static __efi_runtime_data u16 mm_sp_id;
++static u16 mm_sp_id;
+
+#endif
+
extern struct efi_var_file __efi_runtime_data *efi_var_buf;
static efi_uintn_t max_buffer_size; /* comm + var + func + data */
static efi_uintn_t max_payload_size; /* func + data */
-@@ -24,6 +54,7 @@ struct mm_connection {
+@@ -24,6 +57,7 @@ struct mm_connection {
u32 session;
};
@@ -269,7 +200,7 @@ index dfef18435d..7d9d577281 100644
/**
* get_connection() - Retrieve OP-TEE session for a specific UUID.
*
-@@ -143,16 +174,227 @@ static efi_status_t optee_mm_communicate(void *comm_buf, ulong dsize)
+@@ -143,13 +177,248 @@ static efi_status_t optee_mm_communicate(void *comm_buf, ulong dsize)
return ret;
}
@@ -290,7 +221,7 @@ index dfef18435d..7d9d577281 100644
+ *
+ * 0 on success
+ */
-+static int __efi_runtime ffa_notify_mm_sp(void)
++static int ffa_notify_mm_sp(void)
+{
+ struct ffa_send_direct_data msg = {0};
+ int ret;
@@ -301,7 +232,7 @@ index dfef18435d..7d9d577281 100644
+
+ msg.data0 = FFA_SHARED_MM_BUFFER_OFFSET; /* x3 */
+
-+ ret = ffa_bus_ops_get()->sync_send_receive(mm_sp_id, &msg);
++ ret = ffa_bus_ops_get()->sync_send_receive(NULL, mm_sp_id, &msg, 1);
+ if (ret != 0)
+ return ret;
+
@@ -330,7 +261,7 @@ index dfef18435d..7d9d577281 100644
+ */
+static int ffa_discover_mm_sp_id(void)
+{
-+ u32 count = 0, size = 0;
++ u32 count = 0;
+ int ret;
+ struct ffa_partition_info *parts_info;
+
@@ -340,7 +271,7 @@ index dfef18435d..7d9d577281 100644
+ /*
+ * get from the driver the count of the SPs matching the UUID
+ */
-+ ret = ffa_bus_ops_get()->partition_info_get(mm_sp_svc_uuid, &count, NULL);
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, mm_sp_svc_uuid, &count, NULL);
+ if (ret != 0) {
+ log_err("EFI: Failure in querying partitions count (error code: %d)\n", ret);
+ return ret;
@@ -358,18 +289,16 @@ index dfef18435d..7d9d577281 100644
+
+ log_info("EFI: Pre-allocating %d partition(s) info structures\n", count);
+
-+ parts_info = calloc(count, sizeof(struct ffa_partition_info));
++ parts_info = calloc(count, sizeof(*parts_info));
+ if (!parts_info)
-+ return -EINVAL;
-+
-+ size = count * sizeof(struct ffa_partition_info);
++ return -ENOMEM;
+
+ /*
+ * ask the driver to fill the
+ * buffer with the SPs info
+ */
-+ ret = ffa_bus_ops_get()->partition_info_get(mm_sp_svc_uuid, &size, parts_info);
-+ if (ret != 0) {
++ ret = ffa_bus_ops_get()->partition_info_get(NULL, mm_sp_svc_uuid, &count, parts_info);
++ if (ret) {
+ log_err("EFI: Failure in querying partition(s) info (error code: %d)\n", ret);
+ free(parts_info);
+ return ret;
@@ -404,10 +333,11 @@ index dfef18435d..7d9d577281 100644
+ *
+ * EFI status code
+ */
-+static efi_status_t __efi_runtime ffa_mm_communicate(void *comm_buf, ulong comm_buf_size)
++static efi_status_t ffa_mm_communicate(void *comm_buf, ulong comm_buf_size)
+{
+ ulong tx_data_size;
+ int ffa_ret;
++ efi_status_t efi_ret;
+ struct efi_mm_communicate_header *mm_hdr;
+ void *virt_shared_buf;
+
@@ -429,7 +359,7 @@ index dfef18435d..7d9d577281 100644
+ /* Copy the data to the shared buffer */
+
+ virt_shared_buf = (void *)map_sysmem((phys_addr_t)FFA_SHARED_MM_BUFFER_ADDR, 0);
-+ efi_memcpy_runtime(virt_shared_buf, comm_buf, tx_data_size);
++ memcpy(virt_shared_buf, comm_buf, tx_data_size);
+
+ /*
+ * The secure world might have cache disabled for
@@ -444,8 +374,6 @@ index dfef18435d..7d9d577281 100644
+ /* Announce there is data in the shared buffer */
+
+ ffa_ret = ffa_notify_mm_sp();
-+ if (ffa_ret)
-+ unmap_sysmem(virt_shared_buf);
+
+ switch (ffa_ret) {
+ case 0:
@@ -457,30 +385,57 @@ index dfef18435d..7d9d577281 100644
+ sizeof(size_t);
+
+ if (rx_data_size > comm_buf_size) {
-+ unmap_sysmem(virt_shared_buf);
-+ return EFI_OUT_OF_RESOURCES;
++ efi_ret = EFI_OUT_OF_RESOURCES;
++ break;
+ }
+
-+ efi_memcpy_runtime(comm_buf, virt_shared_buf, rx_data_size);
-+ unmap_sysmem(virt_shared_buf);
-+
-+ return EFI_SUCCESS;
++ memcpy(comm_buf, virt_shared_buf, rx_data_size);
++ efi_ret = EFI_SUCCESS;
++ break;
+ }
+ case -EINVAL:
-+ return EFI_DEVICE_ERROR;
++ efi_ret = EFI_DEVICE_ERROR;
++ break;
+ case -EPERM:
-+ return EFI_INVALID_PARAMETER;
++ efi_ret = EFI_INVALID_PARAMETER;
++ break;
+ case -EACCES:
-+ return EFI_ACCESS_DENIED;
++ efi_ret = EFI_ACCESS_DENIED;
++ break;
+ case -EBUSY:
-+ return EFI_OUT_OF_RESOURCES;
++ efi_ret = EFI_OUT_OF_RESOURCES;
++ break;
+ default:
-+ return EFI_ACCESS_DENIED;
++ efi_ret = EFI_ACCESS_DENIED;
+ }
++
++ unmap_sysmem(virt_shared_buf);
++ return efi_ret;
+}
+#endif
+
+/**
++ * select_ffa_mm_comms() - checks FF-A support availability
++ *
++ * Making sure FF-A is compiled in. If that's the case try to discover
++ * the FF-A bus.
++ *
++ * Return:
++ *
++ * 0: FF-A ready for use. Otherwise, failure
++ */
++static efi_status_t select_ffa_mm_comms(void)
++{
++ efi_status_t ret = EFI_UNSUPPORTED;
++#if (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
++ ret = ffa_bus_discover(NULL);
++ if (ret)
++ ret = EFI_NOT_READY;
++#endif
++ return ret;
++}
++
++/**
+ * mm_communicate() - Adjust the communication buffer to the MM SP and send
* it to OP-TEE
*
@@ -488,31 +443,34 @@ index dfef18435d..7d9d577281 100644
+ * @comm_buf: locally allocated communication buffer
* @dsize: buffer size
+ *
-+ * The MM SP (also called partition) can be StandAlonneMM or smm-gateway.
++ * The SP (also called partition) can be any MM SP such as StandAlonneMM or smm-gateway.
+ * The comm_buf format is the same for both partitions.
+ * When using the u-boot OP-TEE driver, StandAlonneMM is supported.
-+ * When using the u-boot FF-A driver, StandAlonneMM and smm-gateway are supported.
++ * When using the u-boot FF-A driver, any MM SP is supported.
+ *
* Return: status code
*/
--static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
-+static efi_status_t __efi_runtime mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
- {
- efi_status_t ret;
- struct efi_mm_communicate_header *mm_hdr;
-@@ -162,7 +404,11 @@ static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
+ static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
+@@ -162,7 +431,17 @@ static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize)
mm_hdr = (struct efi_mm_communicate_header *)comm_buf;
var_hdr = (struct smm_variable_communicate_header *)mm_hdr->data;
-+ #if (IS_ENABLED(CONFIG_OPTEE))
- ret = optee_mm_communicate(comm_buf, dsize);
-+ #elif (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
-+ ret = ffa_mm_communicate(comm_buf, dsize);
-+ #endif
+- ret = optee_mm_communicate(comm_buf, dsize);
++ ret = select_ffa_mm_comms();
++ if (ret != EFI_SUCCESS) {
++#if (IS_ENABLED(CONFIG_OPTEE))
++ ret = optee_mm_communicate(comm_buf, dsize);
++#endif
++ } else {
++#if (IS_ENABLED(CONFIG_ARM_FFA_TRANSPORT))
++ ret = ffa_mm_communicate(comm_buf, dsize);
++#endif
++ }
++
if (ret != EFI_SUCCESS) {
log_err("%s failed!\n", __func__);
return ret;
-@@ -258,6 +504,13 @@ efi_status_t EFIAPI get_max_payload(efi_uintn_t *size)
+@@ -258,6 +537,13 @@ efi_status_t EFIAPI get_max_payload(efi_uintn_t *size)
goto out;
}
*size = var_payload->size;
@@ -526,7 +484,7 @@ index dfef18435d..7d9d577281 100644
/*
* There seems to be a bug in EDK2 miscalculating the boundaries and
* size checks, so deduct 2 more bytes to fulfill this requirement. Fix
-@@ -697,7 +950,7 @@ void efi_variables_boot_exit_notify(void)
+@@ -697,7 +983,7 @@ void efi_variables_boot_exit_notify(void)
ret = EFI_NOT_FOUND;
if (ret != EFI_SUCCESS)
new file mode 100644
@@ -0,0 +1,76 @@
+From 46cadb787a3b13da39419706fae7d1ba703f4b68 Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Fri, 23 Sep 2022 15:17:21 +0100
+Subject: [PATCH 10/25] arm_ffa: efi: corstone1000: enable MM communication
+
+turn on EFI MM communication
+
+On corstone1000 platform MM communication between u-boot
+and the secure world (Optee) is done using the FF-A bus.
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Cc: Tom Rini <trini@konsulko.com>
+Cc: Simon Glass <sjg@chromium.org>
+Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
+Cc: Jens Wiklander <jens.wiklander@linaro.org>
+Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20221122131751.22747-1-abdellatif.elkhlifi@arm.com/]
+
+Changelog:
+===============
+
+v8:
+
+* drop OP-TEE configs from Corstone-1000 defconfig
+
+v7:
+
+* improve the definition of FFA_SHARED_MM_BUFFER_ADDR and
+ FFA_SHARED_MM_BUFFER_OFFSET
+* update FFA_SHARED_MM_BUFFER_ADDR value
+
+v6:
+
+* corstone-1000: enable optee driver
+* corstone-1000: remove CONFIG_ARM_FFA_EFI_RUNTIME_MODE from the defconfig
+
+v4:
+
+* corstone-1000: turn on EFI MM communication
+---
+ configs/corstone1000_defconfig | 2 ++
+ include/configs/corstone1000.h | 9 +++++++++
+ 2 files changed, 11 insertions(+)
+
+diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
+index ed2e0fe70a..c26f99e7e5 100644
+--- a/configs/corstone1000_defconfig
++++ b/configs/corstone1000_defconfig
+@@ -52,3 +52,5 @@ CONFIG_DM_SERIAL=y
+ CONFIG_USB=y
+ CONFIG_USB_ISP1760=y
+ CONFIG_ERRNO_STR=y
++CONFIG_EFI_MM_COMM_TEE=y
++CONFIG_ARM_FFA_TRANSPORT=y
+diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
+index 8e0230c135..0362d29ac2 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -14,6 +14,15 @@
+
+ #include <linux/sizes.h>
+
++#define FFA_SHARED_MM_BUFFER_SIZE SZ_4K /* 4 KB */
++
++/*
++ * shared buffer physical address used for communication between
++ * u-boot and the MM SP
++ */
++#define FFA_SHARED_MM_BUFFER_ADDR 0x02000000UL
++#define FFA_SHARED_MM_BUFFER_OFFSET 0
++
+ #define V2M_BASE 0x80000000
+
+ #define CONFIG_PL011_CLOCK 50000000
+--
+2.17.1
+
similarity index 83%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi-corstone1000-introduce-EFI-capsule-update.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-introduce-EFI-capsule-update.patch
@@ -1,7 +1,7 @@
-From 10e155a677192731481ebe7f302e2d9ad790346a Mon Sep 17 00:00:00 2001
+From 7702c4aeda51011be95ecbaab0dc2e7373d04286 Mon Sep 17 00:00:00 2001
From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Thu, 28 Jul 2022 15:01:55 +0100
-Subject: [PATCH 16/26] efi: corstone1000: introduce EFI capsule update
+Date: Tue, 29 Nov 2022 15:11:27 +0000
+Subject: [PATCH 11/25] efi: corstone1000: introduce EFI capsule update
This commit provides capsule update feature for Corstone1000.
@@ -22,15 +22,43 @@ Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Upstream-Status: Pending [Not submitted to upstream yet]
---
- include/configs/corstone1000.h | 18 +++++
- include/efi_loader.h | 4 +-
- lib/efi_loader/efi_boottime.c | 36 ++++++++++
- lib/efi_loader/efi_capsule.c | 124 ++++++++++++++++++++++++++++++++-
- lib/efi_loader/efi_setup.c | 15 ++++
- 5 files changed, 193 insertions(+), 4 deletions(-)
+ board/armltd/corstone1000/corstone1000.c | 4 +
+ configs/corstone1000_defconfig | 3 +
+ include/configs/corstone1000.h | 18 ++++
+ include/efi_loader.h | 4 +-
+ lib/efi_loader/efi_boottime.c | 36 +++++++
+ lib/efi_loader/efi_capsule.c | 124 ++++++++++++++++++++++-
+ lib/efi_loader/efi_setup.c | 15 +++
+ 7 files changed, 200 insertions(+), 4 deletions(-)
+diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
+index 4f4b96a095..76816f8f4e 100644
+--- a/board/armltd/corstone1000/corstone1000.c
++++ b/board/armltd/corstone1000/corstone1000.c
+@@ -66,6 +66,10 @@ static struct mm_region corstone1000_mem_map[] = {
+
+ struct mm_region *mem_map = corstone1000_mem_map;
+
++void set_dfu_alt_info(char *interface, char *devstr)
++{
++}
++
+ int board_init(void)
+ {
+ return 0;
+diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
+index c26f99e7e5..c72d027711 100644
+--- a/configs/corstone1000_defconfig
++++ b/configs/corstone1000_defconfig
+@@ -54,3 +54,6 @@ CONFIG_USB_ISP1760=y
+ CONFIG_ERRNO_STR=y
+ CONFIG_EFI_MM_COMM_TEE=y
+ CONFIG_ARM_FFA_TRANSPORT=y
++CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
++CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y
++CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 5960c6b4be..fe5ec0adcd 100644
+index 0362d29ac2..4d20090c9b 100644
--- a/include/configs/corstone1000.h
+++ b/include/configs/corstone1000.h
@@ -14,6 +14,24 @@
@@ -59,10 +87,10 @@ index 5960c6b4be..fe5ec0adcd 100644
/*
diff --git a/include/efi_loader.h b/include/efi_loader.h
-index 5b41985244..796419b69b 100644
+index 545ba06d94..773c4f6310 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
-@@ -984,11 +984,11 @@ extern const struct efi_firmware_management_protocol efi_fmp_fit;
+@@ -993,11 +993,11 @@ extern const struct efi_firmware_management_protocol efi_fmp_fit;
extern const struct efi_firmware_management_protocol efi_fmp_raw;
/* Capsule update */
@@ -77,10 +105,10 @@ index 5b41985244..796419b69b 100644
efi_uintn_t capsule_count,
u64 *maximum_capsule_size,
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index cede7826bd..9bf2596597 100644
+index 1099ccc800..d9eed33ac8 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
-@@ -2095,6 +2095,33 @@ static void efi_exit_caches(void)
+@@ -2103,6 +2103,33 @@ static void efi_exit_caches(void)
#endif
}
@@ -106,7 +134,7 @@ index cede7826bd..9bf2596597 100644
+ msg.data0 = CORSTONE1000_SEPROXY_UPDATE_SVC_ID; /* x3 */
+ msg.data2 = CORSTONE1000_KERNEL_STARTED_EVT; /* x5 */
+
-+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
++ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
+}
+
+#endif
@@ -114,7 +142,7 @@ index cede7826bd..9bf2596597 100644
/**
* efi_exit_boot_services() - stop all boot services
* @image_handle: handle of the loaded image
-@@ -2210,6 +2237,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2209,6 +2236,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
/* Recalculate CRC32 */
efi_update_table_header_crc32(&systab.hdr);
@@ -131,7 +159,7 @@ index cede7826bd..9bf2596597 100644
efi_set_watchdog(0);
WATCHDOG_RESET();
diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index a6b98f066a..c0f3427a60 100644
+index a6b98f066a..636b61f0ad 100644
--- a/lib/efi_loader/efi_capsule.c
+++ b/lib/efi_loader/efi_capsule.c
@@ -25,6 +25,14 @@
@@ -221,7 +249,7 @@ index a6b98f066a..c0f3427a60 100644
+ msg.data1 = capsule_image_size; /* x4 */
+ msg.data2 = CORSTONE1000_BUFFER_READY_EVT; /* x5 */
+
-+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
++ return ffa_bus_ops_get()->sync_send_receive(NULL, CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
+}
+#endif
+
@@ -301,7 +329,7 @@ index a6b98f066a..c0f3427a60 100644
efi_uintn_t capsule_count,
u64 *maximum_capsule_size,
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
-index 492ecf4cb1..bfd4687e10 100644
+index c633fcd91e..443f409906 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -16,6 +16,13 @@
similarity index 86%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-arm-corstone1000-fix-unrecognized-filesystem-type.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch
@@ -1,7 +1,7 @@
-From 3f8d35ccbb0d59d4820b81f7f939ada95b3cd92c Mon Sep 17 00:00:00 2001
+From 71162273e8a6b28a6aaf8635cff752419d09a293 Mon Sep 17 00:00:00 2001
From: Rui Miguel Silva <rui.silva@linaro.org>
Date: Fri, 4 Mar 2022 15:56:09 +0000
-Subject: [PATCH 18/26] arm: corstone1000: fix unrecognized filesystem type
+Subject: [PATCH 12/25] arm: corstone1000: fix unrecognized filesystem type
Some usb sticks are not recognized by usb, just add a
delay before checking status.
similarity index 89%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch
@@ -1,7 +1,7 @@
-From 3bb5826af8e3891617d41a30419de0ce089f9fc3 Mon Sep 17 00:00:00 2001
+From f8ccaf53dec63d57bab2f86b822f9fb3ed06d132 Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 10 Dec 2021 20:03:35 +0000
-Subject: [PATCH 19/26] efi_capsule: corstone1000: pass interface id and buffer
+Subject: [PATCH 13/25] efi_capsule: corstone1000: pass interface id and buffer
event id using register w4
Initially the interface/event IDs are passed to the SP using register
@@ -23,7 +23,7 @@ Upstream-Status: Pending [Not submitted to upstream yet]
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 2d89a8966e..4637dd5d5d 100644
+index 4d20090c9b..77f96e87a1 100644
--- a/include/configs/corstone1000.h
+++ b/include/configs/corstone1000.h
@@ -24,6 +24,12 @@
@@ -40,7 +40,7 @@ index 2d89a8966e..4637dd5d5d 100644
#define CORSTONE1000_CAPSULE_BUFFER_SIZE (8192) /* 32 MB */
diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index c0f3427a60..bf8bd68256 100644
+index 636b61f0ad..c22b9b5aa0 100644
--- a/lib/efi_loader/efi_capsule.c
+++ b/lib/efi_loader/efi_capsule.c
@@ -28,6 +28,8 @@
@@ -67,7 +67,7 @@ index c0f3427a60..bf8bd68256 100644
+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+ PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w4 */
- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
+ return ffa_bus_ops_get()->sync_send_receive(NULL, CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
}
--
2.17.1
similarity index 86%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_boottime-corstone1000-pass-interface-id-and-kern.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_boottime-corstone1000-pass-interface-id-and-kern.patch
@@ -1,7 +1,7 @@
-From 668fe40ccb0db5542ef333cd4655511dbb8572f9 Mon Sep 17 00:00:00 2001
+From e4e7ccc77a4e6930a768cc1c1f6daf8907ac16c3 Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 10 Dec 2021 20:10:41 +0000
-Subject: [PATCH 20/26] efi_boottime: corstone1000: pass interface id and
+Subject: [PATCH 14/25] efi_boottime: corstone1000: pass interface id and
kernel event id using register w4
Initially the interface/event IDs are passed to the SP using register
@@ -22,10 +22,10 @@ Upstream-Status: Pending [Not submitted to upstream yet]
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 9bf2596597..de815484d2 100644
+index d9eed33ac8..88f2d050be 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
-@@ -27,6 +27,11 @@
+@@ -30,6 +30,11 @@
#include <arm_ffa.h>
#endif
@@ -37,7 +37,7 @@ index 9bf2596597..de815484d2 100644
DECLARE_GLOBAL_DATA_PTR;
/* Task priority level */
-@@ -2112,10 +2117,12 @@ static int efi_corstone1000_kernel_started_event(void)
+@@ -2120,10 +2125,12 @@ static int efi_corstone1000_kernel_started_event(void)
log_debug("[%s]\n", __func__);
/*
@@ -51,7 +51,7 @@ index 9bf2596597..de815484d2 100644
+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+ PREP_SEPROXY_EVT(CORSTONE1000_KERNEL_STARTED_EVT); /* w4 */
- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
}
--
2.17.1
deleted file mode 100644
@@ -1,53 +0,0 @@
-From 01d1487cebc37834e2a5d259e0417a610539a0f5 Mon Sep 17 00:00:00 2001
-From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Thu, 9 Jun 2022 12:47:35 +0100
-Subject: [PATCH 15/26] arm_ffa: corstone1000: enable FF-A and MM support
-
-This commit allows corstone1000 platform to perform
-MM communication between u-boot and the secure world
-using FF-A transport.
-
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20220926101723.9965-1-abdellatif.elkhlifi@arm.com/]
----
- configs/corstone1000_defconfig | 2 ++
- include/configs/corstone1000.h | 9 +++++++++
- 2 files changed, 11 insertions(+)
-
-diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
-index e573fe6fe6..c299dda49f 100644
---- a/configs/corstone1000_defconfig
-+++ b/configs/corstone1000_defconfig
-@@ -44,6 +44,8 @@ CONFIG_USB=y
- CONFIG_DM_USB=y
- CONFIG_USB_ISP1760=y
- CONFIG_USB_STORAGE=y
-+CONFIG_ARM_FFA_TRANSPORT=y
-+CONFIG_ARM_FFA_EFI_RUNTIME_MODE=y
- CONFIG_EFI_MM_COMM_TEE=y
- # CONFIG_OPTEE is not set
- # CONFIG_GENERATE_SMBIOS_TABLE is not set
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 8ba0effb0a..5960c6b4be 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -14,6 +14,15 @@
-
- #include <linux/sizes.h>
-
-+#define FFA_SHARED_MM_BUFFER_SIZE SZ_4K /* 4 KB */
-+
-+/*
-+ * shared buffer physical address used for communication between
-+ * u-boot and the MM SP
-+ */
-+#define FFA_SHARED_MM_BUFFER_ADDR (0x023F8000)
-+#define FFA_SHARED_MM_BUFFER_OFFSET (0)
-+
- #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x03f00000)
- #define CONFIG_SKIP_LOWLEVEL_INIT
-
-2.17.1
-
similarity index 90%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-efi_loader-corstone1000-remove-guid-check-from-corst.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_loader-corstone1000-remove-guid-check-from-corst.patch
@@ -1,7 +1,7 @@
-From 4d7fd850347dbea10a73cd5cf6eb518607118414 Mon Sep 17 00:00:00 2001
+From caf6c4ec65fd0a5e945dd790f2369acd163d1daf Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Sat, 11 Dec 2021 13:23:55 +0000
-Subject: [PATCH 21/26] efi_loader: corstone1000: remove guid check from
+Subject: [PATCH 15/25] efi_loader: corstone1000: remove guid check from
corstone1000 config option
Use generic fmp guid and no separte check is required for
@@ -15,7 +15,7 @@ Upstream-Status: Pending [Not submitted to upstream yet]
1 file changed, 1 insertion(+), 15 deletions(-)
diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index bf8bd68256..5db9d30d53 100644
+index c22b9b5aa0..0eee3c2d4c 100644
--- a/lib/efi_loader/efi_capsule.c
+++ b/lib/efi_loader/efi_capsule.c
@@ -646,12 +646,6 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
similarity index 86%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
@@ -1,7 +1,7 @@
-From 720e5ada733b0f7b019baaec57d74603a9dff67e Mon Sep 17 00:00:00 2001
+From 41a2c8bb23e587e9abe7b8bc62db1a93c0e5d841 Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 17 Dec 2021 19:49:02 +0000
-Subject: [PATCH 22/26] efi_loader: populate ESRT table if EFI_ESRT config
+Subject: [PATCH 16/25] efi_loader: populate ESRT table if EFI_ESRT config
option is set
This change is to call efi_esrt_populate function if CONFIG_EFI_ESRT
@@ -15,7 +15,7 @@ Upstream-Status: Pending [Not submitted to upstream yet]
1 file changed, 7 insertions(+)
diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index 5db9d30d53..65e2fc8296 100644
+index 0eee3c2d4c..94dc0dfe3d 100644
--- a/lib/efi_loader/efi_capsule.c
+++ b/lib/efi_loader/efi_capsule.c
@@ -668,6 +668,13 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
deleted file mode 100644
@@ -1,34 +0,0 @@
-From a84f6be14f1bb31edea987fc02efd5a079a28db1 Mon Sep 17 00:00:00 2001
-From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Date: Wed, 17 Nov 2021 15:28:06 +0000
-Subject: [PATCH 17/26] corstone1000: Update FFA shared buffer address
-
-FFA shared buffer address changed to 0x02000000.
-
-The existing address 0x023F8000 is currently being used by
-Optee so the virtual address returned to the SMM gateway is 0x0000.
-So the buffer is moved to 0x02000000.
-
-Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Pending [Not submitted to upstream yet]
----
- include/configs/corstone1000.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index fe5ec0adcd..2d89a8966e 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -38,7 +38,7 @@
- * shared buffer physical address used for communication between
- * u-boot and the MM SP
- */
--#define FFA_SHARED_MM_BUFFER_ADDR (0x023F8000)
-+#define FFA_SHARED_MM_BUFFER_ADDR (0x02000000)
- #define FFA_SHARED_MM_BUFFER_OFFSET (0)
-
- #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x03f00000)
-2.17.1
-
similarity index 96%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_firmware-add-get_image_info-for-corstone1000.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-efi_firmware-add-get_image_info-for-corstone1000.patch
@@ -1,7 +1,7 @@
-From 2cad562823976134f201d6e2ef187bf103e17d1e Mon Sep 17 00:00:00 2001
+From 323df950c63af6d1a9ba5bd16f4f9d9348e9afc2 Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 17 Dec 2021 19:50:25 +0000
-Subject: [PATCH 23/26] efi_firmware: add get_image_info for corstone1000
+Subject: [PATCH 17/25] efi_firmware: add get_image_info for corstone1000
This change is to populate get_image_info which eventually
will be populated in ESRT table
similarity index 91%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-efi_loader-send-bootcomplete-message-to-secure-encla.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-efi_loader-send-bootcomplete-message-to-secure-encla.patch
@@ -1,7 +1,7 @@
-From 709e5d8ff07474f840f1d34d3077135f77795452 Mon Sep 17 00:00:00 2001
+From 7bf9c380c63726b7de8316e9c743cb06c9bc7842 Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Mon, 15 Aug 2022 15:46:18 +0100
-Subject: [PATCH 24/26] efi_loader: send bootcomplete message to secure enclave
+Subject: [PATCH 18/25] efi_loader: send bootcomplete message to secure enclave
On corstone1000 platform, Secure Enclave will be expecting
an event from uboot when it performs capsule update. Previously,
@@ -21,7 +21,7 @@ Upstream-Status: Pending [Not submitted to upstream yet]
4 files changed, 41 insertions(+), 45 deletions(-)
diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 4637dd5d5d..333b1d93b6 100644
+index 77f96e87a1..4cf1170ffb 100644
--- a/include/configs/corstone1000.h
+++ b/include/configs/corstone1000.h
@@ -22,7 +22,7 @@
@@ -34,10 +34,10 @@ index 4637dd5d5d..333b1d93b6 100644
#define PREP_SEPROXY_SVC_ID_MASK GENMASK(31, 16)
#define PREP_SEPROXY_SVC_ID(x) (FIELD_PREP(PREP_SEPROXY_SVC_ID_MASK, (x)))
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index de815484d2..cede7826bd 100644
+index 88f2d050be..1099ccc800 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
-@@ -27,11 +27,6 @@
+@@ -30,11 +30,6 @@
#include <arm_ffa.h>
#endif
@@ -49,7 +49,7 @@ index de815484d2..cede7826bd 100644
DECLARE_GLOBAL_DATA_PTR;
/* Task priority level */
-@@ -2100,35 +2095,6 @@ static void efi_exit_caches(void)
+@@ -2108,35 +2103,6 @@ static void efi_exit_caches(void)
#endif
}
@@ -77,7 +77,7 @@ index de815484d2..cede7826bd 100644
- msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
- PREP_SEPROXY_EVT(CORSTONE1000_KERNEL_STARTED_EVT); /* w4 */
-
-- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
+- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
-}
-
-#endif
@@ -85,7 +85,7 @@ index de815484d2..cede7826bd 100644
/**
* efi_exit_boot_services() - stop all boot services
* @image_handle: handle of the loaded image
-@@ -2244,15 +2210,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2243,15 +2209,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
/* Recalculate CRC32 */
efi_update_table_header_crc32(&systab.hdr);
@@ -115,7 +115,7 @@ index af43d4502f..25f427b936 100644
}
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
-index bfd4687e10..6c9e14c37e 100644
+index 443f409906..c154eb0e9d 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -17,6 +17,9 @@
@@ -156,7 +156,7 @@ index bfd4687e10..6c9e14c37e 100644
+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+ PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w4 */
+
-+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
++ return ffa_bus_ops_get()->sync_send_receive(NULL, CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
+}
+#endif
+
similarity index 94%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-efi_loader-fix-null-pointer-exception-with-get_image.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-efi_loader-fix-null-pointer-exception-with-get_image.patch
@@ -1,7 +1,7 @@
-From 456e616401b02a579e9ea5ec3e5ab1d1c884b389 Mon Sep 17 00:00:00 2001
+From 28e7a47c7021b7d321bb6e4dbe1bd7d2ceb8aa6d Mon Sep 17 00:00:00 2001
From: Vishnu Banavath <vishnu.banavath@arm.com>
Date: Fri, 14 Jan 2022 15:24:18 +0000
-Subject: [PATCH 25/26] efi_loader: fix null pointer exception with
+Subject: [PATCH 19/25] efi_loader: fix null pointer exception with
get_image_info
get_img_info API implemented for corstone1000 target does not
new file mode 100644
@@ -0,0 +1,99 @@
+From d662633cb8e90144969790b8abf047a3f777e47a Mon Sep 17 00:00:00 2001
+From: Rui Miguel Silva <rui.silva@linaro.org>
+Date: Wed, 30 Nov 2022 15:37:22 +0000
+Subject: [PATCH 20/25] arm:corstone1000: add mmc for fvp
+
+Enable support mmc/sdcard for the corstone1000 FVP.
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+Upstream-Status: Pending [Not submitted to upstream yet]
+---
+ board/armltd/corstone1000/corstone1000.c | 28 +++++++++++++++++++-----
+ configs/corstone1000_defconfig | 8 ++++++-
+ include/configs/corstone1000.h | 4 +++-
+ 3 files changed, 32 insertions(+), 8 deletions(-)
+
+diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
+index 76816f8f4e..d6ca6e8961 100644
+--- a/board/armltd/corstone1000/corstone1000.c
++++ b/board/armltd/corstone1000/corstone1000.c
+@@ -38,19 +38,35 @@ static struct mm_region corstone1000_mem_map[] = {
+ }, {
+ /* USB */
+ .virt = 0x40200000UL,
+- .phys = 0x40200000UL,
++ .phys = 0x40200000UL,
++ .size = 0x00100000UL,
++ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
++ PTE_BLOCK_NON_SHARE |
++ PTE_BLOCK_PXN | PTE_BLOCK_UXN
++ }, {
++ /* MMC0 */
++ .virt = 0x40300000UL,
++ .phys = 0x40300000UL,
+ .size = 0x00100000UL,
+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+- PTE_BLOCK_NON_SHARE |
+- PTE_BLOCK_PXN | PTE_BLOCK_UXN
++ PTE_BLOCK_NON_SHARE |
++ PTE_BLOCK_PXN | PTE_BLOCK_UXN
+ }, {
+ /* ethernet */
+ .virt = 0x40100000UL,
+- .phys = 0x40100000UL,
++ .phys = 0x40100000UL,
++ .size = 0x00100000UL,
++ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
++ PTE_BLOCK_NON_SHARE |
++ PTE_BLOCK_PXN | PTE_BLOCK_UXN
++ }, {
++ /* MMC1 */
++ .virt = 0x50000000UL,
++ .phys = 0x50000000UL,
+ .size = 0x00100000UL,
+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+- PTE_BLOCK_NON_SHARE |
+- PTE_BLOCK_PXN | PTE_BLOCK_UXN
++ PTE_BLOCK_NON_SHARE |
++ PTE_BLOCK_PXN | PTE_BLOCK_UXN
+ }, {
+ /* OCVM */
+ .virt = 0x80000000UL,
+diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
+index c72d027711..336da67a8d 100644
+--- a/configs/corstone1000_defconfig
++++ b/configs/corstone1000_defconfig
+@@ -40,7 +40,13 @@ CONFIG_VERSION_VARIABLE=y
+ CONFIG_NET_RANDOM_ETHADDR=y
+ CONFIG_REGMAP=y
+ CONFIG_MISC=y
+-# CONFIG_MMC is not set
++CONFIG_CLK=y
++CONFIG_CMD_MMC=y
++CONFIG_DM_MMC=y
++CONFIG_ARM_PL180_MMCI=y
++CONFIG_MMC_SDHCI_ADMA_HELPERS=y
++CONFIG_MMC_WRITE=y
++CONFIG_DM_GPIO=y
+ CONFIG_PHYLIB=y
+ CONFIG_PHY_SMSC=y
+ CONFIG_SMC911X=y
+diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
+index 4cf1170ffb..1f28a0f6c0 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -58,7 +58,9 @@
+ #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1
+
+ #define BOOT_TARGET_DEVICES(func) \
+- func(USB, usb, 0)
++ func(USB, usb, 0) \
++ func(MMC, mmc, 0) \
++ func(MMC, mmc, 1)
+
+ #include <config_distro_bootcmd.h>
+
+--
+2.17.1
+
new file mode 100644
@@ -0,0 +1,33 @@
+From 37ee9a07d168b43bde17b2ce3dbf637905af5bf2 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@arm.com>
+Date: Wed, 30 Nov 2022 18:59:59 +0000
+Subject: [PATCH 21/25] corstone1000: add compressed kernel support
+
+The corstone1000 kernel has become too large to fit in the available
+storage. Swtiching to a compressed kernel avoids the problem, but
+requires uncompressing it. Add this decompression to the default boot
+instructions.
+
+Signed-off-by: Jon Mason <jon.mason@arm.com>
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Upstream-Status: Pending [Not submitted to upstream yet]
+---
+ configs/corstone1000_defconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
+index 336da67a8d..eeb207aa5f 100644
+--- a/configs/corstone1000_defconfig
++++ b/configs/corstone1000_defconfig
+@@ -15,7 +15,7 @@ CONFIG_FIT=y
+ CONFIG_BOOTDELAY=3
+ CONFIG_USE_BOOTARGS=y
+ CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk"
+-CONFIG_BOOTCOMMAND="run retrieve_kernel_load_addr; echo Loading kernel from $kernel_addr to memory ... ; loadm $kernel_addr $kernel_addr_r 0xc00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;"
++CONFIG_BOOTCOMMAND="run retrieve_kernel_load_addr; echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r 0xf00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;"
+ CONFIG_CONSOLE_RECORD=y
+ CONFIG_LOGLEVEL=7
+ # CONFIG_DISPLAY_CPUINFO is not set
+--
+2.17.1
+
similarity index 74%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-Introduce-external-sys-driver-to-device-tree.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-Introduce-external-sys-driver-to-device-tree.patch
@@ -1,7 +1,7 @@
-From 83f16fe96a86b00f7a4b7c4c4f7416119b80eddd Mon Sep 17 00:00:00 2001
+From a3fae205de2fd6d2abdb8afca6475267c16e9e29 Mon Sep 17 00:00:00 2001
From: Emekcan <emekcan.aras@arm.com>
-Date: Fri, 19 Aug 2022 16:04:48 +0100
-Subject: [PATCH] Introduce external sys driver to device-tree
+Date: Wed, 30 Nov 2022 19:02:26 +0000
+Subject: [PATCH 22/25] Introduce external sys driver to device-tree
It adds external sys driver binding to u-boot
device tree.
@@ -13,10 +13,10 @@ Upstream-Status: Pending [Not submitted to upstream yet]
1 file changed, 7 insertions(+)
diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi
-index d0194aa893..19b6e3ea72 100644
+index 4e46826f88..2c7185e139 100644
--- a/arch/arm/dts/corstone1000.dtsi
+++ b/arch/arm/dts/corstone1000.dtsi
-@@ -160,6 +160,13 @@
+@@ -160,5 +160,12 @@
secure-status = "okay"; /* secure-world-only */
status = "disabled";
};
@@ -28,8 +28,7 @@ index d0194aa893..19b6e3ea72 100644
+ reg-names = "rstreg", "streg";
+ };
};
-
- arm_ffa: arm_ffa {
+ };
--
2.17.1
similarity index 92%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0029-Add-mhu-and-rpmsg-client-to-u-boot-device-tree.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-Add-mhu-and-rpmsg-client-to-u-boot-device-tree.patch
@@ -1,7 +1,7 @@
-From a1b8b91a43cfa9dbaa2d907a6d9629da6f93fa3e Mon Sep 17 00:00:00 2001
+From 55e2bc835be50b23ef04066b950bbe75c0065d19 Mon Sep 17 00:00:00 2001
From: Emekcan <emekcan.aras@arm.com>
Date: Mon, 12 Sep 2022 15:47:06 +0100
-Subject: [PATCH] Add mhu and rpmsg client to u-boot device tree
+Subject: [PATCH 23/25] Add mhu and rpmsg client to u-boot device tree
Adds external system controller and mhu driver to u-boot
device tree. This enables communication between host and
@@ -10,11 +10,11 @@ the external system.
Signed-off-by: Emekcan Aras <Emekcan.Aras@arm.com>
Upstream-Status: Pending [Not submitted to upstream yet]
---
- arch/arm/dts/corstone1000.dtsi | 50 ++++++++++++++++++++++++++++++++
+ arch/arm/dts/corstone1000.dtsi | 50 ++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi
-index 19b6e3ea72..61dd6c432c 100644
+index 2c7185e139..61e0c33247 100644
--- a/arch/arm/dts/corstone1000.dtsi
+++ b/arch/arm/dts/corstone1000.dtsi
@@ -161,6 +161,56 @@
similarity index 92%
rename from meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0030-arm-corstone1000-esrt-support.patch
rename to meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-arm-corstone1000-esrt-support.patch
@@ -1,7 +1,7 @@
-From d8fca6ebd5917df9a12dbf1da6a97f99af06eee9 Mon Sep 17 00:00:00 2001
+From 475f787ba7351282ca3ce0fcf9badc01821cd8a3 Mon Sep 17 00:00:00 2001
From: Satish Kumar <satish.kumar01@arm.com>
-Date: Fri, 19 Aug 2022 09:18:33 +0100
-Subject: [PATCH] arm/corstone1000: esrt support
+Date: Wed, 30 Nov 2022 19:11:43 +0000
+Subject: [PATCH 24/25] arm/corstone1000: esrt support
The implementation is platform specific and would require
change in future.
@@ -15,14 +15,14 @@ Upstream-Status: Inappropriate [Redesign of FMP protocol for ESRT and Capsule up
---
include/efi_api.h | 2 +-
lib/efi_loader/efi_firmware.c | 133 ++++++++++++++++++++++++++++++++++
- lib/efi_loader/efi_setup.c | 16 ++--
- 3 files changed, 142 insertions(+), 9 deletions(-)
+ lib/efi_loader/efi_setup.c | 17 +++--
+ 3 files changed, 143 insertions(+), 9 deletions(-)
diff --git a/include/efi_api.h b/include/efi_api.h
-index 83c01085fd..26899afd01 100644
+index 9bb0d44ac8..fcf2643e14 100644
--- a/include/efi_api.h
+++ b/include/efi_api.h
-@@ -2014,7 +2014,7 @@ struct efi_firmware_image_descriptor {
+@@ -2030,7 +2030,7 @@ struct efi_firmware_image_descriptor {
u32 last_attempt_status;
u64 hardware_instance;
efi_firmware_image_dep_t *dependencies;
@@ -185,13 +185,14 @@ index 28d9a19edb..aa4af8036b 100644
.set_image = efi_firmware_fit_set_image,
.check_image = efi_firmware_check_image_unsupported,
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
-index 6c9e14c37e..6ccda175ff 100644
+index c154eb0e9d..63329bbff8 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
-@@ -168,13 +168,6 @@ static efi_status_t efi_init_capsule(void)
+@@ -167,14 +167,6 @@ static efi_status_t efi_init_capsule(void)
+ efi_status_t ret = EFI_SUCCESS;
#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
- int ffa_ret;
+- int ffa_ret;
-
- ffa_ret = efi_corstone1000_uboot_efi_started_event();
- if (ffa_ret)
@@ -202,11 +203,10 @@ index 6c9e14c37e..6ccda175ff 100644
ret = efi_corstone1000_alloc_capsule_shared_buf();
if (ret != EFI_SUCCESS) {
printf("EFI: Corstone-1000: cannot allocate caspsule shared buffer\n");
-@@ -306,7 +299,14 @@ efi_status_t efi_init_obj_list(void)
- if (ret != EFI_SUCCESS)
- goto out;
- }
--
+@@ -308,6 +300,15 @@ efi_status_t efi_init_obj_list(void)
+ if (ret != EFI_SUCCESS)
+ goto out;
+
+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
+ int ffa_ret;
+ ffa_ret = efi_corstone1000_uboot_efi_started_event();
@@ -215,9 +215,10 @@ index 6c9e14c37e..6ccda175ff 100644
+ else
+ debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
+#endif
++
/* Initialize variable services */
ret = efi_init_variables();
if (ret != EFI_SUCCESS)
--
-2.25.1
+2.17.1
new file mode 100644
@@ -0,0 +1,50 @@
+From de5994cda7a35317f12dc1cedb28cae1b932283a Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Wed, 30 Nov 2022 19:14:52 +0000
+Subject: [PATCH 25/25] efi_setup: discover FF-A bus before raising EFI started
+ event
+
+add FF-A discovery to efi_corstone1000_uboot_efi_started_event()
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Upstream-Status: Pending [Not submitted to upstream yet]
+---
+ lib/efi_loader/efi_setup.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
+index 63329bbff8..cf8abe3af0 100644
+--- a/lib/efi_loader/efi_setup.c
++++ b/lib/efi_loader/efi_setup.c
+@@ -142,9 +142,16 @@ static efi_status_t efi_init_secure_boot(void)
+ static int efi_corstone1000_uboot_efi_started_event(void)
+ {
+ struct ffa_send_direct_data msg = {0};
++ int ret;
+
+ log_debug("[%s]\n", __func__);
+
++ ret = ffa_bus_discover(NULL);
++ if (ret != 0) {
++ log_err("failure to discover FF-A bus\n");
++ return ret;
++ }
++
+ /*
+ * setting the kernel started event arguments:
+ * setting capsule update interface ID(31:16)
+@@ -304,9 +311,9 @@ efi_status_t efi_init_obj_list(void)
+ int ffa_ret;
+ ffa_ret = efi_corstone1000_uboot_efi_started_event();
+ if (ffa_ret)
+- debug("[efi_boottime][ERROR]: Failure to notify SE Proxy FW update service\n");
++ log_err("Failure to notify SE Proxy FW update service\n");
+ else
+- debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
++ debug("SE Proxy FW update service notified\n");
+ #endif
+
+ /* Initialize variable services */
+--
+2.17.1
+
deleted file mode 100644
@@ -1,149 +0,0 @@
-From 5e4c819c7ab0841429016c098106615b33486c8b Mon Sep 17 00:00:00 2001
-From: Rui Miguel Silva <rui.silva@linaro.org>
-Date: Tue, 5 Apr 2022 10:24:38 +0100
-Subject: [PATCH 26/26] arm:corstone1000: add mmc for fvp
-
-Enable support mmc/sdcard for the corstone1000 FVP.
-
-Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
-Upstream-Status: Pending [Not submitted to upstream yet]
----
- arch/arm/dts/corstone1000-fvp.dts | 28 +++++++++++++++
- board/armltd/corstone1000/corstone1000.c | 46 ++++++++++++++++--------
- configs/corstone1000_defconfig | 8 ++++-
- include/configs/corstone1000.h | 4 ++-
- 4 files changed, 69 insertions(+), 17 deletions(-)
-
-diff --git a/arch/arm/dts/corstone1000-fvp.dts b/arch/arm/dts/corstone1000-fvp.dts
-index 1fcc137a49..26b0f1b3ce 100644
---- a/arch/arm/dts/corstone1000-fvp.dts
-+++ b/arch/arm/dts/corstone1000-fvp.dts
-@@ -20,4 +20,32 @@
- interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
- reg-io-width = <2>;
- };
-+
-+ vmmc_v3_3d: fixed_v3_3d {
-+ compatible = "regulator-fixed";
-+ regulator-name = "vmmc_supply";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ regulator-always-on;
-+ };
-+
-+ sdmmc0: mmc@40300000 {
-+ compatible = "arm,pl18x", "arm,primecell";
-+ reg = <0x40300000 0x1000>;
-+ interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;
-+ max-frequency = <12000000>;
-+ vmmc-supply = <&vmmc_v3_3d>;
-+ clocks = <&smbclk>, <&refclk100mhz>;
-+ clock-names = "smclk", "apb_pclk";
-+ };
-+
-+ sdmmc1: mmc@50000000 {
-+ compatible = "arm,pl18x", "arm,primecell";
-+ reg = <0x50000000 0x10000>;
-+ interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
-+ max-frequency = <12000000>;
-+ vmmc-supply = <&vmmc_v3_3d>;
-+ clocks = <&smbclk>, <&refclk100mhz>;
-+ clock-names = "smclk", "apb_pclk";
-+ };
- };
-diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
-index 2fa485ff37..3d537d7a90 100644
---- a/board/armltd/corstone1000/corstone1000.c
-+++ b/board/armltd/corstone1000/corstone1000.c
-@@ -46,22 +46,38 @@ static struct mm_region corstone1000_mem_map[] = {
- .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
- PTE_BLOCK_NON_SHARE |
- PTE_BLOCK_PXN | PTE_BLOCK_UXN
-- }, {
-- /* USB */
-- .virt = 0x40200000UL,
-- .phys = 0x40200000UL,
-- .size = 0x00100000UL,
-- .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-- PTE_BLOCK_NON_SHARE |
-- PTE_BLOCK_PXN | PTE_BLOCK_UXN
- }, {
-- /* ethernet */
-- .virt = 0x40100000UL,
-- .phys = 0x40100000UL,
-- .size = 0x00100000UL,
-- .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-- PTE_BLOCK_NON_SHARE |
-- PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ /* USB */
-+ .virt = 0x40200000UL,
-+ .phys = 0x40200000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* MMC0 */
-+ .virt = 0x40300000UL,
-+ .phys = 0x40300000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* ethernet */
-+ .virt = 0x40100000UL,
-+ .phys = 0x40100000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
-+ }, {
-+ /* MMC1 */
-+ .virt = 0x50000000UL,
-+ .phys = 0x50000000UL,
-+ .size = 0x00100000UL,
-+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-+ PTE_BLOCK_NON_SHARE |
-+ PTE_BLOCK_PXN | PTE_BLOCK_UXN
- }, {
- /* OCVM */
- .virt = 0x80000000UL,
-diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig
-index c299dda49f..76e07fc20c 100644
---- a/configs/corstone1000_defconfig
-+++ b/configs/corstone1000_defconfig
-@@ -38,7 +38,13 @@ CONFIG_CMD_EFIDEBUG=y
- CONFIG_CMD_FAT=y
- CONFIG_OF_CONTROL=y
- CONFIG_REGMAP=y
--# CONFIG_MMC is not set
-+CONFIG_CLK=y
-+CONFIG_CMD_MMC=y
-+CONFIG_DM_MMC=y
-+CONFIG_ARM_PL180_MMCI=y
-+CONFIG_MMC_SDHCI_ADMA_HELPERS=y
-+CONFIG_MMC_WRITE=y
-+CONFIG_DM_GPIO=y
- CONFIG_DM_SERIAL=y
- CONFIG_USB=y
- CONFIG_DM_USB=y
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 333b1d93b6..815239590e 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -89,7 +89,9 @@
- #define CONFIG_SYS_MAXARGS 64 /* max command args */
-
- #define BOOT_TARGET_DEVICES(func) \
-- func(USB, usb, 0)
-+ func(USB, usb, 0) \
-+ func(MMC, mmc, 0) \
-+ func(MMC, mmc, 1)
-
- #include <config_distro_bootcmd.h>
-
-2.17.1
-
new file mode 100644
@@ -0,0 +1,27 @@
+From 15778524604652db60f704a772b6815d0f4305bf Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Mon, 5 Dec 2022 17:02:32 +0000
+Subject: [PATCH] corstone1000: enable distro booting command
+
+enable distro_bootcmd
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Upstream-Status: Pending [Not submitted to upstream yet]
+---
+ include/configs/corstone1000.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
+index 1f28a0f6c0..548856b970 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -64,5 +64,6 @@
+
+ #include <config_distro_bootcmd.h>
+
++#define CONFIG_EXTRA_ENV_SETTINGS BOOTENV
+
+ #endif
+--
+2.17.1
+
deleted file mode 100644
@@ -1,34 +0,0 @@
-From 26c8a8528b794dbaba49bcf3e1bae8a1e15a8448 Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@arm.com>
-Date: Thu, 25 Aug 2022 11:21:28 +0100
-Subject: [PATCH] corstone1000: add compressed kernel support
-
-The corstone1000 kernel has become too large to fit in the available
-storage. Swtiching to a compressed kernel avoids the problem, but
-requires uncompressing it. Add this decompression to the default boot
-instructions.
-
-Signed-off-by: Jon Mason <jon.mason@arm.com>
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Pending [Not submitted to upstream yet]
----
- include/configs/corstone1000.h | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index 815239590e..a8aa105fe6 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -120,7 +120,8 @@
- #define CONFIG_BOOTCOMMAND \
- "run retrieve_kernel_load_addr;" \
- "echo Loading kernel from $kernel_addr to memory ... ;" \
-- "loadm $kernel_addr $kernel_addr_r 0xc00000;" \
-+ "unzip $kernel_addr 0x90000000;" \
-+ "loadm 0x90000000 $kernel_addr_r 0xf00000;" \
- "usb start; usb reset;" \
- "run distro_bootcmd;" \
- "bootefi $kernel_addr_r $fdtcontroladdr;"
-2.17.1
-
deleted file mode 100644
@@ -1,182 +0,0 @@
-From 6cb8e5f83d53357fbc6e58c2c5c5a3450654f9e6 Mon Sep 17 00:00:00 2001
-From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Date: Wed, 19 Oct 2022 17:51:10 +0100
-Subject: [PATCH] arm_ffa: add support for 32-bit direct messaging
-
-add 32-bit mode for FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP
-
-Tested-by: Mohamed Omar Asaker <mohamed.omarasaker@arm.com>
-Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
-Upstream-Status: Pending [Not submitted to upstream yet]
----
- cmd/armffa.c | 2 +-
- drivers/firmware/arm-ffa/core.c | 17 ++++++++++++++---
- drivers/firmware/arm-ffa/sandbox.c | 2 +-
- include/arm_ffa.h | 2 +-
- lib/efi_loader/efi_capsule.c | 2 +-
- lib/efi_loader/efi_setup.c | 2 +-
- lib/efi_loader/efi_variable_tee.c | 2 +-
- test/dm/ffa.c | 6 +++---
- 8 files changed, 23 insertions(+), 12 deletions(-)
-
-diff --git a/cmd/armffa.c b/cmd/armffa.c
-index 9b56e8a830..9842b99181 100644
---- a/cmd/armffa.c
-+++ b/cmd/armffa.c
-@@ -129,7 +129,7 @@ int do_ffa_msg_send_direct_req(struct cmd_tbl *cmdtp, int flag, int argc,
- return -EINVAL;
- }
-
-- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
- if (ret == 0) {
- u8 cnt;
-
-diff --git a/drivers/firmware/arm-ffa/core.c b/drivers/firmware/arm-ffa/core.c
-index caba10caae..ba1ba59937 100644
---- a/drivers/firmware/arm-ffa/core.c
-+++ b/drivers/firmware/arm-ffa/core.c
-@@ -1032,6 +1032,7 @@ static int ffa_cache_partitions_info(void)
- * ffa_msg_send_direct_req - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function
- * @dst_part_id: destination partition ID
- * @msg: pointer to the message data preallocated by the client (in/out)
-+ * @is_smc64: select 64-bit or 32-bit FF-A ABI
- *
- * This is the runtime function that implements FFA_MSG_SEND_DIRECT_{REQ,RESP}
- * FF-A functions.
-@@ -1048,10 +1049,12 @@ static int ffa_cache_partitions_info(void)
- *
- * 0 on success. Otherwise, failure
- */
--static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_send_direct_data *msg)
-+static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_send_direct_data *msg,
-+ u8 is_smc64)
- {
- ffa_value_t res = {0};
- int ffa_errno;
-+ u64 req_mode, resp_mode;
-
- if (!ffa_priv_data || !ffa_priv_data->invoke_ffa_fn)
- return -EINVAL;
-@@ -1060,8 +1063,16 @@ static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_sen
- if (!ffa_priv_data->partitions.count || !ffa_priv_data->partitions.descs)
- return -ENODEV;
-
-+ if(is_smc64) {
-+ req_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ);
-+ resp_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP);
-+ } else {
-+ req_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_REQ);
-+ resp_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_RESP);
-+ }
-+
- ffa_priv_data->invoke_ffa_fn((ffa_value_t){
-- .a0 = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ),
-+ .a0 = req_mode,
- .a1 = PREP_SELF_ENDPOINT_ID(ffa_priv_data->id) |
- PREP_PART_ENDPOINT_ID(dst_part_id),
- .a2 = 0,
-@@ -1083,7 +1094,7 @@ static int __ffa_runtime ffa_msg_send_direct_req(u16 dst_part_id, struct ffa_sen
- return 0;
- }
-
-- if (res.a0 == FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP)) {
-+ if (res.a0 == resp_mode){
- /*
- * Message sent with response
- * extract the return data
-diff --git a/drivers/firmware/arm-ffa/sandbox.c b/drivers/firmware/arm-ffa/sandbox.c
-index 16e1fdc809..8e8549441d 100644
---- a/drivers/firmware/arm-ffa/sandbox.c
-+++ b/drivers/firmware/arm-ffa/sandbox.c
-@@ -430,7 +430,7 @@ static int sandbox_ffa_sp_valid(u16 part_id)
- * @{a0-a7} , res: The SMC call arguments and return structure.
- *
- * This is the function that emulates FFA_MSG_SEND_DIRECT_{REQ,RESP}
-- * FF-A functions.
-+ * FF-A functions. Only SMC 64-bit is supported in Sandbox.
- *
- * Emulating interrupts is not supported. So, FFA_RUN and FFA_INTERRUPT are not supported.
- * In case of success FFA_MSG_SEND_DIRECT_RESP is returned with default pattern data (0xff).
-diff --git a/include/arm_ffa.h b/include/arm_ffa.h
-index 665413a0c5..4a7c59ff28 100644
---- a/include/arm_ffa.h
-+++ b/include/arm_ffa.h
-@@ -97,7 +97,7 @@ struct __packed ffa_send_direct_data {
- struct ffa_bus_ops {
- int (*partition_info_get)(const char *uuid_str,
- u32 *parts_size, struct ffa_partition_info *buffer);
-- int (*sync_send_receive)(u16 dst_part_id, struct ffa_send_direct_data *msg);
-+ int (*sync_send_receive)(u16 dst_part_id, struct ffa_send_direct_data *msg, u8 is_smc64);
- int (*rxtx_unmap)(void);
- };
-
-diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index 65e2fc8296..c479c53d04 100644
---- a/lib/efi_loader/efi_capsule.c
-+++ b/lib/efi_loader/efi_capsule.c
-@@ -591,7 +591,7 @@ static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_s
- msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
- PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w4 */
-
-- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
-+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
- }
- #endif
-
-diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
-index 6ccda175ff..416af8d663 100644
---- a/lib/efi_loader/efi_setup.c
-+++ b/lib/efi_loader/efi_setup.c
-@@ -153,7 +153,7 @@ static int efi_corstone1000_uboot_efi_started_event(void)
- msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
- PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w4 */
-
-- return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg);
-+ return ffa_bus_ops_get()->sync_send_receive(CORSTONE1000_SEPROXY_PART_ID, &msg, 0);
- }
- #endif
-
-diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
-index 7d9d577281..05f3c02911 100644
---- a/lib/efi_loader/efi_variable_tee.c
-+++ b/lib/efi_loader/efi_variable_tee.c
-@@ -201,7 +201,7 @@ static int __efi_runtime ffa_notify_mm_sp(void)
-
- msg.data0 = FFA_SHARED_MM_BUFFER_OFFSET; /* x3 */
-
-- ret = ffa_bus_ops_get()->sync_send_receive(mm_sp_id, &msg);
-+ ret = ffa_bus_ops_get()->sync_send_receive(mm_sp_id, &msg, 1);
- if (ret != 0)
- return ret;
-
-diff --git a/test/dm/ffa.c b/test/dm/ffa.c
-index 052d5fc3f4..14b19cf71e 100644
---- a/test/dm/ffa.c
-+++ b/test/dm/ffa.c
-@@ -170,7 +170,7 @@ static int test_ffa_msg_send_direct_req(u16 part_id, struct unit_test_state *ut
- struct ffa_send_direct_data msg = {0};
- u8 cnt;
-
-- ut_assertok(ffa_bus_ops_get()->sync_send_receive(part_id, &msg));
-+ ut_assertok(ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1));
-
- for (cnt = 0; cnt < sizeof(struct ffa_send_direct_data) / sizeof(u64); cnt++)
- ut_assertok(((u64 *)&msg)[cnt] != 0xffffffffffffffff);
-@@ -380,12 +380,12 @@ static int dm_test_ffa_nack(struct unit_test_state *uts)
- ut_assertok(count != SANDBOX_SP_COUNT_PER_VALID_SERVICE);
-
- /* send data to an invalid partition */
-- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
- ut_assertok(ret != -EINVAL);
-
- /* send data to a valid partition */
- part_id = prvdata->partitions.descs[0].info.id;
-- ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg);
-+ ret = ffa_bus_ops_get()->sync_send_receive(part_id, &msg, 1);
- ut_assertok(ret != 0);
-
- return CMD_RET_SUCCESS;
-2.17.1
@@ -18,37 +18,32 @@ EXTRA_OEMAKE:append:corstone1000 = ' DEVICE_TREE=${CORSTONE1000_DEVICE_TREE}'
SYSROOT_DIRS:append:corstone1000 = " /boot"
SRC_URI:append:corstone1000 = " \
- file://0001-cmd-load-add-load-command-for-memory-mapped.patch \
- file://0002-arm-add-support-to-corstone1000-platform.patch \
- file://0003-usb-common-move-urb-code-to-common.patch \
- file://0004-usb-add-isp1760-family-driver.patch \
- file://0005-corstone1000-enable-isp1763-usb-controller.patch \
- file://0006-arm64-smccc-add-support-for-SMCCCv1.2-x0-x17-registe.patch \
- file://0007-arm64-smccc-clear-the-Xn-registers-after-SMC-calls.patch \
- file://0008-lib-uuid-introduce-be_uuid_str_to_le_bin-function.patch \
- file://0009-arm_ffa-introduce-Arm-FF-A-low-level-driver.patch \
- file://0010-arm_ffa-introduce-armffa-command.patch \
- file://0011-arm_ffa-introduce-the-FF-A-Sandbox-driver.patch \
- file://0012-arm_ffa-introduce-Sandbox-test-cases-for-UCLASS_FFA.patch \
- file://0013-arm_ffa-introduce-armffa-command-Sandbox-test.patch \
- file://0014-arm_ffa-introduce-FF-A-MM-communication.patch \
- file://0015-arm_ffa-corstone1000-enable-FF-A-and-MM-support.patch \
- file://0016-efi-corstone1000-introduce-EFI-capsule-update.patch \
- file://0017-corstone1000-Update-FFA-shared-buffer-address.patch \
- file://0018-arm-corstone1000-fix-unrecognized-filesystem-type.patch \
- file://0019-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch \
- file://0020-efi_boottime-corstone1000-pass-interface-id-and-kern.patch \
- file://0021-efi_loader-corstone1000-remove-guid-check-from-corst.patch \
- file://0022-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch \
- file://0023-efi_firmware-add-get_image_info-for-corstone1000.patch \
- file://0024-efi_loader-send-bootcomplete-message-to-secure-encla.patch \
- file://0025-efi_loader-fix-null-pointer-exception-with-get_image.patch \
- file://0026-arm-corstone1000-add-mmc-for-fvp.patch \
- file://0027-corstone1000-use-a-compressed-kernel.patch \
- file://0028-Introduce-external-sys-driver-to-device-tree.patch \
- file://0029-Add-mhu-and-rpmsg-client-to-u-boot-device-tree.patch \
- file://0030-arm-corstone1000-esrt-support.patch \
- file://0031-ffa-add-support-for-32-bit-direct-messaging.patch \
+ file://0001-arm64-smccc-add-support-for-SMCCCv1.2-x0-x17-registe.patch \
+ file://0002-lib-uuid-introduce-uuid_str_to_le_bin-function.patch \
+ file://0003-arm_ffa-introduce-Arm-FF-A-low-level-driver.patch \
+ file://0004-arm_ffa-efi-unmap-RX-TX-buffers.patch \
+ file://0005-arm_ffa-introduce-armffa-command.patch \
+ file://0006-arm_ffa-introduce-the-FF-A-Sandbox-driver.patch \
+ file://0007-arm_ffa-introduce-Sandbox-test-cases-for-UCLASS_FFA.patch \
+ file://0008-arm_ffa-introduce-armffa-command-Sandbox-test.patch \
+ file://0009-arm_ffa-efi-introduce-FF-A-MM-communication.patch \
+ file://0010-arm_ffa-efi-corstone1000-enable-MM-communication.patch \
+ file://0011-efi-corstone1000-introduce-EFI-capsule-update.patch \
+ file://0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch \
+ file://0013-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch \
+ file://0014-efi_boottime-corstone1000-pass-interface-id-and-kern.patch \
+ file://0015-efi_loader-corstone1000-remove-guid-check-from-corst.patch \
+ file://0016-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch \
+ file://0017-efi_firmware-add-get_image_info-for-corstone1000.patch \
+ file://0018-efi_loader-send-bootcomplete-message-to-secure-encla.patch \
+ file://0019-efi_loader-fix-null-pointer-exception-with-get_image.patch \
+ file://0020-arm-corstone1000-add-mmc-for-fvp.patch \
+ file://0021-corstone1000-add-compressed-kernel-support.patch \
+ file://0022-Introduce-external-sys-driver-to-device-tree.patch \
+ file://0023-Add-mhu-and-rpmsg-client-to-u-boot-device-tree.patch \
+ file://0024-arm-corstone1000-esrt-support.patch \
+ file://0025-efi_setup-discover-FF-A-bus-before-raising-EFI-start.patch \
+ file://0026-corstone1000-enable-distro-booting-command.patch \
"
#