subtree updates

meta-raspberrypi: b6a1645a97..c57b464b88:
  Lluis Campos (1):
        rpi-cmdline: do_compile: Use pure Python syntax to get `CMDLINE`

meta-openembedded: 2eb39477a7..a755af4fb5:
  Adrian Zaharia (1):
        lapack: add packageconfig for lapacke

  Akash Hadke (1):
        polkit: Add --shell /bin/nologin to polkitd user

  Alex Kiernan (3):
        ntpsec: Add UPSTREAM_CHECK_URI
        libgpiod: Detect ptest using PTEST_ENABLED
        ostree: Cleanup PACKAGECONFIGs

  Anuj Mittal (1):
        yasm: fix buildpaths warning

  Atanas Bunchev (1):
        python3-twitter: Upgrade 4.8.0 -> 4.10.1

  Bartosz Golaszewski (4):
        imagemagick: add PACKAGECONFIG for C++ bindings
        python3-matplotlib: don't use PYTHON_PN
        python3-matplotlib: add packaging to RDEPENDS
        python3-matplotlib: bump to 3.5.2

  Bruce Ashfield (3):
        vboxguestdrivers: fix build against 5.19 kernel / libc-headers
        zfs: update to v2.1.5
        vboxguestdrivers: make kernel shared directory dependency explicit

  Carsten Bäcker (1):
        spdlog: Fix CMake flag

  Changqing Li (3):
        fuse3: support ptest
        redis: fix do_patch fuzz warning
        dlt-daemon: fix dlt-system.service failed since buffer overflow

  Clément Péron (1):
        python: add Pydantic data validation package

  Devendra Tewari (1):
        android-tools: sleep more in android-gadget-start

  Ed Tanous (1):
        Add python-requests-unixsocket recipe

  Enguerrand de Ribaucourt (1):
        mdio-tools: add recipes

  Etienne Cordonnier (1):
        uutils-coreutils: add recipe

  Jagadeesh Krishnanjanappa (4):
        python3-asgiref: add recipe
        python3-django: make 3.2.x as default version
        python3-django: Add python3-asgiref runtime dependency
        python3-django: remove 2.2.x recipe

  Jan Luebbe (2):
        chrony: add support for config and source snippet includes
        gensio: upgrade 2.3.1 -> 2.5.2

  Jan Vermaete (1):
        makeself: added makeself as new recipe

  Jim Broadus (1):
        networkmanager: fix iptables and nft paths

  Jose Quaresma (2):
        wireguard-module: 1.0.20210219 -> 1.0.20220627
        wireguard-tools: Add a new package for wg-quick

  Julian Haller (2):
        pcsc-lite: upgrade 1.9.0 -> 1.9.8
        ccid: upgrade 1.4.33 -> 1.5.0

  Justin Bronder (1):
        lmdb: only set SONAME on the shared library

  Khem Raj (61):
        mariadb: Inherit pkgconfig
        mariadb: Add packageconfig for lz4 and enable it
        ibus: Swith to use main branch instead of master
        kronosnet: Upgrade to 1.24
        ostree: Upgrade to 2022.5 release
        sdbus-c++-libsystemd: Fix build with glibc 2.36
        xfstests: Upgrade to v2022.07.10
        autofs: Fix build with glibc 2.36
        audit: Upgrade to 3.0.8 and fix build with linux 5.17+
        pcp: Add to USERADD_PACKAGES instead of override
        mozjs: Use RUST_HOST_SYS and RUST_TARGET_SYS
        fluentbit: Fix build with clang
        audit: Fix build with musl
        fluentbit: Fix build with musl
        klibc: Upgrade to 2.0.10
        gnome-keyring,cunit,xfce4-panel: Do not inherit remove-libtool class here
        mpd: Update to 0.23.8
        openipmi: Enable largefile cflags
        proftpd: Always enable largefile support
        netperf: Always enable largefile support
        openipmi: Always enable largefile support
        unbound: Always enable largefile support
        sysbench: Always enable largefile support
        libmtp: Always enable largefile support
        toybox: Fix build with glibc 2.36+
        xfstests: Upgrade to 2022.07.31 release
        libmpd: Fix function returns and casts
        audit: Revert the tweak done in configure step in do_install
        mpd: Upgrade to 0.23.9
        fluentbit: Use CMAKE_C_STANDARD_LIBRARIES cmake var to pass libatomic
        fluentbit: Upgrade to 1.9.7 and fix build on x86
        klibc: Fix build with kernel 5.19 headers
        ntpsec: Add -D_GNU_SOURCE and fix building with devtool
        gd: Fix build with clang-15
        cpulimit: Define -D_GNU_SOURCE
        safec: Remove unused variable 'len'
        ncftp: Enable autoreconf
        ncftp: Fix TMPDIR path embedding into ncftpget
        libb64: Switch to github fork and upgrade to 2.0.0.1+git
        dhrystone: Disable warnings as errors with clang
        dibbler: Fix build with musl
        fio: Fix additional warnings seen with musl
        ssmtp: Fix null pointer assignments
        gst-editing-services: Add recipe
        rygel: Upgrade to 0.40.4
        libesmtp: Define _GNU_SOURCE
        python3-grpcio: Enable largefile support explicitly
        libteam: Include missing headers for strrchr and memcmp
        neon: Upgrade to 0.32.2
        satyr: Fix build on musl/clang
        libmusicbrainz: Avoid -Wnonnull warning
        aom: Upgrade to 3.4.0
        vorbis-tools: Fix build on musl
        dvb-apps: Use tarball for SRC_URI and fix build on musl
        python3-netifaces: Fix build with python3 and musl
        python3-pyephem: Fix build with python3 and musl
        samba: Fix warnings in configure tests for rpath checks
        lirc: Fix build on musl
        mongodb: Fix boost build with clang-15
        crda: Fix build with clang-15
        monkey: Fix build with musl

  Lei Maohui (2):
        dnf-plugin-tui: Fix somw issue in postinstall process.
        xrdp: Fix buildpaths warning.

  Leon Anavi (16):
        python3-nocasedict: Upgrade 1.0.3 -> 1.0.4
        python3-frozenlist: Upgrade 1.3.0 -> 1.3.1
        python3-networkx: Upgrade 2.8.4 -> 2.8.5
        python3-pyhamcrest: Upgrade 2.0.3 -> 2.0.4
        python3-aiohue: Upgrade 4.4.2 -> 4.5.0
        python3-pyperf: Upgrade 2.3.0 -> 2.4.1
        python3-eth-abi: Upgrade 3.0.0 -> 3.0.1
        python3-cytoolz: Upgrade 0.11.2 -> 0.12.0
        python3-yarl: Upgrade 1.7.2 -> 1.8.1
        python3-term: Upgrade 2.3 -> 2.4
        python3-coverage: Upgrade 6.4.1 -> 6.4.4
        python3-regex: Upgrade 2022.7.25 -> 2022.8.17
        python3-awesomeversion: Upgrade 22.6.0 -> 22.8.0
        python3-typed-ast: Upgrade 1.5.2 -> 1.5.4
        python3-prompt-toolkit: Upgrade 3.0.24 -> 3.0.30
        python3-prettytable: Upgrade 3.1.1 -> 3.3.0

  Markus Volk (6):
        libass: update to v1.16.0
        spdlog: update to v1.10.0
        waylandpp: add recipe
        wireplumber: update to v0.4.11
        pipewire: update to v0.3.56
        pipewire: improve runtime dependency settings

  Marta Rybczynska (1):
        polkit: update patches for musl compilation

  Matthias Klein (1):
        libftdi: update to 1.5

  Mike Crowe (1):
        yasm: Only depend on xmlto when docs are enabled

  Mike Petersen (1):
        sshpass: add recipe

  Mingli Yu (10):
        net-snmp: set ac_cv_path_PSPROG
        postgresql: Fix the buildpaths issue
        freeradius: Fix buildpaths issue
        openipmi: Fix buildpaths issue
        apache2: Fix the buildpaths issue
        frr: fix buildpaths issue
        nspr: fix buildpaths issue
        liblockfile: fix buildpaths issue
        freediameter: fix buildpaths issue
        postgresql: make sure pam conf installed when pam enabled

  Ovidiu Panait (1):
        net-snmp: upgrade 5.9.1 -> 5.9.3

  Paulo Neves (1):
        fluentbit Upgrade to 1.3.5 -> 1.9.6

  Philip Balister (2):
        python3-pybind11: Update to Version 2.10.0.
        Remove dead link and old information from the README.

  Potin Lai (7):
        libplist: add libplist_git.bb
        libimobiledevice-glue: SRCREV bump bc6c44b..d2ff796
        libimobiledevice: add libimobiledevice_git.bb
        libirecovery: SRCREV bump e190945..ab5b4d8
        libusbmuxd: add libusbmuxd_git.bb
        usbmuxd: add usbmuxd_git.bb
        idevicerestore: SRCREV bump 280575b..7d622d9

  Richard Purdie (1):
        lmdb: Don't inherit base

  Sam Van Den Berge (1):
        python3-jsonrpcserver: add patch to use importlib.resources instead of pkg_resources

  Saul Wold (10):
        libipc-signal-perl: Fix LICENSE string
        libdigest-hmac-perl: Fix LICENSE string
        libio-socket-ssl-perl: Fix LICENSE string
        libdigest-sha1-perl: Fix LICENSE string
        libmime-types-perl: Fix LICENSE string
        libauthen-sasl-perl: Fix LICENSE string
        libnet-ldap-perl: Fix LICENSE string
        libxml-libxml-perl: Fix LICENSE string
        libnet-telnet-perl: Fix LICENSE string
        libproc-waitstat-perl: Fix LICENSE string

  Sean Anderson (2):
        image_types_sparse: Pad source image to block size
        image_types_sparse: Generate "don't care" chunks

  Vyacheslav Yurkov (4):
        protobuf: correct ptest dependency
        protobuf: 3.19.4 -> 3.21.5 upgrade
        protobuf: change build system to cmake
        protobuf: disable protoc binary for target

  Wang Mingyu (60):
        cifs-utils: upgrade 6.15 -> 7.0
        geocode-glib: upgrade 3.26.3 -> 3.26.4
        gjs: upgrade 1.72.1 -> 1.72.2
        htpdate: upgrade 1.3.5 -> 1.3.6
        icewm: upgrade 2.9.8 -> 2.9.9
        ipc-run: upgrade 20200505.0 -> 20220807.0
        iwd: upgrade 1.28 -> 1.29
        ldns: upgrade 1.8.1 -> 1.8.2
        libadwaita: upgrade 1.1.3 -> 1.1.4
        libencode-perl: upgrade 3.18 -> 3.19
        libmime-charset-perl: upgrade 1.012.2 -> 1.013.1
        libtest-warn-perl: upgrade 0.36 -> 0.37
        nano: upgrade 6.3 -> 6.4
        nbdkit: upgrade 1.31.15 -> 1.32.1
        netdata: upgrade 1.35.1 -> 1.36.0
        fio: upgrade 3.30 -> 3.31
        nlohmann-json: upgrade 3.10.5 -> 3.11.2
        poco: upgrade 1.12.1 -> 1.12.2
        postgresql: upgrade 14.4 -> 14.5
        poppler: upgrade 22.07.0 -> 22.08.0
        smarty: upgrade 4.1.1 -> 4.2.0
        tracker: upgrade 3.3.2 -> 3.3.3
        uftp: upgrade 5.0 -> 5.0.1
        xdg-user-dirs: upgrade 0.17 -> 0.18
        python3-pycodestyle: upgrade 2.9.0 -> 2.9.1
        python3-pyzmq: upgrade 23.2.0 -> 23.2.1
        python3-setuptools-declarative-requirements: upgrade 1.2.0 -> 1.3.0
        python3-sqlalchemy: upgrade 1.4.39 -> 1.4.40
        python3-werkzeug: upgrade 2.2.1 -> 2.2.2
        python3-xmlschema: upgrade 2.0.1 -> 2.0.2
        python3-yappi: upgrade 1.3.5 -> 1.3.6
        ade: upgrade 0.1.1f -> 0.1.2
        babl: upgrade 0.1.92 -> 0.1.94
        ctags: upgrade 5.9.20220703.0 -> 5.9.20220821.0
        grilo-plugins: upgrade 0.3.14 -> 0.3.15
        ldns: upgrade 1.8.2 -> 1.8.3
        libcurses-perl: upgrade 1.38 -> 1.41
        mosquitto: upgrade 2.0.14 -> 2.0.15
        nbdkit: upgrade 1.32.1 -> 1.33.1
        netdata: upgrade 1.36.0 -> 1.36.1
        libsdl2-ttf: upgrade 2.20.0 -> 2.20.1
        xfstests: upgrade 2022.07.31 -> 2022.08.07
        php: upgrade 8.1.8 -> 8.1.9
        rdma-core: upgrade 41.0 -> 42.0
        spitools: upgrade 1.0.1 -> 1.0.2
        unbound: upgrade 1.16.1 -> 1.16.2
        zlog: upgrade 1.2.15 -> 1.2.16
        python3-hexbytes: upgrade 0.2.3 -> 0.3.0
        python3-pythonping: upgrade 1.1.2 -> 1.1.3
        python3-jsonrpcserver: Add dependence python3-typing-extensions
        feh: upgrade 3.9 -> 3.9.1
        gnome-bluetooth: upgrade 42.2 -> 42.3
        hunspell: upgrade 1.7.0 -> 1.7.1
        gtk4: upgrade 4.6.6 -> 4.6.7
        logwatch: upgrade 7.6 -> 7.7
        bdwgc: upgrade 8.2.0 -> 8.2.2
        tcpreplay: upgrade 4.4.1 -> 4.4.2
        tree: upgrade 2.0.2 -> 2.0.3
        xfsdump: upgrade 3.1.10 -> 3.1.11
        babl: upgrade 0.1.94 -> 0.1.96

  Wolfgang Meyer (1):
        libsdl2-ttf: upgrade 2.0.18 -> 2.20.0

  Xu Huan (18):
        python3-protobuf: upgrade 4.21.3 -> 4.21.4
        python3-pycodestyle: upgrade 2.8.0 -> 2.9.0
        python3-pyflakes: upgrade 2.4.0 -> 2.5.0
        python3-pythonping: upgrade 1.1.1 -> 1.1.2
        python3-regex: upgrade 2022.7.24 -> 2022.7.25
        python3-werkzeug: upgrade 2.2.0 -> 2.2.1
        python3-google-auth: upgrade 2.9.1 -> 2.10.0
        python3-humanize: upgrade 4.2.3 -> 4.3.0
        python3-hexbytes: upgrade 0.2.2 -> 0.2.3
        python3-imageio: upgrade 2.21.0 -> 2.21.1
        python3-nocaselist: upgrade 1.0.5 -> 1.0.6
        python3-protobuf: upgrade 4.21.4 -> 4.21.5
        python3-pycares: upgrade 4.2.1 -> 4.2.2
        python3-fastjsonschema: upgrade 2.16.1 -> 2.16.2
        python3-google-api-python-client: upgrade 2.56.0 -> 2.57.0
        python3-google-auth: upgrade 2.10.0 -> 2.11.0
        python3-grpcio-tools: upgrade 1.47.0 -> 1.48.0
        python3-grpcio: upgrade 1.47.0 -> 1.48.0

  Yi Zhao (5):
        strongswan: upgrade 5.9.6 -> 5.9.7
        libldb: upgrade 2.3.3 -> 2.3.4
        samba: upgrade 4.14.13 -> 4.14.14
        python3-jsonrpcserver: upgrade 5.0.7 -> 5.0.8
        samba: fix buildpaths issue

  wangmy (16):
        gedit: upgrade 42.1 -> 42.2
        libwacom: upgrade 2.3.0 -> 2.4.0
        htpdate: upgrade 1.3.4 -> 1.3.5
        nbdkit: upgrade 1.31.14 -> 1.31.15
        pure-ftpd: upgrade 1.0.50 -> 1.0.51
        avro-c: upgrade 1.11.0 -> 1.11.1
        debootstrap: upgrade 1.0.126 -> 1.0.127
        freerdp: upgrade 2.7.0 -> 2.8.0
        icewm: upgrade 2.9.7 -> 2.9.8
        libmxml: upgrade 3.3 -> 3.3.1
        poco: upgrade 1.12.0 -> 1.12.1
        xfontsel: upgrade 1.0.6 -> 1.1.0
        xmessage: upgrade 1.0.5 -> 1.0.6
        xrefresh: upgrade 1.0.6 -> 1.0.7
        zabbix: upgrade 6.0.5 -> 6.2.1
        xrdp: upgrade 0.9.18 -> 0.9.19

  zhengrq.fnst (4):
        python3-asttokens: upgrade 2.0.7 -> 2.0.8
        python3-charset-normalizer: upgrade 2.1.0 -> 2.1.1
        python3-eth-account: 0.6.1 -> 0.7.0
        python3-cantools: upgrade 37.1.0 -> 37.1.2

  zhengruoqin (12):
        python3-dominate: upgrade 2.6.0 -> 2.7.0
        python3-flask-login: upgrade 0.6.1 -> 0.6.2
        python3-google-api-python-client: upgrade 2.54.0 -> 2.55.0
        python3-haversine: upgrade 2.5.1 -> 2.6.0
        python3-imageio: upgrade 2.19.5 -> 2.21.0
        python3-autobahn: upgrade 22.6.1 -> 22.7.1
        python3-engineio: upgrade 4.3.3 -> 4.3.4
        python3-flask: upgrade 2.1.3 -> 2.2.2
        python3-gcovr: upgrade 5.1 -> 5.2
        python3-google-api-python-client: upgrade 2.55.0 -> 2.56.0
        python3-asttokens: upgrade 2.0.5 -> 2.0.7
        python3-zeroconf: upgrade 0.38.7 -> 0.39.0

meta-security: 2a2d650ee0..10fdc2b13a:
  Anton Antonov (2):
        Use CARGO_TARGET_SUBDIR in do_install
        parsec-service: Update oeqa tests

  Armin Kuster (8):
        python3-privacyidea: update to 3.7.3
        lkrg-module: update to 0.9.5
        apparmor: update to 3.0.6
        packagegroup-core-security: add space for appends
        cryptmount: Add new pkg
        packagegroup-core-security: add pkg to grp
        cyptmount: Fix mount.h conflicts seen with glibc 2.36+
        kas: update testimage inherit

  John Edward Broadbent (1):
        meta-security: Add recipe for Glome

  Mingli Yu (1):
        samhain-standalone: fix buildpaths issue

poky: fc59c28724..9b1db65e7d:
  Alejandro Hernandez Samaniego (1):
        baremetal-image.bbclass: Emulate image.bbclass to handle new classes scope

  Alex Stewart (1):
        maintainers: update opkg maintainer

  Alexander Kanavin (113):
        kmscube: address linux 5.19 fails
        rpm: update 4.17.0 -> 4.17.1
        go: update 1.18.4 -> 1.19
        bluez5: update 5.64 -> 5.65
        python3-pip: update 22.2.1 -> 22.2.2
        ffmpeg: update 5.0.1 -> 5.1
        iproute2: upgrade 5.18.0 -> 5.19.0
        harfbuzz: upgrade 4.4.1 -> 5.1.0
        libwpe: upgrade 1.12.0 -> 1.12.2
        bind: upgrade 9.18.4 -> 9.18.5
        diffoscope: upgrade 218 -> 220
        ell: upgrade 0.51 -> 0.52
        gnutls: upgrade 3.7.6 -> 3.7.7
        iso-codes: upgrade 4.10.0 -> 4.11.0
        kea: upgrade 2.0.2 -> 2.2.0
        kexec-tools: upgrade 2.0.24 -> 2.0.25
        libcap: upgrade 2.64 -> 2.65
        libevdev: upgrade 1.12.1 -> 1.13.0
        libnotify: upgrade 0.8.0 -> 0.8.1
        libwebp: upgrade 1.2.2 -> 1.2.3
        libxcvt: upgrade 0.1.1 -> 0.1.2
        mesa: upgrade 22.1.3 -> 22.1.5
        mobile-broadband-provider-info: upgrade 20220511 -> 20220725
        nettle: upgrade 3.8 -> 3.8.1
        piglit: upgrade to latest revision
        puzzles: upgrade to latest revision
        python3: upgrade 3.10.5 -> 3.10.6
        python3-dtschema: upgrade 2022.7 -> 2022.8
        python3-hypothesis: upgrade 6.50.1 -> 6.54.1
        python3-jsonschema: upgrade 4.9.0 -> 4.9.1
        python3-markdown: upgrade 3.3.7 -> 3.4.1
        python3-setuptools: upgrade 63.3.0 -> 63.4.1
        python3-sphinx: upgrade 5.0.2 -> 5.1.1
        python3-urllib3: upgrade 1.26.10 -> 1.26.11
        sqlite3: upgrade 3.39.1 -> 3.39.2
        sysklogd: upgrade 2.4.0 -> 2.4.2
        webkitgtk: upgrade 2.36.4 -> 2.36.5
        kernel-dev: working with kernel using devtool does not require building and installing eSDK
        sdk-manual: describe how to use extensible SDK functionality directly in a Yocto build
        dropbear: merge .inc into .bb
        rust: update 1.62.0 -> 1.62.1
        cmake: update 3.23.2 -> 3.24.0
        weston: upgrade 10.0.1 -> 10.0.2
        patchelf: update 0.14.5 -> 0.15.0
        patchelf: replace a rejected patch with an equivalent uninative.bbclass tweak
        weston: exclude pre-releases from version check
        tzdata: upgrade 2022a -> 2022b
        libcgroup: update 2.0.2 -> 3.0.0
        python3-setuptools-rust: update 1.4.1 -> 1.5.1
        shadow: update 4.11.1 -> 4.12.1
        slang: update 2.3.2 -> 2.3.3
        xz: update 5.2.5 -> 5.2.6
        gdk-pixbuf: update 2.42.8 -> 2.42.9
        xorgproto: update 2022.1 -> 2022.2
        boost-build-native: update 4.4.1 -> 1.80.0
        boost: update 1.79.0 -> 1.80.0
        vulkan-samples: update to latest revision
        epiphany: upgrade 42.3 -> 42.4
        git: upgrade 2.37.1 -> 2.37.2
        glib-networking: upgrade 2.72.1 -> 2.72.2
        gnu-efi: upgrade 3.0.14 -> 3.0.15
        gpgme: upgrade 1.17.1 -> 1.18.0
        libjpeg-turbo: upgrade 2.1.3 -> 2.1.4
        libwebp: upgrade 1.2.3 -> 1.2.4
        lighttpd: upgrade 1.4.65 -> 1.4.66
        mesa: upgrade 22.1.5 -> 22.1.6
        meson: upgrade 0.63.0 -> 0.63.1
        mpg123: upgrade 1.30.1 -> 1.30.2
        pango: upgrade 1.50.8 -> 1.50.9
        piglit: upgrade to latest revision
        pkgconf: upgrade 1.8.0 -> 1.9.2
        python3-dtschema: upgrade 2022.8 -> 2022.8.1
        python3-more-itertools: upgrade 8.13.0 -> 8.14.0
        python3-numpy: upgrade 1.23.1 -> 1.23.2
        python3-pbr: upgrade 5.9.0 -> 5.10.0
        python3-pyelftools: upgrade 0.28 -> 0.29
        python3-pytz: upgrade 2022.1 -> 2022.2.1
        strace: upgrade 5.18 -> 5.19
        sysklogd: upgrade 2.4.2 -> 2.4.4
        wireless-regdb: upgrade 2022.06.06 -> 2022.08.12
        wpebackend-fdo: upgrade 1.12.0 -> 1.12.1
        python3-hatchling: update 1.6.0 -> 1.8.0
        python3-setuptools: update 63.4.1 -> 65.0.2
        devtool: do not leave behind source trees in workspace/sources
        systemtap: add a patch to address a python 3.11 failure
        bitbake: bitbake-layers: initialize tinfoil before registering command line arguments
        scripts/oe-setup-builddir: add a check that TEMPLATECONF is valid
        bitbake-layers: add a command to save the active build configuration as a template into a layer
        bitbake-layers: add ability to save current layer repository configuration into a file
        scripts/oe-setup-layers: add a script that restores the layer configuration from a json file
        selftest/bblayers: add a test for creating a layer setup and using it to restore the layers
        selftest/bblayers: adjust the revision for the layer setup test
        perl: run builds from a pristine source tree
        meta-poky/conf: move default templates to conf/templates/default/
        syslinux: mark all pending patches as Inactive-Upstream
        shadow: correct the pam patch status
        mtd-utils: remove patch that adds -I option
        gstreamer1.0-plugins-bad: remove an unneeded patch
        ghostscript: remove unneeded patch
        ovmf: drop the force no-stack-protector patch
        python: submit CC to cc_basename patch upstream
        mc: submit perl warnings patch upstream
        sysvinit: send install.patch upstream
        valgrind: (re)send ppc instructions patch upstream
        gdk-pixbuf: submit fatal-loader.patch upstream
        libsdl2: follow upstream version is even rule
        python3-pip: submit reproducible.patch upstream
        python3-pip: remove unneeded reproducible.patch
        llvm: remove 0006-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch
        scripts/oe-setup-builddir: migrate build/conf/templateconf.cfg to new template locations
        meta/files/layers.schema.json: drop the layers property
        scripts/oe-setup-builddir: write to conf/templateconf.cfg after the build is set up
        scripts/oe-setup-builddir: make environment variable the highest priority source for TEMPLATECONF

  Alexandre Belloni (1):
        ruby: drop capstone support

  Andrei Gherzan (7):
        shadow: Enable subid support
        rootfspostcommands.py: Restructure sort_passwd and related functions
        rootfspostcommands.py: Cleanup subid backup files generated by shadow-utils
        selftest: Add module for testing rootfs postcommands
        rootfs-postcommands.bbclass: Follow function rename in rootfspostcommands.py
        shadow: Avoid nss warning/error with musl
        linux-yocto: Fix COMPATIBLE_MACHINE regex match

  Andrey Konovalov (2):
        mesa: add pipe-loader's libraries to libopencl-mesa package
        mesa: build clover with native LLVM codegen support for freedreno

  Anuj Mittal (1):
        poky.conf: add ubuntu-22.04 to tested distros

  Armin Kuster (1):
        system-requirements.rst: remove EOL and Centos7 hosts

  Aryaman Gupta (1):
        bitbake: runqueue: add memory pressure regulation

  Awais Belal (1):
        kernel-fitimage.bbclass: only package unique DTBs

  Beniamin Sandu (1):
        libpam: use /run instead of /var/run in systemd tmpfiles

  Bertrand Marquis (1):
        sysvinit-inittab/start_getty: Fix respawn too fast

  Bruce Ashfield (22):
        linux-yocto/5.15: update to v5.15.58
        linux-yocto/5.10: update to v5.10.134
        linux-yocto-rt/5.15: update to -rt48 (and fix -stable merge)
        linux-libc-headers: update to v5.19
        kernel-devsrc: support arm v5.19+ on target build
        kernel-devsrc: support powerpc on v5.19+
        lttng-modules: fix build against mips and v5.19 kernel
        linux-yocto: introduce v5.19 reference kernel recipes
        meta/conf: update preferred linux-yocto version to v5.19
        linux-yocto: drop v5.10 reference kernel recipes
        linux-yocto/5.15: update to v5.15.59
        linux-yocto/5.15: fix reproducibility issues
        linux-yocto/5.19: cfg: update x32 configuration fragment
        linux-yocto/5.19: fix reproducibility issues
        poky: update preferred version to v5.19
        poky: change preferred kernel version to 5.15 in poky-alt
        yocto-bsp: drop v5.10 bbappend and create 5.19 placeholder
        lttng-modules: replace mips compaction fix with upstream change
        linux-yocto/5.15: update to v5.15.60
        linux-yocto/5.19: update to v5.19.1
        linux-yocto/5.19: update to v5.19.3
        linux-yocto/5.15: update to v5.15.62

  Changqing Li (1):
        apt: fix nativesdk-apt build failure during the second time build

  Chen Qi (2):
        python3-hypothesis: revert back to 6.46.11
        python3-requests: add python3-compression dependency

  Drew Moseley (1):
        rng-tools: Replace obsolete "wants systemd-udev-settle"

  Enrico Scholz (2):
        npm.bbclass: fix typo in 'fund' config option
        npm.bbclass: fix architecture mapping

  Ernst Sjöstrand (1):
        cve-check: Don't use f-strings

  Jacob Kroon (1):
        python3-cython: Remove debug lines

  Jan Luebbe (2):
        openssh: sync local ssh_config + sshd_config files with upstream 8.7p1
        openssh: add support for config snippet includes to ssh and sshd

  JeongBong Seo (1):
        wic: add 'none' fstype for custom image

  Johannes Schneider (1):
        classes: rootfs-postcommands: autologin root on serial-getty

  Jon Mason (2):
        oeqa/parselogs: add qemuarmv5 arm-charlcd masking
        ref-manual: add numa to machine features

  Jose Quaresma (4):
        bitbake: build: prefix the tasks with a timestamp in the log task_order
        archiver.bbclass: some recipes that uses the kernelsrc bbclass uses the shared source
        linux-yocto: prepend the the value with a space when append to KERNEL_EXTRA_ARGS
        shaderc: upgrade 2022.1 -> 2022.2

  Joshua Watt (4):
        bitbake: siggen: Fix insufficent entropy in sigtask file names
        bitbake: utils: Pass lock argument in fileslocked
        classes: cve-check: Get shared database lock
        meta/files: add layer setup JSON schema and example

  Kai Kang (1):
        packagegroup-self-hosted: update for strace

  Kevin Hao (1):
        uboot-config.bbclass: Don't bail out early in multi configs

  Khem Raj (83):
        qemu: Fix build with glibc 2.36
        mtd-utils: Fix build with glibc 2.36
        stress-ng: Upgrade to 0.14.03
        bootchart2: Fix build with glibc 2.36+
        ltp: Fix sys/mount.h conflicts needed for glibc 2.36+ compile
        efivar: Fix build with glibc 2.36
        cracklib: Drop using register keyword
        util-linux: Define pidfd_* function signatures
        util-linux: Upgrade to 2.38.1
        tcp-wrappers: Fix implicit-function-declaration warnings
        perl-cross: Correct function signatures in configure_func.sh
        perl: Pass additional flags to enable lfs and gnu source
        sysvinit: Fix mount.h conflicts seen with glibc 2.36+
        glibc: Bump to 2.36
        glibc: Update patch status
        zip: Enable largefile support based on distro feature
        zip: Make configure checks to be more robust
        unzip: Fix configure tests to use modern C
        unzip: Enable largefile support when enabled in distro
        iproute2: Fix netns check during configure
        glibc: Bump to latest 2.36 branch
        gstreamer1.0-plugins-base: Include required system headers for isspace() and sscanf()
        musl: Upgrade to latest tip of trunk
        zip: Always enable LARGE_FILE_SUPPORT
        libmicrohttpd: Enable largefile support unconditionally
        unzip: Always enable largefile support
        default-distrovars: Remove largefile from defualt DISTRO_FEATURES
        zlib: Resolve CVE-2022-37434
        json-c: Fix function prototypes
        rsync: Backport fix to address CVE-2022-29154
        rsync: Upgrade to 3.2.5
        libtirpc: Backport fix for CVE-2021-46828
        libxml2: Ignore CVE-2016-3709
        tiff: Backport a patch for CVE-2022-34526
        libtirpc: Upgrade to 1.3.3
        perf: Add packageconfig for libbfd support and use disabled as default
        connman: Backports for security fixes
        systemd: Upgrade to 251.4 and fix build with binutils 2.39
        time: Add missing include for memset
        screen: Add missing include files in configure checks
        setserial: Fix build with clang
        expect: Fix implicit-function-declaration warnings
        spirv-tools: Remove default copy constructor in header
        boost: Compile out stdlib unary/binary_functions for c++11 and newer
        vulkan-samples: Qualify move as std::move
        apt: Do not use std::binary_function
        ltp: Fix sys/mount.h and linux/mount.h conflict
        rpm: Remove -Wimplicit-function-declaration warnings
        binutils: Upgrade to 2.39 release
        binutils-cross: Disable gprofng for when building cross binutils
        binutils: Package up gprofng
        binutils: Disable gprofng when using clang
        binutils-cross-canadian: Package up new gprofng.rc file
        autoconf: Fix strict prototype errors in generated tests
        rsync: Add missing prototypes to function declarations
        nfs-utils: Upgrade to 2.6.2
        webkitgtk: Upgrade to 2.36.6 minor update
        musl: Update to tip
        binutils: Disable gprofng on musl systems
        binutils: Upgrade to latest on 2.39 release branch
        cargo_common.bbclass: Add missing space in shell conditional code
        rng-tools: Remove depndencies on hwrng
        ccache: Update the patch status
        ccache: Fix build with gcc12 on musl
        alsa-plugins: Include missing string.h
        xinetd: Pass missing -D_GNU_SOURCE
        watchdog: Include needed system header for function decls
        libcgroup: Use GNU strerror_r only when its available
        pinentry: enable _XOPEN_SOURCE on musl for wchar usage in curses
        apr: Use correct strerror_r implementation based on libc type
        gcr: Define _GNU_SOURCE
        ltp: Adjust types to match create_fifo_thread return
        gcc: Upgrade to 12.2.0
        glibc: Update to latest on 2.36
        ltp: Remove -mfpmath=sse on x86-64 too
        apr: Cache configure tests which use AC_TRY_RUN
        rust: Fix build failure on riscv32
        ncurses: Fix configure tests for exit and mbstate_t
        rust-llvm: Update to matching LLVM_VERSION from rust-source
        librepo: Fix build on musl
        rsync: Turn on -pedantic-errors at the end of 'configure'
        ccache: Upgrade to 4.6.2
        xmlto: Update to use upstream tip of trunk

  Konrad Weihmann (1):
        python3: disable user site-pkg for native target

  Lee Chee Yang (1):
        migration guides: add release notes for 4.0.3

  Luca Ceresoli (1):
        libmnl: remove unneeded SRC_URI 'name' option

  Markus Volk (2):
        connman: add PACKAGECONFIG to support iwd
        packagegroup-base.bb: add a configure option to set the wireless-daemon

  Martin Jansa (5):
        glibc: revert one upstream change to work around broken DEBUG_BUILD build
        syslinux: Fix build with glibc-2.36
        syslinux: refresh patches with devtool
        glibc: fix new upstream build issue with DEBUG_BUILD build
        glibc: apply proposed patch from upstream instead of revert

  Mateusz Marciniec (2):
        util-linux: Remove --enable-raw from EXTRA_OECONF
        util-linux: Improve check for magic in configure.ac

  Michael Halstead (1):
        uninative: Upgrade to 3.7 to work with glibc 2.36

  Michael Opdenacker (1):
        dev-manual: use proper note directive

  Mingli Yu (1):
        bitbake: fetch: use BPN instead

  Neil Horman (1):
        bitbake: Fix npm to use https rather than http

  Paul Eggleton (1):
        relocate_sdk.py: ensure interpreter size error causes relocation to fail

  Pavel Zhukov (6):
        package_rpm: Do not replace square brackets in %files
        selftest: Add regression test for rpm filesnames
        parselogs: Ignore xf86OpenConsole error
        bitbake: gitsm: Error out if submodule refers to parent repo
        bitbake: tests: Add Timeout class
        bitbake: tests: Add test for possible gitsm deadlock

  Peter Bergin (3):
        rust-cross-canadian: rename shell variables for easier appends
        packagegroup-rust-cross-canadian: add native compiler environment
        oeqa/sdk: extend rust test to also use a build script

  Peter Marko (1):
        create-spdx: handle links to inaccessible locations

  Quentin Schulz (3):
        docs: conf.py: update yocto_git base URL
        docs: README: add TeX font package required for building PDF
        docs: ref-manual: system-requirements: add missing packages

  Randy MacLeod (1):
        rust: update from 1.62.1 to 1.63.0

  Rasmus Villemoes (1):
        bitbake.conf: set BB_DEFAULT_UMASK using ??=

  Richard Purdie (85):
        oeqa/selftest/sstate: Ensure tests are deterministic
        nativesdk: Clear TUNE_FEATURES
        populate_sdk_base: Disable rust SDK for MIPS n32
        selftest/reproducible: Exclude rust/rust-dbg for now until we can fix
        conf/distro/no-static-libs: Allow static musl for rust
        rust-target-config: Add mips n32 target information
        rust-common: Add CXXFLAGS
        rust-common: Drop export directive from wrappers
        rust-common: Rework wrappers to handle musl
        rust: Work around reproducibility issues
        rust: Switch to use RUST_XXX_SYS consistently
        rust.inc: Rename variables to make code clearer
        rust.inc: Fix cross build llvm-config handling
        rust/mesa: Drop obsolete YOCTO_ALTERNATE_MULTILIB_NAME
        rust-target-config: Show clear error when target isn't defined
        rust: Generate per recipe target configuration files
        rust-common/rust: Improve bootstrap BUILD_SYS handling
        cargo_common: Handle build SYS as well as HOST/TARGET
        rust-llvm: Enable nativesdk variant
        rust.inc: Fix for cross compilation configuration
        rust-common: Update to match cross targets
        rust-target-config: Make target workaround generic
        rust-common: Simplify libc handling
        cargo: Drop cross-canadian variant and fix/use nativesdk
        rust-common: Set rustlibdir to match target expectation
        rust-cross-canadian: Simplify and fix
        rust: Drop cross/crosssdk
        rust: Enable nativesdk and target builds + replace rust-tools-cross-canadian
        rust: Fix musl builds
        rust: Ensure buildpaths are handled in debug symbols correctly
        rust: Update README
        selftest/wic: Tweak test case to not depend on kernel size
        bitbake: runqueue: Ensure deferred tasks are sorted by multiconfig
        bitbake: runqueue: Improve deadlock warning messages
        bitbake: runqueue: Drop deadlock breaking force fail
        rust-common: Remove conflict with utils create_wrapper
        kern-devsrc: Drop auto.conf creation
        cargo: Work around host system library conflicts
        rust-cross-canadian: Use shell from SDK, not the host
        buildhistory: Only use image-artifact-names as an image class
        rust: Remove unneeded RUST_TARGETGENS settings
        meta-skeleton/hello-mod: Switch to SPDX-License-Identifier
        perf: Fix reproducibility issues with 5.19 onwards
        selftest/runtime_test/incompatible_lic: Use IMAGE_CLASSES for testimage
        testexport: Fix to work as an image class
        testexport: Use IMAGE_CLASSES for testimage
        selftest/runtime_test: Use testexport in IMAGE_CLASSES, not globally
        bitbake: BBHandler: Allow earlier exit for classes not found
        bitbake: BBHandler: Make inherit calls more directly
        bitbake: bitbake: Add copyright headers where missing
        bitbake: BBHandler/cooker: Implement recipe and global classes
        classes: Add copyright statements to files without one
        scripts: Add copyright statements to files without one
        classes: Add SPDX license identifiers
        lib: Add copyright statements to files without one
        insane: Update to allow for class layout changes
        classes: Update classes to match new bitbake class scope functionality
        recipetool: Update for class changes
        package: Switch debug source handling to use prefix map
        libgcc/gcc-runtime: Improve source reference handling
        bitbake.conf: Handle S and B separately for debug mapping
        python3-cython: Update code to match debug path changes
        gcc-cross: Fix relative links
        gcc: Resolve relative prefix-map filenames
        gcc: Add a patch to avoid hardcoded paths in libgcc on powerpc
        gcc: Update patch status to submitted for two patches
        valgrind: Disable drd/tests/std_thread2 ptest
        valgrind: Update to match debug file layout changes
        skeleton/service: Ensure debug path handling works as intended
        distrooverrides: Move back to classes whilst it's usage is clarified
        vim: Upgrade 9.0.0115 -> 9.0.0242
        icu: Drop binconfig support (icu-config)
        libtirpc: Mark CVE-2021-46828 as resolved
        bitbake: runqueue: Change pressure file warning to a note
        rust-target-config: Drop has-elf-tls option
        llvm: Add llvm-config wrapper to improve flags handling
        mesa: Rework llvm handling
        rust-target-config: Fix qemuppc target cpu option
        rust: Fix crossbeam-utils for arches without atomics
        pseudo: Update to include recent upstream minor fixes
        bitbake: Revert "fetch: use BPN instead"
        vim: Upgrade 9.0.0242 -> 9.0.0341
        gcc-multilib-config: Fix i686 toolchain relocation issues
        kernel: Always set CC and LD for the kernel build
        kernel: Use consistent make flags for menuconfig

  Robert Joslyn (1):
        curl: Update to 7.85.0

  Ross Burton (9):
        oeqa/qemurunner: add run_serial() comment
        oeqa/commands: add support for running cross tools to runCmd
        oeqa/selftest: rewrite gdbserver test
        libxml2: wrap xmllint to use the correct XML catalogues
        oeqa/selftest: add test for debuginfod
        libgcrypt: remove obsolete pkgconfig install
        libgcrypt: remove obsolete patch
        libgcrypt: rewrite ptest
        cve-check: close cursors as soon as possible

  Sakib Sajal (2):
        qemu: fix CVE-2021-3507
        qemu: fix CVE-2022-0216

  Shubham Kulkarni (1):
        sanity: add a comment to ensure CONNECTIVITY_CHECK_URIS is correct

  Simone Weiss (1):
        json-c: Add ptest for json-c

  Sundeep KOKKONDA (1):
        glibc : stable 2.35 branch updates

  Thomas Roos (1):
        oeqa devtool: Add tests to cover devtool handling of various git URL styles

  Tom Hochstein (1):
        piglit: Add PACKAGECONFIG for glx and opencl

  Tom Rini (1):
        qemux86-64: Allow higher tunes

  Ulrich Ölmann (1):
        scripts/runqemu.README: fix typos and trailing whitespaces

  William A. Kennington III (1):
        image_types: Set SOURCE_DATE_EPOCH for squashfs

  Yang Xu (1):
        insane.bbclass: Skip patches not in oe-core by full path

  Yogesh Tyagi (1):
        gdbserver : add selftest

  Yongxin Liu (1):
        grub2: fix several CVEs

  wangmy (19):
        msmtp: upgrade 1.8.20 -> 1.8.22
        bind: upgrade 9.18.5 -> 9.18.6
        btrfs-tools: upgrade 5.18.1 -> 5.19
        libdnf: upgrade 0.67.0 -> 0.68.0
        librepo: upgrade 1.14.3 -> 1.14.4
        pkgconf: upgrade 1.9.2 -> 1.9.3
        python3-pygments: upgrade 2.12.0 -> 2.13.0
        ethtool: upgrade 5.18 -> 5.19
        librsvg: upgrade 2.54.4 -> 2.54.5
        libtasn1: upgrade 4.18.0 -> 4.19.0
        liburcu: upgrade 0.13.1 -> 0.13.2
        libwpe: upgrade 1.12.2 -> 1.12.3
        lttng-tools: upgrade 2.13.7 -> 2.13.8
        lttng-ust: upgrade 2.13.3 -> 2.13.4
        libatomic-ops: upgrade 7.6.12 -> 7.6.14
        lz4: upgrade 1.9.3 -> 1.9.4
        python3-hatchling: upgrade 1.8.0 -> 1.8.1
        python3-urllib3: upgrade 1.26.11 -> 1.26.12
        repo: upgrade 2.28 -> 2.29.1

meta-arm: 20a629180c..52f07a4b0b:
  Anton Antonov (11):
        arm/optee-os: backport RWX permission error patch
        work around for too few arguments to function init_disassemble_info() error
        arm/optee-os: backport linker warning patches
        arm/tf-a-tests: work around RWX permission error on segment
        Recipes for Trusted Services dependencies.
        Recipes for Trusted Services Secure Partitions
        ARM-FFA kernel drivers and kernel configs for Trusted Services
        Trusted Services test/demo NWd tools
        psa-api-tests for Trusted Services
        Include Trusted Services SPs into optee-os image
        Define qemuarm64-secureboot-ts CI pipeline and include it into meta-arm

  Gowtham Suresh Kumar (2):
        arm-bsp/secure-partitions: fix SMM gateway bug for EFI GetVariable()
        arm-bsp/u-boot: drop EFI GetVariable() workarounds patches

  Jon Mason (11):
        arm-bsp/fvp-base-arm32: Update kernel patch for v5.19
        arm/qemuarm64-secureboot: remove tfa memory patch
        arm/linux-yocto: remove optee num pages kernel config variable
        arm-bsp/juno: drop scmi patch
        arm/qemuarm-secureboot: remove vmalloc from QB_KERNEL_CMDLINE_APPEND
        arm/fvp: use image-artifact-names as an image class
        atp/atp: drop package inherits
        arm/optee: Update to 3.18
        arm-bsp/fvp-base: set preferred kernel to 5.15
        arm/arm-bsp: Add yocto-kernel-cache bluetooth support
        arm-bsp/corstone1000: use compressed kernel image

  Khem Raj (2):
        gator-daemon: Define _GNU_SOURCE feature test macro
        optee-os: Add section attribute parameters when clang is used

  Peter Hoyes (3):
        docs: Update FVP_CONSOLES in runfvp documentation
        docs: Introduce meta-arm OEQA documentation
        arm/oeqa: Make linuxboot test case timeout configurable

  Richard Purdie (1):
        gem5/gem5-m5ops: Drop uneeded package inherit

  Ross Burton (2):
        arm/trusted-firmware-a: remove redundant patches
        arm/trusted-firmware-a: work around RWX permission error on segment

  Rui Miguel Silva (2):
        arm-bsp:corstone500: rebase u-boot patches on v2022.07
        arm-bsp/corstone1000: rebase u-boot patches on top v2022.07

  Vishnu Banavath (3):
        arm-bsp/trusted-firmware-a: Bump TF-A version for N1SDP
        arm-bsp/optee: add optee-os support for N1SDP target
        arm/optee: update optee-client to v3.18

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I90aa0a94410dd208163af126566d22c77787abc2
diff --git a/meta-arm/.gitlab-ci.yml b/meta-arm/.gitlab-ci.yml
index 840a650..1fb21f6 100644
--- a/meta-arm/.gitlab-ci.yml
+++ b/meta-arm/.gitlab-ci.yml
@@ -171,6 +171,13 @@
         TCLIBC: [glibc, musl]
         TESTING: testimage
 
+qemuarm64-secureboot-ts:
+  extends: .build
+  parallel:
+    matrix:
+      - TCLIBC: [glibc, musl]
+        TESTING: testimage
+
 qemuarm64:
   extends: .build
   parallel:
diff --git a/meta-arm/ci/qemuarm64-secureboot-ts.yml b/meta-arm/ci/qemuarm64-secureboot-ts.yml
new file mode 100644
index 0000000..66a27c6
--- /dev/null
+++ b/meta-arm/ci/qemuarm64-secureboot-ts.yml
@@ -0,0 +1,28 @@
+# Build qemuarm64-secureboot machine with
+# Trusted Services secure partition included into optee-os image.
+#
+# Run Trustes Services OEQA tests.
+
+header:
+  version: 11
+  includes:
+    - ci/base.yml
+    - ci/meta-openembedded.yml
+
+machine: qemuarm64-secureboot
+
+local_conf_header:
+  failing_tests: |
+    # software IO TLB: Cannot allocate buffer
+    DEFAULT_TEST_SUITES:remove = "parselogs"
+  trusted_services: |
+    TEST_SUITES:append = " trusted_services"
+    # Include TS Crypto, Storage, ITS, Attestation and SMM-Gateway SPs into optee-os image
+    MACHINE_FEATURES:append = " arm-ffa ts-crypto ts-storage ts-its ts-attestation ts-smm-gateway"
+    # Include TS demo/test tools into image
+    IMAGE_INSTALL:append = " packagegroup-ts-tests"
+    # Include TS PSA Arch tests into image
+    IMAGE_INSTALL:append = " packagegroup-ts-tests-psa"
+
+target:
+  - core-image-base
diff --git a/meta-arm/documentation/oeqa-fvp.md b/meta-arm/documentation/oeqa-fvp.md
new file mode 100644
index 0000000..582dd38
--- /dev/null
+++ b/meta-arm/documentation/oeqa-fvp.md
@@ -0,0 +1,55 @@
+# OEQA on Arm FVPs
+
+OE-Core's [oeqa][OEQA] framework provides a method of performing runtime tests on machines using the `testimage` Yocto task. meta-arm has good support for writing test cases against [Arm FVPs][FVP], meaning the [runfvp][RUNFVP] boot configuration can be re-used.
+
+Tests can be configured to run automatically post-build by setting the variable `TESTIMAGE_AUTO="1"`, e.g. in your Kas file or local.conf.
+
+There are two main methods of testing, using different test "targets".
+
+## OEFVPTarget
+
+This runs test cases on a machine using SSH. It therefore requires that an SSH server is installed in the image.
+
+In test cases, the primary interface with the target is, e.g:
+```
+(status, output) = self.target.run('uname -a')
+```
+which runs a single command on the target (using `ssh -c`) and returns the status code and the output. It is therefore useful for running tests in a Linux environment.
+
+For examples of test cases, see meta/lib/oeqa/runtime/cases in OE-Core. The majority of test cases depend on `ssh.SSHTest.test_ssh`, which first validates that the SSH connection is functioning.
+
+Example machine configuration:
+```
+TEST_TARGET = "OEFVPTarget"
+TEST_SERVER_IP = "127.0.0.1"
+TEST_TARGET_IP = "127.0.0.1:8022"
+IMAGE_FEATURES:append = " ssh-server-dropbear"
+FVP_CONFIG[bp.virtio_net.hostbridge.userNetPorts] ?= "8022=22"
+```
+
+## OEFVPSerialTarget
+
+This runs tests against one or more serial consoles on the FVP. It is more flexible than OEFVPTarget, but test cases written for this test target do not support the test cases in OE-core. As it does not require an SSH server, it is suitable for machines with performance or memory limitations.
+
+Internally, this test target launches a [Pexpect][PEXPECT] instance for each entry in FVP_CONSOLES which can be used with the provided alias. The whole Pexpect API is exposed on the target, where the alias is always passed as the first argument, e.g.:
+```
+self.target.expect('default', r'root@.*\:~#', timeout=30)
+self.assertNotIn(b'ERROR:', self.target.before('tf-a'))
+```
+
+For an example of a full test case, see meta-arm/lib/oeqa/runtime/cases/linuxboot.py This test case can be used to minimally verify that a machine boots to a Linux shell. The default timeout is 10 minutes, but this can be configured with the variable TEST_FVP_LINUX_BOOT_TIMEOUT, which expects a value in seconds.
+
+The SSH interface described above is also available on OEFVPSerialTarget to support writing a set of hybrid test suites that use a combination of serial and SSH access. Note however that this test target does not guarantee that Linux has booted to shell prior to running any tests, so the test cases in OE-core are not supported.
+
+Example machine configuration:
+```
+TEST_TARGET="OEFVPSerialTarget"
+TEST_SUITES="linuxboot"
+FVP_CONSOLES[default] = "terminal_0"
+FVP_CONSOLES[tf-a] = "s_terminal_0"
+```
+
+[OEQA]: https://docs.yoctoproject.org/test-manual/intro.html
+[FVP]: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms
+[RUNFVP]: runfvp.md
+[PEXPECT]: https://pexpect.readthedocs.io/en/stable/overview.html
diff --git a/meta-arm/documentation/runfvp.md b/meta-arm/documentation/runfvp.md
index b9e007b..c792f4e 100644
--- a/meta-arm/documentation/runfvp.md
+++ b/meta-arm/documentation/runfvp.md
@@ -98,13 +98,16 @@
 FVP_TERMINALS[bp.terminal_3] = ""
 ```
 
-### `FVP_CONSOLE`
+### `FVP_CONSOLES`
 
-This specifies what serial port is used when `--console` is passed to runfvp. Note that this has to be the FVP identifier but without the board prefix, for example:
+This specifies what serial ports can be used in oeqa tests, along with an alias to be used in the test cases. Note that the values have to be the FVP identifier but without the board prefix, for example:
 ```
-FVP_CONSOLE = "terminal_0"
+FVP_CONSOLES[default] = "terminal_0"
+FVP_CONSOLES[tf-a] = "s_terminal_0"
 ```
 
+The 'default' console is also used when `--console` is passed to runfvp.
+
 ### `FVP_EXTRA_ARGS`
 
 Arbitrary extra arguments that are passed directly to the FVP.  For example:
diff --git a/meta-arm/meta-arm-bsp/conf/machine/corstone500.conf b/meta-arm/meta-arm-bsp/conf/machine/corstone500.conf
index 1d25471..adcfddd 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/corstone500.conf
+++ b/meta-arm/meta-arm-bsp/conf/machine/corstone500.conf
@@ -26,7 +26,7 @@
 UBOOT_MACHINE = "corstone500_defconfig"
 UBOOT_IMAGE_ENTRYPOINT = "0x84000000"
 UBOOT_IMAGE_LOADADDRESS = "0x84000000"
-PREFERRED_VERSION_u-boot ?= "2022.04"
+PREFERRED_VERSION_u-boot ?= "2022.07"
 
 # making sure EXTRA_IMAGEDEPENDS will be used while creating the image
 WKS_FILE_DEPENDS:append = " ${EXTRA_IMAGEDEPENDS}"
diff --git a/meta-arm/meta-arm-bsp/conf/machine/fvp-base.conf b/meta-arm/meta-arm-bsp/conf/machine/fvp-base.conf
index 434812b..04ec112 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/fvp-base.conf
+++ b/meta-arm/meta-arm-bsp/conf/machine/fvp-base.conf
@@ -10,6 +10,8 @@
 TUNE_FEATURES = "aarch64"
 
 PREFERRED_VERSION_u-boot ?= "2022.04"
+PREFERRED_VERSION_linux-yocto ?= "5.15%"
+PREFERRED_VERSION_linux-yocto-rt ?= "5.15%"
 
 # FVP u-boot configuration
 UBOOT_MACHINE = "vexpress_aemv8a_semi_defconfig"
diff --git a/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc b/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
index 91dbbfd..ec48222 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
+++ b/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
@@ -22,7 +22,7 @@
 RE_IMAGE_OFFSET = "0x1000"
 
 # u-boot
-PREFERRED_VERSION_u-boot ?= "2022.04"
+PREFERRED_VERSION_u-boot ?= "2022.07"
 EXTRA_IMAGEDEPENDS += "u-boot"
 
 UBOOT_CONFIG ??= "EFI"
@@ -46,7 +46,7 @@
 # Linux kernel
 PREFERRED_PROVIDER_virtual/kernel:forcevariable = "linux-yocto"
 PREFERRED_VERSION_linux-yocto = "5.15%"
-KERNEL_IMAGETYPE = "Image"
+KERNEL_IMAGETYPE = "Image.gz"
 
 INITRAMFS_IMAGE_BUNDLE ?= "1"
 
diff --git a/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf b/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
index 5e87e61..5d1be82 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
+++ b/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
@@ -30,6 +30,9 @@
 #UEFI EDK2 firmware
 EXTRA_IMAGEDEPENDS += "edk2-firmware"
 
+#optee
+PREFERRED_VERSION_optee-os ?= "3.18.%"
+
 #grub-efi
 EFI_PROVIDER ?= "grub-efi"
 MACHINE_FEATURES += "efi"
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/files/n1sdp/bl_size.patch b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/files/n1sdp/bl_size.patch
deleted file mode 100644
index a5b3019..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/files/n1sdp/bl_size.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 80b1efa92486a87f9e82dbf665ef612291148de8 Mon Sep 17 00:00:00 2001
-From: Adam Johnston <adam.johnston@arm.com>
-Date: Tue, 14 Jun 2022 11:19:30 +0000
-Subject: [PATCH] arm-bsp/trusted-firmware-a: N1SDP trusted boot
-
-Increase max size of BL2 on N1SDP by 4KB to enable trusted boot
-Decrease max size of BL1 on N1SDP by 8KB so BL1/BL2 fits above BL31 progbits
-
-Signed-off-by: Adam Johnston <adam.johnston@arm.com>
-Upstream-Status: Pending [Flagged to upstream]
-
----
- plat/arm/board/n1sdp/include/platform_def.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/plat/arm/board/n1sdp/include/platform_def.h b/plat/arm/board/n1sdp/include/platform_def.h
-index c9b81bafa..7468a31ed 100644
---- a/plat/arm/board/n1sdp/include/platform_def.h
-+++ b/plat/arm/board/n1sdp/include/platform_def.h
-@@ -91,7 +91,7 @@
-  * PLAT_ARM_MAX_BL1_RW_SIZE is calculated using the current BL1 RW debug size
-  * plus a little space for growth.
-  */
--#define PLAT_ARM_MAX_BL1_RW_SIZE	0xE000
-+#define PLAT_ARM_MAX_BL1_RW_SIZE	0xC000
- 
- /*
-  * PLAT_ARM_MAX_ROMLIB_RW_SIZE is define to use a full page
-@@ -110,7 +110,7 @@
-  * little space for growth.
-  */
- #if TRUSTED_BOARD_BOOT
--# define PLAT_ARM_MAX_BL2_SIZE		0x20000
-+# define PLAT_ARM_MAX_BL2_SIZE		0x21000
- #else
- # define PLAT_ARM_MAX_BL2_SIZE		0x14000
- #endif
--- 
-2.35.1
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-n1sdp.inc b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-n1sdp.inc
index f8a0b8d..034dac3 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-n1sdp.inc
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-n1sdp.inc
@@ -1,5 +1,8 @@
 # N1SDP specific TFA support
 
+SRCREV_tfa  = "1d867c14cb41c1171d16fa7e395a4eaed3d572b2"
+PV .= "+git${SRCPV}"
+
 COMPATIBLE_MACHINE = "n1sdp"
 TFA_PLATFORM       = "n1sdp"
 TFA_BUILD_TARGET   = "all fip"
@@ -9,16 +12,23 @@
 TFA_UBOOT          = "0"
 TFA_UEFI           = "1"
 
-SRC_URI:append = " file://bl_size.patch"
-
 TFA_ROT_KEY= "plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem"
 
+# Enabling Secure-EL1 Payload Dispatcher (SPD)
+TFA_SPD = "spmd"
+# Cortex-A35 supports Armv8.0-A (no S-EL2 execution state).
+# So, the SPD SPMC component should run at the S-EL1 execution state
+TFA_SPMD_SPM_AT_SEL2 = "0"
+
+# BL2 loads BL32 (optee). So, optee needs to be built first:
+DEPENDS += "optee-os"
+
 EXTRA_OEMAKE:append = "\
                     TRUSTED_BOARD_BOOT=1 \
-                    GENERATE_COT=1 \
-                    CREATE_KEYS=1 \
-                    ENABLE_PIE=0 \
-                    ARM_ROTPK_LOCATION="devel_rsa" \
-                    ROT_KEY="${TFA_ROT_KEY}" \
-                    BL33=${RECIPE_SYSROOT}/firmware/uefi.bin \
-                    "
+		    GENERATE_COT=1 \
+		    CREATE_KEYS=1 \
+		    ARM_ROTPK_LOCATION="devel_rsa" \
+		    ROT_KEY="${TFA_ROT_KEY}" \
+		    BL32=${RECIPE_SYSROOT}/lib/firmware/tee-pager_v2.bin \
+		    BL33=${RECIPE_SYSROOT}/firmware/uefi.bin \
+		    "
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-cmd-load-add-load-command-for-memory-mapped.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-cmd-load-add-load-command-for-memory-mapped.patch
index d0ae964..dc64e3c 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-cmd-load-add-load-command-for-memory-mapped.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-cmd-load-add-load-command-for-memory-mapped.patch
@@ -1,7 +1,7 @@
-From c047b15fba9da36616bc9a346d9fe4d76e7ca4b2 Mon Sep 17 00:00:00 2001
+From 7a1a84ea74fdd06a7f5f239f4c5f4b727d6cd232 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/27] cmd: load: add load command for memory mapped
+Subject: [PATCH 01/24] 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
@@ -26,10 +26,10 @@
  6 files changed, 78 insertions(+)
 
 diff --git a/README b/README
-index f51f392111f9..049bcd108980 100644
+index b7ab6e50708d..cd76f95e74c1 100644
 --- a/README
 +++ b/README
-@@ -2760,6 +2760,7 @@ rarpboot- boot image via network using RARP/TFTP protocol
+@@ -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)
@@ -38,10 +38,10 @@
  mm	- memory modify (auto-incrementing)
  nm	- memory modify (constant address)
 diff --git a/cmd/Kconfig b/cmd/Kconfig
-index 5e25e45fd288..ff50102a89c7 100644
+index 09193b61b95f..ba2f321ae989 100644
 --- a/cmd/Kconfig
 +++ b/cmd/Kconfig
-@@ -1076,6 +1076,12 @@ config CMD_LOADB
+@@ -1143,6 +1143,12 @@ config CMD_LOADB
  	help
  	  Load a binary file over serial line.
  
@@ -55,7 +55,7 @@
  	bool "loads"
  	default y
 diff --git a/cmd/bootefi.c b/cmd/bootefi.c
-index 53d9f0e0dcca..8d492ea9e70c 100644
+index 827fcd97dfd8..37ce659fa123 100644
 --- a/cmd/bootefi.c
 +++ b/cmd/bootefi.c
 @@ -34,6 +34,18 @@ static struct efi_device_path *bootefi_device_path;
@@ -141,10 +141,10 @@
 +);
 +#endif /* CONFIG_CMD_LOADM */
 diff --git a/include/efi_loader.h b/include/efi_loader.h
-index af36639ec6a7..126db279dd3e 100644
+index 11930fbea838..5b41985244e2 100644
 --- a/include/efi_loader.h
 +++ b/include/efi_loader.h
-@@ -585,6 +585,8 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
+@@ -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);
@@ -154,10 +154,10 @@
  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 0542aaae16c7..d8dc59b2c95c 100644
+index 171661b89727..2493d7432613 100644
 --- a/lib/efi_loader/efi_device_path.c
 +++ b/lib/efi_loader/efi_device_path.c
-@@ -1138,6 +1138,8 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
+@@ -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;
@@ -166,7 +166,7 @@
  	int part = 0;
  	char *filename;
  	char *s;
-@@ -1153,6 +1155,13 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
+@@ -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();
@@ -181,5 +181,5 @@
  		part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
  					       1);
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm-add-support-to-corstone1000-platform.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm-add-support-to-corstone1000-platform.patch
index e0caaa4..1863629 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm-add-support-to-corstone1000-platform.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm-add-support-to-corstone1000-platform.patch
@@ -1,7 +1,7 @@
-From 5cc889db3279ef4944ab64e36db3dbab1bf9ffa5 Mon Sep 17 00:00:00 2001
+From c9a9a467bb335047812004dd022dcadf9514101f 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/27] arm: add support to corstone1000 platform
+Subject: [PATCH 02/24] 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
@@ -27,10 +27,10 @@
  board/armltd/corstone1000/Kconfig        |  12 ++
  board/armltd/corstone1000/MAINTAINERS    |   7 +
  board/armltd/corstone1000/Makefile       |   7 +
- board/armltd/corstone1000/corstone1000.c | 121 ++++++++++++++++
+ board/armltd/corstone1000/corstone1000.c | 125 +++++++++++++++++
  configs/corstone1000_defconfig           |  80 +++++++++++
  include/configs/corstone1000.h           |  86 ++++++++++++
- 11 files changed, 548 insertions(+)
+ 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
@@ -42,12 +42,12 @@
  create mode 100644 include/configs/corstone1000.h
 
 diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 4567c183fb84..d64051b533a7 100644
+index 9898c7d68e1b..2fc2b7d20f12 100644
 --- a/arch/arm/Kconfig
 +++ b/arch/arm/Kconfig
-@@ -1266,6 +1266,12 @@ config TARGET_VEXPRESS64_JUNO
- 	select USB
- 	imply OF_HAS_PRIOR_STAGE
+@@ -1347,6 +1347,12 @@ config ARCH_VEXPRESS64
+ 	select ENV_IS_IN_FLASH if MTD
+ 	imply DISTRO_DEFAULTS
  
 +config TARGET_CORSTONE1000
 +	bool "Support Corstone1000 Platform"
@@ -58,7 +58,7 @@
  config TARGET_TOTAL_COMPUTE
  	bool "Support Total Compute Platform"
  	select ARM64
-@@ -2198,6 +2204,8 @@ source "arch/arm/mach-nexell/Kconfig"
+@@ -2295,6 +2301,8 @@ source "arch/arm/mach-npcm/Kconfig"
  
  source "board/armltd/total_compute/Kconfig"
  
@@ -68,10 +68,10 @@
  source "board/bosch/guardian/Kconfig"
  source "board/Marvell/octeontx/Kconfig"
 diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
-index 644ba961a223..7de25d09c9fe 100644
+index a7e0d9f6c0e8..8c8f15b6a813 100644
 --- a/arch/arm/dts/Makefile
 +++ b/arch/arm/dts/Makefile
-@@ -1215,6 +1215,9 @@ dtb-$(CONFIG_TARGET_EA_LPC3250DEVKITV2) += lpc3250-ea3250.dtb
+@@ -1265,6 +1265,9 @@ dtb-$(CONFIG_TARGET_EA_LPC3250DEVKITV2) += lpc3250-ea3250.dtb
  
  dtb-$(CONFIG_ARCH_QEMU) += qemu-arm.dtb qemu-arm64.dtb
  
@@ -369,10 +369,10 @@
 +obj-y	:= corstone1000.o
 diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c
 new file mode 100644
-index 000000000000..eff1739f0b02
+index 000000000000..2fa485ff3799
 --- /dev/null
 +++ b/board/armltd/corstone1000/corstone1000.c
-@@ -0,0 +1,121 @@
+@@ -0,0 +1,125 @@
 +// SPDX-License-Identifier: GPL-2.0+
 +/*
 + * (C) Copyright 2022 ARM Limited
@@ -452,6 +452,10 @@
 +
 +struct mm_region *mem_map = corstone1000_mem_map;
 +
++void set_dfu_alt_info(char *interface, char *devstr)
++{
++}
++
 +int board_init(void)
 +{
 +	return 0;
@@ -673,5 +677,5 @@
 +				"bootefi $kernel_addr_r $fdtcontroladdr;"
 +#endif
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-usb-common-move-urb-code-to-common.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-usb-common-move-urb-code-to-common.patch
index 9974915..1cebd07 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-usb-common-move-urb-code-to-common.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-usb-common-move-urb-code-to-common.patch
@@ -1,7 +1,7 @@
-From b8f4f76e135ff2061d0032292f5209ac911dba16 Mon Sep 17 00:00:00 2001
+From 61c5fe3758a0febdee33429f5be16f69279045cc 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/27] usb: common: move urb code to common
+Subject: [PATCH 03/24] 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.
@@ -493,5 +493,5 @@
  /*
   * Hub Status & Hub Change bit masks
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-usb-add-isp1760-family-driver.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-usb-add-isp1760-family-driver.patch
index 5940f06..1dd6f25 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-usb-add-isp1760-family-driver.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-usb-add-isp1760-family-driver.patch
@@ -1,7 +1,7 @@
-From 62a666a83766f5517e90464638455286bb33f433 Mon Sep 17 00:00:00 2001
+From 8abb9c6a342d750a3a3a66e674c3be6597fc9f66 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/27] usb: add isp1760 family driver
+Subject: [PATCH 04/24] usb: add isp1760 family driver
 
 ISP1760/61/63 are a family of usb controllers, blah, blah, more info
 here.
@@ -34,10 +34,10 @@
  create mode 100644 drivers/usb/isp1760/isp1760-uboot.h
 
 diff --git a/Makefile b/Makefile
-index ad83d60dc39d..2c857c1fe2cc 100644
+index 98867fbe06b4..67851020f5c1 100644
 --- a/Makefile
 +++ b/Makefile
-@@ -834,6 +834,7 @@ libs-y += drivers/usb/host/
+@@ -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/
@@ -3801,5 +3801,5 @@
 +
 +#endif
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-corstone1000-enable-isp1763-usb-controller.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-corstone1000-enable-isp1763-usb-controller.patch
index 2ce03b6..c465455 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-corstone1000-enable-isp1763-usb-controller.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-corstone1000-enable-isp1763-usb-controller.patch
@@ -1,7 +1,7 @@
-From b7fb62e512e00a5fdbb4321bb0b4109261518481 Mon Sep 17 00:00:00 2001
+From 5031fea320bb4ccc1ce7470193d8f4402ae819c9 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/27] corstone1000: enable isp1763 usb controller
+Subject: [PATCH 05/24] 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
@@ -44,5 +44,5 @@
  				"boot_bank_flag=0x08002000\0"				\
  				"kernel_addr_bank_0=0x083EE000\0"			\
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-introducing-Arm-FF-A-low-level-driver.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-introducing-Arm-FF-A-low-level-driver.patch
index 8cc848f..617aaf7 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-introducing-Arm-FF-A-low-level-driver.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-introducing-Arm-FF-A-low-level-driver.patch
@@ -1,7 +1,7 @@
-From ede21dc1ca75132698cc81e88357c5789ccf67c7 Mon Sep 17 00:00:00 2001
+From 968c86e8a6ed3e9e6621f0ae44977b5b13d90bfd Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Tue, 16 Nov 2021 12:34:52 +0000
-Subject: [PATCH 06/27] arm_ffa: introducing Arm FF-A low-level driver
+Subject: [PATCH 06/24] arm_ffa: introducing Arm FF-A low-level driver
 
 This driver implements Arm Firmware Framework for Armv8-A on u-boot
 
@@ -58,10 +58,10 @@
  create mode 100644 lib/arm-ffa/arm_ffa_helper.c
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 96582fc67777..14307e6da644 100644
+index 7f27ff4c20fc..d29d7e040764 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -232,6 +232,14 @@ F:	board/CZ.NIC/
+@@ -244,6 +244,14 @@ F:	board/CZ.NIC/
  F:	configs/turris_*_defconfig
  F:	include/configs/turris_*.h
  
@@ -143,20 +143,20 @@
  	DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state));
  #endif
 diff --git a/common/board_r.c b/common/board_r.c
-index c24d9b4e220b..af20f38b104c 100644
+index 6f4aca2077d6..412a0ea9fac3 100644
 --- a/common/board_r.c
 +++ b/common/board_r.c
-@@ -61,6 +61,9 @@
- #include <wdt.h>
+@@ -62,6 +62,9 @@
  #include <asm-generic/gpio.h>
  #include <efi_loader.h>
+ #include <relocate.h>
 +#ifdef CONFIG_ARM_FFA_TRANSPORT
 +#include <arm_ffa_helper.h>
 +#endif
  
  DECLARE_GLOBAL_DATA_PTR;
  
-@@ -770,6 +773,9 @@ static init_fnc_t init_sequence_r[] = {
+@@ -779,6 +782,9 @@ static init_fnc_t init_sequence_r[] = {
  	INIT_FUNC_WATCHDOG_RESET
  	initr_net,
  #endif
@@ -180,10 +180,10 @@
  
  source "drivers/axi/Kconfig"
 diff --git a/drivers/Makefile b/drivers/Makefile
-index 4e7cf284405a..6671d2a604ab 100644
+index 67c8af74424e..1be687b55d13 100644
 --- a/drivers/Makefile
 +++ b/drivers/Makefile
-@@ -107,6 +107,7 @@ obj-y += iommu/
+@@ -109,6 +109,7 @@ obj-y += iommu/
  obj-y += smem/
  obj-y += thermal/
  obj-$(CONFIG_TEE) += tee/
@@ -2249,10 +2249,10 @@
 +int ffa_uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin);
 +#endif
 diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
-index 0e26e1d13824..a1181b8f48e7 100644
+index 3ba69ad9a084..732441824557 100644
 --- a/include/dm/uclass-id.h
 +++ b/include/dm/uclass-id.h
-@@ -52,6 +52,7 @@ enum uclass_id {
+@@ -55,6 +55,7 @@ enum uclass_id {
  	UCLASS_EFI_MEDIA,	/* Devices provided by UEFI firmware */
  	UCLASS_ETH,		/* Ethernet device */
  	UCLASS_ETH_PHY,		/* Ethernet PHY device */
@@ -2320,10 +2320,10 @@
  
  #define arm_smccc_smc_quirk(...) __arm_smccc_smc(__VA_ARGS__)
 diff --git a/lib/Kconfig b/lib/Kconfig
-index 3c6fa99b1a6a..473821b882e2 100644
+index acc0ac081a44..65db65c3c4cd 100644
 --- a/lib/Kconfig
 +++ b/lib/Kconfig
-@@ -810,6 +810,7 @@ config SMBIOS_PARSER
+@@ -902,6 +902,7 @@ config SMBIOS_PARSER
  source lib/efi/Kconfig
  source lib/efi_loader/Kconfig
  source lib/optee/Kconfig
@@ -2332,7 +2332,7 @@
  config TEST_FDTDEC
  	bool "enable fdtdec test"
 diff --git a/lib/Makefile b/lib/Makefile
-index 11b03d1cbec8..8e6fad613067 100644
+index d9b1811f7506..4aa3e2ed2a7e 100644
 --- a/lib/Makefile
 +++ b/lib/Makefile
 @@ -9,6 +9,7 @@ obj-$(CONFIG_EFI) += efi/
@@ -2564,7 +2564,7 @@
 +	return 0;
 +}
 diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 5bcb8253edba..cffa2c69d621 100644
+index 4da64b5d2962..c68d9ed4f0bd 100644
 --- a/lib/efi_loader/efi_boottime.c
 +++ b/lib/efi_loader/efi_boottime.c
 @@ -23,6 +23,10 @@
@@ -2578,7 +2578,7 @@
  DECLARE_GLOBAL_DATA_PTR;
  
  /* Task priority level */
-@@ -2114,6 +2118,10 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2113,6 +2117,10 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
  	struct efi_event *evt, *next_event;
  	efi_status_t ret = EFI_SUCCESS;
  
@@ -2589,7 +2589,7 @@
  	EFI_ENTRY("%p, %zx", image_handle, map_key);
  
  	/* Check that the caller has read the current memory map */
-@@ -2174,6 +2182,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2173,6 +2181,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
  		dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
  	}
  
@@ -2606,5 +2606,5 @@
  	efi_runtime_detach();
  
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-introducing-armffa-command.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-introducing-armffa-command.patch
index 83f0547..582bc3e 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-introducing-armffa-command.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-introducing-armffa-command.patch
@@ -1,7 +1,7 @@
-From 541b2b51dc77832ab5845cab4762d29976838d36 Mon Sep 17 00:00:00 2001
+From 58358f79d9f8abbdc8bcfc7d08bd0c7c4c90ec84 Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Tue, 16 Nov 2021 12:36:27 +0000
-Subject: [PATCH 07/27] arm_ffa: introducing armffa command
+Subject: [PATCH 07/24] arm_ffa: introducing armffa command
 
 A new armffa command is provided as an example of how to use
 the FF-A helper functions to communicate with secure world.
@@ -20,10 +20,10 @@
  create mode 100644 cmd/armffa.c
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 14307e6da644..f3fd559da54a 100644
+index d29d7e040764..32fc267fcf13 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -235,6 +235,7 @@ F:	include/configs/turris_*.h
+@@ -247,6 +247,7 @@ F:	include/configs/turris_*.h
  ARM FF-A
  M:	Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
  S:	Maintained
@@ -32,10 +32,10 @@
  F:	include/arm_ffa.h
  F:	include/arm_ffa_helper.h
 diff --git a/cmd/Kconfig b/cmd/Kconfig
-index ff50102a89c7..ff124bf4bad0 100644
+index ba2f321ae989..090e668125d5 100644
 --- a/cmd/Kconfig
 +++ b/cmd/Kconfig
-@@ -813,6 +813,16 @@ endmenu
+@@ -873,6 +873,16 @@ endmenu
  
  menu "Device access commands"
  
@@ -53,7 +53,7 @@
  	#depends on FLASH_CFI_DRIVER
  	bool "armflash"
 diff --git a/cmd/Makefile b/cmd/Makefile
-index 166c652d9825..770b846c44e0 100644
+index 5e43a1e022e8..e40f52f1e416 100644
 --- a/cmd/Makefile
 +++ b/cmd/Makefile
 @@ -12,6 +12,8 @@ obj-y += panic.o
@@ -338,5 +338,5 @@
 +	   "devlist\n"
 +	   "	 - displays the arm_ffa device info\n");
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-introducing-MM-communication-with-FF-A.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-introducing-MM-communication-with-FF-A.patch
index 9b1383e..3b82b41 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-introducing-MM-communication-with-FF-A.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-introducing-MM-communication-with-FF-A.patch
@@ -1,7 +1,7 @@
-From 2f09d4a2e87febd7365b9e18d669208ff2c35edc Mon Sep 17 00:00:00 2001
+From ee7c0aee66db53b2372a3b4245a8754dceee804d Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Wed, 13 Oct 2021 17:51:44 +0100
-Subject: [PATCH 08/27] arm_ffa: introducing MM communication with FF-A
+Subject: [PATCH 08/24] arm_ffa: introducing MM communication with FF-A
 
 This commit allows to perform MM communication using FF-A transport.
 
@@ -30,10 +30,10 @@
  2 files changed, 273 insertions(+), 6 deletions(-)
 
 diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
-index e5e35fe51f65..6827b821545e 100644
+index e3f2402d0e8e..37131237af3f 100644
 --- a/lib/efi_loader/Kconfig
 +++ b/lib/efi_loader/Kconfig
-@@ -56,13 +56,23 @@ config EFI_VARIABLE_FILE_STORE
+@@ -60,13 +60,23 @@ config EFI_VARIABLE_FILE_STORE
  	  stored as file /ubootefi.var on the EFI system partition.
  
  config EFI_MM_COMM_TEE
@@ -42,7 +42,7 @@
 +	bool "UEFI variables storage service via the trusted world"
 +	depends on OPTEE || ARM_FFA_TRANSPORT
  	help
-+	  The MM SP (also called partition) can be StandAlonneMM or smm-gateway.
++         the MM SP (also called partition) can be StandAlonneMM or smm-gateway.
 +	  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.
 +
@@ -56,9 +56,9 @@
 +	  MM buffer. The data is copied by u-boot to thea shared buffer before issuing
 +	  the door bell event.
 +
- endchoice
- 
- config EFI_VARIABLES_PRESEED
+ config EFI_VARIABLE_NO_STORE
+ 	bool "Don't persist non-volatile UEFI variables"
+ 	help
 diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
 index dfef18435dfa..9cb8cfb9c779 100644
 --- a/lib/efi_loader/efi_variable_tee.c
@@ -379,5 +379,5 @@
  
  	/*
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-introducing-test-module-for-UCLASS_FFA.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-introducing-test-module-for-UCLASS_FFA.patch
index 4fb317b..ae4bb02 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-introducing-test-module-for-UCLASS_FFA.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-introducing-test-module-for-UCLASS_FFA.patch
@@ -1,7 +1,7 @@
-From c9a2c457648b732292482fae59a7fd61cefffd33 Mon Sep 17 00:00:00 2001
+From 6f998a5e94e2562b5876b88864876c8b03b88f5a Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Tue, 16 Nov 2021 12:38:48 +0000
-Subject: [PATCH 09/27] arm_ffa: introducing test module for UCLASS_FFA
+Subject: [PATCH 09/24] arm_ffa: introducing test module for UCLASS_FFA
 
 This is the test module for the UCLASS_FFA class.
 
@@ -17,10 +17,10 @@
  create mode 100644 test/dm/ffa.h
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index f3fd559da54a..6510f844fe09 100644
+index 32fc267fcf13..8209dc9319f1 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -240,6 +240,7 @@ F:	drivers/arm-ffa/
+@@ -252,6 +252,7 @@ F:	drivers/arm-ffa/
  F:	include/arm_ffa.h
  F:	include/arm_ffa_helper.h
  F:	lib/arm-ffa/
@@ -29,7 +29,7 @@
  ARM FREESCALE IMX
  M:	Stefano Babic <sbabic@denx.de>
 diff --git a/test/dm/Makefile b/test/dm/Makefile
-index d46552fbf320..ddac250cdff0 100644
+index f0a7c97e3d17..09a3403d2f53 100644
 --- a/test/dm/Makefile
 +++ b/test/dm/Makefile
 @@ -79,6 +79,7 @@ obj-$(CONFIG_POWER_DOMAIN) += power-domain.o
@@ -128,5 +128,5 @@
 +
 +#endif /*__TEST_DM_FFA_H */
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-arm_ffa-corstone1000-enable-FF-A-and-MM-support.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-arm_ffa-corstone1000-enable-FF-A-and-MM-support.patch
index bc96fc4..8cab40c 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-arm_ffa-corstone1000-enable-FF-A-and-MM-support.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-arm_ffa-corstone1000-enable-FF-A-and-MM-support.patch
@@ -1,7 +1,7 @@
-From ce6598d255113458fd5c9d19bb7469b721e37f6f Mon Sep 17 00:00:00 2001
+From c0b01dff84d74f1b5aaff0d9b594e0aaec16c744 Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Tue, 2 Nov 2021 16:44:39 +0000
-Subject: [PATCH 10/27] arm_ffa: corstone1000: enable FF-A and MM support
+Subject: [PATCH 10/24] 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
@@ -53,5 +53,5 @@
  #define CONFIG_SKIP_LOWLEVEL_INIT
  
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-introduce-EFI-capsule-update.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-introduce-EFI-capsule-update.patch
index cb24ec3..0a829c4 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-introduce-EFI-capsule-update.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-introduce-EFI-capsule-update.patch
@@ -1,7 +1,7 @@
-From e70d0128090158872847b82b82cdbcf0e2f13885 Mon Sep 17 00:00:00 2001
+From 652259af2f795a5d69c628ae7b1e79d33c234abd Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Thu, 11 Nov 2021 16:27:59 +0000
-Subject: [PATCH 11/27] efi: corstone1000: introduce EFI capsule update
+Subject: [PATCH 11/24] efi: corstone1000: introduce EFI capsule update
 
 This commit provides capsule update feature for Corstone1000.
 
@@ -58,10 +58,10 @@
  #define MM_SP_UUID_DATA	\
  	0xed, 0x32, 0xd5, 0x33,	\
 diff --git a/include/efi_loader.h b/include/efi_loader.h
-index 126db279dd3e..01b432e6184b 100644
+index 5b41985244e2..796419b69b40 100644
 --- a/include/efi_loader.h
 +++ b/include/efi_loader.h
-@@ -965,11 +965,11 @@ extern const struct efi_firmware_management_protocol efi_fmp_fit;
+@@ -984,11 +984,11 @@ extern const struct efi_firmware_management_protocol efi_fmp_fit;
  extern const struct efi_firmware_management_protocol efi_fmp_raw;
  
  /* Capsule update */
@@ -76,10 +76,10 @@
  		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 cffa2c69d621..5c77a40c3ebe 100644
+index c68d9ed4f0bd..f2b5c7834c01 100644
 --- a/lib/efi_loader/efi_boottime.c
 +++ b/lib/efi_loader/efi_boottime.c
-@@ -2096,6 +2096,44 @@ static void efi_exit_caches(void)
+@@ -2095,6 +2095,44 @@ static void efi_exit_caches(void)
  #endif
  }
  
@@ -124,7 +124,7 @@
  /**
   * efi_exit_boot_services() - stop all boot services
   * @image_handle: handle of the loaded image
-@@ -2209,6 +2247,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+@@ -2208,6 +2246,15 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
  	/* Recalculate CRC32 */
  	efi_update_table_header_crc32(&systab.hdr);
  
@@ -141,10 +141,10 @@
  	efi_set_watchdog(0);
  	WATCHDOG_RESET();
 diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index f00440163d41..c100c1b95298 100644
+index a6b98f066a0b..a0689ba912fc 100644
 --- a/lib/efi_loader/efi_capsule.c
 +++ b/lib/efi_loader/efi_capsule.c
-@@ -24,6 +24,14 @@
+@@ -25,6 +25,14 @@
  #include <crypto/pkcs7_parser.h>
  #include <linux/err.h>
  
@@ -159,7 +159,7 @@
  DECLARE_GLOBAL_DATA_PTR;
  
  const efi_guid_t efi_guid_capsule_report = EFI_CAPSULE_REPORT_GUID;
-@@ -509,6 +517,89 @@ static efi_status_t efi_capsule_update_firmware(
+@@ -512,6 +520,89 @@ static efi_status_t efi_capsule_update_firmware(
  }
  #endif /* CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT */
  
@@ -249,7 +249,7 @@
  /**
   * efi_update_capsule() - process information from operating system
   * @capsule_header_array:	Array of virtual address pointers
-@@ -522,7 +613,7 @@ static efi_status_t efi_capsule_update_firmware(
+@@ -525,7 +616,7 @@ static efi_status_t efi_capsule_update_firmware(
   *
   * Return:			status code
   */
@@ -258,7 +258,7 @@
  		struct efi_capsule_header **capsule_header_array,
  		efi_uintn_t capsule_count,
  		u64 scatter_gather_list)
-@@ -539,6 +630,13 @@ efi_status_t EFIAPI efi_update_capsule(
+@@ -542,6 +633,13 @@ efi_status_t EFIAPI efi_update_capsule(
  		goto out;
  	}
  
@@ -272,7 +272,7 @@
  	ret = EFI_SUCCESS;
  	for (i = 0, capsule = *capsule_header_array; i < capsule_count;
  	     i++, capsule = *(++capsule_header_array)) {
-@@ -551,6 +649,39 @@ efi_status_t EFIAPI efi_update_capsule(
+@@ -554,6 +652,39 @@ efi_status_t EFIAPI efi_update_capsule(
  
  		log_debug("Capsule[%d] (guid:%pUs)\n",
  			  i, &capsule->capsule_guid);
@@ -312,7 +312,7 @@
  		if (!guidcmp(&capsule->capsule_guid,
  			     &efi_guid_firmware_management_capsule_id)) {
  			ret  = efi_capsule_update_firmware(capsule);
-@@ -589,7 +720,7 @@ out:
+@@ -592,7 +723,7 @@ out:
   *
   * Return:			status code
   */
@@ -322,7 +322,7 @@
  		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 eee54e48784f..989380d4f8cd 100644
+index 492ecf4cb15c..bfd4687e10b5 100644
 --- a/lib/efi_loader/efi_setup.c
 +++ b/lib/efi_loader/efi_setup.c
 @@ -16,6 +16,13 @@
@@ -355,5 +355,5 @@
  		ret = efi_set_variable_int(u"CapsuleMax",
  					   &efi_guid_capsule_report,
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-corstone1000-Update-FFA-shared-buffer-address.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-corstone1000-Update-FFA-shared-buffer-address.patch
index 60dc850..d1e13f6 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-corstone1000-Update-FFA-shared-buffer-address.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-corstone1000-Update-FFA-shared-buffer-address.patch
@@ -1,7 +1,7 @@
-From b2d752b4bbd5b2dc4cb22d2d652a261287505926 Mon Sep 17 00:00:00 2001
+From 1ff229c8e02bdd3c859d581787636cfdf674eec1 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 12/27] corstone1000: Update FFA shared buffer address
+Subject: [PATCH 12/24] corstone1000: Update FFA shared buffer address
 
 FFA shared buffer address changed to 0x02000000.
 
@@ -33,5 +33,5 @@
  #define CONFIG_SYS_INIT_SP_ADDR		(CONFIG_SYS_SDRAM_BASE + 0x03f00000)
  #define CONFIG_SKIP_LOWLEVEL_INIT
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-corstone1000-Make-sure-shared-buffer-contents-are-no.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-corstone1000-Make-sure-shared-buffer-contents-are-no.patch
index 2495538..2caeb58 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-corstone1000-Make-sure-shared-buffer-contents-are-no.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-corstone1000-Make-sure-shared-buffer-contents-are-no.patch
@@ -1,7 +1,7 @@
-From 67a755f74716068cfd44a8897c31151fe9ee4328 Mon Sep 17 00:00:00 2001
+From 370422921b2a3f4f7b73ce5b08820c24e82bba19 Mon Sep 17 00:00:00 2001
 From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
 Date: Thu, 18 Nov 2021 16:42:59 +0000
-Subject: [PATCH 13/27] corstone1000: Make sure shared buffer contents are not
+Subject: [PATCH 13/24] corstone1000: Make sure shared buffer contents are not
  cached
 
 After updating the shared buffer, it is required to flush the cache
@@ -48,5 +48,5 @@
  
  	ffa_ret = ffa_notify_mm_sp();
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-arm-corstone1000-fix-unrecognized-filesystem-type.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-arm-corstone1000-fix-unrecognized-filesystem-type.patch
index fa201eb..3151741 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-arm-corstone1000-fix-unrecognized-filesystem-type.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-arm-corstone1000-fix-unrecognized-filesystem-type.patch
@@ -1,7 +1,7 @@
-From e2463e3ef52260b38131085c0901de8708d52693 Mon Sep 17 00:00:00 2001
+From 340ba3fbb0ea388578e30aede92695886f221eaf 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 14/27] arm: corstone1000: fix unrecognized filesystem type
+Subject: [PATCH 14/24] arm: corstone1000: fix unrecognized filesystem type
 
 Some usb sticks are not recognized by usb, just add a
 delay before checking status.
@@ -12,10 +12,10 @@
  1 file changed, 3 insertions(+)
 
 diff --git a/common/usb_storage.c b/common/usb_storage.c
-index c9e2d7343ce2..ae72338323ba 100644
+index eaa31374ef73..79cf4297d4f4 100644
 --- a/common/usb_storage.c
 +++ b/common/usb_storage.c
-@@ -769,6 +769,9 @@ static int usb_stor_BBB_transport(struct scsi_cmd *srb, struct us_data *us)
+@@ -784,6 +784,9 @@ static int usb_stor_BBB_transport(struct scsi_cmd *srb, struct us_data *us)
  st:
  	retry = 0;
  again:
@@ -26,5 +26,5 @@
  	result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE,
  				&actlen, USB_CNTL_TIMEOUT*5);
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch
index 0d1912c..4e3f237 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_capsule-corstone1000-pass-interface-id-and-buffe.patch
@@ -1,7 +1,7 @@
-From 81bf9ed7e8e858cef13cfc3d1435c44445e523df Mon Sep 17 00:00:00 2001
+From 4c249de0915750b328e456c34f18546f92850afd 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 15/27] efi_capsule: corstone1000: pass interface id and buffer
+Subject: [PATCH 15/24] 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
@@ -39,10 +39,10 @@
  #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 c100c1b95298..17d769803b2a 100644
+index a0689ba912fc..e08e97cf3fb7 100644
 --- a/lib/efi_loader/efi_capsule.c
 +++ b/lib/efi_loader/efi_capsule.c
-@@ -27,6 +27,8 @@
+@@ -28,6 +28,8 @@
  #ifdef CONFIG_TARGET_CORSTONE1000
  #include <arm_ffa_helper.h>
  #include <cpu_func.h>
@@ -51,7 +51,7 @@
  
  void *__efi_runtime_data corstone1000_capsule_buf; /* capsule shared buffer virtual address */
  efi_guid_t corstone1000_capsule_guid = EFI_CORSTONE1000_CAPSULE_ID_GUID;
-@@ -587,11 +589,12 @@ static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_s
+@@ -590,11 +592,12 @@ static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_s
  	func_data.data0 = &part_id;
  
  	/*
@@ -69,5 +69,5 @@
  	func_data.data1_size = sizeof(msg);
  	func_data.data1 = &msg;
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_boottime-corstone1000-pass-interface-id-and-kern.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_boottime-corstone1000-pass-interface-id-and-kern.patch
index f460fad..e134f23 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_boottime-corstone1000-pass-interface-id-and-kern.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_boottime-corstone1000-pass-interface-id-and-kern.patch
@@ -1,7 +1,7 @@
-From 10d0ffc26ddcecd83921c2b3b37cb4eff54a154f Mon Sep 17 00:00:00 2001
+From e5e1cf36cb7b77a5bb526f1744c0c77164374ca3 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 16/27] efi_boottime: corstone1000: pass interface id and
+Subject: [PATCH 16/24] 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
@@ -21,7 +21,7 @@
  1 file changed, 10 insertions(+), 3 deletions(-)
 
 diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
-index 5c77a40c3ebe..b58a8c98fd05 100644
+index f2b5c7834c01..140d0f4f71da 100644
 --- a/lib/efi_loader/efi_boottime.c
 +++ b/lib/efi_loader/efi_boottime.c
 @@ -27,6 +27,11 @@
@@ -36,7 +36,7 @@
  DECLARE_GLOBAL_DATA_PTR;
  
  /* Task priority level */
-@@ -2121,10 +2126,12 @@ static int efi_corstone1000_kernel_started_event(void)
+@@ -2120,10 +2125,12 @@ static int efi_corstone1000_kernel_started_event(void)
  	func_data.data0 = &part_id;
  
  	/*
@@ -53,5 +53,5 @@
  	func_data.data1_size = sizeof(msg);
  	func_data.data1 = &msg;
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-efi_loader-corstone1000-remove-guid-check-from-corst.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-efi_loader-corstone1000-remove-guid-check-from-corst.patch
index fa6ab32..b5a1715 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-efi_loader-corstone1000-remove-guid-check-from-corst.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-efi_loader-corstone1000-remove-guid-check-from-corst.patch
@@ -1,7 +1,7 @@
-From c463798489e41725f8ba33debeedc7c4011cda38 Mon Sep 17 00:00:00 2001
+From 596cf4d04580b191d2f4f6082000534bdab13791 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 17/27] efi_loader: corstone1000: remove guid check from
+Subject: [PATCH 17/24] efi_loader: corstone1000: remove guid check from
  corstone1000 config option
 
 Use generic fmp guid and no separte check is required for
@@ -14,10 +14,10 @@
  1 file changed, 1 insertion(+), 15 deletions(-)
 
 diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index 17d769803b2a..939040d2755e 100644
+index e08e97cf3fb7..891143c33909 100644
 --- a/lib/efi_loader/efi_capsule.c
 +++ b/lib/efi_loader/efi_capsule.c
-@@ -654,12 +654,6 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
+@@ -657,12 +657,6 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
  			  i, &capsule->capsule_guid);
  
  #if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
@@ -30,7 +30,7 @@
  		if (efi_size_in_pages(capsule->capsule_image_size) >
  		    CORSTONE1000_CAPSULE_BUFFER_SIZE) {
  			log_err("Corstone1000: Capsule data size exceeds the shared buffer size\n");
-@@ -685,15 +679,7 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
+@@ -688,15 +682,7 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
  		goto out;
  #endif
  
@@ -48,5 +48,5 @@
  			goto out;
  	}
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-arm_ffa-removing-the-cast-when-using-binary-OR-on-FI.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-arm_ffa-removing-the-cast-when-using-binary-OR-on-FI.patch
index 4ee10a0..f858a26 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-arm_ffa-removing-the-cast-when-using-binary-OR-on-FI.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-arm_ffa-removing-the-cast-when-using-binary-OR-on-FI.patch
@@ -1,7 +1,7 @@
-From 1cfca60850727448bdbfe720d98d9e0d4523f6aa Mon Sep 17 00:00:00 2001
+From 460406b46b51b6c585788001147a8961c95cc73c Mon Sep 17 00:00:00 2001
 From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 Date: Sat, 11 Dec 2021 21:05:10 +0000
-Subject: [PATCH 18/27] arm_ffa: removing the cast when using binary OR on
+Subject: [PATCH 18/24] arm_ffa: removing the cast when using binary OR on
  FIELD_PREP macros
 
 When the GENMASK used is above 16-bits wide a u16 cast will cause
@@ -36,5 +36,5 @@
  /* The FF-A SMC function prototype definition */
  
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Return-proper-error-code-when-rx-buffer-is-larger.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Return-proper-error-code-when-rx-buffer-is-larger.patch
deleted file mode 100644
index 21a89a4..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Return-proper-error-code-when-rx-buffer-is-larger.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 7db27eeaba0fd5ddb1e49977bb7e342a1980aa3d Mon Sep 17 00:00:00 2001
-From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Date: Sun, 12 Dec 2021 17:51:17 +0000
-Subject: [PATCH 19/27] Return proper error code when rx buffer is larger
-
-ffa_mm_communicate should return EFI_BUFFER_TOO_SMALL when
-the buffer received from the secure world is larger than the
-comm buffer as this value is forwarded by mm_communicate.
-
-Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_variable_tee.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
-index b6be2b54a030..38655a9dbb7c 100644
---- a/lib/efi_loader/efi_variable_tee.c
-+++ b/lib/efi_loader/efi_variable_tee.c
-@@ -358,7 +358,7 @@ static efi_status_t __efi_runtime ffa_mm_communicate(void *comm_buf, ulong comm_
- 
- 		if (rx_data_size > comm_buf_size) {
- 			unmap_sysmem(virt_shared_buf);
--			return EFI_OUT_OF_RESOURCES;
-+			return EFI_BUFFER_TOO_SMALL;
- 		}
- 
- 		efi_memcpy_runtime(comm_buf, virt_shared_buf, rx_data_size);
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Use-correct-buffer-size.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Use-correct-buffer-size.patch
new file mode 100644
index 0000000..af857f4
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-Use-correct-buffer-size.patch
@@ -0,0 +1,40 @@
+From 936c857add300f41bc58c300793a0e10b48ff69f Mon Sep 17 00:00:00 2001
+From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
+Date: Mon, 13 Dec 2021 15:25:23 +0000
+Subject: [PATCH 19/24] Use correct buffer size
+
+The comm buffer created has additional 4 bytes length which
+needs to be trimmed. This change will reduce the size of the
+comm buffer to what is expected.
+
+Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+---
+ include/mm_communication.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/include/mm_communication.h b/include/mm_communication.h
+index e65fbde60d0a..bb9919095649 100644
+--- a/include/mm_communication.h
++++ b/include/mm_communication.h
+@@ -123,7 +123,7 @@ struct __packed efi_mm_communicate_header {
+  *
+  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER.
+  */
+-struct smm_variable_communicate_header {
++struct __packed smm_variable_communicate_header {
+ 	efi_uintn_t  function;
+ 	efi_status_t ret_status;
+ 	u8           data[];
+@@ -145,7 +145,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;
+-- 
+2.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-Use-correct-buffer-size.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-Use-correct-buffer-size.patch
deleted file mode 100644
index 54328a7..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-Use-correct-buffer-size.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 9ad9ead58e8e9e4f9e7a283c916421b443b424ce Mon Sep 17 00:00:00 2001
-From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Date: Mon, 13 Dec 2021 15:25:23 +0000
-Subject: [PATCH 20/27] Use correct buffer size
-
-The comm buffer created has additional 4 bytes length which
-needs to be trimmed. This change will reduce the size of the
-comm buffer to what is expected.
-
-Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- include/mm_communication.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/include/mm_communication.h b/include/mm_communication.h
-index e65fbde60d0a..bb9919095649 100644
---- a/include/mm_communication.h
-+++ b/include/mm_communication.h
-@@ -123,7 +123,7 @@ struct __packed efi_mm_communicate_header {
-  *
-  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER.
-  */
--struct smm_variable_communicate_header {
-+struct __packed smm_variable_communicate_header {
- 	efi_uintn_t  function;
- 	efi_status_t ret_status;
- 	u8           data[];
-@@ -145,7 +145,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;
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
new file mode 100644
index 0000000..1204f2a
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
@@ -0,0 +1,36 @@
+From 5c57ef351882afebde479de430acf2c4f8fdefc8 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 20/24] 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
+is set. This will populte esrt table with firmware image info
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+---
+ lib/efi_loader/efi_capsule.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
+index 891143c33909..7db78f1f7648 100644
+--- a/lib/efi_loader/efi_capsule.c
++++ b/lib/efi_loader/efi_capsule.c
+@@ -679,6 +679,13 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
+ 			ret = EFI_SUCCESS;
+ 		}
+ 
++		if (IS_ENABLED(CONFIG_EFI_ESRT)) {
++			/* Rebuild the ESRT to reflect any updated FW images. */
++			ret = efi_esrt_populate();
++	               if (ret != EFI_SUCCESS)
++				log_warning("EFI Capsule: failed to update ESRT\n");
++	       }
++
+ 		goto out;
+ #endif
+ 
+-- 
+2.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-Update-comm_buf-when-EFI_BUFFER_TOO_SMALL.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-Update-comm_buf-when-EFI_BUFFER_TOO_SMALL.patch
deleted file mode 100644
index c7ac38f..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-Update-comm_buf-when-EFI_BUFFER_TOO_SMALL.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From b81214dea7056c3877aa9eb775557dc4702660ec Mon Sep 17 00:00:00 2001
-From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Date: Sun, 12 Dec 2021 17:58:08 +0000
-Subject: [PATCH 21/27] Update comm_buf when EFI_BUFFER_TOO_SMALL
-
-When the received buffer is larger than the comm buffer,
-the contents of the shared buffer which can fit in the
-comm buffer should be read before returning.
-
-Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_variable_tee.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
-index 38655a9dbb7c..67743d1f8fce 100644
---- a/lib/efi_loader/efi_variable_tee.c
-+++ b/lib/efi_loader/efi_variable_tee.c
-@@ -357,6 +357,7 @@ static efi_status_t __efi_runtime ffa_mm_communicate(void *comm_buf, ulong comm_
- 			sizeof(size_t);
- 
- 		if (rx_data_size > comm_buf_size) {
-+			efi_memcpy_runtime(comm_buf, virt_shared_buf, comm_buf_size);
- 			unmap_sysmem(virt_shared_buf);
- 			return EFI_BUFFER_TOO_SMALL;
- 		}
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-efi_firmware-add-get_image_info-for-corstone1000.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-efi_firmware-add-get_image_info-for-corstone1000.patch
new file mode 100644
index 0000000..8f86b65
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-efi_firmware-add-get_image_info-for-corstone1000.patch
@@ -0,0 +1,124 @@
+From fcd1dc670d83bd7e7528370d0d6f168bfb44054d 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 21/24] efi_firmware: add get_image_info for corstone1000
+
+This change is to populate get_image_info which eventually
+will be populated in ESRT table
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+%% original patch: 0047-efi_firmware-add-get_image_info-for-corstone1000.patch
+
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+---
+ lib/efi_loader/efi_firmware.c | 71 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 70 insertions(+), 1 deletion(-)
+
+diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
+index 30cafd15caac..af43d4502f92 100644
+--- a/lib/efi_loader/efi_firmware.c
++++ b/lib/efi_loader/efi_firmware.c
+@@ -17,11 +17,69 @@
+ 
+ #define FMP_PAYLOAD_HDR_SIGNATURE	SIGNATURE_32('M', 'S', 'S', '1')
+ 
++#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
++#define EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID \
++	EFI_GUID(0xe2bb9c06, 0x70e9, 0x4b14, 0x97, 0xa3, \
++		 0x5a, 0x79, 0x13, 0x17, 0x6e, 0x3f)
++
++ const efi_guid_t efi_firmware_image_type_uboot_raw =
++				EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID;
++
++static efi_status_t efi_corstone1000_img_info_get (
++	efi_uintn_t *image_info_size,
++	struct efi_firmware_image_descriptor *image_info,
++	u32 *descriptor_version,
++	u8 *descriptor_count,
++	efi_uintn_t *descriptor_size,
++	u32 *package_version,
++	u16 **package_version_name,
++	const efi_guid_t *image_type)
++{
++	int i = 0;
++
++	*image_info_size = sizeof(*image_info);
++	*descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
++	*descriptor_count = 1;//dfu_num;
++	*descriptor_size = sizeof(*image_info);
++	if (package_version)
++		*package_version = 0xffffffff; /* not supported */
++	if(package_version_name)
++		*package_version_name = NULL; /* not supported */
++
++	if(image_info == NULL) {
++		log_warning("image_info is null\n");
++		return EFI_BUFFER_TOO_SMALL;
++	}
++
++	image_info[i].image_index = i;
++	image_info[i].image_type_id = *image_type;
++	image_info[i].image_id = 0;
++	image_info[i].image_id_name = "wic";
++	image_info[i].version = 1;
++	image_info[i].version_name = NULL;
++	image_info[i].size = 0x1000;
++	image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
++					     IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
++	image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE;
++	/* Check if the capsule authentication is enabled */
++	if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE))
++		image_info[0].attributes_setting |=
++			IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
++	image_info[i].lowest_supported_image_version = 0;
++	image_info[i].last_attempt_version = 0;
++	image_info[i].last_attempt_status = LAST_ATTEMPT_STATUS_SUCCESS;
++	image_info[i].hardware_instance = 1;
++	image_info[i].dependencies = NULL;
++
++	return EFI_SUCCESS;
++}
++#endif
++
+ /**
+  * struct fmp_payload_header - EDK2 header for the FMP payload
+  *
+  * This structure describes the header which is preprended to the
+- * FMP payload by the edk2 capsule generation scripts.
++ * FMP payload by the edk1 capsule generation scripts.
+  *
+  * @signature:			Header signature used to identify the header
+  * @header_size:		Size of the structure
+@@ -285,10 +343,18 @@ efi_status_t EFIAPI efi_firmware_get_image_info(
+ 	     !descriptor_size || !package_version || !package_version_name))
+ 		return EFI_EXIT(EFI_INVALID_PARAMETER);
+ 
++#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
++	ret = efi_corstone1000_img_info_get(image_info_size, image_info,
++			       descriptor_version, descriptor_count,
++			       descriptor_size,
++			       package_version, package_version_name,
++			       &efi_firmware_image_type_uboot_raw);
++#else
+ 	ret = efi_fill_image_desc_array(image_info_size, image_info,
+ 					descriptor_version, descriptor_count,
+ 					descriptor_size, package_version,
+ 					package_version_name);
++#endif
+ 
+ 	return EFI_EXIT(ret);
+ }
+@@ -401,6 +467,9 @@ efi_status_t EFIAPI efi_firmware_raw_set_image(
+ 	if (status != EFI_SUCCESS)
+ 		return EFI_EXIT(status);
+ 
++#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
++	return EFI_EXIT(EFI_SUCCESS);
++#endif
+ 	if (dfu_write_by_alt(image_index - 1, (void *)image, image_size,
+ 			     NULL, NULL))
+ 		return EFI_EXIT(EFI_DEVICE_ERROR);
+-- 
+2.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
deleted file mode 100644
index aaea20e..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 5fec641015f8f1ca80f55f05b5e1f67653321303 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/27] 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
-is set. This will populte esrt table with firmware image info
-
-Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_capsule.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
-index 939040d2755e..790d2ba8fe19 100644
---- a/lib/efi_loader/efi_capsule.c
-+++ b/lib/efi_loader/efi_capsule.c
-@@ -676,6 +676,13 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
- 			ret = EFI_SUCCESS;
- 		}
- 
-+		if (IS_ENABLED(CONFIG_EFI_ESRT)) {
-+			/* Rebuild the ESRT to reflect any updated FW images. */
-+			ret = efi_esrt_populate();
-+	               if (ret != EFI_SUCCESS)
-+				log_warning("EFI Capsule: failed to update ESRT\n");
-+	       }
-+
- 		goto out;
- #endif
- 
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-send-bootcomplete-message-to-secure-encla.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-send-bootcomplete-message-to-secure-encla.patch
new file mode 100644
index 0000000..1dc0455
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-efi_loader-send-bootcomplete-message-to-secure-encla.patch
@@ -0,0 +1,191 @@
+From 902d5c499b6627a505986d298986a4ac430592b8 Mon Sep 17 00:00:00 2001
+From: Vishnu Banavath <vishnu.banavath@arm.com>
+Date: Wed, 5 Jan 2022 17:56:09 +0000
+Subject: [PATCH 22/24] 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,
+an event is sent at exitbootservice level. This will create a problem
+when user wants to interrupt at UEFI shell, hence, it is required
+to send an uboot efi initialized event at efi sub-system initialization
+stage.
+
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+---
+ include/configs/corstone1000.h |  2 +-
+ lib/efi_loader/efi_boottime.c  | 49 ----------------------------------
+ lib/efi_loader/efi_firmware.c  |  2 +-
+ lib/efi_loader/efi_setup.c     | 48 +++++++++++++++++++++++++++++++++
+ 4 files changed, 50 insertions(+), 51 deletions(-)
+
+diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
+index a7445e61348b..06b605e43bdf 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -22,7 +22,7 @@
+ 
+ /* Notification events used with SE Proxy update service */
+ #define CORSTONE1000_BUFFER_READY_EVT		(0x1)
+-#define CORSTONE1000_KERNEL_STARTED_EVT		(0x2)
++#define CORSTONE1000_UBOOT_EFI_STARTED_EVT	(0x2)
+ 
+ #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 140d0f4f71da..6b9f5cf272b8 100644
+--- a/lib/efi_loader/efi_boottime.c
++++ b/lib/efi_loader/efi_boottime.c
+@@ -2100,46 +2100,6 @@ static void efi_exit_caches(void)
+ #endif
+ }
+ 
+-#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
+-/**
+- * efi_corstone1000_kernel_started_event - notifies SE Proxy FW update service
+- *
+- * This function notifies the SE Proxy update service that the kernel has already started
+- *
+- * Return:
+- *
+- * 0: on success, otherwise failure
+- */
+-static int efi_corstone1000_kernel_started_event(void)
+-{
+-	struct ffa_interface_data func_data = {0};
+-	struct ffa_send_direct_data msg = {0};
+-	u16 part_id = CORSTONE1000_SEPROXY_PART_ID;
+-
+-	log_debug("[%s]\n", __func__);
+-
+-	/*
+-	 * telling the driver which partition to use
+-	 */
+-	func_data.data0_size = sizeof(part_id);
+-	func_data.data0 = &part_id;
+-
+-	/*
+-	 * setting the kernel started  event arguments:
+-	 * setting capsule update interface ID(31:16)
+-	 * the kernel started event ID(15:0)
+-	 */
+-	msg.a4 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
+-	PREP_SEPROXY_EVT(CORSTONE1000_KERNEL_STARTED_EVT);
+-
+-	func_data.data1_size = sizeof(msg);
+-	func_data.data1 = &msg;
+-
+-	return ffa_helper_msg_send_direct_req(&func_data);
+-}
+-
+-#endif
+-
+ /**
+  * efi_exit_boot_services() - stop all boot services
+  * @image_handle: handle of the loaded image
+@@ -2253,15 +2213,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
+ 	/* Recalculate CRC32 */
+ 	efi_update_table_header_crc32(&systab.hdr);
+ 
+-#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
+-	/* Notifying SE Proxy FW update service */
+-	ffa_ret = efi_corstone1000_kernel_started_event();
+-	if (ffa_ret)
+-		debug("[efi_boottime][ERROR]: Failure to notify SE Proxy FW update service\n");
+-	else
+-		debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
+-#endif
+-
+ 	/* Give the payload some time to boot */
+ 	efi_set_watchdog(0);
+ 	WATCHDOG_RESET();
+diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
+index af43d4502f92..25f427b93669 100644
+--- a/lib/efi_loader/efi_firmware.c
++++ b/lib/efi_loader/efi_firmware.c
+@@ -47,7 +47,7 @@ static efi_status_t efi_corstone1000_img_info_get (
+ 		*package_version_name = NULL; /* not supported */
+ 
+ 	if(image_info == NULL) {
+-		log_warning("image_info is null\n");
++		log_info("image_info is null\n");
+ 		return EFI_BUFFER_TOO_SMALL;
+ 	}
+ 
+diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
+index bfd4687e10b5..a20128e9b582 100644
+--- a/lib/efi_loader/efi_setup.c
++++ b/lib/efi_loader/efi_setup.c
+@@ -17,6 +17,9 @@
+ efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
+ 
+ #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
++#include <linux/bitfield.h>
++#include <linux/bitops.h>
++#include <arm_ffa_helper.h>
+ /**
+  * efi_corstone1000_alloc_capsule_shared_buf - allocate capsule shared buffer
+  */
+@@ -126,6 +129,44 @@ static efi_status_t efi_init_secure_boot(void)
+ }
+ #endif /* CONFIG_EFI_SECURE_BOOT */
+ 
++#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
++/**
++ * efi_corstone1000_uboot-efi_started_event - notifies SE Proxy FW update service
++ *
++ * This function notifies the SE Proxy update service that uboot efi has already started
++ *
++ * Return:
++ *
++ * 0: on success, otherwise failure
++ * */
++static int efi_corstone1000_uboot_efi_started_event(void)
++{
++	struct ffa_interface_data func_data = {0};
++	struct ffa_send_direct_data msg = {0};
++	u16 part_id = CORSTONE1000_SEPROXY_PART_ID;
++
++	log_debug("[%s]\n", __func__);
++
++	/*
++	 * telling the driver which partition to use
++	 */
++	func_data.data0_size = sizeof(part_id);
++	func_data.data0 = &part_id;
++	/*
++	 * setting the uboot efi subsystem started  event arguments:
++	 * setting capsule update interface ID(31:16)
++	 * the uboot efi subsystem started event ID(15:0)
++	 */
++	msg.a4 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
++			PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT);
++
++	func_data.data1_size = sizeof(msg);
++	func_data.data1 = &msg;
++
++	return ffa_helper_msg_send_direct_req(&func_data);
++}
++#endif
++
+ /**
+  * efi_init_capsule - initialize capsule update state
+  *
+@@ -134,8 +175,15 @@ static efi_status_t efi_init_secure_boot(void)
+ static efi_status_t efi_init_capsule(void)
+ {
+ 	efi_status_t ret = EFI_SUCCESS;
++	int ffa_ret;
+ 
+ #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
++	ffa_ret = efi_corstone1000_uboot_efi_started_event();
++	if (ffa_ret)
++		debug("[efi_boottime][ERROR]: Failure to notify SE Proxy FW update service\n");
++	else
++		debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
++
+ 	ret = efi_corstone1000_alloc_capsule_shared_buf();
+ 	if (ret != EFI_SUCCESS) {
+ 		printf("EFI: Corstone-1000: cannot allocate caspsule shared buffer\n");
+-- 
+2.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_firmware-add-get_image_info-for-corstone1000.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_firmware-add-get_image_info-for-corstone1000.patch
deleted file mode 100644
index c86b658..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_firmware-add-get_image_info-for-corstone1000.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-From 34fadec4f659248a6020676f5894895977ccf79d 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/27] efi_firmware: add get_image_info for corstone1000
-
-This change is to populate get_image_info which eventually
-will be populated in ESRT table
-
-Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
-
-%% original patch: 0047-efi_firmware-add-get_image_info-for-corstone1000.patch
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_firmware.c | 64 ++++++++++++++++++++++++++++++++++-
- 1 file changed, 63 insertions(+), 1 deletion(-)
-
-diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
-index a5ff32f121f4..9eb89849b28d 100644
---- a/lib/efi_loader/efi_firmware.c
-+++ b/lib/efi_loader/efi_firmware.c
-@@ -241,6 +241,7 @@ const efi_guid_t efi_firmware_image_type_uboot_fit =
-  *
-  * Return		status code
-  */
-+
- static
- efi_status_t EFIAPI efi_firmware_fit_get_image_info(
- 	struct efi_firmware_management_protocol *this,
-@@ -332,6 +333,56 @@ const struct efi_firmware_management_protocol efi_fmp_fit = {
- const efi_guid_t efi_firmware_image_type_uboot_raw =
- 	EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID;
- 
-+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
-+static efi_status_t efi_corstone1000_img_info_get (
-+	efi_uintn_t *image_info_size,
-+	struct efi_firmware_image_descriptor *image_info,
-+	u32 *descriptor_version,
-+	u8 *descriptor_count,
-+	efi_uintn_t *descriptor_size,
-+	u32 *package_version,
-+	u16 **package_version_name,
-+	const efi_guid_t *image_type)
-+{
-+	int i = 0;
-+
-+	*image_info_size = sizeof(*image_info);
-+	*descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
-+	*descriptor_count = 1;//dfu_num;
-+	*descriptor_size = sizeof(*image_info);
-+	if (package_version)
-+		*package_version = 0xffffffff; /* not supported */
-+	if(package_version_name)
-+		*package_version_name = NULL; /* not supported */
-+
-+	if(image_info == NULL) {
-+		log_warning("image_info is null\n");
-+		return EFI_BUFFER_TOO_SMALL;
-+	}
-+
-+	image_info[i].image_index = i;
-+	image_info[i].image_type_id = *image_type;
-+	image_info[i].image_id = 0;
-+	image_info[i].image_id_name = "wic";
-+	image_info[i].version = 1;
-+	image_info[i].version_name = NULL;
-+	image_info[i].size = 0x1000;
-+	image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
-+					     IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
-+	image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE;
-+	/* Check if the capsule authentication is enabled */
-+	if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE))
-+		image_info[0].attributes_setting |=
-+			IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
-+	image_info[i].lowest_supported_image_version = 0;
-+	image_info[i].last_attempt_version = 0;
-+	image_info[i].last_attempt_status = LAST_ATTEMPT_STATUS_SUCCESS;
-+	image_info[i].hardware_instance = 1;
-+	image_info[i].dependencies = NULL;
-+
-+	return EFI_SUCCESS;
-+}
-+#endif
- /**
-  * efi_firmware_raw_get_image_info - return information about the current
- 				     firmware image
-@@ -376,12 +427,20 @@ efi_status_t EFIAPI efi_firmware_raw_get_image_info(
- 	     !descriptor_size || !package_version || !package_version_name))
- 		return EFI_EXIT(EFI_INVALID_PARAMETER);
- 
--	ret = efi_get_dfu_info(image_info_size, image_info,
-+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
-+	ret = efi_corstone1000_img_info_get(image_info_size, image_info,
- 			       descriptor_version, descriptor_count,
- 			       descriptor_size,
- 			       package_version, package_version_name,
- 			       &efi_firmware_image_type_uboot_raw);
-+#else
- 
-+	ret = efi_get_dfu_info(image_info_size, image_info,
-+			       descriptor_version, descriptor_count,
-+			       descriptor_size,
-+			       package_version, package_version_name,
-+			       &efi_firmware_image_type_uboot_raw);
-+#endif
- 	return EFI_EXIT(ret);
- }
- 
-@@ -462,6 +521,9 @@ efi_status_t EFIAPI efi_firmware_raw_set_image(
- 
- 	}
- 
-+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000)
-+	return EFI_EXIT(EFI_SUCCESS);
-+#endif
- 	if (dfu_write_by_alt(image_index - 1, (void *)image, image_size,
- 			     NULL, NULL))
- 		return EFI_EXIT(EFI_DEVICE_ERROR);
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_loader-fix-null-pointer-exception-with-get_image.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_loader-fix-null-pointer-exception-with-get_image.patch
new file mode 100644
index 0000000..165fac5
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-efi_loader-fix-null-pointer-exception-with-get_image.patch
@@ -0,0 +1,62 @@
+From 383078dde2fbf509dc3d24505f6b328316aee030 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 23/24] efi_loader: fix null pointer exception with
+ get_image_info
+
+get_img_info API implemented for corstone1000 target does not
+check the input attributes and as a result uboot crash's with
+null pointer access. This change is to fix the null pointer
+exception.
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
+---
+ lib/efi_loader/efi_firmware.c | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
+index 25f427b93669..28d9a19edb90 100644
+--- a/lib/efi_loader/efi_firmware.c
++++ b/lib/efi_loader/efi_firmware.c
+@@ -38,26 +38,29 @@ static efi_status_t efi_corstone1000_img_info_get (
+ 	int i = 0;
+ 
+ 	*image_info_size = sizeof(*image_info);
+-	*descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
+-	*descriptor_count = 1;//dfu_num;
+-	*descriptor_size = sizeof(*image_info);
++	if(descriptor_version)
++	    *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
++	if(descriptor_count)
++	    *descriptor_count = 1;
++	if(descriptor_size)
++	    *descriptor_size = sizeof(*image_info);
+ 	if (package_version)
+ 		*package_version = 0xffffffff; /* not supported */
+ 	if(package_version_name)
+ 		*package_version_name = NULL; /* not supported */
+ 
+ 	if(image_info == NULL) {
+-		log_info("image_info is null\n");
++		log_debug("image_info is null\n");
+ 		return EFI_BUFFER_TOO_SMALL;
+ 	}
+ 
+-	image_info[i].image_index = i;
++	image_info[i].image_index = 1;
+ 	image_info[i].image_type_id = *image_type;
+ 	image_info[i].image_id = 0;
+-	image_info[i].image_id_name = "wic";
+-	image_info[i].version = 1;
++	image_info[i].image_id_name = L"wic image";
++	image_info[i].version = 0;
+ 	image_info[i].version_name = NULL;
+-	image_info[i].size = 0x1000;
++	image_info[i].size = 0;
+ 	image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
+ 					     IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
+ 	image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE;
+-- 
+2.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-Comment-mm_communicate-failure-log.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-Comment-mm_communicate-failure-log.patch
deleted file mode 100644
index c6a1aed..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-Comment-mm_communicate-failure-log.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From c0c6e4c1166c4868afc36649b9ed98081a6966e1 Mon Sep 17 00:00:00 2001
-From: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
-Date: Fri, 24 Dec 2021 14:22:52 +0000
-Subject: [PATCH 24/27] Comment mm_communicate failure log
-
-When a getVariable() call is made with data size set to 0,
-mm_communicate should return EFI_BUFFER_TOO_SMALL. This is
-an expected behavior. There should not be any failure logs
-in this case. So the error log is commented here.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_variable_tee.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
-index 67743d1f8fce..a34989efac83 100644
---- a/lib/efi_loader/efi_variable_tee.c
-+++ b/lib/efi_loader/efi_variable_tee.c
-@@ -411,7 +411,10 @@ static efi_status_t __efi_runtime mm_communicate(u8 *comm_buf, efi_uintn_t dsize
- 	ret = ffa_mm_communicate(comm_buf, dsize);
- 	#endif
- 	if (ret != EFI_SUCCESS) {
--		log_err("%s failed!\n", __func__);
-+		/* mm_communicate failure is logged even when getVariable() is called
-+		 * with data size set to 0. This is not expected so logging is commented.
-+		*/
-+		//log_err("%s failed!\n", __func__);
- 		return ret;
- 	}
- 
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-arm-corstone1000-add-mmc-for-fvp.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-arm-corstone1000-add-mmc-for-fvp.patch
new file mode 100644
index 0000000..2b9ca78
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-arm-corstone1000-add-mmc-for-fvp.patch
@@ -0,0 +1,148 @@
+From cc3356c2a30b7aa85a25e9bc7b69a03537df3f27 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 24/24] 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>
+---
+ 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 1fcc137a493c..26b0f1b3cea6 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 2fa485ff3799..3d537d7a9052 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 b042d4e49419..147c14c94865 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 06b605e43bdf..d9855bf91ebf 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -95,7 +95,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.37.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-use-a-compressed-kernel.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-use-a-compressed-kernel.patch
new file mode 100644
index 0000000..4cc2498
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-use-a-compressed-kernel.patch
@@ -0,0 +1,32 @@
+From df70c467c5d100f1522b4521f48da4c51e43688c Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@arm.com>
+Date: Thu, 25 Aug 2022 13:48:22 +0000
+Subject: [PATCH 25/25] corstone1000: use a compressed kernel
+
+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>
+---
+ 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 d9855bf91e..d0cbc40121 100644
+--- a/include/configs/corstone1000.h
++++ b/include/configs/corstone1000.h
+@@ -126,7 +126,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 0xd00000;"		\
+ 				"usb start; usb reset;"					\
+ 				"run distro_bootcmd;"					\
+ 				"bootefi $kernel_addr_r $fdtcontroladdr;"
+-- 
+2.30.2
+
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-efi_loader-send-bootcomplete-message-to-secure-encla.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-efi_loader-send-bootcomplete-message-to-secure-encla.patch
deleted file mode 100644
index d5a0ec0..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-efi_loader-send-bootcomplete-message-to-secure-encla.patch
+++ /dev/null
@@ -1,191 +0,0 @@
-From af2defbfaffa4264052e30f269b91794068e4773 Mon Sep 17 00:00:00 2001
-From: Vishnu Banavath <vishnu.banavath@arm.com>
-Date: Wed, 5 Jan 2022 17:56:09 +0000
-Subject: [PATCH 25/27] 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,
-an event is sent at exitbootservice level. This will create a problem
-when user wants to interrupt at UEFI shell, hence, it is required
-to send an uboot efi initialized event at efi sub-system initialization
-stage.
-
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- include/configs/corstone1000.h |  2 +-
- lib/efi_loader/efi_boottime.c  | 49 ----------------------------------
- lib/efi_loader/efi_firmware.c  |  2 +-
- lib/efi_loader/efi_setup.c     | 48 +++++++++++++++++++++++++++++++++
- 4 files changed, 50 insertions(+), 51 deletions(-)
-
-diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h
-index a7445e61348b..06b605e43bdf 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -22,7 +22,7 @@
- 
- /* Notification events used with SE Proxy update service */
- #define CORSTONE1000_BUFFER_READY_EVT		(0x1)
--#define CORSTONE1000_KERNEL_STARTED_EVT		(0x2)
-+#define CORSTONE1000_UBOOT_EFI_STARTED_EVT	(0x2)
- 
- #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 b58a8c98fd05..d0703060491b 100644
---- a/lib/efi_loader/efi_boottime.c
-+++ b/lib/efi_loader/efi_boottime.c
-@@ -2101,46 +2101,6 @@ static void efi_exit_caches(void)
- #endif
- }
- 
--#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
--/**
-- * efi_corstone1000_kernel_started_event - notifies SE Proxy FW update service
-- *
-- * This function notifies the SE Proxy update service that the kernel has already started
-- *
-- * Return:
-- *
-- * 0: on success, otherwise failure
-- */
--static int efi_corstone1000_kernel_started_event(void)
--{
--	struct ffa_interface_data func_data = {0};
--	struct ffa_send_direct_data msg = {0};
--	u16 part_id = CORSTONE1000_SEPROXY_PART_ID;
--
--	log_debug("[%s]\n", __func__);
--
--	/*
--	 * telling the driver which partition to use
--	 */
--	func_data.data0_size = sizeof(part_id);
--	func_data.data0 = &part_id;
--
--	/*
--	 * setting the kernel started  event arguments:
--	 * setting capsule update interface ID(31:16)
--	 * the kernel started event ID(15:0)
--	 */
--	msg.a4 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
--	PREP_SEPROXY_EVT(CORSTONE1000_KERNEL_STARTED_EVT);
--
--	func_data.data1_size = sizeof(msg);
--	func_data.data1 = &msg;
--
--	return ffa_helper_msg_send_direct_req(&func_data);
--}
--
--#endif
--
- /**
-  * efi_exit_boot_services() - stop all boot services
-  * @image_handle: handle of the loaded image
-@@ -2254,15 +2214,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
- 	/* Recalculate CRC32 */
- 	efi_update_table_header_crc32(&systab.hdr);
- 
--#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
--	/* Notifying SE Proxy FW update service */
--	ffa_ret = efi_corstone1000_kernel_started_event();
--	if (ffa_ret)
--		debug("[efi_boottime][ERROR]: Failure to notify SE Proxy FW update service\n");
--	else
--		debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
--#endif
--
- 	/* Give the payload some time to boot */
- 	efi_set_watchdog(0);
- 	WATCHDOG_RESET();
-diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
-index 9eb89849b28d..477ad072070e 100644
---- a/lib/efi_loader/efi_firmware.c
-+++ b/lib/efi_loader/efi_firmware.c
-@@ -356,7 +356,7 @@ static efi_status_t efi_corstone1000_img_info_get (
- 		*package_version_name = NULL; /* not supported */
- 
- 	if(image_info == NULL) {
--		log_warning("image_info is null\n");
-+		log_info("image_info is null\n");
- 		return EFI_BUFFER_TOO_SMALL;
- 	}
- 
-diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
-index 989380d4f8cd..515a0bdf74ef 100644
---- a/lib/efi_loader/efi_setup.c
-+++ b/lib/efi_loader/efi_setup.c
-@@ -17,6 +17,9 @@
- efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
- 
- #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
-+#include <linux/bitfield.h>
-+#include <linux/bitops.h>
-+#include <arm_ffa_helper.h>
- /**
-  * efi_corstone1000_alloc_capsule_shared_buf - allocate capsule shared buffer
-  */
-@@ -126,6 +129,44 @@ static efi_status_t efi_init_secure_boot(void)
- }
- #endif /* CONFIG_EFI_SECURE_BOOT */
- 
-+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
-+/**
-+ * efi_corstone1000_uboot-efi_started_event - notifies SE Proxy FW update service
-+ *
-+ * This function notifies the SE Proxy update service that uboot efi has already started
-+ *
-+ * Return:
-+ *
-+ * 0: on success, otherwise failure
-+ * */
-+static int efi_corstone1000_uboot_efi_started_event(void)
-+{
-+	struct ffa_interface_data func_data = {0};
-+	struct ffa_send_direct_data msg = {0};
-+	u16 part_id = CORSTONE1000_SEPROXY_PART_ID;
-+
-+	log_debug("[%s]\n", __func__);
-+
-+	/*
-+	 * telling the driver which partition to use
-+	 */
-+	func_data.data0_size = sizeof(part_id);
-+	func_data.data0 = &part_id;
-+	/*
-+	 * setting the uboot efi subsystem started  event arguments:
-+	 * setting capsule update interface ID(31:16)
-+	 * the uboot efi subsystem started event ID(15:0)
-+	 */
-+	msg.a4 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) |
-+			PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT);
-+
-+	func_data.data1_size = sizeof(msg);
-+	func_data.data1 = &msg;
-+
-+	return ffa_helper_msg_send_direct_req(&func_data);
-+}
-+#endif
-+
- /**
-  * efi_init_capsule - initialize capsule update state
-  *
-@@ -134,8 +175,15 @@ static efi_status_t efi_init_secure_boot(void)
- static efi_status_t efi_init_capsule(void)
- {
- 	efi_status_t ret = EFI_SUCCESS;
-+	int ffa_ret;
- 
- #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000)
-+	ffa_ret = efi_corstone1000_uboot_efi_started_event();
-+	if (ffa_ret)
-+		debug("[efi_boottime][ERROR]: Failure to notify SE Proxy FW update service\n");
-+	else
-+		debug("[efi_boottime][INFO]: SE Proxy FW update service notified\n");
-+
- 	ret = efi_corstone1000_alloc_capsule_shared_buf();
- 	if (ret != EFI_SUCCESS) {
- 		printf("EFI: Corstone-1000: cannot allocate caspsule shared buffer\n");
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-efi_loader-fix-null-pointer-exception-with-get_image.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-efi_loader-fix-null-pointer-exception-with-get_image.patch
deleted file mode 100644
index 532e872..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-efi_loader-fix-null-pointer-exception-with-get_image.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 2da8554ab732c59c7ca624ac4b16412fa9c2e39c 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 26/27] efi_loader: fix null pointer exception with
- get_image_info
-
-get_img_info API implemented for corstone1000 target does not
-check the input attributes and as a result uboot crash's with
-null pointer access. This change is to fix the null pointer
-exception.
-
-Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
-Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
----
- lib/efi_loader/efi_firmware.c | 19 +++++++++++--------
- 1 file changed, 11 insertions(+), 8 deletions(-)
-
-diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
-index 477ad072070e..f99c57fde576 100644
---- a/lib/efi_loader/efi_firmware.c
-+++ b/lib/efi_loader/efi_firmware.c
-@@ -347,26 +347,29 @@ static efi_status_t efi_corstone1000_img_info_get (
- 	int i = 0;
- 
- 	*image_info_size = sizeof(*image_info);
--	*descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
--	*descriptor_count = 1;//dfu_num;
--	*descriptor_size = sizeof(*image_info);
-+	if(descriptor_version)
-+	    *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
-+	if(descriptor_count)
-+	    *descriptor_count = 1;
-+	if(descriptor_size)
-+	    *descriptor_size = sizeof(*image_info);
- 	if (package_version)
- 		*package_version = 0xffffffff; /* not supported */
- 	if(package_version_name)
- 		*package_version_name = NULL; /* not supported */
- 
- 	if(image_info == NULL) {
--		log_info("image_info is null\n");
-+		log_debug("image_info is null\n");
- 		return EFI_BUFFER_TOO_SMALL;
- 	}
- 
--	image_info[i].image_index = i;
-+	image_info[i].image_index = 1;
- 	image_info[i].image_type_id = *image_type;
- 	image_info[i].image_id = 0;
--	image_info[i].image_id_name = "wic";
--	image_info[i].version = 1;
-+	image_info[i].image_id_name = L"wic image";
-+	image_info[i].version = 0;
- 	image_info[i].version_name = NULL;
--	image_info[i].size = 0x1000;
-+	image_info[i].size = 0;
- 	image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
- 					     IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED;
- 	image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE;
--- 
-2.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-arm-corstone1000-add-mmc-for-fvp.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-arm-corstone1000-add-mmc-for-fvp.patch
deleted file mode 100644
index bf95ed7..0000000
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-arm-corstone1000-add-mmc-for-fvp.patch
+++ /dev/null
@@ -1,148 +0,0 @@
-From cbf16548dc6dcc8eea97aa18c6ae17fb848e5c6c 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 27/27] 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>
----
- 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 1fcc137a493c..26b0f1b3cea6 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 eff1739f0b02..936a6c9f8b89 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 b042d4e49419..147c14c94865 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 06b605e43bdf..d9855bf91ebf 100644
---- a/include/configs/corstone1000.h
-+++ b/include/configs/corstone1000.h
-@@ -95,7 +95,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.30.2
-
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0001-armv7-adding-generic-timer-access-through-MMIO.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0001-armv7-adding-generic-timer-access-through-MMIO.patch
index 8a98f9d..9a29975 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0001-armv7-adding-generic-timer-access-through-MMIO.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0001-armv7-adding-generic-timer-access-through-MMIO.patch
@@ -1,4 +1,4 @@
-From fff63cfd7d9654dc9ed0c106f29d3a7ad01b0502 Mon Sep 17 00:00:00 2001
+From d75d794785419592ba49046165d19a6ec9488b2d Mon Sep 17 00:00:00 2001
 From: Rui Miguel Silva <rui.silva@linaro.org>
 Date: Wed, 18 Dec 2019 21:52:34 +0000
 Subject: [PATCH 1/2] armv7: adding generic timer access through MMIO
@@ -21,6 +21,8 @@
 Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
 
 %% original patch: 0001-armv7-adding-generic-timer-access-through-MMIO.patch
+
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
 ---
  arch/arm/cpu/armv7/Makefile     |  1 +
  arch/arm/cpu/armv7/mmio_timer.c | 75 +++++++++++++++++++++++++++++++++
@@ -29,7 +31,7 @@
  create mode 100644 arch/arm/cpu/armv7/mmio_timer.c
 
 diff --git a/arch/arm/cpu/armv7/Makefile b/arch/arm/cpu/armv7/Makefile
-index bfbd85ae64..1a0a24e531 100644
+index bfbd85ae64ef..1a0a24e53110 100644
 --- a/arch/arm/cpu/armv7/Makefile
 +++ b/arch/arm/cpu/armv7/Makefile
 @@ -28,6 +28,7 @@ obj-$(CONFIG_ARMV7_PSCI)	+= psci.o psci-common.o
@@ -42,7 +44,7 @@
  obj-y += s5p-common/
 diff --git a/arch/arm/cpu/armv7/mmio_timer.c b/arch/arm/cpu/armv7/mmio_timer.c
 new file mode 100644
-index 0000000000..edd806e06e
+index 000000000000..edd806e06e42
 --- /dev/null
 +++ b/arch/arm/cpu/armv7/mmio_timer.c
 @@ -0,0 +1,75 @@
@@ -122,17 +124,17 @@
 +	return gd->arch.timer_rate_hz;
 +}
 diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
-index a6bc234f51..8d5cd67ace 100644
+index c61df4fb1c9b..cfb1c68b6297 100644
 --- a/scripts/config_whitelist.txt
 +++ b/scripts/config_whitelist.txt
-@@ -1524,6 +1524,7 @@ CONFIG_SYS_MMC_U_BOOT_DST
+@@ -1253,6 +1253,7 @@ CONFIG_SYS_MMC_U_BOOT_DST
  CONFIG_SYS_MMC_U_BOOT_OFFS
  CONFIG_SYS_MMC_U_BOOT_SIZE
  CONFIG_SYS_MMC_U_BOOT_START
 +CONFIG_SYS_MMIO_TIMER
- CONFIG_SYS_MONITOR_BASE
  CONFIG_SYS_MONITOR_LEN
  CONFIG_SYS_MONITOR_SEC
+ CONFIG_SYS_MOR_VAL
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0002-board-arm-add-corstone500-board.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0002-board-arm-add-corstone500-board.patch
index 29b2943..c389a64 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0002-board-arm-add-corstone500-board.patch
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone500/0002-board-arm-add-corstone500-board.patch
@@ -1,4 +1,4 @@
-From 73c319a1096259652853fa2538a733a8ebea96a8 Mon Sep 17 00:00:00 2001
+From 3566cf4ab79ca78acd69cfb87e74587394e5aeb2 Mon Sep 17 00:00:00 2001
 From: Rui Miguel Silva <rui.silva@linaro.org>
 Date: Wed, 8 Jan 2020 09:48:11 +0000
 Subject: [PATCH 2/2] board: arm: add corstone500 board
@@ -13,6 +13,8 @@
 Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
 
 %% original patch: 0002-board-arm-add-corstone500-board.patch
+
+Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
 ---
  arch/arm/Kconfig                       |  10 +++
  board/armltd/corstone500/Kconfig       |  12 +++
@@ -28,10 +30,10 @@
  create mode 100644 include/configs/corstone500.h
 
 diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 4567c183fb..66f99fdf4f 100644
+index 9898c7d68e1b..8c60ed39712e 100644
 --- a/arch/arm/Kconfig
 +++ b/arch/arm/Kconfig
-@@ -641,6 +641,15 @@ config ARCH_BCMSTB
+@@ -718,6 +718,15 @@ config ARCH_BCMSTB
  	  This enables support for Broadcom ARM-based set-top box
  	  chipsets, including the 7445 family of chips.
  
@@ -47,7 +49,7 @@
  config TARGET_VEXPRESS_CA9X4
  	bool "Support vexpress_ca9x4"
  	select CPU_V7A
-@@ -2202,6 +2211,7 @@ source "board/bosch/shc/Kconfig"
+@@ -2299,6 +2308,7 @@ source "board/bosch/shc/Kconfig"
  source "board/bosch/guardian/Kconfig"
  source "board/Marvell/octeontx/Kconfig"
  source "board/Marvell/octeontx2/Kconfig"
@@ -57,7 +59,7 @@
  source "board/cortina/presidio-asic/Kconfig"
 diff --git a/board/armltd/corstone500/Kconfig b/board/armltd/corstone500/Kconfig
 new file mode 100644
-index 0000000000..8e689bd1fd
+index 000000000000..8e689bd1fdc8
 --- /dev/null
 +++ b/board/armltd/corstone500/Kconfig
 @@ -0,0 +1,12 @@
@@ -75,7 +77,7 @@
 +endif
 diff --git a/board/armltd/corstone500/Makefile b/board/armltd/corstone500/Makefile
 new file mode 100644
-index 0000000000..6598fdd3ae
+index 000000000000..6598fdd3ae0d
 --- /dev/null
 +++ b/board/armltd/corstone500/Makefile
 @@ -0,0 +1,8 @@
@@ -89,7 +91,7 @@
 +obj-y := corstone500.o
 diff --git a/board/armltd/corstone500/corstone500.c b/board/armltd/corstone500/corstone500.c
 new file mode 100644
-index 0000000000..e878f5c6a5
+index 000000000000..e878f5c6a521
 --- /dev/null
 +++ b/board/armltd/corstone500/corstone500.c
 @@ -0,0 +1,48 @@
@@ -143,7 +145,7 @@
 +
 diff --git a/configs/corstone500_defconfig b/configs/corstone500_defconfig
 new file mode 100644
-index 0000000000..d3161a4b40
+index 000000000000..d3161a4b40d8
 --- /dev/null
 +++ b/configs/corstone500_defconfig
 @@ -0,0 +1,40 @@
@@ -189,7 +191,7 @@
 +CONFIG_OF_LIBFDT=y
 diff --git a/include/configs/corstone500.h b/include/configs/corstone500.h
 new file mode 100644
-index 0000000000..93c397d2f5
+index 000000000000..93c397d2f515
 --- /dev/null
 +++ b/include/configs/corstone500.h
 @@ -0,0 +1,109 @@
@@ -303,5 +305,5 @@
 +#define CONFIG_ENV_IS_IN_FLASH		1
 +#endif
 -- 
-2.30.2
+2.37.1
 
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot_%.bbappend b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot_%.bbappend
index e254d41..a0a7284 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot_%.bbappend
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot_%.bbappend
@@ -36,15 +36,13 @@
         file://0016-efi_boottime-corstone1000-pass-interface-id-and-kern.patch \
         file://0017-efi_loader-corstone1000-remove-guid-check-from-corst.patch \
         file://0018-arm_ffa-removing-the-cast-when-using-binary-OR-on-FI.patch \
-        file://0019-Return-proper-error-code-when-rx-buffer-is-larger.patch \
-        file://0020-Use-correct-buffer-size.patch \
-        file://0021-Update-comm_buf-when-EFI_BUFFER_TOO_SMALL.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-Comment-mm_communicate-failure-log.patch \
-        file://0025-efi_loader-send-bootcomplete-message-to-secure-encla.patch \
-        file://0026-efi_loader-fix-null-pointer-exception-with-get_image.patch \
-        file://0027-arm-corstone1000-add-mmc-for-fvp.patch \
+        file://0019-Use-correct-buffer-size.patch \
+        file://0020-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch \
+        file://0021-efi_firmware-add-get_image_info-for-corstone1000.patch \
+        file://0022-efi_loader-send-bootcomplete-message-to-secure-encla.patch \
+        file://0023-efi_loader-fix-null-pointer-exception-with-get_image.patch \
+        file://0024-arm-corstone1000-add-mmc-for-fvp.patch \
+        file://0025-corstone1000-use-a-compressed-kernel.patch \
       "
 
 #
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/arm-platforms-kmeta/bsp/arm-platforms/juno.scc b/meta-arm/meta-arm-bsp/recipes-kernel/linux/arm-platforms-kmeta/bsp/arm-platforms/juno.scc
index 2980b39..240ecf5 100644
--- a/meta-arm/meta-arm-bsp/recipes-kernel/linux/arm-platforms-kmeta/bsp/arm-platforms/juno.scc
+++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/arm-platforms-kmeta/bsp/arm-platforms/juno.scc
@@ -1,5 +1,6 @@
 include features/input/input.scc
 include features/net/net.scc
+include features/bluetooth/bluetooth.scc
 include cfg/timer/no_hz.scc
 include cfg/usb-mass-storage.scc
 
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/fvp-base-arm32/0001-ARM-vexpress-enable-GICv3.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/fvp-base-arm32/0001-ARM-vexpress-enable-GICv3.patch
index d0a05c2..184a763 100644
--- a/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/fvp-base-arm32/0001-ARM-vexpress-enable-GICv3.patch
+++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/fvp-base-arm32/0001-ARM-vexpress-enable-GICv3.patch
@@ -1,4 +1,4 @@
-From 5dbb6c4267b1e46ed08359be363d8bc9b6a79397 Mon Sep 17 00:00:00 2001
+From 9fe529a146f4528ec80a3d04588e387f3651dc22 Mon Sep 17 00:00:00 2001
 From: Ryan Harkin <ryan.harkin@linaro.org>
 Date: Wed, 16 Nov 2016 14:43:02 +0000
 Subject: [PATCH] ARM: vexpress: enable GICv3
@@ -11,21 +11,21 @@
 Signed-off-by: Ryan Harkin <ryan.harkin@linaro.org>
 Signed-off-by: Jon Medhurst <tixy@linaro.org>
 ---
- arch/arm/mach-vexpress/Kconfig | 1 +
+ arch/arm/mach-versatile/Kconfig | 1 +
  1 file changed, 1 insertion(+)
 
-diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig
-index 7c728ebc0b33..ed579382d41f 100644
---- a/arch/arm/mach-vexpress/Kconfig
-+++ b/arch/arm/mach-vexpress/Kconfig
-@@ -4,6 +4,7 @@ menuconfig ARCH_VEXPRESS
- 	select ARCH_SUPPORTS_BIG_ENDIAN
+diff --git a/arch/arm/mach-versatile/Kconfig b/arch/arm/mach-versatile/Kconfig
+index 2ef226194c3a..3d54877fe339 100644
+--- a/arch/arm/mach-versatile/Kconfig
++++ b/arch/arm/mach-versatile/Kconfig
+@@ -251,6 +251,7 @@ menuconfig ARCH_VEXPRESS
+ 	depends on ARCH_MULTI_V7
  	select ARM_AMBA
  	select ARM_GIC
 +	select ARM_GIC_V3
  	select ARM_GLOBAL_TIMER
  	select ARM_TIMER_SP804
- 	select COMMON_CLK_VERSATILE
+ 	select GPIOLIB
 -- 
-2.17.1
+2.30.2
 
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/juno/juno-dts-mhu-doorbell.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/juno/juno-dts-mhu-doorbell.patch
deleted file mode 100644
index 81f641c..0000000
--- a/meta-arm/meta-arm-bsp/recipes-kernel/linux/files/juno/juno-dts-mhu-doorbell.patch
+++ /dev/null
@@ -1,616 +0,0 @@
-Add MHU doorbell support and SCMI device nodes to the Juno DeviceTree.
-
-Patch taken from https://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux.git/log/?h=scmi_dt_defconfig
-
-Upstream-Status: Pending
-Signed-off-by: Ross Burton <ross.burton@arm.com>
-
-From 821ffd8e5dc4d2fb2716d5fb912b343b932e1e77 Mon Sep 17 00:00:00 2001
-From: Sudeep Holla <sudeep.holla@arm.com>
-Date: Thu, 20 Apr 2017 11:58:01 +0100
-Subject: [PATCH] arm64: dts: juno: add mhu doorbell support and scmi device
- nodes
-
-Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
----
- arch/arm64/boot/dts/arm/juno-base.dtsi    | 139 ++++++++++++----------
- arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi |   6 +-
- arch/arm64/boot/dts/arm/juno-r1.dts       |  12 +-
- arch/arm64/boot/dts/arm/juno-r2.dts       |  12 +-
- arch/arm64/boot/dts/arm/juno.dts          |  12 +-
- 5 files changed, 96 insertions(+), 85 deletions(-)
-
-diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi
-index 6288e104a089..36844f7d861e 100644
---- a/arch/arm64/boot/dts/arm/juno-base.dtsi
-+++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
-@@ -23,11 +23,12 @@ frame@2a830000 {
- 	};
- 
- 	mailbox: mhu@2b1f0000 {
--		compatible = "arm,mhu", "arm,primecell";
-+		compatible = "arm,mhu-doorbell", "arm,primecell";
- 		reg = <0x0 0x2b1f0000 0x0 0x1000>;
- 		interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
- 			     <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
--		#mbox-cells = <1>;
-+		#mbox-cells = <2>;
-+		mbox-name = "ARM-MHU";
- 		clocks = <&soc_refclk100mhz>;
- 		clock-names = "apb_pclk";
- 	};
-@@ -39,7 +40,7 @@ smmu_gpu: iommu@2b400000 {
- 			     <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
- 		#iommu-cells = <1>;
- 		#global-interrupts = <1>;
--		power-domains = <&scpi_devpd 1>;
-+		power-domains = <&scmi_devpd 9>;
- 		dma-coherent;
- 		status = "disabled";
- 	};
-@@ -63,7 +64,7 @@ smmu_etr: iommu@2b600000 {
- 		#iommu-cells = <1>;
- 		#global-interrupts = <1>;
- 		dma-coherent;
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	gic: interrupt-controller@2c010000 {
-@@ -123,7 +124,7 @@ etf@20010000 { /* etf0 */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 
- 		in-ports {
- 			port {
-@@ -147,7 +148,7 @@ tpiu@20030000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		in-ports {
- 			port {
- 				tpiu_in_port: endpoint {
-@@ -164,7 +165,7 @@ main_funnel: funnel@20040000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 
- 		out-ports {
- 			port {
-@@ -201,7 +202,7 @@ etr@20070000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		arm,scatter-gather;
- 		in-ports {
- 			port {
-@@ -220,7 +221,7 @@ stm@20100000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				stm_out_port: endpoint {
-@@ -235,7 +236,7 @@ replicator@20120000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 
- 		out-ports {
- 			#address-cells = <1>;
-@@ -270,7 +271,7 @@ cpu_debug0: cpu-debug@22010000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm0: etm@22040000 {
-@@ -279,7 +280,7 @@ etm0: etm@22040000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster0_etm0_out_port: endpoint {
-@@ -295,7 +296,7 @@ funnel@220c0000 { /* cluster0 funnel */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster0_funnel_out_port: endpoint {
-@@ -330,7 +331,7 @@ cpu_debug1: cpu-debug@22110000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm1: etm@22140000 {
-@@ -339,7 +340,7 @@ etm1: etm@22140000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster0_etm1_out_port: endpoint {
-@@ -355,7 +356,7 @@ cpu_debug2: cpu-debug@23010000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm2: etm@23040000 {
-@@ -364,7 +365,7 @@ etm2: etm@23040000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster1_etm0_out_port: endpoint {
-@@ -380,7 +381,7 @@ funnel@230c0000 { /* cluster1 funnel */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster1_funnel_out_port: endpoint {
-@@ -427,7 +428,7 @@ cpu_debug3: cpu-debug@23110000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm3: etm@23140000 {
-@@ -436,7 +437,7 @@ etm3: etm@23140000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster1_etm1_out_port: endpoint {
-@@ -452,7 +453,7 @@ cpu_debug4: cpu-debug@23210000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm4: etm@23240000 {
-@@ -461,7 +462,7 @@ etm4: etm@23240000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster1_etm2_out_port: endpoint {
-@@ -477,7 +478,7 @@ cpu_debug5: cpu-debug@23310000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 	};
- 
- 	etm5: etm@23340000 {
-@@ -486,7 +487,7 @@ etm5: etm@23340000 {
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				cluster1_etm3_out_port: endpoint {
-@@ -503,8 +504,8 @@ gpu: gpu@2d000000 {
- 			     <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
- 			     <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
- 		interrupt-names = "job", "mmu", "gpu";
--		clocks = <&scpi_dvfs 2>;
--		power-domains = <&scpi_devpd 1>;
-+		clocks = <&scmi_dvfs 2>;
-+		power-domains = <&scmi_devpd 9>;
- 		dma-coherent;
- 		/* The SMMU is only really of interest to bare-metal hypervisors */
- 		/* iommus = <&smmu_gpu 0>; */
-@@ -519,14 +520,24 @@ sram: sram@2e000000 {
- 		#size-cells = <1>;
- 		ranges = <0 0x0 0x2e000000 0x8000>;
- 
--		cpu_scp_lpri: scp-sram@0 {
--			compatible = "arm,juno-scp-shmem";
--			reg = <0x0 0x200>;
-+		cpu_scp_lpri0: scp-sram@0 {
-+			compatible = "arm,scmi-shmem";
-+			reg = <0x0 0x80>;
- 		};
- 
--		cpu_scp_hpri: scp-sram@200 {
--			compatible = "arm,juno-scp-shmem";
--			reg = <0x200 0x200>;
-+		cpu_scp_lpri1: scp-sram@80 {
-+			compatible = "arm,scmi-shmem";
-+			reg = <0x80 0x80>;
-+		};
-+
-+		cpu_scp_hpri0: scp-sram@100 {
-+			compatible = "arm,scmi-shmem";
-+			reg = <0x100 0x80>;
-+		};
-+
-+		cpu_scp_hpri1: scp-sram@180 {
-+			compatible = "arm,scmi-shmem";
-+			reg = <0x180 0x80>;
- 		};
- 	};
- 
-@@ -558,37 +569,37 @@ pcie_ctlr: pcie@40000000 {
- 		iommu-map = <0x0 &smmu_pcie 0x0 0x1>;
- 	};
- 
--	scpi {
--		compatible = "arm,scpi";
--		mboxes = <&mailbox 1>;
--		shmem = <&cpu_scp_hpri>;
-+	firmware {
-+		scmi {
-+			compatible = "arm,scmi";
-+			mbox-names = "tx", "rx";
-+			mboxes = <&mailbox 0 0 &mailbox 0 1>;
-+			shmem = <&cpu_scp_lpri0 &cpu_scp_lpri1>;
-+			#address-cells = <1>;
-+			#size-cells = <0>;
- 
--		clocks {
--			compatible = "arm,scpi-clocks";
-+			scmi_devpd: protocol@11 {
-+				reg = <0x11>;
-+				#power-domain-cells = <1>;
-+			};
- 
--			scpi_dvfs: clocks-0 {
--				compatible = "arm,scpi-dvfs-clocks";
-+			scmi_dvfs: protocol@13 {
-+				reg = <0x13>;
- 				#clock-cells = <1>;
--				clock-indices = <0>, <1>, <2>;
--				clock-output-names = "atlclk", "aplclk","gpuclk";
-+				mbox-names = "tx", "rx";
-+				mboxes = <&mailbox 1 0 &mailbox 1 1>;
-+				shmem = <&cpu_scp_hpri0 &cpu_scp_hpri1>;
- 			};
--			scpi_clk: clocks-1 {
--				compatible = "arm,scpi-variable-clocks";
-+
-+			scmi_clk: protocol@14 {
-+				reg = <0x14>;
- 				#clock-cells = <1>;
--				clock-indices = <3>;
--				clock-output-names = "pxlclk";
- 			};
--		};
- 
--		scpi_devpd: power-controller {
--			compatible = "arm,scpi-power-domains";
--			num-domains = <2>;
--			#power-domain-cells = <1>;
--		};
--
--		scpi_sensors0: sensors {
--			compatible = "arm,scpi-sensors";
--			#thermal-sensor-cells = <1>;
-+			scmi_sensors0: protocol@15 {
-+				reg = <0x15>;
-+				#thermal-sensor-cells = <1>;
-+			};
- 		};
- 	};
- 
-@@ -596,40 +607,40 @@ thermal-zones {
- 		pmic {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 0>;
-+			thermal-sensors = <&scmi_sensors0 0>;
- 		};
- 
- 		soc {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 3>;
-+			thermal-sensors = <&scmi_sensors0 3>;
- 		};
- 
- 		big_cluster_thermal_zone: big-cluster {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 21>;
-+			thermal-sensors = <&scmi_sensors0 21>;
- 			status = "disabled";
- 		};
- 
- 		little_cluster_thermal_zone: little-cluster {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 22>;
-+			thermal-sensors = <&scmi_sensors0 22>;
- 			status = "disabled";
- 		};
- 
- 		gpu0_thermal_zone: gpu0 {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 23>;
-+			thermal-sensors = <&scmi_sensors0 23>;
- 			status = "disabled";
- 		};
- 
- 		gpu1_thermal_zone: gpu1 {
- 			polling-delay = <1000>;
- 			polling-delay-passive = <100>;
--			thermal-sensors = <&scpi_sensors0 24>;
-+			thermal-sensors = <&scmi_sensors0 24>;
- 			status = "disabled";
- 		};
- 	};
-@@ -705,7 +716,7 @@ hdlcd@7ff50000 {
- 		reg = <0 0x7ff50000 0 0x1000>;
- 		interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
- 		iommus = <&smmu_hdlcd1 0>;
--		clocks = <&scpi_clk 3>;
-+		clocks = <&scmi_clk 3>;
- 		clock-names = "pxlclk";
- 
- 		port {
-@@ -720,7 +731,7 @@ hdlcd@7ff60000 {
- 		reg = <0 0x7ff60000 0 0x1000>;
- 		interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
- 		iommus = <&smmu_hdlcd0 0>;
--		clocks = <&scpi_clk 3>;
-+		clocks = <&scmi_clk 3>;
- 		clock-names = "pxlclk";
- 
- 		port {
-diff --git a/arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi b/arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi
-index eda3d9e18af6..e6ecb0dfcbcd 100644
---- a/arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi
-+++ b/arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi
-@@ -6,7 +6,7 @@ funnel@20130000 { /* cssys1 */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				csys1_funnel_out_port: endpoint {
-@@ -29,7 +29,7 @@ etf@20140000 { /* etf1 */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		in-ports {
- 			port {
- 				etf1_in_port: endpoint {
-@@ -52,7 +52,7 @@ funnel@20150000 { /* cssys2 */
- 
- 		clocks = <&soc_smc50mhz>;
- 		clock-names = "apb_pclk";
--		power-domains = <&scpi_devpd 0>;
-+		power-domains = <&scmi_devpd 8>;
- 		out-ports {
- 			port {
- 				csys2_funnel_out_port: endpoint {
-diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts
-index 0e24e29eb9b1..fee67943f4d5 100644
---- a/arch/arm64/boot/dts/arm/juno-r1.dts
-+++ b/arch/arm64/boot/dts/arm/juno-r1.dts
-@@ -96,7 +96,7 @@ A57_0: cpu@0 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A57_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 		};
-@@ -113,7 +113,7 @@ A57_1: cpu@1 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A57_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 		};
-@@ -130,7 +130,7 @@ A53_0: cpu@100 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 		};
-@@ -147,7 +147,7 @@ A53_1: cpu@101 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 		};
-@@ -164,7 +164,7 @@ A53_2: cpu@102 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 		};
-@@ -181,7 +181,7 @@ A53_3: cpu@103 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 		};
-diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts
-index e609420ce3e4..7792626eb29e 100644
---- a/arch/arm64/boot/dts/arm/juno-r2.dts
-+++ b/arch/arm64/boot/dts/arm/juno-r2.dts
-@@ -96,7 +96,7 @@ A72_0: cpu@0 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A72_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 			dynamic-power-coefficient = <450>;
-@@ -114,7 +114,7 @@ A72_1: cpu@1 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A72_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 			dynamic-power-coefficient = <450>;
-@@ -132,7 +132,7 @@ A53_0: cpu@100 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <485>;
- 			dynamic-power-coefficient = <140>;
-@@ -150,7 +150,7 @@ A53_1: cpu@101 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <485>;
- 			dynamic-power-coefficient = <140>;
-@@ -168,7 +168,7 @@ A53_2: cpu@102 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <485>;
- 			dynamic-power-coefficient = <140>;
-@@ -186,7 +186,7 @@ A53_3: cpu@103 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <485>;
- 			dynamic-power-coefficient = <140>;
-diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts
-index f00cffbd032c..a28316c65c1b 100644
---- a/arch/arm64/boot/dts/arm/juno.dts
-+++ b/arch/arm64/boot/dts/arm/juno.dts
-@@ -95,7 +95,7 @@ A57_0: cpu@0 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A57_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 			dynamic-power-coefficient = <530>;
-@@ -113,7 +113,7 @@ A57_1: cpu@1 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <256>;
- 			next-level-cache = <&A57_L2>;
--			clocks = <&scpi_dvfs 0>;
-+			clocks = <&scmi_dvfs 0>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <1024>;
- 			dynamic-power-coefficient = <530>;
-@@ -131,7 +131,7 @@ A53_0: cpu@100 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 			dynamic-power-coefficient = <140>;
-@@ -149,7 +149,7 @@ A53_1: cpu@101 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 			dynamic-power-coefficient = <140>;
-@@ -167,7 +167,7 @@ A53_2: cpu@102 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 			dynamic-power-coefficient = <140>;
-@@ -185,7 +185,7 @@ A53_3: cpu@103 {
- 			d-cache-line-size = <64>;
- 			d-cache-sets = <128>;
- 			next-level-cache = <&A53_L2>;
--			clocks = <&scpi_dvfs 1>;
-+			clocks = <&scmi_dvfs 1>;
- 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
- 			capacity-dmips-mhz = <578>;
- 			dynamic-power-coefficient = <140>;
--- 
-2.25.1
-
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc
index f05c5ff..7bb4a92 100644
--- a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc
+++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc
@@ -91,7 +91,6 @@
 KBUILD_DEFCONFIG:juno = "defconfig"
 KCONFIG_MODE:juno = "--alldefconfig"
 FILESEXTRAPATHS:prepend:juno := "${ARMBSPFILESPATHS}"
-SRC_URI:append:juno = " file://juno-dts-mhu-doorbell.patch"
 
 #
 # Musca B1/S2 can't run Linux
@@ -180,6 +179,7 @@
     file://0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch \
     file://0043-ANDROID-trusty-ffa-Enable-FFA-transport-for-both-mem.patch \
     file://0044-ANDROID-trusty-Make-trusty-transports-configurable.patch \
+    file://init_disassemble_info-signature-changes-causes-compile-failures.patch \
     "
 KERNEL_FEATURES:append:tc = " bsp/arm-platforms/tc.scc"
 KERNEL_FEATURES:append:tc1 = " bsp/arm-platforms/tc-autofdo.scc"
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/init_disassemble_info-signature-changes-causes-compile-failures.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/init_disassemble_info-signature-changes-causes-compile-failures.patch
new file mode 100644
index 0000000..aa33bb7
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/init_disassemble_info-signature-changes-causes-compile-failures.patch
@@ -0,0 +1,99 @@
+From 1b2013986271de39360cf79e62ed9b7d2cc59f9b Mon Sep 17 00:00:00 2001
+From: Andres Freund <andres@anarazel.de>
+Date: Wed, 22 Jun 2022 11:19:18 -0700
+Subject: [PATCH] init_disassemble_info() signature changes causes compile
+ failures
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Hi,
+
+binutils changed the signature of init_disassemble_info(), which now causes
+perf and bpftool to fail to compile (e.g. on debian unstable).
+
+Relevant binutils commit: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=60a3da00bd5407f07d64dff82a4dae98230dfaac
+
+util/annotate.c: In function ‘symbol__disassemble_bpf’:
+util/annotate.c:1765:9: error: too few arguments to function ‘init_disassemble_info’
+ 1765 |         init_disassemble_info(&info, s,
+      |         ^~~~~~~~~~~~~~~~~~~~~
+In file included from util/annotate.c:1718:
+/usr/include/dis-asm.h:472:13: note: declared here
+  472 | extern void init_disassemble_info (struct disassemble_info *dinfo, void *stream,
+      |             ^~~~~~~~~~~~~~~~~~~~~
+
+with equivalent failures in
+
+tools/bpf/bpf_jit_disasm.c
+tools/bpf/bpftool/jit_disasm.c
+
+The fix is easy enough, add a wrapper around fprintf() that conforms to the
+new signature.
+
+However I assume the necessary feature test and wrapper should only be added
+once? I don't know the kernel stuff well enough to choose the right structure
+here.
+
+Attached is my local fix for perf. Obviously would need work to be a real
+solution.
+
+Greetings,
+
+Andres Freund
+---
+
+binutils 2.39 changed the signature of init_disassemble_info(),
+which now causes perf and bpftool to fail to compile.
+
+Relevant binutils commit: [1]
+
+There is a proper fix in development upstream[2].
+This is a work-around for older kernels.
+
+[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=60a3da00bd5407f07d64dff82a4dae98230dfaac
+[2] https://patchwork.kernel.org/project/netdevbpf/cover/20220801013834.156015-1-andres@anarazel.de/
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+
+ tools/perf/util/annotate.c | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
+index 6c8575e182ed..466a3a68f5cd 100644
+--- a/tools/perf/util/annotate.c
++++ b/tools/perf/util/annotate.c
+@@ -1677,6 +1677,18 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
+ #include <bfd.h>
+ #include <dis-asm.h>
+ 
++static int fprintf_styled(void *, enum disassembler_style, const char* fmt, ...)
++{
++  va_list args;
++  int r;
++
++  va_start(args, fmt);
++  r = vprintf(fmt, args);
++  va_end(args);
++
++  return r;
++}
++
+ static int symbol__disassemble_bpf(struct symbol *sym,
+ 				   struct annotate_args *args)
+ {
+@@ -1719,7 +1731,8 @@ static int symbol__disassemble_bpf(struct symbol *sym,
+ 		goto out;
+ 	}
+ 	init_disassemble_info(&info, s,
+-			      (fprintf_ftype) fprintf);
++			      (fprintf_ftype) fprintf,
++			      fprintf_styled);
+ 
+ 	info.arch = bfd_get_arch(bfdf);
+ 	info.mach = bfd_get_mach(bfdf);
+-- 
+2.30.2
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0001-core-arm-add-MPIDR-affinity-shift-and-mask-for-32-bi.patch b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0001-core-arm-add-MPIDR-affinity-shift-and-mask-for-32-bi.patch
new file mode 100644
index 0000000..f249e52
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0001-core-arm-add-MPIDR-affinity-shift-and-mask-for-32-bi.patch
@@ -0,0 +1,29 @@
+Upstream-Status: Pending [Not submitted to upstream yet]
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+From cf84c933bb7b8a95742d1e723950cb2cde2d5320 Mon Sep 17 00:00:00 2001
+From: Vishnu Banavath <vishnu.banavath@arm.com>
+Date: Wed, 20 Jul 2022 16:37:10 +0100
+Subject: [PATCH] core: arm: add MPIDR affinity shift and mask for 32-bit
+
+This change is to add MPIDR affinity shift and mask for
+32-bit
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+diff --git a/core/arch/arm/include/arm.h b/core/arch/arm/include/arm.h
+index f59478af..2f6f82e7 100644
+--- a/core/arch/arm/include/arm.h
++++ b/core/arch/arm/include/arm.h
+@@ -63,6 +63,8 @@
+ #define MPIDR_AFF1_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF1_SHIFT)
+ #define MPIDR_AFF2_SHIFT	U(16)
+ #define MPIDR_AFF2_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF2_SHIFT)
++#define MPIDR_AFF3_SHIFT	U(32)
++#define MPIDR_AFF3_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF3_SHIFT)
+ 
+ #define MPIDR_MT_SHIFT		U(24)
+ #define MPIDR_MT_MASK		BIT(MPIDR_MT_SHIFT)
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0002-plat-n1sdp-add-N1SDP-platform-support.patch b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0002-plat-n1sdp-add-N1SDP-platform-support.patch
new file mode 100644
index 0000000..db195ab
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0002-plat-n1sdp-add-N1SDP-platform-support.patch
@@ -0,0 +1,233 @@
+Upstream-Status: Pending [Not submitted to upstream yet]
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+From 22ba7c7789082dbc179921962cdcadece4499c89 Mon Sep 17 00:00:00 2001
+From: Vishnu Banavath <vishnu.banavath@arm.com>
+Date: Thu, 30 Jun 2022 18:36:26 +0100
+Subject: [PATCH] plat-n1sdp: add N1SDP platform support
+
+These changes are to add N1SDP platform to optee-os
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+diff --git a/core/arch/arm/plat-n1sdp/conf.mk b/core/arch/arm/plat-n1sdp/conf.mk
+new file mode 100644
+index 00000000..06b4975a
+--- /dev/null
++++ b/core/arch/arm/plat-n1sdp/conf.mk
+@@ -0,0 +1,41 @@
++include core/arch/arm/cpu/cortex-armv8-0.mk
++
++CFG_DEBUG_INFO = y
++CFG_TEE_CORE_LOG_LEVEL = 4
++
++# Workaround 808870: Unconditional VLDM instructions might cause an
++# alignment fault even though the address is aligned
++# Either hard float must be disabled for AArch32 or strict alignment checks
++# must be disabled
++ifeq ($(CFG_SCTLR_ALIGNMENT_CHECK),y)
++$(call force,CFG_TA_ARM32_NO_HARD_FLOAT_SUPPORT,y)
++else
++$(call force,CFG_SCTLR_ALIGNMENT_CHECK,n)
++endif
++
++CFG_ARM64_core ?= y
++
++CFG_ARM_GICV3 = y
++
++# ARM debugger needs this
++platform-cflags-debug-info = -gdwarf-4
++platform-aflags-debug-info = -gdwarf-4
++
++CFG_CORE_SEL1_SPMC	= y
++CFG_WITH_ARM_TRUSTED_FW	= y
++
++$(call force,CFG_GIC,y)
++$(call force,CFG_PL011,y)
++$(call force,CFG_SECURE_TIME_SOURCE_CNTPCT,y)
++
++CFG_CORE_HEAP_SIZE = 0x32000 # 200kb
++
++CFG_TEE_CORE_NB_CORE = 4
++CFG_TZDRAM_START ?= 0x08000000
++CFG_TZDRAM_SIZE  ?= 0x02008000
++
++CFG_SHMEM_START  ?= 0x83000000
++CFG_SHMEM_SIZE   ?= 0x00210000
++# DRAM1 is defined above 4G
++$(call force,CFG_CORE_LARGE_PHYS_ADDR,y)
++$(call force,CFG_CORE_ARM64_PA_BITS,36)
+diff --git a/core/arch/arm/plat-n1sdp/main.c b/core/arch/arm/plat-n1sdp/main.c
+new file mode 100644
+index 00000000..cfb7f19b
+--- /dev/null
++++ b/core/arch/arm/plat-n1sdp/main.c
+@@ -0,0 +1,63 @@
++// SPDX-License-Identifier: BSD-2-Clause
++/*
++ * Copyright (c) 2022, Arm Limited.
++ */
++
++#include <arm.h>
++#include <console.h>
++#include <drivers/gic.h>
++#include <drivers/pl011.h>
++#include <drivers/tpm2_mmio.h>
++#include <drivers/tpm2_ptp_fifo.h>
++#include <drivers/tzc400.h>
++#include <initcall.h>
++#include <keep.h>
++#include <kernel/boot.h>
++#include <kernel/interrupt.h>
++#include <kernel/misc.h>
++#include <kernel/notif.h>
++#include <kernel/panic.h>
++#include <kernel/spinlock.h>
++#include <kernel/tee_time.h>
++#include <mm/core_memprot.h>
++#include <mm/core_mmu.h>
++#include <platform_config.h>
++#include <sm/psci.h>
++#include <stdint.h>
++#include <string.h>
++#include <trace.h>
++
++static struct gic_data gic_data __nex_bss;
++static struct pl011_data console_data __nex_bss;
++
++register_phys_mem_pgdir(MEM_AREA_IO_SEC, CONSOLE_UART_BASE, PL011_REG_SIZE);
++
++register_ddr(DRAM0_BASE, DRAM0_SIZE);
++
++register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICD_BASE, GIC_DIST_REG_SIZE);
++register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICC_BASE, GIC_DIST_REG_SIZE);
++register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICR_BASE, GIC_DIST_REG_SIZE);
++
++void main_init_gic(void)
++{
++	gic_init_base_addr(&gic_data, GICC_BASE,
++			   GICD_BASE);
++	itr_init(&gic_data.chip);
++}
++
++void main_secondary_init_gic(void)
++{
++	gic_cpu_init(&gic_data);
++}
++
++void itr_core_handler(void)
++{
++	gic_it_handle(&gic_data);
++}
++
++void console_init(void)
++{
++	pl011_init(&console_data, CONSOLE_UART_BASE, CONSOLE_UART_CLK_IN_HZ,
++		   CONSOLE_BAUDRATE);
++	register_serial_console(&console_data.chip);
++}
+diff --git a/core/arch/arm/plat-n1sdp/n1sdp_core_pos.S b/core/arch/arm/plat-n1sdp/n1sdp_core_pos.S
+new file mode 100644
+index 00000000..439d4e67
+--- /dev/null
++++ b/core/arch/arm/plat-n1sdp/n1sdp_core_pos.S
+@@ -0,0 +1,32 @@
++/* SPDX-License-Identifier: BSD-2-Clause */
++/*
++ * Copyright (c) 2022, Arm Limited
++ */
++
++#include <asm.S>
++#include <arm.h>
++#include "platform_config.h"
++
++FUNC get_core_pos_mpidr , :
++        mov     x4, x0
++
++        /*
++         * The MT bit in MPIDR is always set for n1sdp and the
++         * affinity level 0 corresponds to thread affinity level.
++         */
++
++        /* Extract individual affinity fields from MPIDR */
++        ubfx    x0, x4, #MPIDR_AFF0_SHIFT, #MPIDR_AFFINITY_BITS
++        ubfx    x1, x4, #MPIDR_AFF1_SHIFT, #MPIDR_AFFINITY_BITS
++        ubfx    x2, x4, #MPIDR_AFF2_SHIFT, #MPIDR_AFFINITY_BITS
++        ubfx    x3, x4, #MPIDR_AFF3_SHIFT, #MPIDR_AFFINITY_BITS
++
++        /* Compute linear position */
++        mov     x4, #N1SDP_MAX_CLUSTERS_PER_CHIP
++        madd    x2, x3, x4, x2
++        mov     x4, #N1SDP_MAX_CPUS_PER_CLUSTER
++        madd    x1, x2, x4, x1
++        mov     x4, #N1SDP_MAX_PE_PER_CPU
++        madd    x0, x1, x4, x0
++        ret
++END_FUNC get_core_pos_mpidr
+diff --git a/core/arch/arm/plat-n1sdp/platform_config.h b/core/arch/arm/plat-n1sdp/platform_config.h
+new file mode 100644
+index 00000000..81b99409
+--- /dev/null
++++ b/core/arch/arm/plat-n1sdp/platform_config.h
+@@ -0,0 +1,49 @@
++/* SPDX-License-Identifier: BSD-2-Clause */
++/*
++ * Copyright (c) 2022, Arm Limited
++ */
++
++#ifndef PLATFORM_CONFIG_H
++#define PLATFORM_CONFIG_H
++
++#include <mm/generic_ram_layout.h>
++#include <stdint.h>
++
++/* Make stacks aligned to data cache line length */
++#define STACK_ALIGNMENT		64
++
++ /* N1SDP topology related constants */
++#define N1SDP_MAX_CPUS_PER_CLUSTER              U(2)
++#define PLAT_ARM_CLUSTER_COUNT                  U(2)
++#define PLAT_N1SDP_CHIP_COUNT                   U(2)
++#define N1SDP_MAX_CLUSTERS_PER_CHIP             U(2)
++#define N1SDP_MAX_PE_PER_CPU                    U(1)
++
++#define PLATFORM_CORE_COUNT                     (PLAT_N1SDP_CHIP_COUNT *        \
++		                                PLAT_ARM_CLUSTER_COUNT *        \
++						N1SDP_MAX_CPUS_PER_CLUSTER *    \
++						N1SDP_MAX_PE_PER_CPU)
++
++#define GIC_BASE		0x2c010000
++
++#define UART1_BASE		0x1C0A0000
++#define UART1_CLK_IN_HZ		24000000  /*24MHz*/
++
++#define CONSOLE_UART_BASE	UART1_BASE
++#define CONSOLE_UART_CLK_IN_HZ	UART1_CLK_IN_HZ
++
++#define DRAM0_BASE		0x80000000
++#define DRAM0_SIZE		0x80000000
++
++#define GICD_BASE		0x30000000
++#define GICC_BASE		0x2C000000
++#define GICR_BASE		0x300C0000
++
++#ifndef UART_BAUDRATE
++#define UART_BAUDRATE		115200
++#endif
++#ifndef CONSOLE_BAUDRATE
++#define CONSOLE_BAUDRATE	UART_BAUDRATE
++#endif
++
++#endif /*PLATFORM_CONFIG_H*/
+diff --git a/core/arch/arm/plat-n1sdp/sub.mk b/core/arch/arm/plat-n1sdp/sub.mk
+new file mode 100644
+index 00000000..a0b49da1
+--- /dev/null
++++ b/core/arch/arm/plat-n1sdp/sub.mk
+@@ -0,0 +1,3 @@
++global-incdirs-y += .
++srcs-y += main.c
++srcs-y	+= n1sdp_core_pos.S
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0003-HACK-disable-instruction-cache-and-data-cache.patch b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0003-HACK-disable-instruction-cache-and-data-cache.patch
new file mode 100644
index 0000000..e8f4cc4
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0003-HACK-disable-instruction-cache-and-data-cache.patch
@@ -0,0 +1,46 @@
+Upstream-Status: Pending [Not submitted to upstream yet]
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+From 0c3ce4c09cd7d2ff4cd2e62acab899dd88dc9514 Mon Sep 17 00:00:00 2001
+From: Vishnu Banavath <vishnu.banavath@arm.com>
+Date: Wed, 20 Jul 2022 16:45:59 +0100
+Subject: [PATCH] HACK: disable instruction cache and data cache.
+
+For some reason, n1sdp fails to boot with instruction cache and
+data cache enabled. This is a temporary change to disable I cache
+and D cache until a proper fix is found.
+
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+%% original patch: 0003-HACK-disable-instruction-cache-and-data-cache.patch
+
+diff --git a/core/arch/arm/kernel/entry_a64.S b/core/arch/arm/kernel/entry_a64.S
+index 875b6e69..594d6928 100644
+--- a/core/arch/arm/kernel/entry_a64.S
++++ b/core/arch/arm/kernel/entry_a64.S
+@@ -52,7 +52,7 @@
+ 
+ 	.macro set_sctlr_el1
+ 		mrs	x0, sctlr_el1
+-		orr	x0, x0, #SCTLR_I
++		bic	x0, x0, #SCTLR_I
+ 		orr	x0, x0, #SCTLR_SA
+ 		orr	x0, x0, #SCTLR_SPAN
+ #if defined(CFG_CORE_RWDATA_NOEXEC)
+@@ -490,11 +490,11 @@ LOCAL_FUNC enable_mmu , : , .identity_map
+ 	isb
+ 
+ 	/* Enable I and D cache */
+-	mrs	x1, sctlr_el1
++	/* mrs	x1, sctlr_el1
+ 	orr	x1, x1, #SCTLR_I
+ 	orr	x1, x1, #SCTLR_C
+ 	msr	sctlr_el1, x1
+-	isb
++	isb */
+ 
+ 	/* Adjust stack pointers and return address */
+ 	msr	spsel, #1
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0004-Handle-logging-syscall.patch b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0004-Handle-logging-syscall.patch
new file mode 100644
index 0000000..356be9e
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/files/optee-os/n1sdp/0004-Handle-logging-syscall.patch
@@ -0,0 +1,33 @@
+Upstream-Status: Pending [Not submitted to upstream yet]
+Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
+
+From b3fde6c2e1a950214f760ab9f194f3a6572292a8 Mon Sep 17 00:00:00 2001
+From: Balint Dobszay <balint.dobszay@arm.com>
+Date: Fri, 15 Jul 2022 13:45:54 +0200
+Subject: [PATCH] Handle logging syscall
+
+Signed-off-by: Balint Dobszay <balint.dobszay@arm.com>
+Change-Id: Ib8151cc9c66aea8bcc8fe8b1ecdc3f9f9c5f14e4
+
+%% original patch: 0004-Handle-logging-syscall.patch
+
+diff --git a/core/arch/arm/kernel/spmc_sp_handler.c b/core/arch/arm/kernel/spmc_sp_handler.c
+index e0fa0aa6..c7a45387 100644
+--- a/core/arch/arm/kernel/spmc_sp_handler.c
++++ b/core/arch/arm/kernel/spmc_sp_handler.c
+@@ -1004,6 +1004,12 @@ void spmc_sp_msg_handler(struct thread_smc_args *args,
+ 			ffa_mem_reclaim(args, caller_sp);
+ 			sp_enter(args, caller_sp);
+ 			break;
++		case 0xdeadbeef:
++			ts_push_current_session(&caller_sp->ts_sess);
++			IMSG("%s", (char *)args->a1);
++			ts_pop_current_session();
++			sp_enter(args, caller_sp);
++			break;
+ 		default:
+ 			EMSG("Unhandled FFA function ID %#"PRIx32,
+ 			     (uint32_t)args->a0);
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os-n1sdp.inc b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os-n1sdp.inc
new file mode 100644
index 0000000..219f08b
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os-n1sdp.inc
@@ -0,0 +1,22 @@
+# N1 SDP specific configuration for optee-os
+
+COMPATIBLE_MACHINE:n1sdp = "n1sdp"
+OPTEEMACHINE:n1sdp = "n1sdp"
+
+TS_INSTALL_PREFIX_PATH = "${RECIPE_SYSROOT}/firmware/sp/opteesp"
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/files/optee-os/n1sdp:"
+SRC_URI:append = " \
+    file://0001-core-arm-add-MPIDR-affinity-shift-and-mask-for-32-bi.patch \
+    file://0002-plat-n1sdp-add-N1SDP-platform-support.patch \
+    file://0003-HACK-disable-instruction-cache-and-data-cache.patch \
+    file://0004-Handle-logging-syscall.patch \
+    "
+
+EXTRA_OEMAKE += " CFG_TEE_CORE_LOG_LEVEL=4"
+
+EXTRA_OEMAKE += " CFG_TEE_BENCHMARK=n"
+
+EXTRA_OEMAKE += " CFG_CORE_SEL1_SPMC=y CFG_CORE_FFA=y"
+
+EXTRA_OEMAKE += " CFG_WITH_SP=y"
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_3.18.0.bbappend b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_3.18.0.bbappend
new file mode 100644
index 0000000..f80e09f
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_3.18.0.bbappend
@@ -0,0 +1,6 @@
+# Machine specific configurations
+
+MACHINE_OPTEE_OS_REQUIRE ?= ""
+MACHINE_OPTEE_OS_REQUIRE:n1sdp = "optee-os-n1sdp.inc"
+
+require ${MACHINE_OPTEE_OS_REQUIRE}
diff --git a/meta-arm/meta-arm-bsp/recipes-security/trusted-services/secure-partitions/corstone1000/0048-Fix-UEFI-get_variable-with-small-buffer.patch b/meta-arm/meta-arm-bsp/recipes-security/trusted-services/secure-partitions/corstone1000/0048-Fix-UEFI-get_variable-with-small-buffer.patch
new file mode 100644
index 0000000..e4573a5
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/trusted-services/secure-partitions/corstone1000/0048-Fix-UEFI-get_variable-with-small-buffer.patch
@@ -0,0 +1,407 @@
+Upstream-Status: Pending 
+Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
+
+From 2d975e5ec5df6f81d6c35fe927f72d49181142f8 Mon Sep 17 00:00:00 2001
+From: Julian Hall <julian.hall@arm.com>
+Date: Tue, 19 Jul 2022 12:43:30 +0100
+Subject: [PATCH] Fix UEFI get_variable with small buffer
+
+The handling of the UEFI get_variable operation was incorrect when
+a small or zero data length was specified by a requester. A zero
+length data length is a legitimate way to discover the size of a
+variable without actually retrieving its data. This change adds
+test cases that reproduce the problem and a fix.
+
+Signed-off-by: Julian Hall <julian.hall@arm.com>
+Change-Id: Iec087fbf9305746d1438888e871602ec0ce15824
+---
+ .../backend/test/variable_store_tests.cpp     | 60 ++++++++++++++++--
+ .../backend/uefi_variable_store.c             | 46 +++++++++++---
+ .../client/cpp/smm_variable_client.cpp        | 33 +++++-----
+ .../client/cpp/smm_variable_client.h          |  8 ++-
+ .../provider/smm_variable_provider.c          |  2 +-
+ .../service/smm_variable_service_tests.cpp    | 62 +++++++++++++++++++
+ 6 files changed, 179 insertions(+), 32 deletions(-)
+
+diff --git a/components/service/smm_variable/backend/test/variable_store_tests.cpp b/components/service/smm_variable/backend/test/variable_store_tests.cpp
+index 235642e6..98faf761 100644
+--- a/components/service/smm_variable/backend/test/variable_store_tests.cpp
++++ b/components/service/smm_variable/backend/test/variable_store_tests.cpp
+@@ -128,7 +128,8 @@ TEST_GROUP(UefiVariableStoreTests)
+ 
+ 	efi_status_t get_variable(
+ 		const std::wstring &name,
+-		std::string &data)
++		std::string &data,
++		size_t data_len_clamp = VARIABLE_BUFFER_SIZE)
+ 	{
+ 		std::vector<int16_t> var_name = to_variable_name(name);
+ 		size_t name_size = var_name.size() * sizeof(int16_t);
+@@ -144,21 +145,40 @@ TEST_GROUP(UefiVariableStoreTests)
+ 		access_variable->NameSize = name_size;
+ 		memcpy(access_variable->Name, var_name.data(), name_size);
+ 
+-		access_variable->DataSize = 0;
++		size_t max_data_len = (data_len_clamp == VARIABLE_BUFFER_SIZE) ?
++			VARIABLE_BUFFER_SIZE -
++				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(access_variable) :
++			data_len_clamp;
++
++		access_variable->DataSize = max_data_len;
+ 
+ 		efi_status_t status = uefi_variable_store_get_variable(
+ 			&m_uefi_variable_store,
+ 			access_variable,
+-			VARIABLE_BUFFER_SIZE -
+-				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(access_variable),
++			max_data_len,
+ 			&total_size);
+ 
++		data.clear();
++
+ 		if (status == EFI_SUCCESS) {
+ 
+ 			const char *data_start = (const char*)(msg_buffer +
+ 				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(access_variable));
+ 
+ 			data = std::string(data_start, access_variable->DataSize);
++
++			UNSIGNED_LONGLONGS_EQUAL(
++				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(access_variable),
++				total_size);
++		}
++		else if (status == EFI_BUFFER_TOO_SMALL) {
++
++			/* String length set to reported variable length */
++			data.insert(0, access_variable->DataSize, '!');
++
++			UNSIGNED_LONGLONGS_EQUAL(
++				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(access_variable),
++				total_size);
+ 		}
+ 
+ 		return status;
+@@ -336,6 +356,38 @@ TEST(UefiVariableStoreTests, persistentSetGet)
+ 	LONGS_EQUAL(0, input_data.compare(output_data));
+ }
+ 
++TEST(UefiVariableStoreTests, getWithSmallBuffer)
++{
++	efi_status_t status = EFI_SUCCESS;
++	std::wstring var_name = L"test_variable";
++	std::string input_data = "quick brown fox";
++	std::string output_data;
++
++	/* A get with a zero length buffer is a legitimate way to
++	 * discover the variable size. This test performs GetVariable
++	 * operations with various buffer small buffer sizes. */
++	status = set_variable(var_name, input_data, 0);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, status);
++
++	/* First get the variable without a constrained buffer */
++	status = get_variable(var_name, output_data);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, status);
++
++	/* Expect got variable data to be the same as the set value */
++	UNSIGNED_LONGLONGS_EQUAL(input_data.size(), output_data.size());
++	LONGS_EQUAL(0, input_data.compare(output_data));
++
++	/* Now try with a zero length buffer */
++	status = get_variable(var_name, output_data, 0);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_BUFFER_TOO_SMALL, status);
++	UNSIGNED_LONGLONGS_EQUAL(input_data.size(), output_data.size());
++
++	/* Try with a non-zero length but too small buffer */
++	status = get_variable(var_name, output_data, input_data.size() -1);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_BUFFER_TOO_SMALL, status);
++	UNSIGNED_LONGLONGS_EQUAL(input_data.size(), output_data.size());
++}
++
+ TEST(UefiVariableStoreTests, removeVolatile)
+ {
+ 	efi_status_t status = EFI_SUCCESS;
+diff --git a/components/service/smm_variable/backend/uefi_variable_store.c b/components/service/smm_variable/backend/uefi_variable_store.c
+index e8771c21..90d648de 100644
+--- a/components/service/smm_variable/backend/uefi_variable_store.c
++++ b/components/service/smm_variable/backend/uefi_variable_store.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2021, Arm Limited. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
+  *
+  * SPDX-License-Identifier: BSD-3-Clause
+  *
+@@ -294,7 +294,10 @@ efi_status_t uefi_variable_store_get_variable(
+ 
+ 			status = load_variable_data(context, info, var, max_data_len);
+ 			var->Attributes = info->metadata.attributes;
+-			*total_length = SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(var);
++
++			*total_length = (status == EFI_SUCCESS) ?
++				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(var) :
++				SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(var);
+ 		}
+ 	}
+ 
+@@ -682,7 +685,6 @@ static efi_status_t load_variable_data(
+ {
+ 	EMSG("In func %s\n", __func__);
+ 	psa_status_t psa_status = PSA_SUCCESS;
+-	size_t data_len = 0;
+ 	uint8_t *data = (uint8_t*)var +
+ 		SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(var);
+ 
+@@ -692,17 +694,41 @@ static efi_status_t load_variable_data(
+ 
+ 	if (delegate_store->storage_backend) {
+ 
+-		psa_status = delegate_store->storage_backend->interface->get(
++		struct psa_storage_info_t storage_info;
++
++		psa_status = delegate_store->storage_backend->interface->get_info(
+ 			delegate_store->storage_backend->context,
+ 			context->owner_id,
+ 			info->metadata.uid,
+-			0,
+-			max_data_len,
+-			data,
+-			&data_len);
+-		EMSG("In func %s get status is %d\n", __func__, psa_status);
++			&storage_info);
++
++		if (psa_status == PSA_SUCCESS) {
+ 
+-		var->DataSize = data_len;
++			size_t get_limit = (var->DataSize < max_data_len) ?
++				var->DataSize :
++				max_data_len;
++
++			if (get_limit >= storage_info.size) {
++
++				size_t got_len = 0;
++
++				psa_status = delegate_store->storage_backend->interface->get(
++					delegate_store->storage_backend->context,
++					context->owner_id,
++					info->metadata.uid,
++					0,
++					max_data_len,
++					data,
++					&got_len);
++
++				var->DataSize = got_len;
++			}
++			else {
++
++				var->DataSize = storage_info.size;
++				psa_status = PSA_ERROR_BUFFER_TOO_SMALL;
++			}
++		}
+ 	}
+ 
+ 	return psa_to_efi_storage_status(psa_status);
+diff --git a/components/service/smm_variable/client/cpp/smm_variable_client.cpp b/components/service/smm_variable/client/cpp/smm_variable_client.cpp
+index 8438285b..b6b4ed90 100644
+--- a/components/service/smm_variable/client/cpp/smm_variable_client.cpp
++++ b/components/service/smm_variable/client/cpp/smm_variable_client.cpp
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  *
+  * SPDX-License-Identifier: BSD-3-Clause
+  */
+@@ -122,21 +122,22 @@ efi_status_t smm_variable_client::get_variable(
+ 		guid,
+ 		name,
+ 		data,
+-		0);
++		0,
++		MAX_VAR_DATA_SIZE);
+ }
+ 
+ efi_status_t smm_variable_client::get_variable(
+ 	const EFI_GUID &guid,
+ 	const std::wstring &name,
+ 	std::string &data,
+-	size_t override_name_size)
++	size_t override_name_size,
++	size_t max_data_size)
+ {
+ 	efi_status_t efi_status = EFI_NOT_READY;
+ 
+ 	std::vector<int16_t> var_name = to_variable_name(name);
+ 	size_t name_size = var_name.size() * sizeof(int16_t);
+-	size_t data_size = 0;
+-	size_t req_len = SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_SIZE(name_size, data_size);
++	size_t req_len = SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_SIZE(name_size, 0);
+ 
+ 	rpc_call_handle call_handle;
+ 	uint8_t *req_buf;
+@@ -154,7 +155,7 @@ efi_status_t smm_variable_client::get_variable(
+ 
+ 		access_var->Guid = guid;
+ 		access_var->NameSize = name_size;
+-		access_var->DataSize = data_size;
++		access_var->DataSize = max_data_size;
+ 
+ 		memcpy(access_var->Name, var_name.data(), name_size);
+ 
+@@ -168,26 +169,28 @@ efi_status_t smm_variable_client::get_variable(
+ 
+ 			efi_status = opstatus;
+ 
+-			if (efi_status == EFI_SUCCESS) {
+-
+-				efi_status = EFI_PROTOCOL_ERROR;
++			if (resp_len >= SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_NAME_OFFSET) {
+ 
+-				if (resp_len >= SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_NAME_OFFSET) {
++				access_var = (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE*)resp_buf;
++				size_t data_size = access_var->DataSize;
+ 
+-					access_var = (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE*)resp_buf;
++				if (resp_len >=
++					SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(access_var)) {
+ 
+-					if (resp_len >=
+-						SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(access_var)) {
++					if (efi_status == EFI_SUCCESS) {
+ 
+-						data_size = access_var->DataSize;
+ 						const char *data_start = (const char*)
+ 						&resp_buf[
+ 							SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(access_var)];
+ 
+ 						data.assign(data_start, data_size);
+-						efi_status = EFI_SUCCESS;
+ 					}
+ 				}
++				else if (efi_status == EFI_BUFFER_TOO_SMALL) {
++
++					data.clear();
++					data.insert(0, data_size, '!');
++				}
+ 			}
+ 		}
+ 		else {
+diff --git a/components/service/smm_variable/client/cpp/smm_variable_client.h b/components/service/smm_variable/client/cpp/smm_variable_client.h
+index c7973916..3d2371a8 100644
+--- a/components/service/smm_variable/client/cpp/smm_variable_client.h
++++ b/components/service/smm_variable/client/cpp/smm_variable_client.h
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  *
+  * SPDX-License-Identifier: BSD-3-Clause
+  */
+@@ -56,7 +56,8 @@ public:
+ 		const EFI_GUID &guid,
+ 		const std::wstring &name,
+ 		std::string &data,
+-		size_t override_name_size);
++		size_t override_name_size,
++		size_t max_data_size = MAX_VAR_DATA_SIZE);
+ 
+ 	/* Remove a variable */
+ 	efi_status_t remove_variable(
+@@ -113,6 +114,9 @@ public:
+ 
+ 
+ private:
++
++	static const size_t MAX_VAR_DATA_SIZE = 65536;
++
+ 	efi_status_t rpc_to_efi_status() const;
+ 
+ 	static std::vector<int16_t> to_variable_name(const std::wstring &string);
+diff --git a/components/service/smm_variable/provider/smm_variable_provider.c b/components/service/smm_variable/provider/smm_variable_provider.c
+index 1f362c17..95c4fdc9 100644
+--- a/components/service/smm_variable/provider/smm_variable_provider.c
++++ b/components/service/smm_variable/provider/smm_variable_provider.c
+@@ -165,7 +165,7 @@ static rpc_status_t get_variable_handler(void *context, struct call_req *req)
+ 		}
+ 		else {
+ 
+-			/* Reponse buffer not big enough */
++			/* Response buffer not big enough */
+ 			efi_status = EFI_BAD_BUFFER_SIZE;
+ 		}
+ 	}
+diff --git a/components/service/smm_variable/test/service/smm_variable_service_tests.cpp b/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
+index 38c08ebe..989a3e63 100644
+--- a/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
++++ b/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
+@@ -284,6 +284,68 @@ TEST(SmmVariableServiceTests, setAndGetNv)
+ 	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
+ }
+ 
++TEST(SmmVariableServiceTests, getVarSize)
++{
++	efi_status_t efi_status = EFI_SUCCESS;
++	std::wstring var_name = L"test_variable";
++	std::string set_data = "UEFI variable data string";
++	std::string get_data;
++
++	efi_status = m_client->set_variable(
++		m_common_guid,
++		var_name,
++		set_data,
++		0);
++
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
++
++	/* Get with the data size set to zero. This is the standard way
++	 * to discover the variable size. */
++	efi_status = m_client->get_variable(
++		m_common_guid,
++		var_name,
++		get_data,
++		0, 0);
++
++	UNSIGNED_LONGLONGS_EQUAL(EFI_BUFFER_TOO_SMALL, efi_status);
++	UNSIGNED_LONGS_EQUAL(set_data.size(), get_data.size());
++
++	/* Expect remove to be permitted */
++	efi_status = m_client->remove_variable(m_common_guid, var_name);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
++}
++
++TEST(SmmVariableServiceTests, getVarSizeNv)
++{
++	efi_status_t efi_status = EFI_SUCCESS;
++	std::wstring var_name = L"test_variable";
++	std::string set_data = "UEFI variable data string";
++	std::string get_data;
++
++	efi_status = m_client->set_variable(
++		m_common_guid,
++		var_name,
++		set_data,
++		EFI_VARIABLE_NON_VOLATILE);
++
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
++
++	/* Get with the data size set to zero. This is the standard way
++	 * to discover the variable size. */
++	efi_status = m_client->get_variable(
++		m_common_guid,
++		var_name,
++		get_data,
++		0, 0);
++
++	UNSIGNED_LONGLONGS_EQUAL(EFI_BUFFER_TOO_SMALL, efi_status);
++	UNSIGNED_LONGS_EQUAL(set_data.size(), get_data.size());
++
++	/* Expect remove to be permitted */
++	efi_status = m_client->remove_variable(m_common_guid, var_name);
++	UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
++}
++
+ TEST(SmmVariableServiceTests, enumerateStoreContents)
+ {
+ 	efi_status_t efi_status = EFI_SUCCESS;
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm-bsp/recipes-security/trusted-services/ts-corstone1000.inc b/meta-arm/meta-arm-bsp/recipes-security/trusted-services/ts-corstone1000.inc
index 88c46a7..b04863f 100644
--- a/meta-arm/meta-arm-bsp/recipes-security/trusted-services/ts-corstone1000.inc
+++ b/meta-arm/meta-arm-bsp/recipes-security/trusted-services/ts-corstone1000.inc
@@ -59,6 +59,7 @@
 		  file://0046-Fix-update-psa_set_key_usage_flags-definition-to-the.patch \
 		  file://0047-Fixes-in-AEAD-for-psa-arch-test-54-and-58.patch \
 		  file://0003-corstone1000-port-crypto-config.patch;patchdir=../psa-arch-tests \
+                  file://0048-Fix-UEFI-get_variable-with-small-buffer.patch \
                   "
 
 SRC_URI_MBEDTLS = "git://github.com/ARMmbed/mbedtls.git;protocol=https;branch=development;name=mbedtls;destsuffix=git/mbedtls"
diff --git a/meta-arm/meta-arm-bsp/wic/corstone1000-image.corstone1000.wks b/meta-arm/meta-arm-bsp/wic/corstone1000-image.corstone1000.wks
index c58d7d6..7625679 100644
--- a/meta-arm/meta-arm-bsp/wic/corstone1000-image.corstone1000.wks
+++ b/meta-arm/meta-arm-bsp/wic/corstone1000-image.corstone1000.wks
@@ -12,4 +12,4 @@
 part --source rawcopy --sourceparams="file=signed_fip-corstone1000.bin" --align 1 --no-table --fixed-size 2
 
 # Rawcopy of kernel with initramfs
-part --source rawcopy --sourceparams="file=Image-initramfs-${MACHINE}.bin" --no-table --fixed-size 12
+part --source rawcopy --sourceparams="file=Image.gz-initramfs-${MACHINE}.bin" --no-table --fixed-size 12
diff --git a/meta-arm/meta-arm/classes/fvpboot.bbclass b/meta-arm/meta-arm/classes/fvpboot.bbclass
index ec9d4f5..fbdfa96 100644
--- a/meta-arm/meta-arm/classes/fvpboot.bbclass
+++ b/meta-arm/meta-arm/classes/fvpboot.bbclass
@@ -26,7 +26,7 @@
 
 EXTRA_IMAGEDEPENDS += "${FVP_PROVIDER}"
 
-inherit image-artifact-names
+IMAGE_CLASSES += "image-artifact-names"
 
 IMAGE_POSTPROCESS_COMMAND += "do_write_fvpboot_conf;"
 python do_write_fvpboot_conf() {
diff --git a/meta-arm/meta-arm/conf/machine/qemuarm-secureboot.conf b/meta-arm/meta-arm/conf/machine/qemuarm-secureboot.conf
index a459f3f..e48d964 100644
--- a/meta-arm/meta-arm/conf/machine/qemuarm-secureboot.conf
+++ b/meta-arm/meta-arm/conf/machine/qemuarm-secureboot.conf
@@ -12,6 +12,7 @@
 QB_FSINFO = "wic:no-kernel-in-fs"
 QB_ROOTFS_OPT = ""
 QB_KERNEL_ROOT = "/dev/vda2"
+QB_KERNEL_CMDLINE_APPEND = ""
 
 IMAGE_FSTYPES += "wic wic.qcow2"
 
diff --git a/meta-arm/meta-arm/lib/oeqa/runtime/cases/linuxboot.py b/meta-arm/meta-arm/lib/oeqa/runtime/cases/linuxboot.py
index 8994405..99a8e78 100644
--- a/meta-arm/meta-arm/lib/oeqa/runtime/cases/linuxboot.py
+++ b/meta-arm/meta-arm/lib/oeqa/runtime/cases/linuxboot.py
@@ -12,7 +12,8 @@
 
     def setUp(self):
         self.console = self.target.DEFAULT_CONSOLE
+        self.timeout = int(self.td.get('TEST_FVP_LINUX_BOOT_TIMEOUT') or 10*60)
 
     def test_linux_boot(self):
         self.logger.info(f"{self.console}: Waiting for login prompt")
-        self.target.expect(self.console, r"login\:", timeout=10*60)
+        self.target.expect(self.console, r"login\:", self.timeout)
diff --git a/meta-arm/meta-arm/lib/oeqa/runtime/cases/trusted_services.py b/meta-arm/meta-arm/lib/oeqa/runtime/cases/trusted_services.py
new file mode 100644
index 0000000..a5f9376
--- /dev/null
+++ b/meta-arm/meta-arm/lib/oeqa/runtime/cases/trusted_services.py
@@ -0,0 +1,50 @@
+#
+
+from oeqa.runtime.case import OERuntimeTestCase
+from oeqa.core.decorator.depends import OETestDepends
+from oeqa.runtime.decorator.package import OEHasPackage
+
+class TrustedServicesTest(OERuntimeTestCase):
+
+    def run_test_tool(self, cmd, expected_status=0 ):
+        """ Run a test utility """
+
+        status, output = self.target.run(cmd)
+        self.assertEqual(status, expected_status, msg='\n'.join([cmd, output]))
+
+    @OEHasPackage(['ts-demo'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_00_ts_demo(self):
+        self.run_test_tool('ts-demo')
+
+    @OEHasPackage(['ts-service-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_01_ts_service_test(self):
+        self.run_test_tool('ts-service-test')
+
+    @OEHasPackage(['ts-uefi-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_02_ts_uefi_test(self):
+        self.run_test_tool('uefi-test')
+
+    @OEHasPackage(['ts-psa-crypto-api-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_03_psa_crypto_api_test(self):
+        # There are a few expected PSA Crypto tests failing
+        self.run_test_tool('psa-crypto-api-test', expected_status=46)
+
+    @OEHasPackage(['ts-psa-its-api-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_04_psa_its_api_test(self):
+        self.run_test_tool('psa-its-api-test')
+
+    @OEHasPackage(['ts-psa-ps-api-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_05_psa_ps_api_test(self):
+        # There are a few expected PSA Storage tests failing
+        self.run_test_tool('psa-ps-api-test', expected_status=46)
+
+    @OEHasPackage(['ts-psa-iat-api-test'])
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_06_psa_iat_api_test(self):
+        self.run_test_tool('psa-iat-api-test')
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/build-deps-upgrade-to-mbed-TLS-2.28.0.patch b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/build-deps-upgrade-to-mbed-TLS-2.28.0.patch
deleted file mode 100644
index 058423c..0000000
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/build-deps-upgrade-to-mbed-TLS-2.28.0.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-Upstream-Status: Backport
-Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
-
-From a93084be95634b66b917f1c8baf403067dc75c5d Mon Sep 17 00:00:00 2001
-From: Sandrine Bailleux <sandrine.bailleux@arm.com>
-Date: Thu, 21 Apr 2022 10:21:29 +0200
-Subject: [PATCH] build(deps): upgrade to mbed TLS 2.28.0
-
-Upgrade to the latest and greatest 2.x release of Mbed TLS library
-(i.e. v2.28.0) to take advantage of their bug fixes.
-
-Note that the Mbed TLS project published version 3.x some time
-ago. However, as this is a major release with API breakages, upgrading
-to 3.x might require some more involved changes in TF-A, which we are
-not ready to do. We shall upgrade to mbed TLS 3.x after the v2.7
-release of TF-A.
-
-Actually, the upgrade this time simply boils down to including the new
-source code module 'constant_time.c' into the firmware.
-
-To quote mbed TLS v2.28.0 release notes [1]:
-
-  The mbedcrypto library includes a new source code module
-  constant_time.c, containing various functions meant to resist timing
-  side channel attacks. This module does not have a separate
-  configuration option, and functions from this module will be
-  included in the build as required.
-
-As a matter of fact, if one is attempting to link TF-A against mbed
-TLS v2.28.0 without the present patch, one gets some linker errors
-due to missing symbols from this new module.
-
-Apart from this, none of the items listed in mbed TLS release
-notes [1] directly affect TF-A. Special note on the following one:
-
-  Fix a bug in mbedtls_gcm_starts() when the bit length of the iv
-  exceeds 2^32.
-
-In TF-A, we do use mbedtls_gcm_starts() when the firmware decryption
-feature is enabled with AES-GCM as the authenticated decryption
-algorithm (DECRYPTION_SUPPORT=aes_gcm). However, the iv_len variable
-which gets passed to mbedtls_gcm_starts() is an unsigned int, i.e. a
-32-bit value which by definition is always less than 2**32. Therefore,
-we are immune to this bug.
-
-With this upgrade, the size of BL1 and BL2 binaries does not appear to
-change on a standard sample test build (with trusted boot and measured
-boot enabled).
-
-[1] https://github.com/Mbed-TLS/mbedtls/releases/tag/v2.28.0
-
-Change-Id: Icd5dbf527395e9e22c8fd6b77427188bd7237fd6
-Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
----
- drivers/auth/mbedtls/mbedtls_common.mk | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/auth/mbedtls/mbedtls_common.mk b/drivers/auth/mbedtls/mbedtls_common.mk
-index 0a4775d00..3eb41617f 100644
---- a/drivers/auth/mbedtls/mbedtls_common.mk
-+++ b/drivers/auth/mbedtls/mbedtls_common.mk
-@@ -48,6 +48,7 @@ LIBMBEDTLS_SRCS		:= $(addprefix ${MBEDTLS_DIR}/library/,	\
- 					rsa_internal.c				\
- 					x509.c 					\
- 					x509_crt.c 				\
-+					constant_time.c 			\
- 					)
- 
- # The platform may define the variable 'TF_MBEDTLS_KEY_ALG' to select the key
--- 
-2.25.1
-
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/rwx-segments.patch b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/rwx-segments.patch
new file mode 100644
index 0000000..a4518ec
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/rwx-segments.patch
@@ -0,0 +1,38 @@
+Binutils 2.39 now warns when a segment has RXW permissions[1]:
+
+aarch64-none-elf-ld.bfd: warning: bl31.elf has a LOAD segment with RWX
+permissions
+
+However, TF-A passes --fatal-warnings to LD, so this is a build failure.
+
+There is a ticket filed upstream[2], so until that is resolved just
+remove --fatal-warnings.
+
+[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ba951afb99912da01a6e8434126b8fac7aa75107
+[2] https://developer.trustedfirmware.org/T996
+
+Upstream-Status: Inappropriate
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+
+diff --git a/Makefile b/Makefile
+index 3941f8698..13bbac348 100644
+--- a/Makefile
++++ b/Makefile
+@@ -418,7 +418,7 @@ TF_LDFLAGS		+=	$(TF_LDFLAGS_$(ARCH))
+ # LD = gcc (used when GCC LTO is enabled)
+ else ifneq ($(findstring gcc,$(notdir $(LD))),)
+ # Pass ld options with Wl or Xlinker switches
+-TF_LDFLAGS		+=	-Wl,--fatal-warnings -O1
++TF_LDFLAGS		+=	-O1
+ TF_LDFLAGS		+=	-Wl,--gc-sections
+ ifeq ($(ENABLE_LTO),1)
+ 	ifeq (${ARCH},aarch64)
+@@ -435,7 +435,7 @@ TF_LDFLAGS		+=	$(subst --,-Xlinker --,$(TF_LDFLAGS_$(ARCH)))
+ 
+ # LD = gcc-ld (ld) or llvm-ld (ld.lld) or other
+ else
+-TF_LDFLAGS		+=	--fatal-warnings -O1
++TF_LDFLAGS		+=	-O1
+ TF_LDFLAGS		+=	--gc-sections
+ # ld.lld doesn't recognize the errata flags,
+ # therefore don't add those in that case
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/ssl.patch b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/ssl.patch
deleted file mode 100644
index cdabd1b..0000000
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/ssl.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-fiptool: respect OPENSSL_DIR
-
-fiptool links to libcrypto, so as with the other tools it should respect
-OPENSSL_DIR for include/library paths.
-
-Upstream-Status: Submitted
-Signed-off-by: Ross Burton <ross.burton@arm.com>
-
-diff --git a/Makefile b/Makefile
-index ec6f88585..2d3b9fc26 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1388,7 +1388,7 @@ fwu_fip: ${BUILD_PLAT}/${FWU_FIP_NAME}
- 
- ${FIPTOOL}: FORCE
- ifdef UNIX_MK
--	${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} --no-print-directory -C ${FIPTOOLPATH}
-+	${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} OPENSSL_DIR=${OPENSSL_DIR} --no-print-directory -C ${FIPTOOLPATH}
- else
- # Clear the MAKEFLAGS as we do not want
- # to pass the gnumake flags to nmake.
-diff --git a/tools/fiptool/Makefile b/tools/fiptool/Makefile
-index 11d2e7b0b..7c2a08379 100644
---- a/tools/fiptool/Makefile
-+++ b/tools/fiptool/Makefile
-@@ -12,6 +12,8 @@ FIPTOOL ?= fiptool${BIN_EXT}
- PROJECT := $(notdir ${FIPTOOL})
- OBJECTS := fiptool.o tbbr_config.o
- V ?= 0
-+OPENSSL_DIR := /usr
-+
- 
- override CPPFLAGS += -D_GNU_SOURCE -D_XOPEN_SOURCE=700
- HOSTCCFLAGS := -Wall -Werror -pedantic -std=c99
-@@ -20,7 +22,7 @@ ifeq (${DEBUG},1)
- else
-   HOSTCCFLAGS += -O2
- endif
--LDLIBS := -lcrypto
-+LDLIBS := -L${OPENSSL_DIR}/lib -lcrypto
- 
- ifeq (${V},0)
-   Q := @
-@@ -28,7 +30,7 @@ else
-   Q :=
- endif
- 
--INCLUDE_PATHS := -I../../include/tools_share
-+INCLUDE_PATHS := -I../../include/tools_share  -I${OPENSSL_DIR}/include
- 
- HOSTCC ?= gcc
- 
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/tf-a-tests-no-warn-rwx-segments.patch b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/tf-a-tests-no-warn-rwx-segments.patch
new file mode 100644
index 0000000..5d02e35
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/tf-a-tests-no-warn-rwx-segments.patch
@@ -0,0 +1,26 @@
+Binutils 2.39 now warns when a segment has RXW permissions[1]:
+
+aarch64-poky-linux-musl-ld: tftf.elf has a LOAD segment with RWX permissions
+
+There is a ticket filed upstream[2], so until that is resolved just
+disable the warning
+
+[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ba951afb99912da01a6e8434126b8fac7aa75107
+[2] https://developer.trustedfirmware.org/T996
+
+Upstream-Status: Inappropriate
+Signed-off-by: Anton Antonov <anrton.antonov@arm.com>
+
+diff --git a/Makefile b/Makefile
+index 6d0774e1..be3f84ce 100644
+--- a/Makefile
++++ b/Makefile
+@@ -238,7 +238,7 @@ TFTF_SOURCES		:= ${FRAMEWORK_SOURCES}	${TESTS_SOURCES} ${PLAT_SOURCES} ${LIBC_SR
+ TFTF_INCLUDES		+= ${PLAT_INCLUDES}
+ TFTF_CFLAGS		+= ${COMMON_CFLAGS}
+ TFTF_ASFLAGS		+= ${COMMON_ASFLAGS}
+-TFTF_LDFLAGS		+= ${COMMON_LDFLAGS}
++TFTF_LDFLAGS		+= ${COMMON_LDFLAGS} --no-warn-rwx-segments
+ TFTF_EXTRA_OBJS 	:=
+ 
+ ifneq (${BP_OPTION},none)
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.7.0.bb b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.7.0.bb
index 0c06440..645b245 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.7.0.bb
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.7.0.bb
@@ -7,7 +7,8 @@
 
 COMPATIBLE_MACHINE ?= "invalid"
 
-SRC_URI = "git://git.trustedfirmware.org/TF-A/tf-a-tests.git;protocol=https;branch=master"
+SRC_URI = "git://git.trustedfirmware.org/TF-A/tf-a-tests.git;protocol=https;branch=master \
+          file://tf-a-tests-no-warn-rwx-segments.patch"
 SRCREV ?= "5f591f67738a1bbe6b262c53d9dad46ed8bbcd67"
 
 DEPENDS += "optee-os"
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
index 8815510..6cf55d6 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
@@ -10,7 +10,14 @@
 TFA_PLATFORM:qemu-generic-arm64 = "qemu_sbsa"
 TFA_PLATFORM:qemuarm-secureboot = "qemu"
 
-TFA_SPD:qemuarm64-secureboot = "opteed"
+# Trusted Services secure partitions require arm-ffa machine feature.
+# Enabling Secure-EL1 Payload Dispatcher (SPD) in this case
+TFA_SPD:qemuarm64-secureboot = "${@bb.utils.contains('MACHINE_FEATURES', 'arm-ffa', 'spmd', 'opteed', d)}"
+# Configure tf-a accordingly to TS requirements if included
+EXTRA_OEMAKE:append:qemuarm64-secureboot = "${@bb.utils.contains('MACHINE_FEATURES', 'arm-ffa', ' CTX_INCLUDE_EL2_REGS=0 SPMC_OPTEE=1 ', '' , d)}"
+# Cortex-A57 supports Armv8.0 (no S-EL2 execution state).
+# The SPD SPMC component should run at the S-EL1 execution state.
+TFA_SPMD_SPM_AT_SEL2:qemuarm64-secureboot = "0"
 
 TFA_UBOOT:qemuarm64-secureboot = "1"
 TFA_UBOOT:qemuarm-secureboot = "1"
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.7.0.bb b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.7.0.bb
index 537ec32..35817c0 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.7.0.bb
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.7.0.bb
@@ -3,6 +3,8 @@
 # TF-A v2.7
 SRCREV_tfa = "35f4c7295bafeb32c8bcbdfb6a3f2e74a57e732b"
 
+SRC_URI += "file://rwx-segments.patch"
+
 LIC_FILES_CHKSUM += "file://docs/license.rst;md5=b2c740efedc159745b9b31f88ff03dde"
 
 # mbed TLS v2.28.0
diff --git a/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon/0001-daemon-mxml-Define-_GNU_SOURCE.patch b/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon/0001-daemon-mxml-Define-_GNU_SOURCE.patch
new file mode 100644
index 0000000..d246043
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon/0001-daemon-mxml-Define-_GNU_SOURCE.patch
@@ -0,0 +1,31 @@
+From 04e2e924c3ab8da41343277746804dbcd7bf520d Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 13 Aug 2022 16:49:52 -0700
+Subject: [PATCH] daemon/mxml: Define _GNU_SOURCE
+
+This file uses vasprintf() which is defined only with _GNU_SOURCE
+feature macro is on.
+
+Upstream-Status: Pending
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ daemon/mxml/mxml-string.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/daemon/mxml/mxml-string.c b/daemon/mxml/mxml-string.c
+index 678aeb9..c9cd153 100644
+--- a/daemon/mxml/mxml-string.c
++++ b/daemon/mxml/mxml-string.c
+@@ -13,6 +13,8 @@
+  * Include necessary headers...
+  */
+ 
++#define _GNU_SOURCE
++
+ #include "config.h"
+ 
+ 
+-- 
+2.37.2
+
diff --git a/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon_7.7.0.bb b/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon_7.7.0.bb
index 492d321..07b8abb 100644
--- a/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon_7.7.0.bb
+++ b/meta-arm/meta-arm/recipes-devtools/gator-daemon/gator-daemon_7.7.0.bb
@@ -18,6 +18,7 @@
 SRCREV = "9d8d75fa08352470c51abc23fe3b314879bd8b78"
 SRC_URI = "git://github.com/ARM-software/gator.git;protocol=http;branch=main;protocol=https \
            file://0001-Sources.mk-Remove-xml-PmuXMLParser.h-header-from-GAT.patch;striplevel=2 \
+           file://0001-daemon-mxml-Define-_GNU_SOURCE.patch;striplevel=2 \
           "
 
 S = "${WORKDIR}/git/daemon"
diff --git a/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/arm-ffa-tee_1.1.1.bb b/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/arm-ffa-tee_1.1.1.bb
new file mode 100644
index 0000000..9e997de
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/arm-ffa-tee_1.1.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A Linux kernel module providing user space access to Trusted Services"
+DESCRIPTION = "${SUMMARY}"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=05e355bbd617507216a836c56cf24983"
+
+inherit module
+
+SRC_URI = "git://gitlab.arm.com/linux-arm/linux-trusted-services;protocol=https;branch=main \
+           file://Makefile;subdir=git \
+          "
+S = "${WORKDIR}/git"
+
+# Tag tee-v1.1
+SRCREV = "3b543b7591505b715f332c972248a3ea41604d83"
+
+COMPATIBLE_HOST = "(arm|aarch64).*-linux"
+KERNEL_MODULE_AUTOLOAD += "arm-ffa-tee"
+
+do_install:append() {
+    install -d ${D}${includedir}
+    install -m 0644 ${S}/uapi/arm_ffa_tee.h ${D}${includedir}/
+}
diff --git a/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/files/Makefile b/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/files/Makefile
new file mode 100644
index 0000000..40a6e47
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/arm-ffa-tee/files/Makefile
@@ -0,0 +1,14 @@
+obj-m := arm-ffa-tee.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers
diff --git a/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/arm-ffa-user_5.0.0.bb b/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/arm-ffa-user_5.0.0.bb
new file mode 100644
index 0000000..8d86197
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/arm-ffa-user_5.0.0.bb
@@ -0,0 +1,29 @@
+SUMMARY = "FF-A Debugfs Linux kernel module"
+DESCRIPTION = "This out-of-tree kernel module exposes FF-A operations to user space \
+used for development purposes"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=05e355bbd617507216a836c56cf24983"
+
+inherit module
+
+SRC_URI = "git://gitlab.arm.com/linux-arm/linux-trusted-services;protocol=https;branch=debugfs \
+           file://Makefile;subdir=git \
+          "
+S = "${WORKDIR}/git"
+
+# Tag 5.0.0.
+SRCREV = "6ec4196a59db8204ed670ef3b78f24a8234b85a6"
+
+COMPATIBLE_HOST = "(arm|aarch64).*-linux"
+KERNEL_MODULE_AUTOLOAD += "arm-ffa-user"
+KERNEL_MODULE_PROBECONF += "arm-ffa-user"
+
+# This debugfs driver is used only by uefi-test for testing SmmGW SP
+# UUIDs = SMM Gateway SP
+FFA-USER-UUID-LIST ?= "ed32d533-99e6-4209-9cc0-2d72cdd998a7"
+module_conf_arm-ffa-user = "options arm-ffa-user uuid_str_list=${FFA-USER-UUID-LIST}"
+
+do_install:append() {
+    install -d ${D}${includedir}
+    install -m 0644 ${S}/arm_ffa_user.h ${D}${includedir}/
+}
diff --git a/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/files/Makefile b/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/files/Makefile
new file mode 100644
index 0000000..c54d1fc
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/arm-ffa-user/files/Makefile
@@ -0,0 +1,14 @@
+obj-m := arm-ffa-user.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-5.15.inc b/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-5.15.inc
new file mode 100644
index 0000000..bc66efb
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-5.15.inc
@@ -0,0 +1,5 @@
+# Include a backport kernel patch for TEE driver
+
+SRC_URI:append = " \
+    file://Add-sec_world_id-to-struct-tee_shm.patch \
+    "
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-transport.inc b/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-transport.inc
new file mode 100644
index 0000000..dec31dd
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/arm-ffa-transport.inc
@@ -0,0 +1,6 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+# Enable ARM-FFA transport
+SRC_URI:append = " \
+    file://arm-ffa-transport.cfg \
+    "
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/Add-sec_world_id-to-struct-tee_shm.patch b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/Add-sec_world_id-to-struct-tee_shm.patch
new file mode 100644
index 0000000..8f54b30
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/Add-sec_world_id-to-struct-tee_shm.patch
@@ -0,0 +1,44 @@
+From 9028b2463c1ea96f51c3ba53e2479346019ff6ad Mon Sep 17 00:00:00 2001
+From: Jens Wiklander <jens.wiklander@linaro.org>
+Date: Thu, 25 Mar 2021 15:08:44 +0100
+Subject: [PATCH] tee: add sec_world_id to struct tee_shm
+
+Adds sec_world_id to struct tee_shm which describes a shared memory
+object. sec_world_id can be used by a driver to store an id assigned by
+secure world.
+
+Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
+Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
+
+Upstream-Status: Submitted [https://github.com/torvalds/linux/commit/9028b2463c1ea96f51c3ba53e2479346019ff6ad]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ include/linux/tee_drv.h | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h
+index 3ebfea0781f100..a1f03461369bd9 100644
+--- a/include/linux/tee_drv.h
++++ b/include/linux/tee_drv.h
+@@ -197,7 +197,11 @@ int tee_session_calc_client_uuid(uuid_t *uuid, u32 connection_method,
+  * @num_pages:	number of locked pages
+  * @dmabuf:	dmabuf used to for exporting to user space
+  * @flags:	defined by TEE_SHM_* in tee_drv.h
+- * @id:		unique id of a shared memory object on this device
++ * @id:		unique id of a shared memory object on this device, shared
++ *		with user space
++ * @sec_world_id:
++ *		secure world assigned id of this shared memory object, not
++ *		used by all drivers
+  *
+  * This pool is only supposed to be accessed directly from the TEE
+  * subsystem and from drivers that implements their own shm pool manager.
+@@ -213,6 +217,7 @@ struct tee_shm {
+ 	struct dma_buf *dmabuf;
+ 	u32 flags;
+ 	int id;
++	u64 sec_world_id;
+ };
+ 
+ /**
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/skip-unavailable-memory.patch b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/skip-unavailable-memory.patch
new file mode 100644
index 0000000..d157ef7
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto-5.15/skip-unavailable-memory.patch
@@ -0,0 +1,85 @@
+From 7bfeda1c9224270af97adf799ce0b5a4292bceb6 Mon Sep 17 00:00:00 2001
+From: Andre Przywara <andre.przywara@arm.com>
+Date: Tue, 17 May 2022 11:14:10 +0100
+Subject: [PATCH] of/fdt: Ignore disabled memory nodes
+
+When we boot a machine using a devicetree, the generic DT code goes
+through all nodes with a 'device_type = "memory"' property, and collects
+all memory banks mentioned there. However it does not check for the
+status property, so any nodes which are explicitly "disabled" will still
+be added as a memblock.
+This ends up badly for QEMU, when booting with secure firmware on
+arm/arm64 machines, because QEMU adds a node describing secure-only
+memory:
+===================
+	secram@e000000 {
+		secure-status = "okay";
+		status = "disabled";
+		reg = <0x00 0xe000000 0x00 0x1000000>;
+		device_type = "memory";
+	};
+===================
+
+The kernel will eventually use that memory block (which is located below
+the main DRAM bank), but accesses to that will be answered with an
+SError:
+===================
+[    0.000000] Internal error: synchronous external abort: 96000050 [#1] PREEMPT SMP
+[    0.000000] Modules linked in:
+[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.18.0-rc6-00014-g10c8acb8b679 #524
+[    0.000000] Hardware name: linux,dummy-virt (DT)
+[    0.000000] pstate: 200000c5 (nzCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+[    0.000000] pc : new_slab+0x190/0x340
+[    0.000000] lr : new_slab+0x184/0x340
+[    0.000000] sp : ffff80000a4b3d10
+....
+==================
+The actual crash location and call stack will be somewhat random, and
+depend on the specific allocation of that physical memory range.
+
+As the DT spec[1] explicitly mentions standard properties, add a simple
+check to skip over disabled memory nodes, so that we only use memory
+that is meant for non-secure code to use.
+
+That fixes booting a QEMU arm64 VM with EL3 enabled ("secure=on"), when
+not using UEFI. In this case the QEMU generated DT will be handed on
+to the kernel, which will see the secram node.
+This issue is reproducible when using TF-A together with U-Boot as
+firmware, then booting with the "booti" command.
+
+When using U-Boot as an UEFI provider, the code there [2] explicitly
+filters for disabled nodes when generating the UEFI memory map, so we
+are safe.
+EDK/2 only reads the first bank of the first DT memory node [3] to learn
+about memory, so we got lucky there.
+
+[1] https://github.com/devicetree-org/devicetree-specification/blob/main/source/chapter3-devicenodes.rst#memory-node (after the table)
+[2] https://source.denx.de/u-boot/u-boot/-/blob/master/lib/fdtdec.c#L1061-1063
+[3] https://github.com/tianocore/edk2/blob/master/ArmVirtPkg/PrePi/FdtParser.c
+
+Reported-by: Ross Burton <ross.burton@arm.com>
+Signed-off-by: Andre Przywara <andre.przywara@arm.com>
+
+Upstream-Status: Submitted [https://lore.kernel.org/linux-arm-kernel/20220517101410.3493781-1-andre.przywara@arm.com/T/#u]
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+
+---
+ drivers/of/fdt.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
+index 59a7a9ee58ef..5439c899fe04 100644
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -1102,6 +1102,9 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
+ 	if (type == NULL || strcmp(type, "memory") != 0)
+ 		return 0;
+ 
++	if (!of_fdt_device_is_available(initial_boot_params, node))
++		return 0;
++
+ 	reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
+ 	if (reg == NULL)
+ 		reg = of_get_flat_dt_prop(node, "reg", &l);
+-- 
+2.25.1
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/arm-ffa-transport.cfg b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/arm-ffa-transport.cfg
new file mode 100644
index 0000000..34de78e
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/arm-ffa-transport.cfg
@@ -0,0 +1 @@
+CONFIG_ARM_FFA_TRANSPORT=y
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/generic-arm64-kmeta/generic-arm64-standard.scc b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/generic-arm64-kmeta/generic-arm64-standard.scc
index 21bff02..7036476 100644
--- a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/generic-arm64-kmeta/generic-arm64-standard.scc
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/generic-arm64-kmeta/generic-arm64-standard.scc
@@ -3,3 +3,4 @@
 define KARCH arm64
 
 include ktypes/standard/standard.scc
+include features/bluetooth/bluetooth.scc
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/no-strict-devmem.cfg b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/no-strict-devmem.cfg
new file mode 100644
index 0000000..d372aca
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/no-strict-devmem.cfg
@@ -0,0 +1 @@
+CONFIG_STRICT_DEVMEM=n
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/skip-unavailable-memory.patch b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/skip-unavailable-memory.patch
deleted file mode 100644
index c5dac6a..0000000
--- a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/skip-unavailable-memory.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-Backported to 5.15.
-
-Upstream-Status: Submitted [https://lore.kernel.org/linux-arm-kernel/20220517101410.3493781-1-andre.przywara@arm.com/T/#u]
-Signed-off-by: Ross Burton <ross.burton@arm.com>
-
-From 7bfeda1c9224270af97adf799ce0b5a4292bceb6 Mon Sep 17 00:00:00 2001
-From: Andre Przywara <andre.przywara@arm.com>
-Date: Tue, 17 May 2022 11:14:10 +0100
-Subject: [PATCH] of/fdt: Ignore disabled memory nodes
-
-When we boot a machine using a devicetree, the generic DT code goes
-through all nodes with a 'device_type = "memory"' property, and collects
-all memory banks mentioned there. However it does not check for the
-status property, so any nodes which are explicitly "disabled" will still
-be added as a memblock.
-This ends up badly for QEMU, when booting with secure firmware on
-arm/arm64 machines, because QEMU adds a node describing secure-only
-memory:
-===================
-	secram@e000000 {
-		secure-status = "okay";
-		status = "disabled";
-		reg = <0x00 0xe000000 0x00 0x1000000>;
-		device_type = "memory";
-	};
-===================
-
-The kernel will eventually use that memory block (which is located below
-the main DRAM bank), but accesses to that will be answered with an
-SError:
-===================
-[    0.000000] Internal error: synchronous external abort: 96000050 [#1] PREEMPT SMP
-[    0.000000] Modules linked in:
-[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.18.0-rc6-00014-g10c8acb8b679 #524
-[    0.000000] Hardware name: linux,dummy-virt (DT)
-[    0.000000] pstate: 200000c5 (nzCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
-[    0.000000] pc : new_slab+0x190/0x340
-[    0.000000] lr : new_slab+0x184/0x340
-[    0.000000] sp : ffff80000a4b3d10
-....
-==================
-The actual crash location and call stack will be somewhat random, and
-depend on the specific allocation of that physical memory range.
-
-As the DT spec[1] explicitly mentions standard properties, add a simple
-check to skip over disabled memory nodes, so that we only use memory
-that is meant for non-secure code to use.
-
-That fixes booting a QEMU arm64 VM with EL3 enabled ("secure=on"), when
-not using UEFI. In this case the QEMU generated DT will be handed on
-to the kernel, which will see the secram node.
-This issue is reproducible when using TF-A together with U-Boot as
-firmware, then booting with the "booti" command.
-
-When using U-Boot as an UEFI provider, the code there [2] explicitly
-filters for disabled nodes when generating the UEFI memory map, so we
-are safe.
-EDK/2 only reads the first bank of the first DT memory node [3] to learn
-about memory, so we got lucky there.
-
-[1] https://github.com/devicetree-org/devicetree-specification/blob/main/source/chapter3-devicenodes.rst#memory-node (after the table)
-[2] https://source.denx.de/u-boot/u-boot/-/blob/master/lib/fdtdec.c#L1061-1063
-[3] https://github.com/tianocore/edk2/blob/master/ArmVirtPkg/PrePi/FdtParser.c
-
-Reported-by: Ross Burton <ross.burton@arm.com>
-Signed-off-by: Andre Przywara <andre.przywara@arm.com>
----
- drivers/of/fdt.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
-index 59a7a9ee58ef..5439c899fe04 100644
---- a/drivers/of/fdt.c
-+++ b/drivers/of/fdt.c
-@@ -1102,6 +1102,9 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
- 	if (type == NULL || strcmp(type, "memory") != 0)
- 		return 0;
- 
-+	if (!of_fdt_device_is_available(initial_boot_params, node))
-+		return 0;
-+
- 	reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
- 	if (reg == NULL)
- 		reg = of_get_flat_dt_prop(node, "reg", &l);
--- 
-2.25.1
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/tee.cfg b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/tee.cfg
index 9a25cd5..53c452d 100644
--- a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/tee.cfg
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto/tee.cfg
@@ -5,7 +5,6 @@
 # TEE drivers
 #
 CONFIG_OPTEE=y
-CONFIG_OPTEE_SHM_NUM_PRIV_PAGES=1
 # end of TEE drivers
 
 CONFIG_TCG_TPM=y
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_%.bbappend b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_%.bbappend
index 1d01daa..896add8 100644
--- a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_%.bbappend
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_%.bbappend
@@ -8,10 +8,14 @@
 
 FILESEXTRAPATHS:prepend:qemuarm64-secureboot = "${ARMFILESPATHS}"
 SRC_URI:append:qemuarm64-secureboot = " \
-    file://skip-unavailable-memory.patch \
     file://tee.cfg \
     "
 
+# for Trusted Services uefi-test tool if SMM-Gateway is included
+SRC_URI:append:qemuarm64-secureboot = "\
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-smm-gateway', 'file://no-strict-devmem.cfg', '' , d)} \
+    "
+
 FILESEXTRAPATHS:prepend:qemuarm-secureboot = "${ARMFILESPATHS}"
 SRC_URI:append:qemuarm-secureboot = " \
     file://tee.cfg \
@@ -22,3 +26,6 @@
 
 FILESEXTRAPATHS:prepend:qemuarm = "${ARMFILESPATHS}"
 SRC_URI:append:qemuarm = " file://efi.cfg"
+
+FFA_TRANSPORT_INCLUDE = "${@bb.utils.contains('MACHINE_FEATURES', 'arm-ffa', 'arm-ffa-transport.inc', '' , d)}"
+require ${FFA_TRANSPORT_INCLUDE}
diff --git a/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_5.15%.bbappend b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_5.15%.bbappend
new file mode 100644
index 0000000..9a18dd8
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-kernel/linux/linux-yocto_5.15%.bbappend
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}-5.15:"
+
+SRC_URI:append:qemuarm64-secureboot = " \
+    file://skip-unavailable-memory.patch \
+    "
+
+FFA_TEE_INCLUDE = "${@bb.utils.contains('MACHINE_FEATURES', 'arm-ffa', 'arm-ffa-5.15.inc', '' , d)}"
+require ${FFA_TEE_INCLUDE}
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-client_3.17.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-client_3.17.0.bb
deleted file mode 100644
index 5de16e7..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-client_3.17.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require optee-client.inc
-
-SRCREV = "9a337049c52495e5e16b4a94decaa3e58fce793e"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-client_3.18.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-client_3.18.0.bb
new file mode 100644
index 0000000..0c831db
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-client_3.18.0.bb
@@ -0,0 +1,3 @@
+require optee-client.inc
+
+SRCREV = "e7cba71cc6e2ecd02f412c7e9ee104f0a5dffc6f"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-examples.inc b/meta-arm/meta-arm/recipes-security/optee/optee-examples.inc
index e6feb99..5011f48 100644
--- a/meta-arm/meta-arm/recipes-security/optee/optee-examples.inc
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-examples.inc
@@ -12,7 +12,7 @@
 require optee.inc
 
 SRC_URI = "git://github.com/linaro-swg/optee_examples.git;branch=master;protocol=https \
-           file://0001-Makefile-Fix-non-portable-sh-check-for-plugins.patch"
+           "
 
 EXTRA_OEMAKE += "TA_DEV_KIT_DIR=${TA_DEV_KIT_DIR} \
                  HOST_CROSS_COMPILE=${HOST_PREFIX} \
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-examples/0001-Makefile-Fix-non-portable-sh-check-for-plugins.patch b/meta-arm/meta-arm/recipes-security/optee/optee-examples/0001-Makefile-Fix-non-portable-sh-check-for-plugins.patch
deleted file mode 100644
index 70add62..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-examples/0001-Makefile-Fix-non-portable-sh-check-for-plugins.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 11610debf750f15c7a104db7315dcd7d69e282a8 Mon Sep 17 00:00:00 2001
-From: Alejandro Enedino Hernandez Samaniego <alhe@linux.microsoft.com>
-Date: Sat, 26 Feb 2022 01:52:26 +0000
-Subject: [PATCH] Makefile: Fix non-portable sh check for plugins
-
-Upstream-Status: Pending
-
-We previously held a patch that used "=" for comparison, but when
-that patch got upstreamed it was changed to "==" which is non-portable,
-resulting in an error:
-
-/bin/sh: 6: [: acipher: unexpected operator
-/bin/sh: 6: [: plugins: unexpected operator
-/bin/sh: 6: [: hello_world: unexpected operator
-/bin/sh: 6: [: hotp: unexpected operator
-/bin/sh: 6: [: aes: unexpected operator
-/bin/sh: 6: [: random: unexpected operator
-/bin/sh: 6: [: secure_storage: unexpected operator
-
-if /bin/sh doesnt point to bash.
-
-Which in turn causes our do_install task to fail since plugins arent
-where we expect them to be.
-
-
-Signed-off-by: Alejandro Enedino Hernandez Samaniego <alhe@linux.microsoft.com>
----
- Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/Makefile b/Makefile
-index b3f16aa..9359d95 100644
---- a/Makefile
-+++ b/Makefile
-@@ -31,7 +31,7 @@ prepare-for-rootfs: examples
- 			cp -p $$example/host/optee_example_$$example $(OUTPUT_DIR)/ca/; \
- 		fi; \
- 		cp -pr $$example/ta/*.ta $(OUTPUT_DIR)/ta/; \
--		if [ $$example == plugins ]; then \
-+		if [ $$example = plugins ]; then \
- 			cp -p plugins/syslog/*.plugin $(OUTPUT_DIR)/plugins/; \
- 		fi; \
- 	done
--- 
-2.25.1
-
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.17.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.17.0.bb
deleted file mode 100644
index b5f6269..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.17.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require optee-examples.inc
-
-SRCREV = "65fc74309e12189ad5b6ce3ffec37c8011088a5a"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.18.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.18.0.bb
new file mode 100644
index 0000000..8118fee
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-examples_3.18.0.bb
@@ -0,0 +1,3 @@
+require optee-examples.inc
+
+SRCREV = "f301ee9df2129c0db683e726c91dc2cefe4cdb65"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.17.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.17.0.bb
deleted file mode 100644
index 5ff373a..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.17.0.bb
+++ /dev/null
@@ -1,25 +0,0 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/optee-os:"
-require optee-os_3.17.0.bb
-
-SUMMARY = "OP-TEE Trusted OS TA devkit"
-DESCRIPTION = "OP-TEE TA devkit for build TAs"
-HOMEPAGE = "https://www.op-tee.org/"
-
-DEPENDS += "python3-pycryptodome-native"
-
-do_install() {
-    #install TA devkit
-    install -d ${D}${includedir}/optee/export-user_ta/
-    for f in ${B}/export-ta_${OPTEE_ARCH}/* ; do
-        cp -aR $f ${D}${includedir}/optee/export-user_ta/
-    done
-}
-
-do_deploy() {
-	echo "Do not inherit do_deploy from optee-os."
-}
-
-FILES:${PN} = "${includedir}/optee/"
-
-# Build paths are currently embedded
-INSANE_SKIP:${PN}-dev += "buildpaths"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.18.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.18.0.bb
new file mode 100644
index 0000000..0982df3
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os-tadevkit_3.18.0.bb
@@ -0,0 +1,25 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/optee-os:"
+require optee-os_3.18.0.bb
+
+SUMMARY = "OP-TEE Trusted OS TA devkit"
+DESCRIPTION = "OP-TEE TA devkit for build TAs"
+HOMEPAGE = "https://www.op-tee.org/"
+
+DEPENDS += "python3-pycryptodome-native"
+
+do_install() {
+    #install TA devkit
+    install -d ${D}${includedir}/optee/export-user_ta/
+    for f in ${B}/export-ta_${OPTEE_ARCH}/* ; do
+        cp -aR $f ${D}${includedir}/optee/export-user_ta/
+    done
+}
+
+do_deploy() {
+	echo "Do not inherit do_deploy from optee-os."
+}
+
+FILES:${PN} = "${includedir}/optee/"
+
+# Build paths are currently embedded
+INSANE_SKIP:${PN}-dev += "buildpaths"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os-ts.inc b/meta-arm/meta-arm/recipes-security/optee/optee-os-ts.inc
new file mode 100644
index 0000000..10a4175
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os-ts.inc
@@ -0,0 +1,54 @@
+# Include Trusted Services SPs accordingly to defined machine features
+
+# Please notice that OPTEE will load SPs in the order listed in this file.
+# If an SP requires another SP to be already loaded it must be listed lower.
+
+# TS SPs UUIDs definitions
+require recipes-security/trusted-services/ts-uuid.inc
+
+TS_ENV = "opteesp"
+TS_BIN = "${RECIPE_SYSROOT}/usr/${TS_ENV}/bin"
+
+# ITS SP
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-its', \
+                                        ' ts-sp-its', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-its', \
+                                        ' ${TS_BIN}/${ITS_UUID}.stripped.elf', '', d)}"
+
+# Storage SP
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-storage', \
+                                        ' ts-sp-storage', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-storage', \
+                                        ' ${TS_BIN}/${STORAGE_UUID}.stripped.elf', '', d)}"
+
+# Crypto SP.
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-crypto', \
+                                        ' ts-sp-crypto', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-crypto', \
+                                        ' ${TS_BIN}/${CRYPTO_UUID}.stripped.elf', '', d)}"
+
+# Attestation SP
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-attestation', \
+                                        ' ts-sp-attestation', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-attestation', \
+                                        ' ${TS_BIN}/${ATTESTATION_UUID}.stripped.elf', '', d)}"
+
+# Env-test SP
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-env-test', \
+                                        ' ts-sp-env-test', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-env-test', \
+                                        ' ${TS_BIN}/${ENV_TEST_UUID}.stripped.elf', '', d)}"
+
+# SE-Proxy SP
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-se-proxy', \
+                                        ' ts-sp-se-proxy', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-se-proxy', \
+                                        ' ${TS_BIN}/${SE_PROXY_UUID}.stripped.elf', '', d)}"
+
+# SMM Gateway
+DEPENDS:append  = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-smm-gateway', \
+                                        ' ts-sp-smm-gateway', '' , d)}"
+SP_PATHS:append = "${@bb.utils.contains('MACHINE_FEATURES', 'ts-smm-gateway', \
+                                        ' ${TS_BIN}/${SMM_GATEWAY_UUID}.stripped.elf', '', d)}"
+
+EXTRA_OEMAKE:append = "${@oe.utils.conditional('SP_PATHS', '', '', ' CFG_SECURE_PARTITION=y SP_PATHS=\'${SP_PATHS}\' ', d)}"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os.inc b/meta-arm/meta-arm/recipes-security/optee/optee-os.inc
index 11193dc..a03ea6a 100644
--- a/meta-arm/meta-arm/recipes-security/optee/optee-os.inc
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os.inc
@@ -19,6 +19,7 @@
 SRC_URI:append = " \
     file://0006-allow-setting-sysroot-for-libgcc-lookup.patch \
     file://0007-allow-setting-sysroot-for-clang.patch \
+    file://0008-no-warn-rwx-segments.patch \
    "
 
 S = "${WORKDIR}/git"
@@ -33,6 +34,8 @@
     ta-targets=ta_${OPTEE_ARCH} \
     O=${B} \
 "
+EXTRA_OEMAKE += " HOST_PREFIX=${HOST_PREFIX}"
+EXTRA_OEMAKE += " CROSS_COMPILE64=${HOST_PREFIX}"
 
 CFLAGS[unexport] = "1"
 LDFLAGS[unexport] = "1"
@@ -40,7 +43,9 @@
 AS[unexport] = "1"
 LD[unexport] = "1"
 
-do_configure[noexec] = "1"
+do_compile:prepend() {
+	PLAT_LIBGCC_PATH=$(${CC} -print-libgcc-file-name)
+}
 
 do_compile() {
     oe_runmake -C ${S} all
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/0001-core-Define-section-attributes-for-clang.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/0001-core-Define-section-attributes-for-clang.patch
new file mode 100644
index 0000000..db88e7f
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/0001-core-Define-section-attributes-for-clang.patch
@@ -0,0 +1,188 @@
+From f189457b79989543f65b8a4e8729eff2cdf9a758 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 13 Aug 2022 19:24:55 -0700
+Subject: [PATCH] core: Define section attributes for clang
+
+Clang's attribute section is not same as gcc, here we need to add flags
+to sections so they can be eventually collected by linker into final
+output segments. Only way to do so with clang is to use
+
+pragma clang section ...
+
+The behavious is described here [1], this allows us to define names bss
+sections. This was not an issue until clang-15 where LLD linker starts
+to detect the section flags before merging them and throws the following
+errors
+
+| ld.lld: error: section type mismatch for .nozi.kdata_page
+| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/kernel/thread.o:(.nozi.kdata_page): SHT_PROGBITS
+| >>> output section .nozi: SHT_NOBITS
+|
+| ld.lld: error: section type mismatch for .nozi.mmu.l2
+| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/mm/core_mmu_lpae.o:(.nozi.mmu.l2): SHT_PROGBITS
+| >>> output section .nozi: SHT_NOBITS
+
+These sections should be carrying SHT_NOBITS but so far it was not
+possible to do so, this patch tries to use clangs pragma to get this
+going and match the functionality with gcc.
+
+[1] https://intel.github.io/llvm-docs/clang/LanguageExtensions.html#specifying-section-names-for-global-objects-pragma-clang-section
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ core/arch/arm/kernel/thread.c    | 19 +++++++++++++++--
+ core/arch/arm/mm/core_mmu_lpae.c | 35 ++++++++++++++++++++++++++++----
+ core/arch/arm/mm/pgt_cache.c     | 12 ++++++++++-
+ core/kernel/thread.c             | 13 +++++++++++-
+ 4 files changed, 71 insertions(+), 8 deletions(-)
+
+diff --git a/core/arch/arm/kernel/thread.c b/core/arch/arm/kernel/thread.c
+index f083b159e..432983c86 100644
+--- a/core/arch/arm/kernel/thread.c
++++ b/core/arch/arm/kernel/thread.c
+@@ -44,15 +44,30 @@ static size_t thread_user_kcode_size __nex_bss;
+ #if defined(CFG_CORE_UNMAP_CORE_AT_EL0) && \
+ 	defined(CFG_CORE_WORKAROUND_SPECTRE_BP_SEC) && defined(ARM64)
+ long thread_user_kdata_sp_offset __nex_bss;
++#ifdef __clang__
++#ifndef CFG_VIRTUALIZATION
++#pragma clang section bss=".nozi.kdata_page"
++#else
++#pragma clang section bss=".nex_nozi.kdata_page"
++#endif
++#endif
+ static uint8_t thread_user_kdata_page[
+ 	ROUNDUP(sizeof(struct thread_core_local) * CFG_TEE_CORE_NB_CORE,
+ 		SMALL_PAGE_SIZE)]
+ 	__aligned(SMALL_PAGE_SIZE)
++#ifndef __clang__
+ #ifndef CFG_VIRTUALIZATION
+-	__section(".nozi.kdata_page");
++	__section(".nozi.kdata_page")
+ #else
+-	__section(".nex_nozi.kdata_page");
++	__section(".nex_nozi.kdata_page")
+ #endif
++#endif
++    ;
++#endif
++
++/* reset BSS section to default ( .bss ) */
++#ifdef __clang__
++#pragma clang section bss=""
+ #endif
+ 
+ #ifdef ARM32
+diff --git a/core/arch/arm/mm/core_mmu_lpae.c b/core/arch/arm/mm/core_mmu_lpae.c
+index 19cd7b61b..78f5910c5 100644
+--- a/core/arch/arm/mm/core_mmu_lpae.c
++++ b/core/arch/arm/mm/core_mmu_lpae.c
+@@ -230,19 +230,46 @@ typedef uint16_t l1_idx_t;
+ typedef uint64_t base_xlat_tbls_t[CFG_TEE_CORE_NB_CORE][NUM_BASE_LEVEL_ENTRIES];
+ typedef uint64_t xlat_tbl_t[XLAT_TABLE_ENTRIES];
+ 
++#ifdef __clang__
++#pragma clang section bss=".nozi.mmu.base_table"
++#endif
+ static base_xlat_tbls_t base_xlation_table[NUM_BASE_TABLES]
+ 	__aligned(NUM_BASE_LEVEL_ENTRIES * XLAT_ENTRY_SIZE)
+-	__section(".nozi.mmu.base_table");
++#ifndef __clang__
++	__section(".nozi.mmu.base_table")
++#endif
++;
++#ifdef __clang__
++#pragma clang section bss=""
++#endif
+ 
++#ifdef __clang__
++#pragma clang section bss=".nozi.mmu.l2"
++#endif
+ static xlat_tbl_t xlat_tables[MAX_XLAT_TABLES]
+-	__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");
++	__aligned(XLAT_TABLE_SIZE)
++#ifndef __clang__
++	__section(".nozi.mmu.l2")
++#endif
++;
++#ifdef __clang__
++#pragma clang section bss=""
++#endif
+ 
+ #define XLAT_TABLES_SIZE	(sizeof(xlat_tbl_t) * MAX_XLAT_TABLES)
+ 
++#ifdef __clang__
++#pragma clang section bss=".nozi.mmu.l2"
++#endif
+ /* MMU L2 table for TAs, one for each thread */
+ static xlat_tbl_t xlat_tables_ul1[CFG_NUM_THREADS]
+-	__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");
+-
++#ifndef __clang__
++	__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2")
++#endif
++;
++#ifdef __clang__
++#pragma clang section bss=""
++#endif
+ /*
+  * TAs page table entry inside a level 1 page table.
+  *
+diff --git a/core/arch/arm/mm/pgt_cache.c b/core/arch/arm/mm/pgt_cache.c
+index d658b3e68..6c36706c0 100644
+--- a/core/arch/arm/mm/pgt_cache.c
++++ b/core/arch/arm/mm/pgt_cache.c
+@@ -104,8 +104,18 @@ void pgt_init(void)
+ 	 * has a large alignment, while .bss has a small alignment. The current
+ 	 * link script is optimized for small alignment in .bss
+ 	 */
++#ifdef __clang__
++#pragma clang section bss=".nozi.mmu.l2"
++#endif
+ 	static uint8_t pgt_tables[PGT_CACHE_SIZE][PGT_SIZE]
+-			__aligned(PGT_SIZE) __section(".nozi.pgt_cache");
++			__aligned(PGT_SIZE)
++#ifndef __clang__
++			__section(".nozi.pgt_cache")
++#endif
++			;
++#ifdef __clang__
++#pragma clang section bss=""
++#endif
+ 	size_t n;
+ 
+ 	for (n = 0; n < ARRAY_SIZE(pgt_tables); n++) {
+diff --git a/core/kernel/thread.c b/core/kernel/thread.c
+index 18d34e6ad..086129e28 100644
+--- a/core/kernel/thread.c
++++ b/core/kernel/thread.c
+@@ -37,13 +37,24 @@ struct thread_core_local thread_core_local[CFG_TEE_CORE_NB_CORE] __nex_bss;
+ 	name[stack_num][sizeof(name[stack_num]) / sizeof(uint32_t) - 1]
+ #endif
+ 
++#define DO_PRAGMA(x) _Pragma (#x)
++
++#ifdef __clang__
++#define DECLARE_STACK(name, num_stacks, stack_size, linkage) \
++DO_PRAGMA (clang section bss=".nozi_stack." #name) \
++linkage uint32_t name[num_stacks] \
++		[ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \
++			 STACK_ALIGNMENT) / sizeof(uint32_t)] \
++		__attribute__((aligned(STACK_ALIGNMENT))); \
++DO_PRAGMA(clang section bss="")
++#else
+ #define DECLARE_STACK(name, num_stacks, stack_size, linkage) \
+ linkage uint32_t name[num_stacks] \
+ 		[ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \
+ 			 STACK_ALIGNMENT) / sizeof(uint32_t)] \
+ 		__attribute__((section(".nozi_stack." # name), \
+ 			       aligned(STACK_ALIGNMENT)))
+-
++#endif
+ #define GET_STACK(stack) ((vaddr_t)(stack) + STACK_SIZE(stack))
+ 
+ DECLARE_STACK(stack_tmp, CFG_TEE_CORE_NB_CORE,
+-- 
+2.37.2
+
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/0008-no-warn-rwx-segments.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/0008-no-warn-rwx-segments.patch
new file mode 100644
index 0000000..1dd70b3
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/0008-no-warn-rwx-segments.patch
@@ -0,0 +1,64 @@
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5474]
+
+From 0b8a917fa51a366806edc0f04b88cd23b24098c4 Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Fri, 5 Aug 2022 09:48:03 +0200
+Subject: [PATCH] core: link: add --no-warn-rwx-segments
+
+binutils ld.bfd generates one RWX LOAD segment by merging several sections
+with mixed R/W/X attributes (.text, .rodata, .data). After version 2.38 it
+also warns by default when that happens [1], which breaks the build due to
+--fatal-warnings. The RWX segment is not a problem for the TEE core, since
+that information is not used to set memory permissions. Therefore, silence
+the warning.
+
+Link: [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ba951afb99912da01a6e8434126b8fac7aa75107
+Link: https://sourceware.org/bugzilla/show_bug.cgi?id=29448
+Reported-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
+---
+ core/arch/arm/kernel/link.mk | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/core/arch/arm/kernel/link.mk b/core/arch/arm/kernel/link.mk
+index 7eed333a32..c39d43cbfc 100644
+--- a/core/arch/arm/kernel/link.mk
++++ b/core/arch/arm/kernel/link.mk
+@@ -31,6 +31,7 @@ link-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map
+ link-ldflags += --sort-section=alignment
+ link-ldflags += --fatal-warnings
+ link-ldflags += --gc-sections
++link-ldflags += $(call ld-option,--no-warn-rwx-segments)
+ 
+ link-ldadd  = $(LDADD)
+ link-ldadd += $(ldflags-external)
+@@ -55,6 +56,7 @@ link-script-cppflags := \
+ 		$(cppflagscore))
+ 
+ ldargs-all_objs := -T $(link-script-dummy) --no-check-sections \
++		   $(call ld-option,--no-warn-rwx-segments) \
+ 		   $(link-objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/all_objs.o
+ $(link-out-dir)/all_objs.o: $(objs) $(libdeps) $(MAKEFILE_LIST)
+@@ -67,7 +69,8 @@ $(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o
+ 	$(q)$(NMcore) $< | \
+ 		$(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@
+ 
+-unpaged-ldargs = -T $(link-script-dummy) --no-check-sections --gc-sections
++unpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
++		 $(call ld-option,--no-warn-rwx-segments)
+ unpaged-ldadd := $(objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/unpaged.o
+ $(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt
+@@ -95,7 +98,8 @@ $(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o
+ 	$(q)$(NMcore) $< | \
+ 		$(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@
+ 
+-init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections
++init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
++	       $(call ld-option,--no-warn-rwx-segments)
+ init-ldadd := $(link-objs-init) $(link-out-dir)/version.o  $(link-ldadd) \
+ 	      $(libgcccore)
+ cleanfiles += $(link-out-dir)/init.o
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0009-add-z-execstack.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0009-add-z-execstack.patch
new file mode 100644
index 0000000..616a0ff
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0009-add-z-execstack.patch
@@ -0,0 +1,95 @@
+From cb4349edce6ce360436f10da8b6aa32e68fb778d Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Tue, 23 Aug 2022 11:41:00 +0000
+Subject: [PATCH] core, ldelf: link: add -z execstack
+
+When building for arm32 with GNU binutils 2.39, the linker outputs
+warnings when generating some TEE core binaries (all_obj.o, init.o,
+unpaged.o and tee.elf) as well as ldelf.elf:
+
+ arm-poky-linux-gnueabi-ld.bfd: warning: atomic_a32.o: missing .note.GNU-stack section implies executable stack
+ arm-poky-linux-gnueabi-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
+
+The permissions used when mapping the TEE core stacks do not depend on
+any metadata found in the ELF file. Similarly when the TEE core loads
+ldelf it already creates a non-executable stack regardless of ELF
+information. Therefore we can safely ignore the warnings. This is done
+by adding the '-z execstack' option.
+
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499]
+
+---
+ core/arch/arm/kernel/link.mk | 13 +++++++++----
+ ldelf/link.mk                |  4 ++++
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/core/arch/arm/kernel/link.mk b/core/arch/arm/kernel/link.mk
+index 3dc459d6..85cde58e 100644
+--- a/core/arch/arm/kernel/link.mk
++++ b/core/arch/arm/kernel/link.mk
+@@ -9,6 +9,11 @@ link-script-dep = $(link-out-dir)/.kern.ld.d
+ 
+ AWK	 = awk
+ 
++link-ldflags-common += $(call ld-option,--no-warn-rwx-segments)
++ifeq ($(CFG_ARM32_core),y)
++link-ldflags-common += $(call ld-option,--no-warn-execstack)
++endif
++
+ link-ldflags  = $(LDFLAGS)
+ ifeq ($(CFG_CORE_ASLR),y)
+ link-ldflags += -pie -Bsymbolic -z notext -z norelro $(ldflag-apply-dynamic-relocs)
+@@ -17,7 +22,7 @@ link-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map
+ link-ldflags += --sort-section=alignment
+ link-ldflags += --fatal-warnings
+ link-ldflags += --gc-sections
+-link-ldflags += $(call ld-option,--no-warn-rwx-segments)
++link-ldflags += $(link-ldflags-common)
+ 
+ link-ldadd  = $(LDADD)
+ link-ldadd += $(ldflags-external)
+@@ -39,7 +44,7 @@ link-script-cppflags := \
+ 		$(cppflagscore))
+ 
+ ldargs-all_objs := -T $(link-script-dummy) --no-check-sections \
+-		   $(call ld-option,--no-warn-rwx-segments) \
++		   $(link-ldflags-common) \
+ 		   $(link-objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/all_objs.o
+ $(link-out-dir)/all_objs.o: $(objs) $(libdeps) $(MAKEFILE_LIST)
+@@ -53,7 +58,7 @@ $(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o
+ 		$(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@
+ 
+ unpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
+-		 $(call ld-option,--no-warn-rwx-segments)
++		 $(link-ldflags-common)
+ unpaged-ldadd := $(objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/unpaged.o
+ $(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt
+@@ -82,7 +87,7 @@ $(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o
+ 		$(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@
+ 
+ init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
+-	       $(call ld-option,--no-warn-rwx-segments)
++	       $(link-ldflags-common)
+ init-ldadd := $(link-objs-init) $(link-out-dir)/version.o  $(link-ldadd) \
+ 	      $(libgcccore)
+ cleanfiles += $(link-out-dir)/init.o
+diff --git a/ldelf/link.mk b/ldelf/link.mk
+index 8fafc879..d8a05ea6 100644
+--- a/ldelf/link.mk
++++ b/ldelf/link.mk
+@@ -19,6 +19,10 @@ link-ldflags += --sort-section=alignment
+ link-ldflags += -z max-page-size=4096 # OP-TEE always uses 4K alignment
+ link-ldflags += $(link-ldflags$(sm))
+ 
++ifeq ($(CFG_ARM32_$(sm)), y)
++link-ldflags += $(call ld-option,--no-warn-execstack)
++endif
++
+ link-ldadd  = $(addprefix -L,$(libdirs))
+ link-ldadd += --start-group $(addprefix -l,$(libnames)) --end-group
+ ldargs-ldelf.elf := $(link-ldflags) $(objs) $(link-ldadd) $(libgcc$(sm))
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0010-add-note-GNU-stack-section.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0010-add-note-GNU-stack-section.patch
new file mode 100644
index 0000000..c0330b9
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.14/0010-add-note-GNU-stack-section.patch
@@ -0,0 +1,128 @@
+From f99a0278ad5e26772b3dcf8c74b5bf986ecfbe1e Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Tue, 23 Aug 2022 12:31:46 +0000
+Subject: [PATCH] arm32: libutils, libutee, ta: add .note.GNU-stack section to
+
+ .S files
+
+When building for arm32 with GNU binutils 2.39, the linker outputs
+warnings when linking Trusted Applications:
+
+ arm-unknown-linux-uclibcgnueabihf-ld.bfd: warning: utee_syscalls_a32.o: missing .note.GNU-stack section implies executable stack
+ arm-unknown-linux-uclibcgnueabihf-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
+
+We could silence the warning by adding the '-z execstack' option to the
+TA link flags, like we did in the parent commit for the TEE core and
+ldelf. Indeed, ldelf always allocates a non-executable piece of memory
+for the TA to use as a stack.
+
+However it seems preferable to comply with the common ELF practices in
+this case. A better fix is therefore to add the missing .note.GNU-stack
+sections in the assembler files.
+
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499]
+
+---
+ lib/libutee/arch/arm/utee_syscalls_a32.S             | 2 ++
+ lib/libutils/ext/arch/arm/atomic_a32.S               | 2 ++
+ lib/libutils/ext/arch/arm/mcount_a32.S               | 2 ++
+ lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S  | 2 ++
+ lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S | 2 ++
+ lib/libutils/isoc/arch/arm/setjmp_a32.S              | 2 ++
+ ta/arch/arm/ta_entry_a32.S                           | 2 ++
+ 7 files changed, 14 insertions(+)
+
+diff --git a/lib/libutee/arch/arm/utee_syscalls_a32.S b/lib/libutee/arch/arm/utee_syscalls_a32.S
+index 6e621ca6..af405f62 100644
+--- a/lib/libutee/arch/arm/utee_syscalls_a32.S
++++ b/lib/libutee/arch/arm/utee_syscalls_a32.S
+@@ -7,6 +7,8 @@
+ #include <tee_syscall_numbers.h>
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+         .section .text
+         .balign 4
+         .code 32
+diff --git a/lib/libutils/ext/arch/arm/atomic_a32.S b/lib/libutils/ext/arch/arm/atomic_a32.S
+index eaef6914..2be73ffa 100644
+--- a/lib/libutils/ext/arch/arm/atomic_a32.S
++++ b/lib/libutils/ext/arch/arm/atomic_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /* uint32_t atomic_inc32(uint32_t *v); */
+ FUNC atomic_inc32 , :
+ 	ldrex	r1, [r0]
+diff --git a/lib/libutils/ext/arch/arm/mcount_a32.S b/lib/libutils/ext/arch/arm/mcount_a32.S
+index 51439a23..54dc3c02 100644
+--- a/lib/libutils/ext/arch/arm/mcount_a32.S
++++ b/lib/libutils/ext/arch/arm/mcount_a32.S
+@@ -7,6 +7,8 @@
+ 
+ #if defined(CFG_TA_GPROF_SUPPORT) || defined(CFG_FTRACE_SUPPORT)
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * Convert return address to call site address by subtracting the size of the
+  * mcount call instruction (blx __gnu_mcount_nc).
+diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
+index a600c879..37ae9ec6 100644
+--- a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
++++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * signed ret_idivmod_values(signed quot, signed rem);
+  * return quotient and remaining the EABI way (regs r0,r1)
+diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
+index 2dc50bc9..5c3353e2 100644
+--- a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
++++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * __value_in_regs lldiv_t __aeabi_ldivmod( long long n, long long d)
+  */
+diff --git a/lib/libutils/isoc/arch/arm/setjmp_a32.S b/lib/libutils/isoc/arch/arm/setjmp_a32.S
+index 43ea5937..f8a0b70d 100644
+--- a/lib/libutils/isoc/arch/arm/setjmp_a32.S
++++ b/lib/libutils/isoc/arch/arm/setjmp_a32.S
+@@ -51,6 +51,8 @@
+ #define SIZE(x)
+ #endif
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /* Arm/Thumb interworking support:
+ 
+    The interworking scheme expects functions to use a BX instruction
+diff --git a/ta/arch/arm/ta_entry_a32.S b/ta/arch/arm/ta_entry_a32.S
+index d2f8a69d..cd9a12f9 100644
+--- a/ta/arch/arm/ta_entry_a32.S
++++ b/ta/arch/arm/ta_entry_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * This function is the bottom of the user call stack. Mark it as such so that
+  * the unwinding code won't try to go further down.
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0009-add-z-execstack.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0009-add-z-execstack.patch
new file mode 100644
index 0000000..5463a34
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0009-add-z-execstack.patch
@@ -0,0 +1,90 @@
+From a9d099d17ef0af6deac4c3b4d15ad0555d258ec8 Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Tue, 23 Aug 2022 11:41:00 +0000
+Subject: [PATCH] core, ldelf: link: add -z execstack
+
+When building for arm32 with GNU binutils 2.39, the linker outputs
+warnings when generating some TEE core binaries (all_obj.o, init.o,
+unpaged.o and tee.elf) as well as ldelf.elf:
+
+ arm-poky-linux-gnueabi-ld.bfd: warning: atomic_a32.o: missing .note.GNU-stack section implies executable stack
+ arm-poky-linux-gnueabi-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
+
+The permissions used when mapping the TEE core stacks do not depend on
+any metadata found in the ELF file. Similarly when the TEE core loads
+ldelf it already creates a non-executable stack regardless of ELF
+information. Therefore we can safely ignore the warnings. This is done
+by adding the '-z execstack' option.
+
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499]
+
+---
+diff --git a/core/arch/arm/kernel/link.mk b/core/arch/arm/kernel/link.mk
+index c39d43cb..0e96e606 100644
+--- a/core/arch/arm/kernel/link.mk
++++ b/core/arch/arm/kernel/link.mk
+@@ -9,6 +9,11 @@ link-script-dep = $(link-out-dir)/.kern.ld.d
+ 
+ AWK	 = awk
+ 
++link-ldflags-common += $(call ld-option,--no-warn-rwx-segments)
++ifeq ($(CFG_ARM32_core),y)
++link-ldflags-common += $(call ld-option,--no-warn-execstack)
++endif
++
+ link-ldflags  = $(LDFLAGS)
+ ifeq ($(CFG_CORE_ASLR),y)
+ link-ldflags += -pie -Bsymbolic -z norelro $(ldflag-apply-dynamic-relocs)
+@@ -31,7 +36,7 @@ link-ldflags += -T $(link-script-pp) -Map=$(link-out-dir)/tee.map
+ link-ldflags += --sort-section=alignment
+ link-ldflags += --fatal-warnings
+ link-ldflags += --gc-sections
+-link-ldflags += $(call ld-option,--no-warn-rwx-segments)
++link-ldflags += $(link-ldflags-common)
+ 
+ link-ldadd  = $(LDADD)
+ link-ldadd += $(ldflags-external)
+@@ -56,7 +61,7 @@ link-script-cppflags := \
+ 		$(cppflagscore))
+ 
+ ldargs-all_objs := -T $(link-script-dummy) --no-check-sections \
+-		   $(call ld-option,--no-warn-rwx-segments) \
++		   $(link-ldflags-common) \
+ 		   $(link-objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/all_objs.o
+ $(link-out-dir)/all_objs.o: $(objs) $(libdeps) $(MAKEFILE_LIST)
+@@ -70,7 +75,7 @@ $(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o
+ 		$(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@
+ 
+ unpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
+-		 $(call ld-option,--no-warn-rwx-segments)
++		 $(link-ldflags-common)
+ unpaged-ldadd := $(objs) $(link-ldadd) $(libgcccore)
+ cleanfiles += $(link-out-dir)/unpaged.o
+ $(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt
+@@ -99,7 +104,7 @@ $(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o
+ 		$(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@
+ 
+ init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \
+-	       $(call ld-option,--no-warn-rwx-segments)
++	       $(link-ldflags-common)
+ init-ldadd := $(link-objs-init) $(link-out-dir)/version.o  $(link-ldadd) \
+ 	      $(libgcccore)
+ cleanfiles += $(link-out-dir)/init.o
+diff --git a/ldelf/link.mk b/ldelf/link.mk
+index 64c8212a..bd49551e 100644
+--- a/ldelf/link.mk
++++ b/ldelf/link.mk
+@@ -20,6 +20,9 @@ link-ldflags += -z max-page-size=4096 # OP-TEE always uses 4K alignment
+ ifeq ($(CFG_CORE_BTI),y)
+ link-ldflags += $(call ld-option,-z force-bti) --fatal-warnings
+ endif
++ifeq ($(CFG_ARM32_$(sm)), y)
++link-ldflags += $(call ld-option,--no-warn-execstack)
++endif
+ link-ldflags += $(link-ldflags$(sm))
+ 
+ link-ldadd  = $(addprefix -L,$(libdirs))
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0010-add-note-GNU-stack-section.patch b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0010-add-note-GNU-stack-section.patch
new file mode 100644
index 0000000..95d5e67
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os/3.18/0010-add-note-GNU-stack-section.patch
@@ -0,0 +1,128 @@
+From 38bf606653ee08b10db6bb298e369cb3a9cdcda9 Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Tue, 23 Aug 2022 12:31:46 +0000
+Subject: [PATCH] arm32: libutils, libutee, ta: add .note.GNU-stack section to
+
+ .S files
+
+When building for arm32 with GNU binutils 2.39, the linker outputs
+warnings when linking Trusted Applications:
+
+ arm-unknown-linux-uclibcgnueabihf-ld.bfd: warning: utee_syscalls_a32.o: missing .note.GNU-stack section implies executable stack
+ arm-unknown-linux-uclibcgnueabihf-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
+
+We could silence the warning by adding the '-z execstack' option to the
+TA link flags, like we did in the parent commit for the TEE core and
+ldelf. Indeed, ldelf always allocates a non-executable piece of memory
+for the TA to use as a stack.
+
+However it seems preferable to comply with the common ELF practices in
+this case. A better fix is therefore to add the missing .note.GNU-stack
+sections in the assembler files.
+
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499]
+
+---
+ lib/libutee/arch/arm/utee_syscalls_a32.S             | 2 ++
+ lib/libutils/ext/arch/arm/atomic_a32.S               | 2 ++
+ lib/libutils/ext/arch/arm/mcount_a32.S               | 2 ++
+ lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S  | 2 ++
+ lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S | 2 ++
+ lib/libutils/isoc/arch/arm/setjmp_a32.S              | 2 ++
+ ta/arch/arm/ta_entry_a32.S                           | 2 ++
+ 7 files changed, 14 insertions(+)
+
+diff --git a/lib/libutee/arch/arm/utee_syscalls_a32.S b/lib/libutee/arch/arm/utee_syscalls_a32.S
+index 6e621ca6..af405f62 100644
+--- a/lib/libutee/arch/arm/utee_syscalls_a32.S
++++ b/lib/libutee/arch/arm/utee_syscalls_a32.S
+@@ -7,6 +7,8 @@
+ #include <tee_syscall_numbers.h>
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+         .section .text
+         .balign 4
+         .code 32
+diff --git a/lib/libutils/ext/arch/arm/atomic_a32.S b/lib/libutils/ext/arch/arm/atomic_a32.S
+index eaef6914..2be73ffa 100644
+--- a/lib/libutils/ext/arch/arm/atomic_a32.S
++++ b/lib/libutils/ext/arch/arm/atomic_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /* uint32_t atomic_inc32(uint32_t *v); */
+ FUNC atomic_inc32 , :
+ 	ldrex	r1, [r0]
+diff --git a/lib/libutils/ext/arch/arm/mcount_a32.S b/lib/libutils/ext/arch/arm/mcount_a32.S
+index 51439a23..54dc3c02 100644
+--- a/lib/libutils/ext/arch/arm/mcount_a32.S
++++ b/lib/libutils/ext/arch/arm/mcount_a32.S
+@@ -7,6 +7,8 @@
+ 
+ #if defined(CFG_TA_GPROF_SUPPORT) || defined(CFG_FTRACE_SUPPORT)
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * Convert return address to call site address by subtracting the size of the
+  * mcount call instruction (blx __gnu_mcount_nc).
+diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
+index a600c879..37ae9ec6 100644
+--- a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
++++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * signed ret_idivmod_values(signed quot, signed rem);
+  * return quotient and remaining the EABI way (regs r0,r1)
+diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
+index 2dc50bc9..5c3353e2 100644
+--- a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
++++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * __value_in_regs lldiv_t __aeabi_ldivmod( long long n, long long d)
+  */
+diff --git a/lib/libutils/isoc/arch/arm/setjmp_a32.S b/lib/libutils/isoc/arch/arm/setjmp_a32.S
+index 43ea5937..f8a0b70d 100644
+--- a/lib/libutils/isoc/arch/arm/setjmp_a32.S
++++ b/lib/libutils/isoc/arch/arm/setjmp_a32.S
+@@ -51,6 +51,8 @@
+ #define SIZE(x)
+ #endif
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /* Arm/Thumb interworking support:
+ 
+    The interworking scheme expects functions to use a BX instruction
+diff --git a/ta/arch/arm/ta_entry_a32.S b/ta/arch/arm/ta_entry_a32.S
+index d2f8a69d..cd9a12f9 100644
+--- a/ta/arch/arm/ta_entry_a32.S
++++ b/ta/arch/arm/ta_entry_a32.S
+@@ -5,6 +5,8 @@
+ 
+ #include <asm.S>
+ 
++	.section .note.GNU-stack,"",%progbits
++
+ /*
+  * This function is the bottom of the user call stack. Mark it as such so that
+  * the unwinding code won't try to go further down.
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os_%.bbappend b/meta-arm/meta-arm/recipes-security/optee/optee-os_%.bbappend
new file mode 100644
index 0000000..09650b9
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os_%.bbappend
@@ -0,0 +1,5 @@
+# Include Trusted Services Secure Partitions
+require optee-os-ts.inc
+
+# Conditionally include platform specific Trusted Services related OPTEE build parameters
+EXTRA_OEMAKE:append:qemuarm64-secureboot = "${@oe.utils.conditional('SP_PATHS', '', '', ' CFG_CORE_HEAP_SIZE=131072 CFG_TEE_BENCHMARK=n CFG_TEE_CORE_LOG_LEVEL=4 CFG_CORE_SEL1_SPMC=y ', d)}"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.14.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-os_3.14.0.bb
index 83b89c4..6400ac2 100644
--- a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.14.0.bb
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os_3.14.0.bb
@@ -3,3 +3,8 @@
 SRCREV = "d21befa5e53eae9db469eba1685f5aa5c6f92c2f"
 
 DEPENDS = "python3-pycryptodome-native python3-pyelftools-native"
+
+SRC_URI:append = " \
+    file://3.14/0009-add-z-execstack.patch \
+    file://3.14/0010-add-note-GNU-stack-section.patch \
+   "
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.17.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-os_3.17.0.bb
deleted file mode 100644
index 3e5e0a6..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.17.0.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require optee-os.inc
-
-SRCREV = "f9e550142dd4b33ee1112f5dd64ffa94ba79cefa"
-
-DEPENDS += "dtc-native"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.18.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-os_3.18.0.bb
index 65d661f..f459efc 100644
--- a/meta-arm/meta-arm/recipes-security/optee/optee-os_3.18.0.bb
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-os_3.18.0.bb
@@ -3,3 +3,8 @@
 DEPENDS += "dtc-native"
 
 SRCREV = "1ee647035939e073a2e8dddb727c0f019cc035f1"
+SRC_URI:append = " \
+    file://0001-core-Define-section-attributes-for-clang.patch \
+    file://3.18/0009-add-z-execstack.patch \
+    file://3.18/0010-add-note-GNU-stack-section.patch \
+   "
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-test_3.17.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-test_3.17.0.bb
deleted file mode 100644
index 18870da..0000000
--- a/meta-arm/meta-arm/recipes-security/optee/optee-test_3.17.0.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-require optee-test.inc
-
-SRC_URI:append = " \
-    file://musl-workaround.patch \
-   "
-SRCREV = "44a31d02379bd8e50762caa5e1592ad81e3339af"
-
-EXTRA_OEMAKE:append:libc-musl = " OPTEE_OPENSSL_EXPORT=${STAGING_INCDIR}"
-DEPENDS:append:libc-musl = " openssl"
-CFLAGS:append:libc-musl = " -Wno-error=deprecated-declarations"
diff --git a/meta-arm/meta-arm/recipes-security/optee/optee-test_3.18.0.bb b/meta-arm/meta-arm/recipes-security/optee/optee-test_3.18.0.bb
new file mode 100644
index 0000000..0570687
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/optee/optee-test_3.18.0.bb
@@ -0,0 +1,10 @@
+require optee-test.inc
+
+SRC_URI:append = " \
+    file://musl-workaround.patch \
+   "
+SRCREV = "da5282a011b40621a2cf7a296c11a35c833ed91b"
+
+EXTRA_OEMAKE:append:libc-musl = " OPTEE_OPENSSL_EXPORT=${STAGING_INCDIR}"
+DEPENDS:append:libc-musl = " openssl"
+CFLAGS:append:libc-musl = " -Wno-error=deprecated-declarations"
diff --git a/meta-arm/meta-arm/recipes-security/packagegroups/packagegroup-ts-tests.bb b/meta-arm/meta-arm/recipes-security/packagegroups/packagegroup-ts-tests.bb
new file mode 100644
index 0000000..72ba33f
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/packagegroups/packagegroup-ts-tests.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Trusted Services test/demo linux tools"
+
+inherit packagegroup
+
+COMPATIBLE_HOST = "aarch64.*-linux"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+PACKAGES = "${PN} ${PN}-psa"
+
+RDEPENDS:${PN} = "\
+    ts-demo \
+    ts-service-test \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-env-test', 'ts-remote-test', '' , d)} \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-smm-gateway', 'ts-uefi-test', '' , d)} \
+"
+
+SUMMARY:${PN}-psa = "PSA certification tests (psa-arch-test) for TS SPs"
+RDEPENDS:${PN}-psa = "\
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-crypto', 'ts-psa-crypto-api-test', '' , d)} \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-its', 'ts-psa-its-api-test', '' , d)} \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-storage', 'ts-psa-ps-api-test', '' , d)} \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-attestation', 'ts-psa-iat-api-test', '' , d)} \
+    ${@bb.utils.contains('MACHINE_FEATURES', 'ts-se-proxy', \
+          'ts-psa-crypto-api-test ts-psa-its-api-test ts-psa-ps-api-test ts-psa-iat-api-test', '' , d)} \
+"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0004-correctly-find-headers-dir.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0004-correctly-find-headers-dir.patch
new file mode 100644
index 0000000..b73b5dc
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0004-correctly-find-headers-dir.patch
@@ -0,0 +1,30 @@
+From 1b9c8d4a7c9519c6085827da8be6546ce80ee711 Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:05:14 +0100
+Subject: [PATCH 1/4] Allow to find libgcc headers
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ external/newlib/newlib.cmake | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/external/newlib/newlib.cmake b/external/newlib/newlib.cmake
+index fff5e2a..13eb78c 100644
+--- a/external/newlib/newlib.cmake
++++ b/external/newlib/newlib.cmake
+@@ -82,7 +82,10 @@ message(STATUS "libgcc.a is used from ${LIBGCC_PATH}")
+ # Moreover the GCC specific header file include directory is also required.
+ # Specify LIBGCC_INCLUDE_DIRS in the command line to manually override the libgcc relative location below.
+ if(NOT DEFINED LIBGCC_INCLUDE_DIRS)
+-	get_filename_component(_TMP_VAR "${LIBGCC_PATH}" DIRECTORY)
++
++	# "libgcc.a" lib location in ${LIBGCC_PATH} might not contain a correct path to headers
++	# We can get the correct path if we ask for a location without a library name
++	gcc_get_lib_location(LIBRARY_NAME "" RES _TMP_VAR)
+ 	set(LIBGCC_INCLUDE_DIRS
+ 		"${_TMP_VAR}/include"
+ 		"${_TMP_VAR}/include-fixed" CACHE STRING "GCC specific include PATHs")
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0005-setting-sysroot-for-libgcc-lookup.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0005-setting-sysroot-for-libgcc-lookup.patch
new file mode 100644
index 0000000..b226bc4
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0005-setting-sysroot-for-libgcc-lookup.patch
@@ -0,0 +1,30 @@
+From 0fbf81d10e0f2aabb80105fabe4ffdf87e28e664 Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:06:07 +0100
+Subject: [PATCH 2/4] Allow setting sysroot for libgcc lookup
+
+Explicitly pass the new variable LIBGCC_LOCATE_CFLAGS variable when searching
+for the compiler libraries.
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ tools/cmake/compiler/GCC.cmake | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/cmake/compiler/GCC.cmake b/tools/cmake/compiler/GCC.cmake
+index 5a8fa59..d591c44 100644
+--- a/tools/cmake/compiler/GCC.cmake
++++ b/tools/cmake/compiler/GCC.cmake
+@@ -268,7 +268,7 @@ function(gcc_get_lib_location)
+ 	cmake_parse_arguments(MY "${options}" "${oneValueArgs}"
+ 						"${multiValueArgs}" ${ARGN} )
+ 	execute_process(
+-		COMMAND ${CMAKE_C_COMPILER} "--print-file-name=${MY_LIBRARY_NAME}"
++		COMMAND ${CMAKE_C_COMPILER} ${LIBGCC_LOCATE_CFLAGS} --print-file-name=${MY_LIBRARY_NAME}
+ 		OUTPUT_VARIABLE _RES
+ 		RESULT_VARIABLE _GCC_ERROR_CODE
+ 		OUTPUT_STRIP_TRAILING_WHITESPACE
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0006-applying-lowercase-project-convention.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0006-applying-lowercase-project-convention.patch
new file mode 100644
index 0000000..09f38c0
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0006-applying-lowercase-project-convention.patch
@@ -0,0 +1,32 @@
+From 37559c70443fe85e246f1f652045f0cd3c78012b Mon Sep 17 00:00:00 2001
+From: Vishnu Banavath <vishnu.banavath@arm.com>
+Date: Sat, 13 Nov 2021 07:47:44 +0000
+Subject: [PATCH] tools/cmake/common: applying lowercase project convention
+
+Lowercase convention should only apply on the paths inside TS
+source-code.
+Host build paths should not be lowercased. Otherwise, builds
+with uppercase paths will break.
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+diff --git a/tools/cmake/common/AddPlatform.cmake b/tools/cmake/common/AddPlatform.cmake
+index ae34c6e..31bcd8c 100644
+--- a/tools/cmake/common/AddPlatform.cmake
++++ b/tools/cmake/common/AddPlatform.cmake
+@@ -37,8 +37,8 @@ function(add_platform)
+ 	set(TGT ${MY_PARAMS_TARGET} CACHE STRING "")
+ 
+ 	# Ensure file path conforms to lowercase project convention
+-	string(TOLOWER "${TS_PLATFORM_ROOT}/${TS_PLATFORM}/platform.cmake" _platdef)
+-	include(${_platdef})
++	string(TOLOWER "${TS_PLATFORM}/platform.cmake" _platdef)
++	include(${TS_PLATFORM_ROOT}/${_platdef})
+ 	set(CMAKE_CONFIGURE_DEPENDS ${_platdef})
+ 
+ 	unset(TGT CACHE)
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0009-PSA-CRYPTO-API-INCLUDE.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0009-PSA-CRYPTO-API-INCLUDE.patch
new file mode 100644
index 0000000..9054f1c
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0009-PSA-CRYPTO-API-INCLUDE.patch
@@ -0,0 +1,39 @@
+From 7f254bf14a97d14d19e61e2b8f8359bc238f3f1b Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:07:51 +0100
+Subject: [PATCH 3/4] Always define PSA_CRYPTO_API_INCLUDE
+
+PSA_CRYPTO_API_INCLUDE is not defined when pre-built mbedtls was used.
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ external/MbedTLS/MbedTLS.cmake | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/external/MbedTLS/MbedTLS.cmake b/external/MbedTLS/MbedTLS.cmake
+index 3193a07..f15e25d 100644
+--- a/external/MbedTLS/MbedTLS.cmake
++++ b/external/MbedTLS/MbedTLS.cmake
+@@ -96,8 +96,6 @@ if (NOT MBEDCRYPTO_LIB_FILE)
+ 	#Configure Mbed TLS to build only mbedcrypto lib
+ 	execute_process(COMMAND ${Python3_EXECUTABLE} scripts/config.py crypto WORKING_DIRECTORY ${MBEDTLS_SOURCE_DIR})
+ 
+-	# Advertise Mbed TLS as the provider of the psa crypto API
+-	set(PSA_CRYPTO_API_INCLUDE "${MBEDTLS_INSTALL_DIR}/include" CACHE STRING "PSA Crypto API include path")
+ 
+ 	include(${TS_ROOT}/tools/cmake/common/PropertyCopy.cmake)
+ 
+@@ -157,6 +155,9 @@ if (NOT MBEDCRYPTO_LIB_FILE)
+ 	set(MBEDCRYPTO_LIB_FILE "${MBEDTLS_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}mbedcrypto${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ endif()
+ 
++# Advertise Mbed TLS as the provider of the psa crypto API
++set(PSA_CRYPTO_API_INCLUDE "${MBEDTLS_INSTALL_DIR}/include" CACHE STRING "PSA Crypto API include path")
++
+ #Create an imported target to have clean abstraction in the build-system.
+ add_library(mbedcrypto STATIC IMPORTED)
+ set_property(DIRECTORY ${CMAKE_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${MBEDCRYPTO_LIB_FILE})
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0010-change-libts-to-export-CMake-package.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0010-change-libts-to-export-CMake-package.patch
new file mode 100644
index 0000000..169ef59
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0010-change-libts-to-export-CMake-package.patch
@@ -0,0 +1,346 @@
+From 0ff5a6163bd2760bb6a61fd5a185a2b92da5e86b Mon Sep 17 00:00:00 2001
+From: Gyorgy Szing <Gyorgy.Szing@arm.com>
+Date: Wed, 20 Jul 2022 12:36:52 +0000
+Subject: [PATCH] Fix: change libts to export a CMake package
+
+libts install content was not compatible to find_module() which made
+using a pre-built libts binary from CMake less than ideal.
+
+This change adds the missing files and updates export and install
+commands to make libts generate a proper CMake package.
+
+From now on an external project will be able to use find_module() to
+integrate libts into its build.
+
+Signed-off-by: Gyorgy Szing <Gyorgy.Szing@arm.com>
+Change-Id: I9e86e02030f6fb3c86af45252110f939cb82670c
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+
+diff --git a/components/messaging/ffa/libsp/component.cmake b/components/messaging/ffa/libsp/component.cmake
+index a21c630..ec4cf6c 100644
+--- a/components/messaging/ffa/libsp/component.cmake
++++ b/components/messaging/ffa/libsp/component.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -21,7 +21,7 @@
+ 	"${CMAKE_CURRENT_LIST_DIR}/sp_rxtx.c"
+ 	)
+ 
+-set_property(TARGET ${TGT} PROPERTY PUBLIC_HEADER
++set_property(TARGET ${TGT} APPEND PROPERTY PUBLIC_HEADER
+ 	${CMAKE_CURRENT_LIST_DIR}/include/ffa_api.h
+ 	${CMAKE_CURRENT_LIST_DIR}/include/ffa_api_defines.h
+ 	${CMAKE_CURRENT_LIST_DIR}/include/ffa_api_types.h
+@@ -49,5 +49,5 @@
+ target_include_directories(${TGT}
+ 	 PUBLIC
+ 		"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
+-		"$<INSTALL_INTERFACE:include>"
++		"$<INSTALL_INTERFACE:${TS_ENV}/include">
+ 	)
+diff --git a/components/rpc/common/interface/component.cmake b/components/rpc/common/interface/component.cmake
+index d567602..e4b2477 100644
+--- a/components/rpc/common/interface/component.cmake
++++ b/components/rpc/common/interface/component.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -8,11 +8,12 @@
+ 	message(FATAL_ERROR "mandatory parameter TGT is not defined.")
+ endif()
+ 
+-set_property(TARGET ${TGT} PROPERTY RPC_CALLER_PUBLIC_HEADER_FILES
++set_property(TARGET ${TGT} APPEND PROPERTY PUBLIC_HEADER
+ 	"${CMAKE_CURRENT_LIST_DIR}/rpc_caller.h"
+ 	"${CMAKE_CURRENT_LIST_DIR}/rpc_status.h"
+ 	)
+ 
+ target_include_directories(${TGT} PUBLIC
+-	"${CMAKE_CURRENT_LIST_DIR}"
++	"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
++	"$<INSTALL_INTERFACE:${TS_ENV}/include>"
+ 	)
+diff --git a/components/service/locator/interface/component.cmake b/components/service/locator/interface/component.cmake
+index b5aefa3..84a4d75 100644
+--- a/components/service/locator/interface/component.cmake
++++ b/components/service/locator/interface/component.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -8,10 +8,11 @@
+ 	message(FATAL_ERROR "mandatory parameter TGT is not defined.")
+ endif()
+ 
+-set_property(TARGET ${TGT} PROPERTY SERVICE_LOCATOR_PUBLIC_HEADER_FILES
++set_property(TARGET ${TGT} APPEND PROPERTY PUBLIC_HEADER
+ 	"${CMAKE_CURRENT_LIST_DIR}/service_locator.h"
+ 	)
+ 
+ target_include_directories(${TGT} PUBLIC
+-	"${CMAKE_CURRENT_LIST_DIR}"
++	"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
++	"$<INSTALL_INTERFACE:${TS_ENV}/include>"
+ 	)
+diff --git a/deployments/libts/libts-import.cmake b/deployments/libts/libts-import.cmake
+index dcabc45..fcfc2ac 100644
+--- a/deployments/libts/libts-import.cmake
++++ b/deployments/libts/libts-import.cmake
+@@ -11,48 +11,18 @@
+ # CMake build file allows libts to be built and installed into the binary
+ # directory of the dependent.
+ #-------------------------------------------------------------------------------
+-
+-# Determine the number of processes to run while running parallel builds.
+-# Pass -DPROCESSOR_COUNT=<n> to cmake to override.
+-if(NOT DEFINED PROCESSOR_COUNT)
+-	include(ProcessorCount)
+-	ProcessorCount(PROCESSOR_COUNT)
+-	set(PROCESSOR_COUNT ${PROCESSOR_COUNT} CACHE STRING "Number of cores to use for parallel builds.")
++option(CFG_FORCE_PREBUILT_LIBTS Off)
++# Try to find a pre-build package.
++find_package(libts "1.0.0" QUIET)
++if(NOT libts_FOUND)
++	if (CFG_FORCE_PREBUILT_LIBTS)
++		string(CONCAT _msg "find_package() failed to find the \"libts\" package. Please set libts_DIR or"
++		                   " CMAKE_FIND_ROOT_PATH properly.\n"
++						   "If you wish to debug the search process pass -DCMAKE_FIND_DEBUG_MODE=ON to cmake.")
++		message(FATAL_ERROR ${_msg})
++	endif()
++	# If not successful, build libts as a sub-project.
++	add_subdirectory(${TS_ROOT}/deployments/libts/${TS_ENV} ${CMAKE_BINARY_DIR}/libts)
++else()
++	message(STATUS "Using prebuilt libts from ${libts_DIR}")
+ endif()
+-
+-set(LIBTS_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/libts_install" CACHE PATH "libts installation directory")
+-set(LIBTS_PACKAGE_PATH "${LIBTS_INSTALL_PATH}/lib/cmake" CACHE PATH "libts CMake package directory")
+-set(LIBTS_SOURCE_DIR "${TS_ROOT}/deployments/libts/${TS_ENV}" CACHE PATH "libts source directory")
+-set(LIBTS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/libts-build" CACHE PATH "libts binary directory")
+-
+-file(MAKE_DIRECTORY ${LIBTS_BINARY_DIR})
+-
+-#Configure the library
+-execute_process(COMMAND
+-	${CMAKE_COMMAND}
+-		-DCMAKE_INSTALL_PREFIX=${LIBTS_INSTALL_PATH}
+-		-GUnix\ Makefiles
+-		-S ${LIBTS_SOURCE_DIR}
+-		-B ${LIBTS_BINARY_DIR}
+-	RESULT_VARIABLE _exec_error
+-)
+-
+-if (_exec_error)
+-	message(FATAL_ERROR "Configuration step of libts failed with ${_exec_error}.")
+-endif()
+-
+-#Build the library
+-execute_process(COMMAND
+-	${CMAKE_COMMAND} --build ${LIBTS_BINARY_DIR} --parallel ${PROCESSOR_COUNT} --target install
+-	RESULT_VARIABLE _exec_error
+-)
+-
+-if (_exec_error)
+-	message(FATAL_ERROR "Build step of libts failed with ${_exec_error}.")
+-endif()
+-
+-# Import the built library
+-include(${LIBTS_INSTALL_PATH}/${TS_ENV}/lib/cmake/libts_targets.cmake)
+-add_library(libts SHARED IMPORTED)
+-set_property(TARGET libts PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${LIBTS_INSTALL_PATH}/${TS_ENV}/include")
+-set_property(TARGET libts PROPERTY IMPORTED_LOCATION "${LIBTS_INSTALL_PATH}/${TS_ENV}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}ts${CMAKE_SHARED_LIBRARY_SUFFIX}")
+diff --git a/deployments/libts/libts.cmake b/deployments/libts/libts.cmake
+index 6463ca1..7f278fd 100644
+--- a/deployments/libts/libts.cmake
++++ b/deployments/libts/libts.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -18,12 +18,11 @@
+ 					MAJOR _major MINOR _minor PATCH _patch)
+ set_target_properties(ts PROPERTIES VERSION "${_major}.${_minor}.${_patch}")
+ set_target_properties(ts PROPERTIES SOVERSION "${_major}")
+-unset(_major)
+-unset(_minor)
+-unset(_patch)
++
++add_library(libts::ts ALIAS ts)
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+@@ -53,19 +52,13 @@
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/tools/cmake/common/ExportLibrary.cmake REQUIRED)
+ 
+-# Select public header files to export
+-get_property(_rpc_caller_public_header_files TARGET ts
+-	PROPERTY RPC_CALLER_PUBLIC_HEADER_FILES
+-)
+-
+-get_property(_service_locator_public_header_files TARGET ts
+-	PROPERTY SERVICE_LOCATOR_PUBLIC_HEADER_FILES
+-)
++get_property(_tmp TARGET ts PROPERTY PUBLIC_HEADER)
+ 
+ # Exports library information in preparation for install
+ export_library(
+ 	TARGET "ts"
+ 	LIB_NAME "libts"
++	PKG_CONFIG_FILE "${CMAKE_CURRENT_LIST_DIR}/libtsConfig.cmake.in"
+ 	INTERFACE_FILES
+ 		${_rpc_caller_public_header_files}
+ 		${_service_locator_public_header_files}
+diff --git a/deployments/libts/libtsConfig.cmake.in b/deployments/libts/libtsConfig.cmake.in
+new file mode 100644
+index 0000000..4860135
+--- /dev/null
++++ b/deployments/libts/libtsConfig.cmake.in
+@@ -0,0 +1,10 @@
++#
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
++#
++# SPDX-License-Identifier: BSD-3-Clause
++#
++
++@PACKAGE_INIT@
++
++include("${CMAKE_CURRENT_LIST_DIR}/libtsTargets.cmake")
++
+diff --git a/tools/cmake/common/ExportLibrary.cmake b/tools/cmake/common/ExportLibrary.cmake
+index fed4e75..4fcf481 100644
+--- a/tools/cmake/common/ExportLibrary.cmake
++++ b/tools/cmake/common/ExportLibrary.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -26,17 +26,29 @@
+ #]===]
+ function(export_library)
+ 	set(options  )
+-	set(oneValueArgs TARGET LIB_NAME)
++	set(oneValueArgs TARGET LIB_NAME PKG_CONFIG_FILE)
+ 	set(multiValueArgs INTERFACE_FILES)
+ 	cmake_parse_arguments(MY_PARAMS "${options}" "${oneValueArgs}"
+ 						"${multiValueArgs}" ${ARGN} )
+ 
+-	if(NOT DEFINED MY_PARAMS_TARGET)
+-		message(FATAL_ERROR "export_library: mandatory parameter TARGET not defined!")
++	foreach(_param IN ITEMS MY_PARAMS_TARGET MY_PARAMS_LIB_NAME MY_PARAMS_PKG_CONFIG_FILE)
++		if(NOT DEFINED ${_param})
++			list(APPEND _miss_params "${_param}" )
++		endif()
++	endforeach()
++
++	if (_miss_params)
++		string(REPLACE ";" ", " _miss_params "${_miss_params}")
++		message(FATAL_ERROR "export_library: mandatory parameter(s) ${_miss_params} not defined!")
+ 	endif()
+-	if(NOT DEFINED MY_PARAMS_LIB_NAME)
+-		message(FATAL_ERROR "export_library: mandatory parameter LIB_NAME not defined!")
+-	endif()
++
++
++	string(TOUPPER "${MY_PARAMS_LIB_NAME}" UC_LIB_NAME)
++	string(TOLOWER "${MY_PARAMS_LIB_NAME}" LC_LIB_NAME)
++	string(SUBSTRING "${UC_LIB_NAME}" 0 1 CAP_LIB_NAME)
++	string(SUBSTRING "${LC_LIB_NAME}" 1 -1 _tmp)
++	string(APPEND CAP_LIB_NAME "${_tmp}")
++
+ 
+ 	# Set default install location if none specified
+ 	if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+@@ -55,6 +67,42 @@
+ 			DESTINATION ${TS_ENV}/include
+ 	)
+ 
++	# Create a config file package.
++	include(CMakePackageConfigHelpers)
++	get_target_property(_ver ${MY_PARAMS_TARGET} VERSION)
++	write_basic_package_version_file(
++		"${CMAKE_CURRENT_BINARY_DIR}/${LC_LIB_NAME}ConfigVersion.cmake"
++		VERSION "${_ver}"
++		COMPATIBILITY SameMajorVersion
++	)
++
++	# Create targets file.
++	export(
++		EXPORT
++			${MY_PARAMS_LIB_NAME}_targets
++		FILE
++			"${CMAKE_CURRENT_BINARY_DIR}/${MY_PARAMS_LIB_NAME}Targets.cmake"
++		NAMESPACE
++			${MY_PARAMS_LIB_NAME}::
++	)
++
++	# Finalize config file.
++	# Config package location relative to install root.
++	set(ConfigPackageLocation ${TS_ENV}/lib/cmake)
++	# Config package location ??
++	get_filename_component(ConfigPackageLocationRel ${ConfigPackageLocation} PATH)
++
++	get_filename_component(_configured_pkgcfg_name "${MY_PARAMS_PKG_CONFIG_FILE}" NAME_WLE)
++	set(_configured_pkgcfg_name "${CMAKE_CURRENT_BINARY_DIR}/${_configured_pkgcfg_name}")
++	configure_package_config_file(
++			"${MY_PARAMS_PKG_CONFIG_FILE}"
++			"${_configured_pkgcfg_name}"
++		PATH_VARS
++
++		INSTALL_DESTINATION
++			${ConfigPackageLocationRel}
++	)
++
+ 	# Install library header files files
+ 	install(
+ 		FILES ${MY_PARAMS_INTERFACE_FILES}
+@@ -64,9 +112,21 @@
+ 	# Install the export details
+ 	install(
+ 		EXPORT ${MY_PARAMS_LIB_NAME}_targets
+-		FILE ${MY_PARAMS_LIB_NAME}_targets.cmake
++		FILE ${MY_PARAMS_LIB_NAME}Targets.cmake
+ 		NAMESPACE ${MY_PARAMS_LIB_NAME}::
+-		DESTINATION ${TS_ENV}/lib/cmake
++		DESTINATION ${ConfigPackageLocation}
+ 		COMPONENT ${MY_PARAMS_LIB_NAME}
+ 	)
++
++
++	# install config and version files
++	install(
++		FILES
++			"${_configured_pkgcfg_name}"
++			"${CMAKE_CURRENT_BINARY_DIR}/${LC_LIB_NAME}ConfigVersion.cmake"
++		DESTINATION
++			${ConfigPackageLocation}
++		COMPONENT
++			${MY_PARAMS_LIB_NAME}
++	)
+ endfunction()
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0011-Adapt-deployments-to-libts-changes.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0011-Adapt-deployments-to-libts-changes.patch
new file mode 100644
index 0000000..34b1035
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0011-Adapt-deployments-to-libts-changes.patch
@@ -0,0 +1,197 @@
+From dfadca01ff028f9fc935937cdaf92b0effff2b90 Mon Sep 17 00:00:00 2001
+From: Gyorgy Szing <Gyorgy.Szing@arm.com>
+Date: Wed, 20 Jul 2022 16:49:39 +0000
+Subject: [PATCH] Adapt deployments to libts changes
+
+Update deployments and restore compatibility to libts build-system
+interface changes.
+
+Signed-off-by: Gyorgy Szing <Gyorgy.Szing@arm.com>
+Change-Id: Iffd38f92fe628a2a6aaff60224986f22ec3a8a2a
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+
+diff --git a/deployments/platform-inspect/platform-inspect.cmake b/deployments/platform-inspect/platform-inspect.cmake
+index ef4ba4b..b1b316d 100644
+--- a/deployments/platform-inspect/platform-inspect.cmake
++++ b/deployments/platform-inspect/platform-inspect.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -12,14 +12,14 @@
+ 
+ #-------------------------------------------------------------------------------
+ #  Use libts for locating and accessing trusted services. An appropriate version
+-#  of libts will be imported for the enviroment in which platform-inspect is
++#  of libts will be imported for the environment in which platform-inspect is
+ #  built.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(platform-inspect PRIVATE libts)
++target_link_libraries(platform-inspect PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+diff --git a/deployments/psa-api-test/psa-api-test.cmake b/deployments/psa-api-test/psa-api-test.cmake
+index d58620f..5c3469c 100644
+--- a/deployments/psa-api-test/psa-api-test.cmake
++++ b/deployments/psa-api-test/psa-api-test.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -12,14 +12,14 @@
+ 
+ #-------------------------------------------------------------------------------
+ #  Use libts for locating and accessing services. An appropriate version of
+-#  libts will be imported for the enviroment in which service tests are
++#  libts will be imported for the environment in which service tests are
+ #  deployed.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(${PROJECT_NAME} PRIVATE libts)
++target_link_libraries(${PROJECT_NAME} PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+diff --git a/deployments/ts-demo/ts-demo.cmake b/deployments/ts-demo/ts-demo.cmake
+index 3e7cca0..9fd8585 100644
+--- a/deployments/ts-demo/ts-demo.cmake
++++ b/deployments/ts-demo/ts-demo.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -13,11 +13,11 @@
+ 
+ #-------------------------------------------------------------------------------
+ #  Use libts for locating and accessing services. An appropriate version of
+-#  libts will be imported for the enviroment in which service tests are
++#  libts will be imported for the environment in which service tests are
+ #  deployed.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(ts-demo PRIVATE libts)
++target_link_libraries(ts-demo PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+ #  Common main for all deployments
+@@ -28,7 +28,7 @@
+ )
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+diff --git a/deployments/ts-remote-test/ts-remote-test.cmake b/deployments/ts-remote-test/ts-remote-test.cmake
+index 0f35bb2..c310445 100644
+--- a/deployments/ts-remote-test/ts-remote-test.cmake
++++ b/deployments/ts-remote-test/ts-remote-test.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -13,11 +13,11 @@
+ 
+ #-------------------------------------------------------------------------------
+ #  Use libts for locating and accessing services. An appropriate version of
+-#  libts will be imported for the enviroment in which tests are
++#  libts will be imported for the environment in which tests are
+ #  deployed.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(ts-remote-test PRIVATE libts)
++target_link_libraries(ts-remote-test PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+ #  Common main for all deployments
+@@ -28,7 +28,7 @@
+ )
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+diff --git a/deployments/ts-service-test/ts-service-test.cmake b/deployments/ts-service-test/ts-service-test.cmake
+index 4a8c59c..3e33757 100644
+--- a/deployments/ts-service-test/ts-service-test.cmake
++++ b/deployments/ts-service-test/ts-service-test.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -8,19 +8,19 @@
+ #-------------------------------------------------------------------------------
+ #  The base build file shared between deployments of 'ts-service-test' for
+ #  different environments.  Used for running end-to-end service-level tests
+-#  where test cases excerise trusted service client interfaces.
++#  where test cases exercise trusted service client interfaces.
+ #-------------------------------------------------------------------------------
+ 
+ #-------------------------------------------------------------------------------
+ #  Use libts for locating and accessing services. An appropriate version of
+-#  libts will be imported for the enviroment in which service tests are
++#  libts will be imported for the environment in which service tests are
+ #  deployed.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(ts-service-test PRIVATE libts)
++target_link_libraries(ts-service-test PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+-#  Components that are common accross all deployments
++#  Components that are common across all deployments
+ #
+ #-------------------------------------------------------------------------------
+ add_components(
+diff --git a/deployments/uefi-test/uefi-test.cmake b/deployments/uefi-test/uefi-test.cmake
+index ea678d0..2f47891 100644
+--- a/deployments/uefi-test/uefi-test.cmake
++++ b/deployments/uefi-test/uefi-test.cmake
+@@ -1,5 +1,5 @@
+ #-------------------------------------------------------------------------------
+-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -18,7 +18,7 @@
+ #  deployed.
+ #-------------------------------------------------------------------------------
+ include(${TS_ROOT}/deployments/libts/libts-import.cmake)
+-target_link_libraries(uefi-test PRIVATE libts)
++target_link_libraries(uefi-test PRIVATE libts::ts)
+ 
+ #-------------------------------------------------------------------------------
+ #  Components that are common accross all deployments
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0012-psa-arch-test-toolchain.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0012-psa-arch-test-toolchain.patch
new file mode 100644
index 0000000..7d07fca
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0012-psa-arch-test-toolchain.patch
@@ -0,0 +1,40 @@
+From 1ce8fcde17a6d2c5cb2e00901d485c91eda776fd Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:09:17 +0100
+Subject: [PATCH 4/4] Pass Yocto build settings to psa-arch-tests native build
+
+PSA-arch-tests need to build a native executable as a part of target build.
+The patch defines correct toolchain settings for native builds.
+
+Upstream-Status: Inappropriate [Yocto build specific change]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ .../psa_arch_tests/modify_attest_config.patch     | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/external/psa_arch_tests/modify_attest_config.patch b/external/psa_arch_tests/modify_attest_config.patch
+index ebe8c44..b5d5e88 100644
+--- a/external/psa_arch_tests/modify_attest_config.patch
++++ b/external/psa_arch_tests/modify_attest_config.patch
+@@ -11,3 +11,18 @@ index 6112ba7..1cdf581 100755
+  
+  /*
+   * Include of PSA defined Header files
++diff --git a/api-tests/tools/scripts/target_cfg/CMakeLists.txt b/api-tests/tools/scripts/target_cfg/CMakeLists.txt
++index 259eb9c..fec1fb8 100644
++--- a/api-tests/tools/scripts/target_cfg/CMakeLists.txt
+++++ b/api-tests/tools/scripts/target_cfg/CMakeLists.txt
++@@ -26,7 +26,9 @@ include("common/CMakeSettings")
++ include("common/Utils")
++ 
++ # Causes toolchain to be re-evaluated
++-unset(ENV{CC})
+++set(ENV{CC} $ENV{BUILD_CC})
+++set(ENV{CFLAGS} $ENV{BUILD_CFLAGS})
+++set(ENV{LDFLAGS} $ENV{BUILD_LDFLAGS})
++ 
++ # Let the CMake look for C compiler
++ project(TargetConfigGen LANGUAGES C)
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0017-Move-libsp-mocks-into-separate-component.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0017-Move-libsp-mocks-into-separate-component.patch
new file mode 100644
index 0000000..d6da370
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0017-Move-libsp-mocks-into-separate-component.patch
@@ -0,0 +1,349 @@
+From 2cd802030ab59787a34c0f6684c16848befabafa Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Wed, 15 Jun 2022 12:47:37 +0200
+Subject: [PATCH 17/24] Move libsp mocks into separate component
+
+Enable deployments to include libsp mocks in tests by simply adding
+the newly created libsp mock component.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I40805fd49362c6cc71b5b34f9ba888d27ce01ed8
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../messaging/ffa/libsp/mock/component.cmake  | 27 ++++++++++
+ .../ffa/libsp/{test => mock}/mock_assert.cpp  |  0
+ .../ffa/libsp/{test => mock}/mock_assert.h    |  0
+ .../ffa/libsp/{test => mock}/mock_ffa_api.cpp |  0
+ .../ffa/libsp/{test => mock}/mock_ffa_api.h   |  0
+ .../{test => mock}/mock_ffa_internal_api.cpp  |  0
+ .../{test => mock}/mock_ffa_internal_api.h    |  0
+ .../ffa/libsp/{test => mock}/mock_sp_rxtx.cpp |  0
+ .../ffa/libsp/{test => mock}/mock_sp_rxtx.h   |  0
+ .../{ => mock}/test/test_mock_assert.cpp      |  0
+ .../{ => mock}/test/test_mock_ffa_api.cpp     |  0
+ .../test/test_mock_ffa_internal_api.cpp       |  0
+ .../{ => mock}/test/test_mock_sp_rxtx.cpp     |  0
+ components/messaging/ffa/libsp/tests.cmake    | 51 +++++++++++--------
+ .../mm_communicate/endpoint/sp/tests.cmake    |  6 +--
+ .../frontend/mm_communicate/tests.cmake       |  6 +--
+ 16 files changed, 64 insertions(+), 26 deletions(-)
+ create mode 100644 components/messaging/ffa/libsp/mock/component.cmake
+ rename components/messaging/ffa/libsp/{test => mock}/mock_assert.cpp (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_assert.h (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_ffa_api.cpp (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_ffa_api.h (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_ffa_internal_api.cpp (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_ffa_internal_api.h (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_sp_rxtx.cpp (100%)
+ rename components/messaging/ffa/libsp/{test => mock}/mock_sp_rxtx.h (100%)
+ rename components/messaging/ffa/libsp/{ => mock}/test/test_mock_assert.cpp (100%)
+ rename components/messaging/ffa/libsp/{ => mock}/test/test_mock_ffa_api.cpp (100%)
+ rename components/messaging/ffa/libsp/{ => mock}/test/test_mock_ffa_internal_api.cpp (100%)
+ rename components/messaging/ffa/libsp/{ => mock}/test/test_mock_sp_rxtx.cpp (100%)
+
+diff --git a/components/messaging/ffa/libsp/mock/component.cmake b/components/messaging/ffa/libsp/mock/component.cmake
+new file mode 100644
+index 0000000..03b8006
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/component.cmake
+@@ -0,0 +1,27 @@
++#-------------------------------------------------------------------------------
++# Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
++#
++# SPDX-License-Identifier: BSD-3-Clause
++#
++#-------------------------------------------------------------------------------
++if (NOT DEFINED TGT)
++	message(FATAL_ERROR "mandatory parameter TGT is not defined.")
++endif()
++
++target_sources(${TGT} PRIVATE
++	"${CMAKE_CURRENT_LIST_DIR}/mock_assert.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_api.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_internal_api.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_rxtx.cpp"
++	)
++
++target_include_directories(${TGT}
++	PUBLIC
++		${CMAKE_CURRENT_LIST_DIR}
++		${CMAKE_CURRENT_LIST_DIR}/../include
++)
++
++target_compile_definitions(${TGT}
++	PUBLIC
++		"ARM64=1"
++)
+\ No newline at end of file
+diff --git a/components/messaging/ffa/libsp/test/mock_assert.cpp b/components/messaging/ffa/libsp/mock/mock_assert.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_assert.cpp
+rename to components/messaging/ffa/libsp/mock/mock_assert.cpp
+diff --git a/components/messaging/ffa/libsp/test/mock_assert.h b/components/messaging/ffa/libsp/mock/mock_assert.h
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_assert.h
+rename to components/messaging/ffa/libsp/mock/mock_assert.h
+diff --git a/components/messaging/ffa/libsp/test/mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_ffa_api.cpp
+rename to components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
+diff --git a/components/messaging/ffa/libsp/test/mock_ffa_api.h b/components/messaging/ffa/libsp/mock/mock_ffa_api.h
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_ffa_api.h
+rename to components/messaging/ffa/libsp/mock/mock_ffa_api.h
+diff --git a/components/messaging/ffa/libsp/test/mock_ffa_internal_api.cpp b/components/messaging/ffa/libsp/mock/mock_ffa_internal_api.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_ffa_internal_api.cpp
+rename to components/messaging/ffa/libsp/mock/mock_ffa_internal_api.cpp
+diff --git a/components/messaging/ffa/libsp/test/mock_ffa_internal_api.h b/components/messaging/ffa/libsp/mock/mock_ffa_internal_api.h
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_ffa_internal_api.h
+rename to components/messaging/ffa/libsp/mock/mock_ffa_internal_api.h
+diff --git a/components/messaging/ffa/libsp/test/mock_sp_rxtx.cpp b/components/messaging/ffa/libsp/mock/mock_sp_rxtx.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_sp_rxtx.cpp
+rename to components/messaging/ffa/libsp/mock/mock_sp_rxtx.cpp
+diff --git a/components/messaging/ffa/libsp/test/mock_sp_rxtx.h b/components/messaging/ffa/libsp/mock/mock_sp_rxtx.h
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/mock_sp_rxtx.h
+rename to components/messaging/ffa/libsp/mock/mock_sp_rxtx.h
+diff --git a/components/messaging/ffa/libsp/test/test_mock_assert.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_assert.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/test_mock_assert.cpp
+rename to components/messaging/ffa/libsp/mock/test/test_mock_assert.cpp
+diff --git a/components/messaging/ffa/libsp/test/test_mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/test_mock_ffa_api.cpp
+rename to components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
+diff --git a/components/messaging/ffa/libsp/test/test_mock_ffa_internal_api.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_internal_api.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/test_mock_ffa_internal_api.cpp
+rename to components/messaging/ffa/libsp/mock/test/test_mock_ffa_internal_api.cpp
+diff --git a/components/messaging/ffa/libsp/test/test_mock_sp_rxtx.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_sp_rxtx.cpp
+similarity index 100%
+rename from components/messaging/ffa/libsp/test/test_mock_sp_rxtx.cpp
+rename to components/messaging/ffa/libsp/mock/test/test_mock_sp_rxtx.cpp
+diff --git a/components/messaging/ffa/libsp/tests.cmake b/components/messaging/ffa/libsp/tests.cmake
+index d851442..296ae46 100644
+--- a/components/messaging/ffa/libsp/tests.cmake
++++ b/components/messaging/ffa/libsp/tests.cmake
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2020-2021, Arm Limited. All rights reserved.
++# Copyright (c) 2020-2022, Arm Limited. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -9,10 +9,11 @@ include(UnitTest)
+ unit_test_add_suite(
+ 	NAME libsp_mock_assert
+ 	SOURCES
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_assert.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_assert.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_assert.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_assert.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -21,10 +22,11 @@ unit_test_add_suite(
+ unit_test_add_suite(
+ 	NAME libsp_mock_ffa_internal_api
+ 	SOURCES
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_internal_api.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_ffa_internal_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_internal_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_ffa_internal_api.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -35,12 +37,13 @@ unit_test_add_suite(
+ 	SOURCES
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_ffa_api.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_ffa_memory_descriptors.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_internal_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_internal_api.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/ffa.c
+ 		${CMAKE_CURRENT_LIST_DIR}/ffa_memory_descriptors.c
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_assert.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_assert.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -49,10 +52,11 @@ unit_test_add_suite(
+ unit_test_add_suite(
+ 	NAME libsp_mock_ffa_api
+ 	SOURCES
+-		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_ffa_api.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -62,10 +66,11 @@ unit_test_add_suite(
+ 	NAME libsp_sp_rxtx
+ 	SOURCES
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_rxtx.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/sp_rxtx.c
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -74,10 +79,11 @@ unit_test_add_suite(
+ unit_test_add_suite(
+ 	NAME libsp_mock_sp_rxtx
+ 	SOURCES
+-		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_sp_rxtx.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_sp_rxtx.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_sp_rxtx.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_rxtx.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -88,10 +94,11 @@ unit_test_add_suite(
+ 	SOURCES
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_discovery.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/sp_discovery.c
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_sp_rxtx.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_rxtx.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -103,11 +110,12 @@ unit_test_add_suite(
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_memory_management.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/sp_memory_management.c
+ 		${CMAKE_CURRENT_LIST_DIR}/ffa_memory_descriptors.c
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_assert.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_sp_rxtx.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_assert.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_rxtx.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -119,9 +127,10 @@ unit_test_add_suite(
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_memory_management_internals.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/test/sp_memory_management_internals.yml
+ 		${CMAKE_CURRENT_LIST_DIR}/ffa_memory_descriptors.c
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_assert.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_assert.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -131,10 +140,11 @@ unit_test_add_suite(
+ 	NAME libsp_sp_messaging
+ 	SOURCES
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_messaging.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/sp_messaging.c
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+@@ -144,11 +154,12 @@ unit_test_add_suite(
+ 	NAME libsp_sp_messaging_with_routing_extension
+ 	SOURCES
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_messaging.cpp
+-		${CMAKE_CURRENT_LIST_DIR}/test/mock_ffa_api.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_ffa_api.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/sp_messaging.c
+ 		${CMAKE_CURRENT_LIST_DIR}/ffa_direct_msg_routing_extension.c
+ 	INCLUDE_DIRECTORIES
+ 		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+diff --git a/components/rpc/mm_communicate/endpoint/sp/tests.cmake b/components/rpc/mm_communicate/endpoint/sp/tests.cmake
+index 318f14d..c68a0c7 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/tests.cmake
++++ b/components/rpc/mm_communicate/endpoint/sp/tests.cmake
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2021, Arm Limited. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -13,12 +13,12 @@ unit_test_add_suite(
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_mm_communicate_call_ep.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/test/mock_mm_service.cpp
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_mm_service.cpp
+-		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/test/mock_assert.cpp
++		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/mock/mock_assert.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${UNIT_TEST_PROJECT_PATH}
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/include
+-		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/test
++		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/rpc/common/interface
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+diff --git a/components/service/smm_variable/frontend/mm_communicate/tests.cmake b/components/service/smm_variable/frontend/mm_communicate/tests.cmake
+index d1f930c..50b0b9a 100644
+--- a/components/service/smm_variable/frontend/mm_communicate/tests.cmake
++++ b/components/service/smm_variable/frontend/mm_communicate/tests.cmake
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2021, Arm Limited. All rights reserved.
++# Copyright (c) 2021-2022, Arm Limited. All rights reserved.
+ #
+ # SPDX-License-Identifier: BSD-3-Clause
+ #
+@@ -12,13 +12,13 @@ unit_test_add_suite(
+ 		${CMAKE_CURRENT_LIST_DIR}/smm_variable_mm_service.c
+ 		${CMAKE_CURRENT_LIST_DIR}/test/test_smm_variable_mm_service.cpp
+ 		${UNIT_TEST_PROJECT_PATH}/components/rpc/common/test/mock_rpc_interface.cpp
+-		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/test/mock_assert.cpp
++		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/mock/mock_assert.cpp
+ 	INCLUDE_DIRECTORIES
+ 		${UNIT_TEST_PROJECT_PATH}
+ 		${UNIT_TEST_PROJECT_PATH}/components/rpc/mm_communicate/endpoint/sp
+ 		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ 		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/include
+-		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/test
++		${UNIT_TEST_PROJECT_PATH}/components/messaging/ffa/libsp/mock
+ 		${UNIT_TEST_PROJECT_PATH}/components/rpc/common/interface
+ 	COMPILE_DEFINITIONS
+ 		-DARM64
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0018-Add-mock-for-libsp-sp_discovery.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0018-Add-mock-for-libsp-sp_discovery.patch
new file mode 100644
index 0000000..b385b7a
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0018-Add-mock-for-libsp-sp_discovery.patch
@@ -0,0 +1,339 @@
+From e9ff55c03e06c044eb9c13f2a3315bf7e35f3659 Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Fri, 17 Jun 2022 13:51:21 +0200
+Subject: [PATCH 18/24] Add mock for libsp/sp_discovery
+
+Add mock_sp_discovery for mocking sp_discovery part of libsp.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I94460dc03dd6dcd27f6865f852cc9a0d85f4b583
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../messaging/ffa/libsp/mock/component.cmake  |   1 +
+ .../ffa/libsp/mock/mock_sp_discovery.cpp      | 109 +++++++++++++++++
+ .../ffa/libsp/mock/mock_sp_discovery.h        |  37 ++++++
+ .../mock/test/test_mock_sp_discovery.cpp      | 111 ++++++++++++++++++
+ components/messaging/ffa/libsp/tests.cmake    |  13 ++
+ 5 files changed, 271 insertions(+)
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_discovery.cpp
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_discovery.h
+ create mode 100644 components/messaging/ffa/libsp/mock/test/test_mock_sp_discovery.cpp
+
+diff --git a/components/messaging/ffa/libsp/mock/component.cmake b/components/messaging/ffa/libsp/mock/component.cmake
+index 03b8006..15db85a 100644
+--- a/components/messaging/ffa/libsp/mock/component.cmake
++++ b/components/messaging/ffa/libsp/mock/component.cmake
+@@ -12,6 +12,7 @@ target_sources(${TGT} PRIVATE
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_assert.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_api.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_internal_api.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_discovery.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_rxtx.cpp"
+ 	)
+ 
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_discovery.cpp b/components/messaging/ffa/libsp/mock/mock_sp_discovery.cpp
+new file mode 100644
+index 0000000..47f4ef7
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_discovery.cpp
+@@ -0,0 +1,109 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include "mock_sp_discovery.h"
++
++void expect_sp_discovery_ffa_version_get(const uint16_t *major,
++					 const uint16_t *minor,
++					 sp_result result)
++{
++	mock()
++		.expectOneCall("sp_discovery_ffa_version_get")
++		.withOutputParameterReturning("major", major, sizeof(*major))
++		.withOutputParameterReturning("minor", minor, sizeof(*minor))
++		.andReturnValue(result);
++}
++
++sp_result sp_discovery_ffa_version_get(uint16_t *major, uint16_t *minor)
++{
++	return mock()
++		.actualCall("sp_discovery_ffa_version_get")
++		.withOutputParameter("major", major)
++		.withOutputParameter("minor", minor)
++		.returnIntValue();
++}
++
++void expect_sp_discovery_own_id_get(const uint16_t *id, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_discovery_own_id_get")
++		.withOutputParameterReturning("id", id, sizeof(*id))
++		.andReturnValue(result);
++}
++
++sp_result sp_discovery_own_id_get(uint16_t *id)
++{
++	return mock()
++		.actualCall("sp_discovery_own_id_get")
++		.withOutputParameter("id", id)
++		.returnIntValue();
++}
++
++void expect_sp_discovery_partition_id_get(const struct sp_uuid *uuid,
++					  const uint16_t *id, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_discovery_partition_id_get")
++		.withMemoryBufferParameter("uuid", (const unsigned char *)uuid,
++					   sizeof(*uuid))
++		.withOutputParameterReturning("id", id, sizeof(*id))
++		.andReturnValue(result);
++}
++
++sp_result sp_discovery_partition_id_get(const struct sp_uuid *uuid,
++					uint16_t *id)
++{
++	return mock()
++		.actualCall("sp_discovery_partition_id_get")
++		.withMemoryBufferParameter("uuid", (const unsigned char *)uuid,
++					   sizeof(*uuid))
++		.withOutputParameter("id", id)
++		.returnIntValue();
++}
++
++void expect_sp_discovery_partition_info_get(const struct sp_uuid *uuid,
++					  const struct sp_partition_info *info,
++					  sp_result result)
++{
++	mock()
++		.expectOneCall("sp_discovery_partition_info_get")
++		.withMemoryBufferParameter("uuid", (const unsigned char *)uuid,
++					   sizeof(*uuid))
++		.withOutputParameterReturning("info", info, sizeof(*info))
++		.andReturnValue(result);
++}
++
++sp_result sp_discovery_partition_info_get(const struct sp_uuid *uuid,
++					  struct sp_partition_info *info)
++{
++	return mock()
++		.actualCall("sp_discovery_partition_info_get")
++		.withMemoryBufferParameter("uuid", (const unsigned char *)uuid,
++					   sizeof(*uuid))
++		.withOutputParameter("info", info)
++		.returnIntValue();
++}
++
++void expect_sp_discovery_partition_info_get_all(const struct sp_partition_info info[],
++						const uint32_t *count,
++						sp_result result)
++{
++	mock()
++		.expectOneCall("sp_discovery_partition_info_get_all")
++		.withOutputParameterReturning("info", info, sizeof(*info) * *count)
++		.withOutputParameterReturning("count", count, sizeof(*count))
++		.andReturnValue(result);
++}
++
++sp_result sp_discovery_partition_info_get_all(struct sp_partition_info info[],
++					      uint32_t *count)
++{
++	return mock()
++		.actualCall("sp_discovery_partition_info_get_all")
++		.withOutputParameter("info", info)
++		.withOutputParameter("count", count)
++		.returnIntValue();
++}
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_discovery.h b/components/messaging/ffa/libsp/mock/mock_sp_discovery.h
+new file mode 100644
+index 0000000..a71ce18
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_discovery.h
+@@ -0,0 +1,37 @@
++/* SPDX-License-Identifier: BSD-3-Clause */
++/*
++ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
++ */
++
++#ifndef LIBSP_MOCK_MOCK_SP_DISCOVERY_H_
++#define LIBSP_MOCK_MOCK_SP_DISCOVERY_H_
++
++#include "../include/sp_discovery.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++void expect_sp_discovery_ffa_version_get(const uint16_t *major,
++					 const uint16_t *minor,
++					 sp_result result);
++
++void expect_sp_discovery_own_id_get(const uint16_t *id, sp_result result);
++
++void expect_sp_discovery_partition_id_get(const struct sp_uuid *uuid,
++					  const uint16_t *id, sp_result result);
++
++
++void expect_sp_discovery_partition_info_get(const struct sp_uuid *uuid,
++					    const struct sp_partition_info *info,
++					    sp_result result);
++
++void expect_sp_discovery_partition_info_get_all(const struct sp_partition_info info[],
++						const uint32_t *count,
++						sp_result result);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* LIBSP_MOCK_MOCK_SP_DISCOVERY_H_ */
+diff --git a/components/messaging/ffa/libsp/mock/test/test_mock_sp_discovery.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_sp_discovery.cpp
+new file mode 100644
+index 0000000..bb4bf07
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/test/test_mock_sp_discovery.cpp
+@@ -0,0 +1,111 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include <CppUTest/TestHarness.h>
++#include "mock_sp_discovery.h"
++#include <stdint.h>
++#include <stdlib.h>
++
++
++
++
++TEST_GROUP(mock_sp_discovery) {
++	TEST_TEARDOWN()
++	{
++		mock().checkExpectations();
++		mock().clear();
++	}
++
++	static const sp_result result = -1;
++};
++
++TEST(mock_sp_discovery, sp_discovery_ffa_version_get)
++{
++	const uint16_t expected_major = 0xabcd;
++	const uint16_t expected_minor = 0xef01;
++	uint16_t major = 0, minor = 0;
++
++	expect_sp_discovery_ffa_version_get(&expected_major, &expected_minor,
++					    result);
++	LONGS_EQUAL(result, sp_discovery_ffa_version_get(&major, &minor));
++	UNSIGNED_LONGS_EQUAL(expected_major, major);
++	UNSIGNED_LONGS_EQUAL(expected_minor, minor);
++}
++
++TEST(mock_sp_discovery, sp_discovery_own_id_get)
++{
++	const uint16_t expected_id = 0x8765;
++	uint16_t id = 0;
++
++	expect_sp_discovery_own_id_get(&expected_id, result);
++	LONGS_EQUAL(result, sp_discovery_own_id_get(&id));
++	UNSIGNED_LONGS_EQUAL(expected_id, id);
++}
++
++TEST(mock_sp_discovery, sp_discovery_partition_id_get)
++{
++	const struct sp_uuid expected_uuid = {
++		.uuid = {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
++			 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}};
++	const uint16_t expected_id = 0xc1ca;
++
++	struct sp_uuid uuid = expected_uuid;
++	uint16_t id = 0;
++
++	expect_sp_discovery_partition_id_get(&expected_uuid, &expected_id,
++					       result);
++	LONGS_EQUAL(result, sp_discovery_partition_id_get(&uuid, &id));
++	UNSIGNED_LONGS_EQUAL(expected_id, id);
++}
++
++TEST(mock_sp_discovery, sp_discovery_partition_info_get)
++{
++	const struct sp_uuid expected_uuid = {
++		.uuid = {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
++			 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}};
++	const struct sp_partition_info expected_info = {
++		.partition_id = 0x1234,
++		.execution_context_count = 0xffff,
++		.supports_direct_requests = true,
++		.can_send_direct_requests = true,
++		.supports_indirect_requests = false
++	};
++
++	struct sp_uuid uuid = expected_uuid;
++	struct sp_partition_info info = {0};
++
++	expect_sp_discovery_partition_info_get(&expected_uuid, &expected_info,
++					       result);
++	LONGS_EQUAL(result, sp_discovery_partition_info_get(&uuid, &info));
++	MEMCMP_EQUAL(&expected_info, &info, sizeof(&expected_info));
++}
++
++TEST(mock_sp_discovery, sp_discovery_partition_info_get_all)
++{
++	const uint32_t expected_count = 2;
++	const struct sp_partition_info expected_info[expected_count] = {{
++		.partition_id = 0x5678,
++		.execution_context_count = 0x1111,
++		.supports_direct_requests = false,
++		.can_send_direct_requests = false,
++		.supports_indirect_requests = true
++	}, {
++		.partition_id = 0x1234,
++		.execution_context_count = 0xffff,
++		.supports_direct_requests = true,
++		.can_send_direct_requests = true,
++		.supports_indirect_requests = false
++	}};
++
++	struct sp_partition_info info[expected_count] = {0};
++	uint32_t count = 0;
++
++	expect_sp_discovery_partition_info_get_all(expected_info,
++						   &expected_count, result);
++	LONGS_EQUAL(result, sp_discovery_partition_info_get_all(info, &count));
++	MEMCMP_EQUAL(&expected_info, &info, sizeof(&expected_info));
++	UNSIGNED_LONGS_EQUAL(expected_count, count);
++}
+\ No newline at end of file
+diff --git a/components/messaging/ffa/libsp/tests.cmake b/components/messaging/ffa/libsp/tests.cmake
+index 296ae46..7b52248 100644
+--- a/components/messaging/ffa/libsp/tests.cmake
++++ b/components/messaging/ffa/libsp/tests.cmake
+@@ -104,6 +104,19 @@ unit_test_add_suite(
+ 		-DARM64
+ )
+ 
++unit_test_add_suite(
++	NAME libsp_mock_sp_discovery
++	SOURCES
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_sp_discovery.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_discovery.cpp
++	INCLUDE_DIRECTORIES
++		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
++		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
++	COMPILE_DEFINITIONS
++		-DARM64
++)
++
+ unit_test_add_suite(
+ 	NAME libsp_sp_memory_management
+ 	SOURCES
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0019-Add-mock-for-libsp-sp_memory_management.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0019-Add-mock-for-libsp-sp_memory_management.patch
new file mode 100644
index 0000000..cf50389
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0019-Add-mock-for-libsp-sp_memory_management.patch
@@ -0,0 +1,977 @@
+From b592a22dbce521522931f8e3d79d6e16f2d334fa Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Fri, 17 Jun 2022 14:42:04 +0200
+Subject: [PATCH 19/24] Add mock for libsp/sp_memory_management
+
+Add mock_sp_memory_management for mocking sp_memory_management part of
+libsp.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I9f74142bc3568dfc59f820ec2c2af81deba0d0da
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../ffa/libsp/include/sp_memory_management.h  |   2 +-
+ .../messaging/ffa/libsp/mock/component.cmake  |   1 +
+ .../libsp/mock/mock_sp_memory_management.cpp  | 523 ++++++++++++++++++
+ .../libsp/mock/mock_sp_memory_management.h    |  98 ++++
+ .../test/test_mock_sp_memory_management.cpp   | 260 +++++++++
+ components/messaging/ffa/libsp/tests.cmake    |  13 +
+ 6 files changed, 896 insertions(+), 1 deletion(-)
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
+ create mode 100644 components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
+
+diff --git a/components/messaging/ffa/libsp/include/sp_memory_management.h b/components/messaging/ffa/libsp/include/sp_memory_management.h
+index 58a6cc1..ec76a3d 100644
+--- a/components/messaging/ffa/libsp/include/sp_memory_management.h
++++ b/components/messaging/ffa/libsp/include/sp_memory_management.h
+@@ -381,7 +381,7 @@ sp_result sp_memory_share_dynamic_is_supported(bool *supported);
+  *
+  * @param[in]      descriptor        The memory descriptor
+  * @param[in,out]  acc_desc          Access descriptor
+- * @param[in,out   regions           Memory region array
++ * @param[in,out]  regions           Memory region array
+  * @param[in]      in_region_count   Count of the specified regions, can be 0
+  * @param[in,out]  out_region_count  Count of the reserved space of in the
+  *                                   regions buffer for retrieved regions. After
+diff --git a/components/messaging/ffa/libsp/mock/component.cmake b/components/messaging/ffa/libsp/mock/component.cmake
+index 15db85a..eb0d28c 100644
+--- a/components/messaging/ffa/libsp/mock/component.cmake
++++ b/components/messaging/ffa/libsp/mock/component.cmake
+@@ -13,6 +13,7 @@ target_sources(${TGT} PRIVATE
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_api.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_internal_api.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_discovery.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_memory_management.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_rxtx.cpp"
+ 	)
+ 
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
+new file mode 100644
+index 0000000..9eb0aaa
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
+@@ -0,0 +1,523 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include "mock_sp_memory_management.h"
++
++void expect_sp_memory_donate(const struct sp_memory_descriptor *descriptor,
++			     const struct sp_memory_access_descriptor *acc_desc,
++			     const struct sp_memory_region regions[],
++			     uint32_t region_count, const uint64_t *handle,
++			     sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_donate")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_donate(struct sp_memory_descriptor *descriptor,
++			   struct sp_memory_access_descriptor *acc_desc,
++			   struct sp_memory_region regions[],
++			   uint32_t region_count, uint64_t *handle)
++{
++	return mock()
++		.actualCall("sp_memory_donate")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_donate_dynamic(const struct sp_memory_descriptor *descriptor,
++				     const struct sp_memory_access_descriptor *acc_desc,
++				     const struct sp_memory_region regions[],
++				     uint32_t region_count, const uint64_t *handle,
++				     sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_donate_dynamic")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_donate_dynamic(struct sp_memory_descriptor *descriptor,
++				   struct sp_memory_access_descriptor *acc_desc,
++				   struct sp_memory_region regions[],
++				   uint32_t region_count, uint64_t *handle,
++				   struct ffa_mem_transaction_buffer *buffer)
++{
++	if (buffer == NULL) { // LCOV_EXCL_BR_LINE
++		FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
++	}
++
++	return mock()
++		.actualCall("sp_memory_donate_dynamic")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_donate_dynamic_is_supported(const bool *supported, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_lend_dynamic_is_supported")
++		.withOutputParameterReturning("supported", supported, sizeof(*supported))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_donate_dynamic_is_supported(bool *supported)
++{
++	return mock()
++		.actualCall("sp_memory_lend_dynamic_is_supported")
++		.withOutputParameter("supported", supported)
++		.returnIntValue();
++}
++
++void expect_sp_memory_lend(const struct sp_memory_descriptor *descriptor,
++			   const struct sp_memory_access_descriptor acc_desc[],
++			   uint32_t acc_desc_count,
++			   const struct sp_memory_region regions[],
++			   uint32_t region_count, const uint64_t *handle,
++			   sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_lend")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_lend(struct sp_memory_descriptor *descriptor,
++			 struct sp_memory_access_descriptor acc_desc[],
++			 uint32_t acc_desc_count,
++			 struct sp_memory_region regions[],
++			 uint32_t region_count, uint64_t *handle)
++{
++	return mock()
++		.actualCall("sp_memory_lend")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_lend_dynamic(const struct sp_memory_descriptor *descriptor,
++				   const struct sp_memory_access_descriptor acc_desc[],
++				   uint32_t acc_desc_count,
++				   const struct sp_memory_region regions[],
++				   const uint32_t region_count, const uint64_t *handle,
++				   sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_lend")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_lend_dynamic(struct sp_memory_descriptor *descriptor,
++				 struct sp_memory_access_descriptor acc_desc[],
++				 uint32_t acc_desc_count,
++				 struct sp_memory_region regions[],
++				 uint32_t region_count, uint64_t *handle,
++				 struct ffa_mem_transaction_buffer *buffer)
++{
++	if (buffer == NULL) { // LCOV_EXCL_BR_LINE
++		FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
++	}
++
++	return mock()
++		.actualCall("sp_memory_lend")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_lend_dynamic_is_supported(const bool *supported, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_lend_dynamic_is_supported")
++		.withOutputParameterReturning("supported", supported, sizeof(*supported))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_lend_dynamic_is_supported(bool *supported)
++{
++	return mock()
++		.actualCall("sp_memory_lend_dynamic_is_supported")
++		.withOutputParameter("supported", supported)
++		.returnIntValue();
++}
++
++void expect_sp_memory_share(const struct sp_memory_descriptor *descriptor,
++			    const struct sp_memory_access_descriptor acc_desc[],
++			    uint32_t acc_desc_count,
++			    const struct sp_memory_region regions[],
++			    uint32_t region_count, const uint64_t *handle,
++			    sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_share")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_share(struct sp_memory_descriptor *descriptor,
++			  struct sp_memory_access_descriptor acc_desc[],
++			  uint32_t acc_desc_count,
++			  struct sp_memory_region regions[],
++			  uint32_t region_count, uint64_t *handle)
++{
++	return mock()
++		.actualCall("sp_memory_share")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_share_dynamic(const struct sp_memory_descriptor *descriptor,
++				    const struct sp_memory_access_descriptor acc_desc[],
++				    uint32_t acc_desc_count,
++				    const struct sp_memory_region regions[],
++				    uint32_t region_count, const uint64_t *handle,
++				    sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_share_dynamic")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameterReturning("handle", handle, sizeof(*handle))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_share_dynamic(struct sp_memory_descriptor *descriptor,
++				  struct sp_memory_access_descriptor acc_desc[],
++				  uint32_t acc_desc_count,
++				  struct sp_memory_region regions[],
++				  uint32_t region_count, uint64_t *handle,
++				  struct ffa_mem_transaction_buffer *buffer)
++{
++	if (buffer == NULL) { // LCOV_EXCL_BR_LINE
++		FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
++	}
++
++	return mock()
++		.actualCall("sp_memory_share_dynamic")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(*descriptor))
++		.withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc) * acc_desc_count)
++		.withUnsignedIntParameter("acc_desc_count", acc_desc_count)
++		.withMemoryBufferParameter("regions", (const unsigned char *)regions,
++					   sizeof(*regions) * region_count)
++		.withUnsignedIntParameter("region_count", region_count)
++		.withOutputParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_share_dynamic_is_supported(const bool *supported, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_share_dynamic_is_supported")
++		.withOutputParameterReturning("supported", supported, sizeof(*supported))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_share_dynamic_is_supported(bool *supported)
++{
++	return mock()
++		.actualCall("sp_memory_share_dynamic_is_supported")
++		.withOutputParameter("supported", supported)
++		.returnIntValue();
++}
++
++void expect_sp_memory_retrieve(const struct sp_memory_descriptor *descriptor,
++			       const struct sp_memory_access_descriptor *req_acc_desc,
++			       const struct sp_memory_access_descriptor *resp_acc_desc,
++			       const struct sp_memory_region in_regions[],
++			       const struct sp_memory_region out_regions[],
++			       uint32_t in_region_count,
++			       const uint32_t *out_region_count, uint64_t handle,
++			       sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_retrieve")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(descriptor))
++		.withMemoryBufferParameter("req_acc_desc", (const unsigned char *)req_acc_desc,
++					   sizeof(*req_acc_desc))
++		.withOutputParameterReturning("resp_acc_desc",
++					      (const unsigned char *)resp_acc_desc,
++					      sizeof(*resp_acc_desc))
++		.withMemoryBufferParameter("in_regions", (const unsigned char *)in_regions,
++					   sizeof(*in_regions) * in_region_count)
++		.withOutputParameterReturning("out_regions", out_regions,
++					      sizeof(*out_regions) * *out_region_count)
++		.withUnsignedIntParameter("in_region_count", in_region_count)
++		.withOutputParameterReturning("out_region_count", out_region_count,
++					      sizeof(*out_region_count))
++		.withUnsignedLongIntParameter("handle", handle)
++		.andReturnValue(result);
++
++}
++
++sp_result sp_memory_retrieve(struct sp_memory_descriptor *descriptor,
++			     struct sp_memory_access_descriptor *acc_desc,
++			     struct sp_memory_region regions[],
++			     uint32_t in_region_count,
++			     uint32_t *out_region_count, uint64_t handle)
++{
++	return mock()
++		.actualCall("sp_memory_retrieve")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(descriptor))
++		.withMemoryBufferParameter("req_acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withOutputParameter("resp_acc_desc", acc_desc)
++		.withMemoryBufferParameter("in_regions", (const unsigned char *)regions,
++					   sizeof(*regions) * in_region_count)
++		.withOutputParameter("out_regions", regions)
++		.withUnsignedIntParameter("in_region_count", in_region_count)
++		.withOutputParameter("out_region_count", out_region_count)
++		.withUnsignedLongIntParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_retrieve_dynamic(const struct sp_memory_descriptor *descriptor,
++				       const struct sp_memory_access_descriptor *req_acc_desc,
++				       const struct sp_memory_access_descriptor *resp_acc_desc,
++				       const struct sp_memory_region in_regions[],
++				       const struct sp_memory_region out_regions[],
++				       uint32_t in_region_count,
++				       const uint32_t *out_region_count, uint64_t handle,
++				       sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_retrieve")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(descriptor))
++		.withMemoryBufferParameter("req_acc_desc", (const unsigned char *)req_acc_desc,
++					   sizeof(*req_acc_desc))
++		.withOutputParameterReturning("resp_acc_desc",
++					      (const unsigned char *)resp_acc_desc,
++					      sizeof(*resp_acc_desc))
++		.withMemoryBufferParameter("in_regions", (const unsigned char *)in_regions,
++					   sizeof(*in_regions) * in_region_count)
++		.withOutputParameterReturning("out_regions", out_regions,
++					      sizeof(*out_regions) * *out_region_count)
++		.withUnsignedIntParameter("in_region_count", in_region_count)
++		.withOutputParameterReturning("out_region_count", out_region_count,
++					      sizeof(*out_region_count))
++		.withUnsignedLongIntParameter("handle", handle)
++		.andReturnValue(result);
++}
++
++sp_result
++sp_memory_retrieve_dynamic(struct sp_memory_descriptor *descriptor,
++			   struct sp_memory_access_descriptor *acc_desc,
++			   struct sp_memory_region regions[],
++			   uint32_t in_region_count, uint32_t *out_region_count,
++			   uint64_t handle,
++			   struct ffa_mem_transaction_buffer *buffer)
++{
++	if (buffer == NULL) { // LCOV_EXCL_BR_LINE
++		FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
++	}
++
++	return mock()
++		.actualCall("sp_memory_retrieve")
++		.withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
++					   sizeof(descriptor))
++		.withMemoryBufferParameter("req_acc_desc", (const unsigned char *)acc_desc,
++					   sizeof(*acc_desc))
++		.withOutputParameter("resp_acc_desc", acc_desc)
++		.withMemoryBufferParameter("in_regions", (const unsigned char *)regions,
++					   sizeof(*regions) * in_region_count)
++		.withOutputParameter("out_regions", regions)
++		.withUnsignedIntParameter("in_region_count", in_region_count)
++		.withOutputParameter("out_region_count", out_region_count)
++		.withUnsignedLongIntParameter("handle", handle)
++		.returnIntValue();
++}
++
++void expect_sp_memory_retrieve_dynamic_is_supported(const bool *supported, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_retrieve_dynamic_is_supported")
++		.withOutputParameterReturning("supported", supported, sizeof(*supported))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_retrieve_dynamic_is_supported(bool *supported)
++{
++	return mock()
++		.actualCall("sp_memory_retrieve_dynamic_is_supported")
++		.withOutputParameter("supported", supported)
++		.returnIntValue();
++}
++
++void expect_sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
++			         uint32_t endpoint_count,
++			         const struct sp_memory_transaction_flags *flags,
++				 sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_relinquish")
++		.withUnsignedLongIntParameter("handle", handle)
++		.withMemoryBufferParameter("endpoints", (const unsigned char *)endpoints,
++					   sizeof(*endpoints) * endpoint_count)
++		.withMemoryBufferParameter("flags", (const unsigned char *)flags, sizeof(*flags))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
++			       uint32_t endpoint_count,
++			       struct sp_memory_transaction_flags *flags)
++{
++	return mock()
++		.actualCall("sp_memory_relinquish")
++		.withUnsignedLongIntParameter("handle", handle)
++		.withMemoryBufferParameter("endpoints", (const unsigned char *)endpoints,
++					   sizeof(*endpoints) * endpoint_count)
++		.withMemoryBufferParameter("flags", (const unsigned char *)flags, sizeof(*flags))
++		.returnIntValue();
++}
++
++void expect_sp_memory_reclaim(uint64_t handle, uint32_t flags, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_reclaim")
++		.withUnsignedLongIntParameter("handle", handle)
++		.withUnsignedIntParameter("flags", flags)
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_reclaim(uint64_t handle, uint32_t flags)
++{
++	return mock()
++		.actualCall("sp_memory_reclaim")
++		.withUnsignedLongIntParameter("handle", handle)
++		.withUnsignedIntParameter("flags", flags)
++		.returnIntValue();
++}
++
++void expect_sp_memory_permission_get(const void *base_address, const struct sp_mem_perm *mem_perm,
++				     sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_permission_set")
++		.withConstPointerParameter("base_address", base_address)
++		.withOutputParameterReturning("mem_perm", mem_perm,
++					      sizeof(*mem_perm))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_permission_get(const void *base_address,
++				   struct sp_mem_perm *mem_perm)
++{
++	return mock()
++		.actualCall("sp_memory_permission_set")
++		.withConstPointerParameter("base_address", base_address)
++		.withOutputParameter("mem_perm", mem_perm)
++		.returnIntValue();
++}
++
++void expect_sp_memory_permission_set(const void *base_address, size_t region_size,
++				     const struct sp_mem_perm *mem_perm, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_memory_permission_set")
++		.withConstPointerParameter("base_address", base_address)
++		.withUnsignedLongIntParameter("region_size", region_size)
++		.withMemoryBufferParameter("mem_perm", (const unsigned char *)mem_perm,
++					   sizeof(*mem_perm))
++		.andReturnValue(result);
++}
++
++sp_result sp_memory_permission_set(const void *base_address, size_t region_size,
++				   const struct sp_mem_perm *mem_perm)
++{
++	return mock()
++		.actualCall("sp_memory_permission_set")
++		.withConstPointerParameter("base_address", base_address)
++		.withUnsignedLongIntParameter("region_size", region_size)
++		.withMemoryBufferParameter("mem_perm", (const unsigned char *)mem_perm,
++					   sizeof(*mem_perm))
++		.returnIntValue();
++}
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
+new file mode 100644
+index 0000000..458d2af
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
+@@ -0,0 +1,98 @@
++/* SPDX-License-Identifier: BSD-3-Clause */
++/*
++ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
++ */
++
++#ifndef LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_
++#define LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_
++
++#include "../include/sp_memory_management.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++void expect_sp_memory_donate(const struct sp_memory_descriptor *descriptor,
++			     const struct sp_memory_access_descriptor *acc_desc,
++			     const struct sp_memory_region regions[],
++			     uint32_t region_count, const uint64_t *handle,
++			     sp_result result);
++
++void expect_sp_memory_donate_dynamic(const struct sp_memory_descriptor *descriptor,
++				     const struct sp_memory_access_descriptor *acc_desc,
++				     const struct sp_memory_region regions[],
++				     uint32_t region_count, const uint64_t *handle,
++				     sp_result result);
++
++void expect_sp_memory_donate_dynamic_is_supported(const bool *supported, sp_result result);
++
++void expect_sp_memory_lend(const struct sp_memory_descriptor *descriptor,
++			   const struct sp_memory_access_descriptor acc_desc[],
++			   uint32_t acc_desc_count,
++			   const struct sp_memory_region regions[],
++			   uint32_t region_count, const uint64_t *handle,
++			   sp_result result);
++
++void expect_sp_memory_lend_dynamic(const struct sp_memory_descriptor *descriptor,
++				   const struct sp_memory_access_descriptor acc_desc[],
++				   uint32_t acc_desc_count,
++				   const struct sp_memory_region regions[],
++				   const uint32_t region_count, const uint64_t *handle,
++				   sp_result result);
++
++void expect_sp_memory_lend_dynamic_is_supported(const bool *supported, sp_result result);
++
++void expect_sp_memory_share(const struct sp_memory_descriptor *descriptor,
++			    const struct sp_memory_access_descriptor acc_desc[],
++			    uint32_t acc_desc_count,
++			    const struct sp_memory_region regions[],
++			    uint32_t region_count, const uint64_t *handle,
++			    sp_result result);
++
++void expect_sp_memory_share_dynamic(const struct sp_memory_descriptor *descriptor,
++				    const struct sp_memory_access_descriptor acc_desc[],
++				    uint32_t acc_desc_count,
++				    const struct sp_memory_region regions[],
++				    uint32_t region_count, const uint64_t *handle,
++				    sp_result result);
++
++void expect_sp_memory_share_dynamic_is_supported(const bool *supported, sp_result result);
++
++void expect_sp_memory_retrieve(const struct sp_memory_descriptor *descriptor,
++			       const struct sp_memory_access_descriptor *req_acc_desc,
++			       const struct sp_memory_access_descriptor *resp_acc_desc,
++			       const struct sp_memory_region in_regions[],
++			       const struct sp_memory_region out_regions[],
++			       uint32_t in_region_count,
++			       const uint32_t *out_region_count, uint64_t handle,
++			       sp_result result);
++
++void expect_sp_memory_retrieve_dynamic(const struct sp_memory_descriptor *descriptor,
++				       const struct sp_memory_access_descriptor *req_acc_desc,
++				       const struct sp_memory_access_descriptor *resp_acc_desc,
++				       const struct sp_memory_region in_regions[],
++				       const struct sp_memory_region out_regions[],
++				       uint32_t in_region_count,
++				       const uint32_t *out_region_count, uint64_t handle,
++				       sp_result result);
++
++void expect_sp_memory_retrieve_dynamic_is_supported(const bool *supported, sp_result result);
++
++void expect_sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
++				 uint32_t endpoint_count,
++				 const struct sp_memory_transaction_flags *flags,
++				 sp_result result);
++
++void expect_sp_memory_reclaim(uint64_t handle, uint32_t flags, sp_result result);
++
++void expect_sp_memory_permission_get(const void *base_address, const struct sp_mem_perm *mem_perm,
++				     sp_result result);
++
++void expect_sp_memory_permission_set(const void *base_address, size_t region_size,
++				     const struct sp_mem_perm *mem_perm, sp_result result);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_ */
+diff --git a/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp b/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
+new file mode 100644
+index 0000000..387b50f
+--- /dev/null
++++ b/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
+@@ -0,0 +1,260 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include <CppUTest/TestHarness.h>
++#include "mock_sp_memory_management.h"
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++
++static const struct sp_memory_descriptor expected_descriptor = {
++	.sender_id = 0xfedc,
++	.memory_type = sp_memory_type_normal_memory,
++	.mem_region_attr = {.normal_memory = {
++		.cacheability = sp_cacheability_write_back,
++		.shareability = sp_shareability_inner_shareable
++	}},
++	.flags = {
++		.zero_memory = true,
++		.operation_time_slicing = true,
++		.zero_memory_after_relinquish = true,
++		.transaction_type = sp_memory_transaction_type_relayer_specified,
++		.alignment_hint = 0x2000
++	},
++	.tag = 0x0123456789abcdefULL
++};
++static const struct sp_memory_access_descriptor expected_acc_desc[] = {
++	{
++		.receiver_id = 0xfafa,
++		.instruction_access = sp_instruction_access_executable,
++		.data_access = sp_data_access_read_only
++	}, {
++		.receiver_id = 0xc1ca,
++		.instruction_access = sp_instruction_access_not_executable,
++		.data_access = sp_data_access_read_write
++	}
++};
++static const struct sp_memory_region expected_regions[2] = {
++	{.address = (void *)0x01234567, .page_count = 0x89abcdef},
++	{.address = (void *)0x12345670, .page_count = 0x9abcdef8},
++};
++static const uint64_t expected_handle = 0xabcdef0123456789ULL;
++static const void *expected_address = (const void *)0x234567879;
++static const struct sp_mem_perm expected_mem_perm = {
++	.data_access = sp_mem_perm_data_perm_read_write,
++	.instruction_access = sp_mem_perm_instruction_perm_non_executable,
++};
++
++TEST_GROUP(mock_sp_memory_management)
++{
++	TEST_SETUP()
++	{
++		memset(&descriptor, 0x00, sizeof(descriptor));
++		memset(&acc_desc, 0x00, sizeof(acc_desc));
++		memset(&regions, 0x00, sizeof(regions));
++		handle = 0;
++		supported = false;
++	}
++
++	TEST_TEARDOWN()
++	{
++		mock().checkExpectations();
++		mock().clear();
++	}
++
++	struct sp_memory_descriptor descriptor;
++	struct sp_memory_access_descriptor acc_desc[2];
++	struct sp_memory_region regions[2];
++	uint64_t handle;
++	bool supported;
++	struct ffa_mem_transaction_buffer tr_buffer;
++
++	static const sp_result result = -1;
++};
++
++TEST(mock_sp_memory_management, sp_memory_donate)
++{
++	descriptor = expected_descriptor;
++	acc_desc[0] = expected_acc_desc[0];
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_donate(&expected_descriptor, expected_acc_desc, expected_regions, 2,
++				&expected_handle, result);
++	LONGS_EQUAL(result, sp_memory_donate(&descriptor, acc_desc, regions, 2, &handle));
++
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_donate_dynamic)
++{
++	descriptor = expected_descriptor;
++	acc_desc[0] = expected_acc_desc[0];
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_donate_dynamic(&expected_descriptor, expected_acc_desc, expected_regions,
++					2, &expected_handle, result);
++	LONGS_EQUAL(result, sp_memory_donate_dynamic(&descriptor, acc_desc, regions, 2, &handle,
++						     &tr_buffer));
++
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_donate_dynamic_is_supported)
++{
++	const bool expected_supported = true;
++	expect_sp_memory_donate_dynamic_is_supported(&expected_supported, result);
++	LONGS_EQUAL(result, sp_memory_donate_dynamic_is_supported(&supported));
++	CHECK_TRUE(supported);
++}
++
++TEST(mock_sp_memory_management, sp_memory_lend)
++{
++	descriptor = expected_descriptor;
++	memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_lend(&descriptor, acc_desc, 2, regions, 2, &expected_handle, result);
++	LONGS_EQUAL(result, sp_memory_lend(&descriptor, acc_desc, 2, regions, 2, &handle));
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_lend_dynamic)
++{
++	descriptor = expected_descriptor;
++	memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_lend_dynamic(&descriptor, acc_desc, 2, regions, 2, &expected_handle,
++				      result);
++	LONGS_EQUAL(result, sp_memory_lend_dynamic(&descriptor, acc_desc, 2, regions, 2, &handle,
++						   &tr_buffer));
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_lend_dynamic_is_supported)
++{
++	const bool expected_supported = true;
++	expect_sp_memory_lend_dynamic_is_supported(&expected_supported, result);
++	LONGS_EQUAL(result, sp_memory_lend_dynamic_is_supported(&supported));
++	CHECK_TRUE(supported);
++}
++
++TEST(mock_sp_memory_management, sp_memory_share)
++{
++	descriptor = expected_descriptor;
++	memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_share(&descriptor, acc_desc, 2, regions, 2, &expected_handle, result);
++	LONGS_EQUAL(result, sp_memory_share(&descriptor, acc_desc, 2, regions, 2, &handle));
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_share_dynamic)
++{
++	descriptor = expected_descriptor;
++	memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
++	memcpy(regions, expected_regions, sizeof(regions));
++
++	expect_sp_memory_share_dynamic(&descriptor, acc_desc, 2, regions, 2, &expected_handle,
++				      result);
++	LONGS_EQUAL(result, sp_memory_share_dynamic(&descriptor, acc_desc, 2, regions, 2, &handle,
++						   &tr_buffer));
++	UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
++}
++
++TEST(mock_sp_memory_management, sp_memory_share_dynamic_is_supported)
++{
++	const bool expected_supported = true;
++	expect_sp_memory_share_dynamic_is_supported(&expected_supported, result);
++	LONGS_EQUAL(result, sp_memory_share_dynamic_is_supported(&supported));
++	CHECK_TRUE(supported);
++}
++
++TEST(mock_sp_memory_management, sp_memory_retrieve)
++{
++	const uint32_t expected_region_count = 1;
++	struct sp_memory_access_descriptor acc_desc = expected_acc_desc[0];
++	struct sp_memory_region region = expected_regions[0];
++	uint32_t out_region_count = 0;
++
++	descriptor = expected_descriptor;
++
++	expect_sp_memory_retrieve(&expected_descriptor, &expected_acc_desc[0],
++				  &expected_acc_desc[1], &expected_regions[0],
++				  &expected_regions[1], 1, &expected_region_count, expected_handle,
++				  result);
++	LONGS_EQUAL(result, sp_memory_retrieve(&descriptor, &acc_desc, &region, 1,
++					       &out_region_count, expected_handle));
++	MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc));
++	MEMCMP_EQUAL(&region, &expected_regions[1], sizeof(region));
++	UNSIGNED_LONGS_EQUAL(expected_region_count, out_region_count);
++}
++
++TEST(mock_sp_memory_management, sp_memory_retrieve_dynamic)
++{
++	const uint32_t expected_region_count = 1;
++	struct sp_memory_access_descriptor acc_desc = expected_acc_desc[0];
++	struct sp_memory_region region = expected_regions[0];
++	uint32_t out_region_count = 0;
++
++	descriptor = expected_descriptor;
++
++	expect_sp_memory_retrieve_dynamic(&expected_descriptor, &expected_acc_desc[0],
++					  &expected_acc_desc[1], &expected_regions[0],
++					  &expected_regions[1], 1, &expected_region_count,
++					  expected_handle, result);
++	LONGS_EQUAL(result, sp_memory_retrieve_dynamic(&descriptor, &acc_desc, &region, 1,
++						       &out_region_count, expected_handle,
++						       &tr_buffer));
++	MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc));
++	MEMCMP_EQUAL(&region, &expected_regions[1], sizeof(region));
++	UNSIGNED_LONGS_EQUAL(expected_region_count, out_region_count);
++}
++
++TEST(mock_sp_memory_management, sp_memory_retrieve_dynamic_is_supported)
++{
++	const bool expected_supported = true;
++	expect_sp_memory_retrieve_dynamic_is_supported(&expected_supported, result);
++	LONGS_EQUAL(result, sp_memory_retrieve_dynamic_is_supported(&supported));
++	CHECK_TRUE(supported);
++}
++
++TEST(mock_sp_memory_management, sp_memory_relinquish)
++{
++	uint16_t endpoints[3] = {1, 2, 3};
++	struct sp_memory_transaction_flags flags = {0}; // TODO: flags
++
++	expect_sp_memory_relinquish(expected_handle, endpoints, 3, &flags, result);
++	LONGS_EQUAL(result, sp_memory_relinquish(expected_handle, endpoints, 3, &flags));
++}
++
++TEST(mock_sp_memory_management, sp_memory_reclaim)
++{
++	uint32_t flags = 0xffffffff;
++
++	expect_sp_memory_reclaim(expected_handle, flags, result);
++	LONGS_EQUAL(result, sp_memory_reclaim(expected_handle, flags));
++}
++
++TEST(mock_sp_memory_management, sp_memory_permission_get)
++{
++	struct sp_mem_perm mem_perm;
++
++	memset(&mem_perm, 0x00, sizeof(mem_perm));
++
++	expect_sp_memory_permission_get(expected_address, &expected_mem_perm, result);
++	LONGS_EQUAL(result, sp_memory_permission_get(expected_address, &mem_perm));
++	MEMCMP_EQUAL(&expected_mem_perm, &mem_perm, sizeof(expected_mem_perm));
++}
++
++TEST(mock_sp_memory_management, sp_memory_permission_set)
++{
++	size_t size = 0x7654;
++
++	expect_sp_memory_permission_set(expected_address, size, &expected_mem_perm, result);
++	LONGS_EQUAL(result, sp_memory_permission_set(expected_address, size, &expected_mem_perm));
++}
+diff --git a/components/messaging/ffa/libsp/tests.cmake b/components/messaging/ffa/libsp/tests.cmake
+index 7b52248..63abb57 100644
+--- a/components/messaging/ffa/libsp/tests.cmake
++++ b/components/messaging/ffa/libsp/tests.cmake
+@@ -134,6 +134,19 @@ unit_test_add_suite(
+ 		-DARM64
+ )
+ 
++unit_test_add_suite(
++	NAME libsp_mock_sp_memory_management
++	SOURCES
++		${CMAKE_CURRENT_LIST_DIR}/test/test_mock_sp_memory_management.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_memory_management.cpp
++	INCLUDE_DIRECTORIES
++		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
++		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
++	COMPILE_DEFINITIONS
++		-DARM64
++)
++
+ unit_test_add_suite(
+ 	NAME libsp_sp_memory_management_internals
+ 	SOURCES
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0020-Add-mock-for-libsp-sp_messaging.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0020-Add-mock-for-libsp-sp_messaging.patch
new file mode 100644
index 0000000..3057051
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0020-Add-mock-for-libsp-sp_messaging.patch
@@ -0,0 +1,284 @@
+From 1e5ce152214e22a7cd9617a5059e42c370351354 Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Fri, 17 Jun 2022 15:40:18 +0200
+Subject: [PATCH 20/24] Add mock for libsp/sp_messaging
+
+Add mock_sp_messaging for mocking sp_messaging part of libsp.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I87478027c61b41028682b10e2535a7e14cf6922f
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../messaging/ffa/libsp/mock/component.cmake  |  1 +
+ .../ffa/libsp/mock/mock_sp_messaging.cpp      | 86 +++++++++++++++++++
+ .../ffa/libsp/mock/mock_sp_messaging.h        | 39 +++++++++
+ .../mock/test/test_mock_sp_messaging.cpp      | 77 +++++++++++++++++
+ components/messaging/ffa/libsp/tests.cmake    | 14 +++
+ 5 files changed, 217 insertions(+)
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_messaging.cpp
+ create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_messaging.h
+ create mode 100644 components/messaging/ffa/libsp/mock/test/test_mock_sp_messaging.cpp
+
+diff --git a/components/messaging/ffa/libsp/mock/component.cmake b/components/messaging/ffa/libsp/mock/component.cmake
+index eb0d28c..375cb46 100644
+--- a/components/messaging/ffa/libsp/mock/component.cmake
++++ b/components/messaging/ffa/libsp/mock/component.cmake
+@@ -14,6 +14,7 @@ target_sources(${TGT} PRIVATE
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_internal_api.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_discovery.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_memory_management.cpp"
++	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_messaging.cpp"
+ 	"${CMAKE_CURRENT_LIST_DIR}/mock_sp_rxtx.cpp"
+ 	)
+ 
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_messaging.cpp b/components/messaging/ffa/libsp/mock/mock_sp_messaging.cpp
+new file mode 100644
+index 0000000..522abb3
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_messaging.cpp
+@@ -0,0 +1,86 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include "mock_sp_messaging.h"
++
++void expect_sp_msg_wait(const struct sp_msg *msg, sp_result result)
++{
++	mock()
++		.expectOneCall("sp_msg_wait")
++		.withOutputParameterReturning("msg", msg, sizeof(*msg))
++		.andReturnValue(result);
++}
++
++sp_result sp_msg_wait(struct sp_msg *msg)
++{
++	return mock()
++		.actualCall("sp_msg_wait")
++		.withOutputParameter("msg", msg)
++		.returnIntValue();
++}
++
++void expect_sp_msg_send_direct_req(const struct sp_msg *req,
++				   const struct sp_msg *resp,
++				   sp_result result)
++{
++	mock()
++		.expectOneCall("sp_msg_send_direct_req")
++		.withMemoryBufferParameter("req", (const unsigned char *)req, sizeof(*req))
++		.withOutputParameterReturning("resp", resp, sizeof(*resp))
++		.andReturnValue(result);
++}
++
++sp_result sp_msg_send_direct_req(const struct sp_msg *req, struct sp_msg *resp)
++{
++	return mock()
++		.actualCall("sp_msg_send_direct_req")
++		.withMemoryBufferParameter("req", (const unsigned char *)req, sizeof(*req))
++		.withOutputParameter("resp", resp)
++		.returnIntValue();
++}
++
++void expect_sp_msg_send_direct_resp(const struct sp_msg *resp,
++				    const struct sp_msg *req,
++				    sp_result result)
++{
++	mock()
++		.expectOneCall("sp_msg_send_direct_resp")
++		.withMemoryBufferParameter("resp", (const unsigned char *)resp, sizeof(*resp))
++		.withOutputParameterReturning("req", req, sizeof(*req))
++		.andReturnValue(result);
++}
++
++sp_result sp_msg_send_direct_resp(const struct sp_msg *resp,
++				  struct sp_msg *req)
++{
++	return mock()
++		.actualCall("sp_msg_send_direct_resp")
++		.withMemoryBufferParameter("resp", (const unsigned char *)resp, sizeof(*resp))
++		.withOutputParameter("req", req)
++		.returnIntValue();
++}
++
++#if FFA_DIRECT_MSG_ROUTING_EXTENSION
++void expect_sp_msg_send_rc_req(const struct sp_msg *req,
++			       const struct sp_msg *resp,
++			       sp_result result)
++{
++	mock()
++		.expectOneCall("sp_msg_send_rc_req")
++		.withMemoryBufferParameter("req", (const unsigned char *)req, sizeof(*req))
++		.withOutputParameterReturning("resp", resp, sizeof(*resp))
++		.andReturnValue(result);
++}
++
++sp_result sp_msg_send_rc_req(const struct sp_msg *req, struct sp_msg *resp)
++{
++	return mock()
++		.actualCall("sp_msg_send_rc_req")
++		.withMemoryBufferParameter("req", (const unsigned char *)req, sizeof(*req))
++		.withOutputParameter("resp", resp)
++		.returnIntValue();
++}
++#endif /* FFA_DIRECT_MSG_ROUTING_EXTENSION */
+diff --git a/components/messaging/ffa/libsp/mock/mock_sp_messaging.h b/components/messaging/ffa/libsp/mock/mock_sp_messaging.h
+new file mode 100644
+index 0000000..8183012
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/mock_sp_messaging.h
+@@ -0,0 +1,39 @@
++/* SPDX-License-Identifier: BSD-3-Clause */
++/*
++ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
++ */
++
++#ifndef LIBSP_MOCK_MOCK_SP_MESSAGING_H_
++#define LIBSP_MOCK_MOCK_SP_MESSAGING_H_
++
++#include "../include/sp_messaging.h"
++
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++void expect_sp_msg_wait(const struct sp_msg *msg, sp_result result);
++
++
++void expect_sp_msg_send_direct_req(const struct sp_msg *req,
++				   const struct sp_msg *resp,
++				   sp_result result);
++
++
++void expect_sp_msg_send_direct_resp(const struct sp_msg *resp,
++				    const struct sp_msg *req,
++				    sp_result result);
++
++#if FFA_DIRECT_MSG_ROUTING_EXTENSION
++void expect_sp_msg_send_rc_req(const struct sp_msg *req,
++			       const struct sp_msg *resp,
++			       sp_result result);
++#endif /* FFA_DIRECT_MSG_ROUTING_EXTENSION */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* LIBSP_MOCK_MOCK_SP_MESSAGING_H_ */
+diff --git a/components/messaging/ffa/libsp/mock/test/test_mock_sp_messaging.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_sp_messaging.cpp
+new file mode 100644
+index 0000000..bfc7959
+--- /dev/null
++++ b/components/messaging/ffa/libsp/mock/test/test_mock_sp_messaging.cpp
+@@ -0,0 +1,77 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright (c) 2022, Arm Limited. All rights reserved.
++ */
++
++#include <CppUTestExt/MockSupport.h>
++#include <CppUTest/TestHarness.h>
++#include "mock_sp_messaging.h"
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++
++static const struct sp_msg expected_req = {
++	.source_id = 0x0123,
++	.destination_id = 0x4567,
++	.args = {0x89abcdef, 0xfedcba98, 0x76543210, 0xabcdef01}
++};
++static const struct sp_msg expected_resp = {
++	.source_id = 0x1234,
++	.destination_id = 0x5678,
++	.args = {0x9abcdef8, 0xedcba98f, 0x65432107, 0xbcdef01a}
++};
++
++TEST_GROUP(mock_sp_messaging)
++{
++	TEST_SETUP()
++	{
++		memset(&req, 0x00, sizeof(req));
++		memset(&resp, 0x00, sizeof(resp));
++	}
++
++	TEST_TEARDOWN()
++	{
++		mock().checkExpectations();
++		mock().clear();
++	}
++
++	struct sp_msg req;
++	struct sp_msg resp;
++	static const sp_result result = -1;
++};
++
++TEST(mock_sp_messaging, sp_msg_wait)
++{
++	expect_sp_msg_wait(&expected_req, result);
++	LONGS_EQUAL(result, sp_msg_wait(&req));
++	MEMCMP_EQUAL(&expected_req, &req, sizeof(expected_req));
++}
++
++TEST(mock_sp_messaging, sp_msg_send_direct_req)
++{
++	req = expected_req;
++
++	expect_sp_msg_send_direct_req(&expected_req, &expected_resp, result);
++	LONGS_EQUAL(result, sp_msg_send_direct_req(&req, &resp));
++	MEMCMP_EQUAL(&expected_resp, &resp, sizeof(expected_resp));
++}
++
++TEST(mock_sp_messaging, sp_msg_send_direct_resp)
++{
++	resp = expected_resp;
++
++	expect_sp_msg_send_direct_resp(&expected_resp, &expected_req, result);
++	LONGS_EQUAL(result, sp_msg_send_direct_resp(&resp, &req));
++	MEMCMP_EQUAL(&expected_req, &req, sizeof(expected_req));
++}
++
++#if FFA_DIRECT_MSG_ROUTING_EXTENSION
++TEST(mock_sp_messaging, sp_msg_send_rc_req)
++{
++	req = expected_req;
++
++	expect_sp_msg_send_rc_req(&expected_req, &expected_resp, result);
++	LONGS_EQUAL(result, sp_msg_send_rc_req(&req, &resp));
++	MEMCMP_EQUAL(&expected_resp, &resp, sizeof(expected_resp));
++}
++#endif /* FFA_DIRECT_MSG_ROUTING_EXTENSION */
+diff --git a/components/messaging/ffa/libsp/tests.cmake b/components/messaging/ffa/libsp/tests.cmake
+index 63abb57..eb0b41e 100644
+--- a/components/messaging/ffa/libsp/tests.cmake
++++ b/components/messaging/ffa/libsp/tests.cmake
+@@ -176,6 +176,20 @@ unit_test_add_suite(
+ 		-DARM64
+ )
+ 
++unit_test_add_suite(
++	NAME libsp_mock_sp_messaging
++	SOURCES
++		${CMAKE_CURRENT_LIST_DIR}/mock/test/test_mock_sp_messaging.cpp
++		${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_messaging.cpp
++	INCLUDE_DIRECTORIES
++		${CMAKE_CURRENT_LIST_DIR}/include/
++		${CMAKE_CURRENT_LIST_DIR}/mock
++		${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
++	COMPILE_DEFINITIONS
++		-DARM64
++		-DFFA_DIRECT_MSG_ROUTING_EXTENSION=1
++)
++
+ unit_test_add_suite(
+ 	NAME libsp_sp_messaging_with_routing_extension
+ 	SOURCES
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0021-Add-64-bit-direct-message-handling-to-libsp.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0021-Add-64-bit-direct-message-handling-to-libsp.patch
new file mode 100644
index 0000000..a037c27
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0021-Add-64-bit-direct-message-handling-to-libsp.patch
@@ -0,0 +1,2552 @@
+From a9edc50077d72cdd7e40ba3f03aee974848cd532 Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Tue, 19 Jul 2022 17:38:00 +0200
+Subject: [PATCH 21/24] Add 64 bit direct message handling to libsp
+
+* Change direct message struct to allow 64 bit arguments
+* Add 64 bit direct message req/resp functions to FF-A layer
+* Distinguish 32/64 bit messages on SP layer by field in sp_msg
+* Update tests and mocks
+
+The FF-A direct message response must match the request's 32/64bit mode
+which is the responsibility of the callee and it should be validated by
+the SPMC.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: Ibbd64ca0291dfe142a23471a649a07ba1a036824
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ components/messaging/ffa/libsp/ffa.c          |  84 ++-
+ .../libsp/ffa_direct_msg_routing_extension.c  |  28 +-
+ .../messaging/ffa/libsp/include/ffa_api.h     |  58 +-
+ .../ffa/libsp/include/ffa_api_defines.h       |   5 +
+ .../ffa/libsp/include/ffa_api_types.h         |   7 +-
+ .../ffa/libsp/include/sp_messaging.h          |   9 +-
+ .../messaging/ffa/libsp/mock/mock_ffa_api.cpp | 100 +++-
+ .../messaging/ffa/libsp/mock/mock_ffa_api.h   |  34 +-
+ .../ffa/libsp/mock/test/test_mock_ffa_api.cpp |  50 +-
+ components/messaging/ffa/libsp/sp_messaging.c |  74 ++-
+ .../messaging/ffa/libsp/test/test_ffa_api.cpp | 337 ++++++++++--
+ .../ffa/libsp/test/test_sp_messaging.cpp      | 498 ++++++++++--------
+ .../rpc/ffarpc/caller/sp/ffarpc_caller.c      |  31 +-
+ .../rpc/ffarpc/endpoint/ffarpc_call_ep.c      |   4 +-
+ .../endpoint/sp/mm_communicate_call_ep.c      |  16 +-
+ .../smm-gateway/common/smm_gateway_sp.c       |   8 +-
+ 16 files changed, 961 insertions(+), 382 deletions(-)
+
+diff --git a/components/messaging/ffa/libsp/ffa.c b/components/messaging/ffa/libsp/ffa.c
+index 374e940..caacc79 100644
+--- a/components/messaging/ffa/libsp/ffa.c
++++ b/components/messaging/ffa/libsp/ffa.c
+@@ -33,11 +33,20 @@ static inline void ffa_unpack_direct_msg(struct ffa_params *svc_result,
+ 	msg->function_id = svc_result->a0;
+ 	msg->source_id = (svc_result->a1 >> 16);
+ 	msg->destination_id = svc_result->a1;
+-	msg->args[0] = svc_result->a3;
+-	msg->args[1] = svc_result->a4;
+-	msg->args[2] = svc_result->a5;
+-	msg->args[3] = svc_result->a6;
+-	msg->args[4] = svc_result->a7;
++
++	if (FFA_IS_32_BIT_FUNC(msg->function_id)) {
++		msg->args.args32[0] = svc_result->a3;
++		msg->args.args32[1] = svc_result->a4;
++		msg->args.args32[2] = svc_result->a5;
++		msg->args.args32[3] = svc_result->a6;
++		msg->args.args32[4] = svc_result->a7;
++	} else {
++		msg->args.args64[0] = svc_result->a3;
++		msg->args.args64[1] = svc_result->a4;
++		msg->args.args64[2] = svc_result->a5;
++		msg->args.args64[3] = svc_result->a6;
++		msg->args.args64[4] = svc_result->a7;
++	}
+ }
+ 
+ /*
+@@ -217,7 +226,7 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
+ 
+ 	if (result.a0 == FFA_ERROR) {
+ 		return ffa_get_errorcode(&result);
+-	} else if (result.a0 == FFA_MSG_SEND_DIRECT_REQ_32) {
++	} else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
+ 		ffa_unpack_direct_msg(&result, msg);
+ 	} else {
+ 		assert(result.a0 == FFA_SUCCESS_32);
+@@ -227,13 +236,15 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
+ 	return FFA_OK;
+ }
+ 
+-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+-				   uint32_t a1, uint32_t a2, uint32_t a3,
+-				   uint32_t a4, struct ffa_direct_msg *msg)
++static ffa_result ffa_msg_send_direct_req(uint32_t function_id, uint32_t resp_id,
++					  uint16_t source, uint16_t dest,
++					  uint64_t a0, uint64_t a1, uint64_t a2,
++					  uint64_t a3, uint64_t a4,
++					  struct ffa_direct_msg *msg)
+ {
+ 	struct ffa_params result = {0};
+ 
+-	ffa_svc(FFA_MSG_SEND_DIRECT_REQ_32,
++	ffa_svc(function_id,
+ 		SHIFT_U32(source, FFA_MSG_SEND_DIRECT_REQ_SOURCE_ID_SHIFT) |
+ 		dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
+ 
+@@ -244,7 +255,7 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+ 
+ 	if (result.a0 == FFA_ERROR) {
+ 		return ffa_get_errorcode(&result);
+-	} else if (result.a0 == FFA_MSG_SEND_DIRECT_RESP_32) {
++	} else if (result.a0 == resp_id) {
+ 		ffa_unpack_direct_msg(&result, msg);
+ 	} else {
+ 		assert(result.a0 == FFA_SUCCESS_32);
+@@ -254,13 +265,36 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+ 	return FFA_OK;
+ }
+ 
+-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+-				    uint32_t a1, uint32_t a2, uint32_t a3,
+-				    uint32_t a4, struct ffa_direct_msg *msg)
++ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
++				      uint32_t a0, uint32_t a1, uint32_t a2,
++				      uint32_t a3, uint32_t a4,
++				      struct ffa_direct_msg *msg)
++{
++	return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_32,
++				       FFA_MSG_SEND_DIRECT_RESP_32,
++				       source, dest, a0, a1, a2, a3, a4, msg);
++}
++
++ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
++				      uint64_t a0, uint64_t a1, uint64_t a2,
++				      uint64_t a3, uint64_t a4,
++				      struct ffa_direct_msg *msg)
++{
++	return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_64,
++				       FFA_MSG_SEND_DIRECT_RESP_64,
++				       source, dest, a0, a1, a2, a3, a4, msg);
++}
++
++static ffa_result ffa_msg_send_direct_resp(uint32_t function_id,
++					   uint16_t source, uint16_t dest,
++					   uint64_t a0, uint64_t a1,
++					   uint64_t a2, uint64_t a3,
++					   uint64_t a4,
++					   struct ffa_direct_msg *msg)
+ {
+ 	struct ffa_params result = {0};
+ 
+-	ffa_svc(FFA_MSG_SEND_DIRECT_RESP_32,
++	ffa_svc(function_id,
+ 		SHIFT_U32(source, FFA_MSG_SEND_DIRECT_RESP_SOURCE_ID_SHIFT) |
+ 		dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
+ 
+@@ -271,7 +305,7 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+ 
+ 	if (result.a0 == FFA_ERROR) {
+ 		return ffa_get_errorcode(&result);
+-	} else if (result.a0 == FFA_MSG_SEND_DIRECT_REQ_32) {
++	} else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
+ 		ffa_unpack_direct_msg(&result, msg);
+ 	} else {
+ 		assert(result.a0 == FFA_SUCCESS_32);
+@@ -281,6 +315,24 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+ 	return FFA_OK;
+ }
+ 
++ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
++				       uint32_t a0, uint32_t a1, uint32_t a2,
++				       uint32_t a3, uint32_t a4,
++				       struct ffa_direct_msg *msg)
++{
++	return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_32, source,
++					dest, a0, a1, a2, a3, a4, msg);
++}
++
++ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
++				      uint64_t a0, uint64_t a1, uint64_t a2,
++				      uint64_t a3, uint64_t a4,
++				      struct ffa_direct_msg *msg)
++{
++	return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_64, source,
++					dest, a0, a1, a2, a3, a4, msg);
++}
++
+ ffa_result ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
+ 			  void *buffer_address, uint32_t page_count,
+ 			  uint64_t *handle)
+diff --git a/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c b/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
+index 6813573..03a372f 100644
+--- a/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
++++ b/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include "ffa_direct_msg_routing_extension.h"
+@@ -20,23 +20,23 @@ static uint16_t callee_id = SP_ID_INVALID;
+ 
+ static bool is_rc_message(const struct ffa_direct_msg *msg)
+ {
+-	return msg->args[0] & FFA_ROUTING_EXT_RC_BIT;
++	return msg->args.args32[0] & FFA_ROUTING_EXT_RC_BIT;
+ }
+ 
+ static bool is_error_message(const struct ffa_direct_msg *msg)
+ {
+-	return msg->args[0] & FFA_ROUTING_EXT_ERROR_BIT;
++	return msg->args.args32[0] & FFA_ROUTING_EXT_ERROR_BIT;
+ }
+ 
+ static ffa_result get_error_code_from_message(const struct ffa_direct_msg *msg)
+ {
+-	return (ffa_result)msg->args[1];
++	return (ffa_result)msg->args.args32[1];
+ }
+ 
+ static ffa_result send_rc_error_message(struct ffa_direct_msg *req,
+ 					ffa_result error_code)
+ {
+-	return ffa_msg_send_direct_resp(req->destination_id, req->source_id,
++	return ffa_msg_send_direct_resp_32(req->destination_id, req->source_id,
+ 					(FFA_ROUTING_EXT_ERROR_BIT |
+ 					 FFA_ROUTING_EXT_RC_BIT),
+ 					error_code, 0, 0, 0, req);
+@@ -45,7 +45,7 @@ static ffa_result send_rc_error_message(struct ffa_direct_msg *req,
+ static ffa_result send_rc_error_message_to_rc_root(struct ffa_direct_msg *resp,
+ 						   ffa_result error_code)
+ {
+-	return ffa_msg_send_direct_req(own_id, callee_id,
++	return ffa_msg_send_direct_req_32(own_id, callee_id,
+ 				       (FFA_ROUTING_EXT_RC_BIT |
+ 					FFA_ROUTING_EXT_ERROR_BIT),
+ 				       error_code, 0, 0, 0, resp);
+@@ -128,10 +128,10 @@ ffa_result ffa_direct_msg_routing_ext_req_post_hook(struct ffa_direct_msg *resp)
+ 		/* Forwarding RC request towards the root (normal world) */
+ 		state = forwarding;
+ 
+-		ffa_res = ffa_msg_send_direct_resp(own_id, caller_id,
+-						   resp->args[0], resp->args[1],
+-						   resp->args[2], resp->args[3],
+-						   resp->args[4], &rc_resp);
++		ffa_res = ffa_msg_send_direct_resp_32(own_id, caller_id,
++						   resp->args.args32[0], resp->args.args32[1],
++						   resp->args.args32[2], resp->args.args32[3],
++						   resp->args.args32[4], &rc_resp);
+ 		if (ffa_res != FFA_OK)
+ 			goto forward_ffa_error_to_rc_root;
+ 
+@@ -145,9 +145,9 @@ ffa_result ffa_direct_msg_routing_ext_req_post_hook(struct ffa_direct_msg *resp)
+ 
+ 		/* Forwarding RC response towards the RC root. */
+ 		state = internal;
+-		ffa_res = ffa_msg_send_direct_req(
+-			own_id, callee_id, rc_resp.args[0], rc_resp.args[1],
+-			rc_resp.args[2], rc_resp.args[3], rc_resp.args[4],
++		ffa_res = ffa_msg_send_direct_req_32(
++			own_id, callee_id, rc_resp.args.args32[0], rc_resp.args.args32[1],
++			rc_resp.args.args32[2], rc_resp.args.args32[3], rc_resp.args.args32[4],
+ 			resp);
+ 
+ 		goto break_on_ffa_error;
+@@ -197,7 +197,7 @@ void ffa_direct_msg_routing_ext_resp_error_hook(void)
+ 
+ void ffa_direct_msg_routing_ext_rc_req_pre_hook(struct ffa_direct_msg *req)
+ {
+-	req->args[0] = FFA_ROUTING_EXT_RC_BIT;
++	req->args.args32[0] = FFA_ROUTING_EXT_RC_BIT;
+ 	state = rc_root;
+ }
+ 
+diff --git a/components/messaging/ffa/libsp/include/ffa_api.h b/components/messaging/ffa/libsp/include/ffa_api.h
+index ec5cb04..4b7073b 100644
+--- a/components/messaging/ffa/libsp/include/ffa_api.h
++++ b/components/messaging/ffa/libsp/include/ffa_api.h
+@@ -126,8 +126,8 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg);
+ /** Messaging interfaces */
+ 
+ /**
+- * @brief      Sends a partition message in parameter registers as a request and
+- *             blocks until the response is available.
++ * @brief      Sends a 32 bit partition message in parameter registers as a
++ *             request and blocks until the response is available.
+  * @note       The ffa_interrupt_handler function can be called during the
+  *             execution of this function
+  *
+@@ -138,13 +138,14 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg);
+  *
+  * @return     The FF-A error status code
+  */
+-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+-				   uint32_t a1, uint32_t a2, uint32_t a3,
+-				   uint32_t a4, struct ffa_direct_msg *msg);
++ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
++				      uint32_t a0, uint32_t a1, uint32_t a2,
++				      uint32_t a3, uint32_t a4,
++				      struct ffa_direct_msg *msg);
+ 
+ /**
+- * @brief      Sends a partition message in parameter registers as a response
+- *             and blocks until the response is available.
++ * @brief      Sends a 64 bit partition message in parameter registers as a
++ *             request and blocks until the response is available.
+  * @note       The ffa_interrupt_handler function can be called during the
+  *             execution of this function
+  *
+@@ -155,9 +156,46 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+  *
+  * @return     The FF-A error status code
+  */
+-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+-				    uint32_t a1, uint32_t a2, uint32_t a3,
+-				    uint32_t a4, struct ffa_direct_msg *msg);
++ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
++				      uint64_t a0, uint64_t a1, uint64_t a2,
++				      uint64_t a3, uint64_t a4,
++				      struct ffa_direct_msg *msg);
++
++/**
++ * @brief      Sends a 32 bit partition message in parameter registers as a
++ *             response and blocks until the response is available.
++ * @note       The ffa_interrupt_handler function can be called during the
++ *             execution of this function
++ *
++ * @param[in]  source            Source endpoint ID
++ * @param[in]  dest              Destination endpoint ID
++ * @param[in]  a0,a1,a2,a3,a4    Implementation defined message values
++ * @param[out] msg               The response message
++ *
++ * @return     The FF-A error status code
++ */
++ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
++				       uint32_t a0, uint32_t a1, uint32_t a2,
++				       uint32_t a3, uint32_t a4,
++				       struct ffa_direct_msg *msg);
++
++/**
++ * @brief      Sends a 64 bit partition message in parameter registers as a
++ *             response and blocks until the response is available.
++ * @note       The ffa_interrupt_handler function can be called during the
++ *             execution of this function
++ *
++ * @param[in]  source            Source endpoint ID
++ * @param[in]  dest              Destination endpoint ID
++ * @param[in]  a0,a1,a2,a3,a4    Implementation defined message values
++ * @param[out] msg               The response message
++ *
++ * @return     The FF-A error status code
++ */
++ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
++				       uint64_t a0, uint64_t a1, uint64_t a2,
++				       uint64_t a3, uint64_t a4,
++				       struct ffa_direct_msg *msg);
+ 
+ /**
+  * Memory management interfaces
+diff --git a/components/messaging/ffa/libsp/include/ffa_api_defines.h b/components/messaging/ffa/libsp/include/ffa_api_defines.h
+index 95bcb0c..163a0cd 100644
+--- a/components/messaging/ffa/libsp/include/ffa_api_defines.h
++++ b/components/messaging/ffa/libsp/include/ffa_api_defines.h
+@@ -58,6 +58,11 @@
+ #define FFA_MEM_PERM_GET		UINT32_C(0x84000088)
+ #define FFA_MEM_PERM_SET		UINT32_C(0x84000089)
+ 
++/* Utility macros */
++#define FFA_TO_32_BIT_FUNC(x)		((x) & (~UINT32_C(0x40000000)))
++#define FFA_IS_32_BIT_FUNC(x)		(((x) & UINT32_C(0x40000000)) == 0)
++#define FFA_IS_64_BIT_FUNC(x)		(((x) & UINT32_C(0x40000000)) != 0)
++
+ /* Special value for MBZ parameters */
+ #define FFA_PARAM_MBZ			UINT32_C(0x0)
+ 
+diff --git a/components/messaging/ffa/libsp/include/ffa_api_types.h b/components/messaging/ffa/libsp/include/ffa_api_types.h
+index 3686e2e..b1be7ac 100644
+--- a/components/messaging/ffa/libsp/include/ffa_api_types.h
++++ b/components/messaging/ffa/libsp/include/ffa_api_types.h
+@@ -1,6 +1,6 @@
+ /* SPDX-License-Identifier: BSD-3-Clause */
+ /*
+- * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #ifndef LIBSP_INCLUDE_FFA_API_TYPES_H_
+@@ -80,7 +80,10 @@ struct ffa_direct_msg {
+ 	uint32_t function_id;
+ 	uint16_t source_id;
+ 	uint16_t destination_id;
+-	uint32_t args[5];
++	union {
++		uint32_t args32[5];
++		uint64_t args64[5];
++	} args;
+ };
+ 
+ /**
+diff --git a/components/messaging/ffa/libsp/include/sp_messaging.h b/components/messaging/ffa/libsp/include/sp_messaging.h
+index 4bb45f7..7173a92 100644
+--- a/components/messaging/ffa/libsp/include/sp_messaging.h
++++ b/components/messaging/ffa/libsp/include/sp_messaging.h
+@@ -1,6 +1,6 @@
+ /* SPDX-License-Identifier: BSD-3-Clause */
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #ifndef LIBSP_INCLUDE_SP_MESSAGING_H_
+@@ -9,6 +9,7 @@
+ #include "sp_api_defines.h"
+ #include "sp_api_types.h"
+ 
++#include <stdbool.h>
+ #include <stdint.h>
+ 
+ #ifdef __cplusplus
+@@ -23,7 +24,11 @@ extern "C" {
+ struct sp_msg {
+ 	uint16_t source_id;
+ 	uint16_t destination_id;
+-	uint32_t args[SP_MSG_ARG_COUNT];
++	bool is_64bit_message;
++	union {
++		uint32_t args32[SP_MSG_ARG_COUNT];
++		uint64_t args64[SP_MSG_ARG_COUNT];
++	} args;
+ };
+ 
+ /**
+diff --git a/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
+index ceebcbf..a01848c 100644
+--- a/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
++++ b/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
+@@ -140,13 +140,13 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
+ 		.returnIntValue();
+ }
+ 
+-void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+-				    uint32_t a1, uint32_t a2, uint32_t a3,
+-				    uint32_t a4,
+-				    const struct ffa_direct_msg *msg,
+-				    ffa_result result)
++void expect_ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
++				       uint32_t a0, uint32_t a1, uint32_t a2,
++				       uint32_t a3, uint32_t a4,
++				       const struct ffa_direct_msg *msg,
++				       ffa_result result)
+ {
+-	mock().expectOneCall("ffa_msg_send_direct_req")
++	mock().expectOneCall("ffa_msg_send_direct_req_32")
+ 		.withUnsignedIntParameter("source", source)
+ 		.withUnsignedIntParameter("dest", dest)
+ 		.withUnsignedIntParameter("a0", a0)
+@@ -158,12 +158,13 @@ void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+ 		.andReturnValue(result);
+ }
+ 
+-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+-				   uint32_t a1, uint32_t a2, uint32_t a3,
+-				   uint32_t a4, struct ffa_direct_msg *msg)
++ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
++				      uint32_t a0, uint32_t a1, uint32_t a2,
++				      uint32_t a3,uint32_t a4,
++				      struct ffa_direct_msg *msg)
+ {
+ 	return mock()
+-		.actualCall("ffa_msg_send_direct_req")
++		.actualCall("ffa_msg_send_direct_req_32")
+ 		.withUnsignedIntParameter("source", source)
+ 		.withUnsignedIntParameter("dest", dest)
+ 		.withUnsignedIntParameter("a0", a0)
+@@ -175,13 +176,49 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+ 		.returnIntValue();
+ }
+ 
+-void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
++void expect_ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
++				       uint64_t a0, uint64_t a1, uint64_t a2,
++				       uint64_t a3, uint64_t a4,
++				       const struct ffa_direct_msg *msg,
++				       ffa_result result)
++{
++	mock().expectOneCall("ffa_msg_send_direct_req_64")
++		.withUnsignedIntParameter("source", source)
++		.withUnsignedIntParameter("dest", dest)
++		.withUnsignedLongIntParameter("a0", a0)
++		.withUnsignedLongIntParameter("a1", a1)
++		.withUnsignedLongIntParameter("a2", a2)
++		.withUnsignedLongIntParameter("a3", a3)
++		.withUnsignedLongIntParameter("a4", a4)
++		.withOutputParameterReturning("msg", msg, sizeof(*msg))
++		.andReturnValue(result);
++}
++
++ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
++				      uint64_t a0, uint64_t a1, uint64_t a2,
++				      uint64_t a3, uint64_t a4,
++				      struct ffa_direct_msg *msg)
++{
++	return mock()
++		.actualCall("ffa_msg_send_direct_req_64")
++		.withUnsignedIntParameter("source", source)
++		.withUnsignedIntParameter("dest", dest)
++		.withUnsignedLongIntParameter("a0", a0)
++		.withUnsignedLongIntParameter("a1", a1)
++		.withUnsignedLongIntParameter("a2", a2)
++		.withUnsignedLongIntParameter("a3", a3)
++		.withUnsignedLongIntParameter("a4", a4)
++		.withOutputParameter("msg", msg)
++		.returnIntValue();
++}
++
++void expect_ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
+ 				     uint32_t a0, uint32_t a1, uint32_t a2,
+ 				     uint32_t a3, uint32_t a4,
+ 				     const struct ffa_direct_msg *msg,
+ 				     ffa_result result)
+ {
+-	mock().expectOneCall("ffa_msg_send_direct_resp")
++	mock().expectOneCall("ffa_msg_send_direct_resp_32")
+ 		.withUnsignedIntParameter("source", source)
+ 		.withUnsignedIntParameter("dest", dest)
+ 		.withUnsignedIntParameter("a0", a0)
+@@ -193,12 +230,12 @@ void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
+ 		.andReturnValue(result);
+ }
+ 
+-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
++ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest, uint32_t a0,
+ 				    uint32_t a1, uint32_t a2, uint32_t a3,
+ 				    uint32_t a4, struct ffa_direct_msg *msg)
+ {
+ 	return mock()
+-		.actualCall("ffa_msg_send_direct_resp")
++		.actualCall("ffa_msg_send_direct_resp_32")
+ 		.withUnsignedIntParameter("source", source)
+ 		.withUnsignedIntParameter("dest", dest)
+ 		.withUnsignedIntParameter("a0", a0)
+@@ -210,6 +247,41 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+ 		.returnIntValue();
+ }
+ 
++void expect_ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
++				     uint64_t a0, uint64_t a1, uint64_t a2,
++				     uint64_t a3, uint64_t a4,
++				     const struct ffa_direct_msg *msg,
++				     ffa_result result)
++{
++	mock().expectOneCall("ffa_msg_send_direct_resp_64")
++		.withUnsignedIntParameter("source", source)
++		.withUnsignedIntParameter("dest", dest)
++		.withUnsignedLongIntParameter("a0", a0)
++		.withUnsignedLongIntParameter("a1", a1)
++		.withUnsignedLongIntParameter("a2", a2)
++		.withUnsignedLongIntParameter("a3", a3)
++		.withUnsignedLongIntParameter("a4", a4)
++		.withOutputParameterReturning("msg", msg, sizeof(*msg))
++		.andReturnValue(result);
++}
++
++ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest, uint64_t a0,
++				    uint64_t a1, uint64_t a2, uint64_t a3,
++				    uint64_t a4, struct ffa_direct_msg *msg)
++{
++	return mock()
++		.actualCall("ffa_msg_send_direct_resp_64")
++		.withUnsignedIntParameter("source", source)
++		.withUnsignedIntParameter("dest", dest)
++		.withUnsignedLongIntParameter("a0", a0)
++		.withUnsignedLongIntParameter("a1", a1)
++		.withUnsignedLongIntParameter("a2", a2)
++		.withUnsignedLongIntParameter("a3", a3)
++		.withUnsignedLongIntParameter("a4", a4)
++		.withOutputParameter("msg", msg)
++		.returnIntValue();
++}
++
+ void expect_ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
+ 			   void *buffer_address, uint32_t page_count,
+ 			   const uint64_t *handle, ffa_result result)
+diff --git a/components/messaging/ffa/libsp/mock/mock_ffa_api.h b/components/messaging/ffa/libsp/mock/mock_ffa_api.h
+index b1c794f..4213ccb 100644
+--- a/components/messaging/ffa/libsp/mock/mock_ffa_api.h
++++ b/components/messaging/ffa/libsp/mock/mock_ffa_api.h
+@@ -30,17 +30,29 @@ void expect_ffa_id_get(const uint16_t *id, ffa_result result);
+ 
+ void expect_ffa_msg_wait(const struct ffa_direct_msg *msg, ffa_result result);
+ 
+-void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
+-				    uint32_t a1, uint32_t a2, uint32_t a3,
+-				    uint32_t a4,
+-				    const struct ffa_direct_msg *msg,
+-				    ffa_result result);
+-
+-void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
+-				     uint32_t a0, uint32_t a1, uint32_t a2,
+-				     uint32_t a3, uint32_t a4,
+-				     const struct ffa_direct_msg *msg,
+-				     ffa_result result);
++void expect_ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
++				       uint32_t a0, uint32_t a1, uint32_t a2,
++				       uint32_t a3, uint32_t a4,
++				       const struct ffa_direct_msg *msg,
++				       ffa_result result);
++
++void expect_ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
++				       uint64_t a0, uint64_t a1, uint64_t a2,
++				       uint64_t a3, uint64_t a4,
++				       const struct ffa_direct_msg *msg,
++				       ffa_result result);
++
++void expect_ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
++					uint32_t a0, uint32_t a1, uint32_t a2,
++					uint32_t a3, uint32_t a4,
++					const struct ffa_direct_msg *msg,
++					ffa_result result);
++
++void expect_ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
++					uint64_t a0, uint64_t a1, uint64_t a2,
++					uint64_t a3, uint64_t a4,
++					const struct ffa_direct_msg *msg,
++					ffa_result result);
+ 
+ void expect_ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
+ 			   void *buffer_address, uint32_t page_count,
+diff --git a/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
+index ab33649..c1cbdd6 100644
+--- a/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
++++ b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
+@@ -105,7 +105,7 @@ TEST(mock_ffa_api, ffa_msg_wait)
+ 	MEMCMP_EQUAL(&expected_msg, &msg, sizeof(expected_msg));
+ }
+ 
+-TEST(mock_ffa_api, ffa_msg_send_direct_req)
++TEST(mock_ffa_api, ffa_msg_send_direct_req_32)
+ {
+ 	const uint16_t source = 0x1122;
+ 	const uint16_t dest = 0x2233;
+@@ -116,13 +116,30 @@ TEST(mock_ffa_api, ffa_msg_send_direct_req)
+ 	const uint32_t a4 = 0x89124567;
+ 	struct ffa_direct_msg msg = { 0 };
+ 
+-	expect_ffa_msg_send_direct_req(source, dest, a0, a1, a2, a3, a4,
++	expect_ffa_msg_send_direct_req_32(source, dest, a0, a1, a2, a3, a4,
++				          &expected_msg, result);
++	LONGS_EQUAL(result, ffa_msg_send_direct_req_32(source, dest, a0, a1, a2,
++						       a3, a4, &msg));
++}
++
++TEST(mock_ffa_api, ffa_msg_send_direct_req_64)
++{
++	const uint16_t source = 0x1122;
++	const uint16_t dest = 0x2233;
++	const uint64_t a0 = 0x4567891221987654;
++	const uint64_t a1 = 0x5678912442198765;
++	const uint64_t a2 = 0x6789124554219876;
++	const uint64_t a3 = 0x7891245665421987;
++	const uint64_t a4 = 0x8912456776542198;
++	struct ffa_direct_msg msg = { 0 };
++
++	expect_ffa_msg_send_direct_req_64(source, dest, a0, a1, a2, a3, a4,
+ 				       &expected_msg, result);
+-	LONGS_EQUAL(result, ffa_msg_send_direct_req(source, dest, a0, a1, a2,
+-						    a3, a4, &msg));
++	LONGS_EQUAL(result, ffa_msg_send_direct_req_64(source, dest, a0, a1, a2,
++						       a3, a4, &msg));
+ }
+ 
+-TEST(mock_ffa_api, ffa_msg_send_direct_resp)
++TEST(mock_ffa_api, ffa_msg_send_direct_resp_32)
+ {
+ 	const uint16_t source = 0x1122;
+ 	const uint16_t dest = 0x2233;
+@@ -133,10 +150,27 @@ TEST(mock_ffa_api, ffa_msg_send_direct_resp)
+ 	const uint32_t a4 = 0x89124567;
+ 	struct ffa_direct_msg msg = { 0 };
+ 
+-	expect_ffa_msg_send_direct_resp(source, dest, a0, a1, a2, a3, a4,
++	expect_ffa_msg_send_direct_resp_32(source, dest, a0, a1, a2, a3, a4,
+ 					&expected_msg, result);
+-	LONGS_EQUAL(result, ffa_msg_send_direct_resp(source, dest, a0, a1, a2,
+-						     a3, a4, &msg));
++	LONGS_EQUAL(result, ffa_msg_send_direct_resp_32(source, dest, a0, a1,
++							a2, a3, a4, &msg));
++}
++
++TEST(mock_ffa_api, ffa_msg_send_direct_resp_64)
++{
++	const uint16_t source = 0x1122;
++	const uint16_t dest = 0x2233;
++	const uint64_t a0 = 0x4567891221987654;
++	const uint64_t a1 = 0x5678912442198765;
++	const uint64_t a2 = 0x6789124554219876;
++	const uint64_t a3 = 0x7891245665421987;
++	const uint64_t a4 = 0x8912456776542198;
++	struct ffa_direct_msg msg = { 0 };
++
++	expect_ffa_msg_send_direct_resp_64(source, dest, a0, a1, a2, a3, a4,
++					  &expected_msg, result);
++	LONGS_EQUAL(result, ffa_msg_send_direct_resp_64(source, dest, a0, a1,
++							a2, a3, a4, &msg));
+ }
+ 
+ TEST(mock_ffa_api, ffa_mem_donate)
+diff --git a/components/messaging/ffa/libsp/sp_messaging.c b/components/messaging/ffa/libsp/sp_messaging.c
+index f7223aa..392006b 100644
+--- a/components/messaging/ffa/libsp/sp_messaging.c
++++ b/components/messaging/ffa/libsp/sp_messaging.c
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include "ffa_api.h"
+@@ -20,22 +20,40 @@ static void pack_ffa_direct_msg(const struct sp_msg *msg,
+ 	ffa_msg->source_id = msg->source_id;
+ 	ffa_msg->destination_id = msg->destination_id;
+ 
+-	ffa_msg->args[0] = 0;
+-	memcpy(&ffa_msg->args[SP_MSG_ARG_OFFSET], msg->args, sizeof(msg->args));
++	ffa_msg->args.args64[0] = 0;
++	if (msg->is_64bit_message)
++		memcpy(&ffa_msg->args.args64[SP_MSG_ARG_OFFSET],
++		       msg->args.args64, sizeof(msg->args.args64));
++	else
++		memcpy(&ffa_msg->args.args32[SP_MSG_ARG_OFFSET],
++		       msg->args.args32, sizeof(msg->args.args32));
+ }
+ 
+ static void unpack_ffa_direct_msg(const struct ffa_direct_msg *ffa_msg,
+ 				  struct sp_msg *msg)
+ {
+-	if (ffa_msg->function_id != FFA_SUCCESS_32) {
++	if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_32 ||
++	    ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_32) {
+ 		/*
+-		 * Handling request or response (error is handled before call)
++		 * Handling 32 bit request or response
+ 		 */
+ 		msg->source_id = ffa_msg->source_id;
+ 		msg->destination_id = ffa_msg->destination_id;
++		msg->is_64bit_message = FFA_IS_64_BIT_FUNC(ffa_msg->function_id);
+ 
+-		memcpy(msg->args, &ffa_msg->args[SP_MSG_ARG_OFFSET],
+-		       sizeof(msg->args));
++		memcpy(msg->args.args32, &ffa_msg->args.args32[SP_MSG_ARG_OFFSET],
++		       sizeof(msg->args.args32));
++	} else if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_64 ||
++		   ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_64) {
++		/*
++		 * Handling 64 bit request or response
++		 */
++		msg->source_id = ffa_msg->source_id;
++		msg->destination_id = ffa_msg->destination_id;
++		msg->is_64bit_message = FFA_IS_64_BIT_FUNC(ffa_msg->function_id);
++
++		memcpy(msg->args.args64, &ffa_msg->args.args64[SP_MSG_ARG_OFFSET],
++		       sizeof(msg->args.args64));
+ 	} else {
+ 		/* Success has no message parameters */
+ 		*msg = (struct sp_msg){ 0 };
+@@ -89,11 +107,18 @@ sp_result sp_msg_send_direct_req(const struct sp_msg *req, struct sp_msg *resp)
+ 	ffa_direct_msg_routing_ext_req_pre_hook(&ffa_req);
+ #endif
+ 
+-	ffa_res = ffa_msg_send_direct_req(ffa_req.source_id,
+-					  ffa_req.destination_id,
+-					  ffa_req.args[0], ffa_req.args[1],
+-					  ffa_req.args[2], ffa_req.args[3],
+-					  ffa_req.args[4], &ffa_resp);
++	if (req->is_64bit_message)
++		ffa_res = ffa_msg_send_direct_req_64(
++			ffa_req.source_id, ffa_req.destination_id,
++			ffa_req.args.args64[0], ffa_req.args.args64[1],
++			ffa_req.args.args64[2], ffa_req.args.args64[3],
++			ffa_req.args.args64[4], &ffa_resp);
++	else
++		ffa_res = ffa_msg_send_direct_req_32(
++			ffa_req.source_id, ffa_req.destination_id,
++			ffa_req.args.args32[0], ffa_req.args.args32[1],
++			ffa_req.args.args32[2], ffa_req.args.args32[3],
++			ffa_req.args.args32[4], &ffa_resp);
+ 
+ 	if (ffa_res != FFA_OK) {
+ #if FFA_DIRECT_MSG_ROUTING_EXTENSION
+@@ -136,11 +161,18 @@ sp_result sp_msg_send_direct_resp(const struct sp_msg *resp, struct sp_msg *req)
+ 	ffa_direct_msg_routing_ext_resp_pre_hook(&ffa_resp);
+ #endif
+ 
+-	ffa_res = ffa_msg_send_direct_resp(ffa_resp.source_id,
+-					   ffa_resp.destination_id,
+-					   ffa_resp.args[0], ffa_resp.args[1],
+-					   ffa_resp.args[2], ffa_resp.args[3],
+-					   ffa_resp.args[4], &ffa_req);
++	if (resp->is_64bit_message)
++		ffa_res = ffa_msg_send_direct_resp_64(
++			ffa_resp.source_id, ffa_resp.destination_id,
++			ffa_resp.args.args64[0], ffa_resp.args.args64[1],
++			ffa_resp.args.args64[2], ffa_resp.args.args64[3],
++			ffa_resp.args.args64[4], &ffa_req);
++	else
++		ffa_res = ffa_msg_send_direct_resp_32(
++			ffa_resp.source_id, ffa_resp.destination_id,
++			ffa_resp.args.args32[0], ffa_resp.args.args32[1],
++			ffa_resp.args.args32[2], ffa_resp.args.args32[3],
++			ffa_resp.args.args32[4], &ffa_req);
+ 
+ 	if (ffa_res != FFA_OK) {
+ #if FFA_DIRECT_MSG_ROUTING_EXTENSION
+@@ -182,11 +214,11 @@ sp_result sp_msg_send_rc_req(const struct sp_msg *req, struct sp_msg *resp)
+ 
+ 	ffa_direct_msg_routing_ext_rc_req_pre_hook(&ffa_req);
+ 
+-	ffa_res = ffa_msg_send_direct_resp(ffa_req.source_id,
++	ffa_res = ffa_msg_send_direct_resp_32(ffa_req.source_id,
+ 					   ffa_req.destination_id,
+-					   ffa_req.args[0], ffa_req.args[1],
+-					   ffa_req.args[2], ffa_req.args[3],
+-					   ffa_req.args[4], &ffa_resp);
++					   ffa_req.args.args32[0], ffa_req.args.args32[1],
++					   ffa_req.args.args32[2], ffa_req.args.args32[3],
++					   ffa_req.args.args32[4], &ffa_resp);
+ 
+ 	if (ffa_res != FFA_OK) {
+ 		ffa_direct_msg_routing_ext_rc_req_error_hook();
+diff --git a/components/messaging/ffa/libsp/test/test_ffa_api.cpp b/components/messaging/ffa/libsp/test/test_ffa_api.cpp
+index 8fa261e..6cca085 100644
+--- a/components/messaging/ffa/libsp/test/test_ffa_api.cpp
++++ b/components/messaging/ffa/libsp/test/test_ffa_api.cpp
+@@ -43,20 +43,35 @@ TEST_GROUP(ffa_api)
+ 		svc_result.a2 = (uint32_t)error_code;
+ 	}
+ 
+-	void msg_equal(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
+-			uint32_t arg0, uint32_t arg1, uint32_t arg2,
+-			uint32_t arg3, uint32_t arg4)
++	void msg_equal_32(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
++			  uint32_t arg0, uint32_t arg1, uint32_t arg2,
++			  uint32_t arg3, uint32_t arg4)
+ 	{
+ 		UNSIGNED_LONGS_EQUAL(func_id, msg.function_id);
+ 		UNSIGNED_LONGS_EQUAL(source_id, msg.source_id);
+ 		UNSIGNED_LONGS_EQUAL(dest_id, msg.destination_id);
+-		UNSIGNED_LONGS_EQUAL(arg0, msg.args[0]);
+-		UNSIGNED_LONGS_EQUAL(arg1, msg.args[1]);
+-		UNSIGNED_LONGS_EQUAL(arg2, msg.args[2]);
+-		UNSIGNED_LONGS_EQUAL(arg3, msg.args[3]);
+-		UNSIGNED_LONGS_EQUAL(arg4, msg.args[4]);
++		UNSIGNED_LONGS_EQUAL(arg0, msg.args.args32[0]);
++		UNSIGNED_LONGS_EQUAL(arg1, msg.args.args32[1]);
++		UNSIGNED_LONGS_EQUAL(arg2, msg.args.args32[2]);
++		UNSIGNED_LONGS_EQUAL(arg3, msg.args.args32[3]);
++		UNSIGNED_LONGS_EQUAL(arg4, msg.args.args32[4]);
+ 	}
+ 
++	void msg_equal_64(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
++			  uint64_t arg0, uint64_t arg1, uint64_t arg2,
++			  uint64_t arg3, uint64_t arg4)
++	{
++		UNSIGNED_LONGS_EQUAL(func_id, msg.function_id);
++		UNSIGNED_LONGS_EQUAL(source_id, msg.source_id);
++		UNSIGNED_LONGS_EQUAL(dest_id, msg.destination_id);
++		UNSIGNED_LONGLONGS_EQUAL(arg0, msg.args.args64[0]);
++		UNSIGNED_LONGLONGS_EQUAL(arg1, msg.args.args64[1]);
++		UNSIGNED_LONGLONGS_EQUAL(arg2, msg.args.args64[2]);
++		UNSIGNED_LONGLONGS_EQUAL(arg3, msg.args.args64[3]);
++		UNSIGNED_LONGLONGS_EQUAL(arg4, msg.args.args64[4]);
++	}
++
++
+ 	struct ffa_params svc_result;
+ 	struct ffa_direct_msg msg;
+ };
+@@ -360,7 +375,7 @@ TEST(ffa_api, ffa_msg_wait_success)
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ 	ffa_result result = ffa_msg_wait(&msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+ TEST(ffa_api, ffa_msg_wait_error)
+@@ -369,10 +384,10 @@ TEST(ffa_api, ffa_msg_wait_error)
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ 	ffa_result result = ffa_msg_wait(&msg);
+ 	LONGS_EQUAL(-1, result);
+-	msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_wait_direct_req)
++TEST(ffa_api, ffa_msg_wait_direct_req_32)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -392,7 +407,31 @@ TEST(ffa_api, ffa_msg_wait_direct_req)
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ 	ffa_result result = ffa_msg_wait(&msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x8400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
++	msg_equal_32(0x8400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
++		   arg4);
++}
++
++TEST(ffa_api, ffa_msg_wait_direct_req_64)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint64_t arg0 = 0x0123456776543210ULL;
++	const uint64_t arg1 = 0x1234567887654321ULL;
++	const uint64_t arg2 = 0x2345678998765432ULL;
++	const uint64_t arg3 = 0x3456789aa9876543ULL;
++	const uint64_t arg4 = 0x456789abba987654ULL;
++
++	svc_result.a0 = 0xC400006F;
++	svc_result.a1 = ((uint32_t)source_id) << 16 | dest_id;
++	svc_result.a3 = arg0;
++	svc_result.a4 = arg1;
++	svc_result.a5 = arg2;
++	svc_result.a6 = arg3;
++	svc_result.a7 = arg4;
++	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
++	ffa_result result = ffa_msg_wait(&msg);
++	LONGS_EQUAL(0, result);
++	msg_equal_64(0xC400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
+ 		   arg4);
+ }
+ 
+@@ -410,7 +449,7 @@ TEST(ffa_api, ffa_msg_wait_one_interrupt_success)
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ 	ffa_result result = ffa_msg_wait(&msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+ TEST(ffa_api, ffa_msg_wait_two_interrupt_success)
+@@ -434,7 +473,7 @@ TEST(ffa_api, ffa_msg_wait_two_interrupt_success)
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ 	ffa_result result = ffa_msg_wait(&msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+ TEST(ffa_api, ffa_msg_wait_unknown_response)
+@@ -448,7 +487,7 @@ TEST(ffa_api, ffa_msg_wait_unknown_response)
+ 	}
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_success)
++TEST(ffa_api, ffa_msg_send_direct_req_32_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -461,13 +500,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_success)
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_req(
++	ffa_result result = ffa_msg_send_direct_req_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_error)
++TEST(ffa_api, ffa_msg_send_direct_req_32_error)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -480,13 +519,48 @@ TEST(ffa_api, ffa_msg_send_direct_req_error)
+ 	setup_error_response(-1);
+ 	expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_req(
++	ffa_result result = ffa_msg_send_direct_req_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(-1, result);
+-	msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
++}
++
++TEST(ffa_api, ffa_msg_send_direct_req_32_get_resp_64)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint32_t arg0 = 0x01234567ULL;
++	const uint32_t arg1 = 0x12345678ULL;
++	const uint32_t arg2 = 0x23456789ULL;
++	const uint32_t arg3 = 0x3456789aULL;
++	const uint32_t arg4 = 0x456789abULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint64_t resp_arg0 = 0x9012345665432109ULL;
++	const uint64_t resp_arg1 = 0xa12345677654321aULL;
++	const uint64_t resp_arg2 = 0xb23456788765432bULL;
++	const uint64_t resp_arg3 = 0xc34567899876543cULL;
++	const uint64_t resp_arg4 = 0xd456789aa987654dULL;
++	assert_environment_t assert_env;
++
++	svc_result.a0 = 0xC4000070;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++
++	expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++
++	if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
++		ffa_msg_send_direct_req_32(source_id, dest_id, arg0, arg1, arg2,
++					arg3, arg4, &msg);
++	}
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_direct_resp)
++TEST(ffa_api, ffa_msg_send_direct_req_32_direct_resp)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -512,14 +586,82 @@ TEST(ffa_api, ffa_msg_send_direct_req_direct_resp)
+ 	svc_result.a7 = resp_arg4;
+ 	expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_req(
++	ffa_result result = ffa_msg_send_direct_req_32(
++		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
++	LONGS_EQUAL(0, result);
++	msg_equal_32(0x84000070, resp_source_id, resp_dest_id, resp_arg0,
++		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
++}
++
++TEST(ffa_api, ffa_msg_send_direct_req_64_success)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint64_t arg0 = 0x0123456776543210ULL;
++	const uint64_t arg1 = 0x1234567887654321ULL;
++	const uint64_t arg2 = 0x2345678998765432ULL;
++	const uint64_t arg3 = 0x3456789aa9876543ULL;
++	const uint64_t arg4 = 0x456789abba987654ULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint64_t resp_arg0 = 0x9012345665432109ULL;
++	const uint64_t resp_arg1 = 0xa12345677654321aULL;
++	const uint64_t resp_arg2 = 0xb23456788765432bULL;
++	const uint64_t resp_arg3 = 0xc34567899876543cULL;
++	const uint64_t resp_arg4 = 0xd456789aa987654dULL;
++
++	svc_result.a0 = 0xC4000070;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++	expect_ffa_svc(0xC400006F, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++	ffa_result result = ffa_msg_send_direct_req_64(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000070, resp_source_id, resp_dest_id, resp_arg0,
++	msg_equal_64(0xC4000070, resp_source_id, resp_dest_id, resp_arg0,
+ 		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_one_interrupt_success)
++TEST(ffa_api, ffa_msg_send_direct_req_64_get_resp_32)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint64_t arg0 = 0x9012345665432109ULL;
++	const uint64_t arg1 = 0xa12345677654321aULL;
++	const uint64_t arg2 = 0xb23456788765432bULL;
++	const uint64_t arg3 = 0xc34567899876543cULL;
++	const uint64_t arg4 = 0xd456789aa987654dULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint32_t resp_arg0 = 0x01234567ULL;
++	const uint32_t resp_arg1 = 0x12345678ULL;
++	const uint32_t resp_arg2 = 0x23456789ULL;
++	const uint32_t resp_arg3 = 0x3456789aULL;
++	const uint32_t resp_arg4 = 0x456789abULL;
++	assert_environment_t assert_env;
++
++	svc_result.a0 = 0x84000070;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++
++	expect_ffa_svc(0xC400006F, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++
++	if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
++		ffa_msg_send_direct_req_64(source_id, dest_id, arg0, arg1, arg2,
++					arg3, arg4, &msg);
++	}
++}
++
++TEST(ffa_api, ffa_msg_send_direct_req_32_one_interrupt_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -539,13 +681,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_one_interrupt_success)
+ 
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_req(
++	ffa_result result = ffa_msg_send_direct_req_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_two_interrupt_success)
++TEST(ffa_api, ffa_msg_send_direct_req_32_two_interrupt_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -573,13 +715,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_two_interrupt_success)
+ 
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_req(
++	ffa_result result = ffa_msg_send_direct_req_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_req_unknown_response)
++TEST(ffa_api, ffa_msg_send_direct_req_32_unknown_response)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -594,12 +736,12 @@ TEST(ffa_api, ffa_msg_send_direct_req_unknown_response)
+ 	expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+ 	if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
+-		ffa_msg_send_direct_req(source_id, dest_id, arg0, arg1, arg2,
++		ffa_msg_send_direct_req_32(source_id, dest_id, arg0, arg1, arg2,
+ 					arg3, arg4, &msg);
+ 	}
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_success)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -612,13 +754,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_success)
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_resp(
++	ffa_result result = ffa_msg_send_direct_resp_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_error)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_error)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -631,13 +773,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_error)
+ 	setup_error_response(-1);
+ 	expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_resp(
++	ffa_result result = ffa_msg_send_direct_resp_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(-1, result);
+-	msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_then_get_direct_req_as_response)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_then_get_direct_req_32_as_response)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -663,14 +805,113 @@ TEST(ffa_api, ffa_msg_send_direct_resp_then_get_direct_req_as_response)
+ 	svc_result.a7 = resp_arg4;
+ 	expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_resp(
++	ffa_result result = ffa_msg_send_direct_resp_32(
++		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
++	LONGS_EQUAL(0, result);
++	msg_equal_32(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
++		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
++}
++
++TEST(ffa_api, ffa_msg_send_direct_resp_32_then_get_direct_req_64_as_response)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint32_t arg0 = 0x01234567ULL;
++	const uint32_t arg1 = 0x12345678ULL;
++	const uint32_t arg2 = 0x23456789ULL;
++	const uint32_t arg3 = 0x3456789aULL;
++	const uint32_t arg4 = 0x456789abULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint64_t resp_arg0 = 0x9012345665432109ULL;
++	const uint64_t resp_arg1 = 0xa12345677654321aULL;
++	const uint64_t resp_arg2 = 0xb23456788765432bULL;
++	const uint64_t resp_arg3 = 0xc34567899876543cULL;
++	const uint64_t resp_arg4 = 0xd456789aa987654dULL;
++
++	svc_result.a0 = 0xC400006F;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++	expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++	ffa_result result = ffa_msg_send_direct_resp_32(
++		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
++	LONGS_EQUAL(0, result);
++	msg_equal_64(0xC400006F, resp_source_id, resp_dest_id, resp_arg0,
++		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
++}
++
++TEST(ffa_api, ffa_msg_send_direct_resp_64_then_get_direct_req_32_as_response)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint64_t arg0 = 0x9012345665432109ULL;
++	const uint64_t arg1 = 0xa12345677654321aULL;
++	const uint64_t arg2 = 0xb23456788765432bULL;
++	const uint64_t arg3 = 0xc34567899876543cULL;
++	const uint64_t arg4 = 0xd456789aa987654dULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint32_t resp_arg0 = 0x01234567ULL;
++	const uint32_t resp_arg1 = 0x12345678ULL;
++	const uint32_t resp_arg2 = 0x23456789ULL;
++	const uint32_t resp_arg3 = 0x3456789aULL;
++	const uint32_t resp_arg4 = 0x456789abULL;
++
++	svc_result.a0 = 0x8400006F;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++	expect_ffa_svc(0xC4000070, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++	ffa_result result = ffa_msg_send_direct_resp_64(
++		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
++	LONGS_EQUAL(0, result);
++	msg_equal_32(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
++		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
++}
++
++TEST(ffa_api, ffa_msg_send_direct_resp_64_then_get_direct_req_64_as_response)
++{
++	const uint16_t source_id = 0x1122;
++	const uint16_t dest_id = 0x3344;
++	const uint64_t arg0 = 0x0123456776543210ULL;
++	const uint64_t arg1 = 0x1234567887654321ULL;
++	const uint64_t arg2 = 0x2345678998765432ULL;
++	const uint64_t arg3 = 0x3456789aa9876543ULL;
++	const uint64_t arg4 = 0x456789abba987654ULL;
++	const uint16_t resp_source_id = 0x1221;
++	const uint16_t resp_dest_id = 0x3443;
++	const uint64_t resp_arg0 = 0x9012345665432109ULL;
++	const uint64_t resp_arg1 = 0xa12345677654321aULL;
++	const uint64_t resp_arg2 = 0xb23456788765432bULL;
++	const uint64_t resp_arg3 = 0xc34567899876543cULL;
++	const uint64_t resp_arg4 = 0xd456789aa987654dULL;
++
++	svc_result.a0 = 0xC400006F;
++	svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
++	svc_result.a3 = resp_arg0;
++	svc_result.a4 = resp_arg1;
++	svc_result.a5 = resp_arg2;
++	svc_result.a6 = resp_arg3;
++	svc_result.a7 = resp_arg4;
++	expect_ffa_svc(0xC4000070, ((uint32_t)source_id << 16) | dest_id, 0,
++		       arg0, arg1, arg2, arg3, arg4, &svc_result);
++	ffa_result result = ffa_msg_send_direct_resp_64(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
++	msg_equal_64(0xC400006F, resp_source_id, resp_dest_id, resp_arg0,
+ 		   resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_one_interrupt_success)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_one_interrupt_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -690,13 +931,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_one_interrupt_success)
+ 
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_resp(
++	ffa_result result = ffa_msg_send_direct_resp_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_two_interrupt_success)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_two_interrupt_success)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -724,13 +965,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_two_interrupt_success)
+ 
+ 	svc_result.a0 = 0x84000061;
+ 	expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+-	ffa_result result = ffa_msg_send_direct_resp(
++	ffa_result result = ffa_msg_send_direct_resp_32(
+ 		source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ 	LONGS_EQUAL(0, result);
+-	msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
++	msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ }
+ 
+-TEST(ffa_api, ffa_msg_send_direct_resp_unknown_response)
++TEST(ffa_api, ffa_msg_send_direct_resp_32_unknown_response)
+ {
+ 	const uint16_t source_id = 0x1122;
+ 	const uint16_t dest_id = 0x3344;
+@@ -745,7 +986,7 @@ TEST(ffa_api, ffa_msg_send_direct_resp_unknown_response)
+ 	expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ 		       arg0, arg1, arg2, arg3, arg4, &svc_result);
+ 	if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
+-		ffa_msg_send_direct_resp(source_id, dest_id, arg0, arg1, arg2,
++		ffa_msg_send_direct_resp_32(source_id, dest_id, arg0, arg1, arg2,
+ 					 arg3, arg4, &msg);
+ 	}
+ }
+diff --git a/components/messaging/ffa/libsp/test/test_sp_messaging.cpp b/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
+index 78bf8bf..786f66e 100644
+--- a/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
++++ b/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
+  */
+ 
+ #include <CppUTest/TestHarness.h>
+@@ -32,7 +32,7 @@ TEST_GROUP(sp_messaging)
+ 		mock().clear();
+ 	}
+ 
+-	void copy_sp_to_ffa_args(const uint32_t sp_args[], uint32_t ffa_args[])
++	void copy_sp_to_ffa_args_32(const uint32_t sp_args[], uint32_t ffa_args[])
+ 	{
+ 		int i = 0;
+ 
+@@ -41,7 +41,16 @@ TEST_GROUP(sp_messaging)
+ 		}
+ 	}
+ 
+-	void fill_ffa_msg(struct ffa_direct_msg * msg)
++	void copy_sp_to_ffa_args_64(const uint64_t sp_args[], uint64_t ffa_args[])
++	{
++		int i = 0;
++
++		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
++			ffa_args[i + SP_MSG_ARG_OFFSET] = sp_args[i];
++		}
++	}
++
++	void fill_ffa_msg_32(struct ffa_direct_msg * msg)
+ 	{
+ 		int i = 0;
+ 
+@@ -49,20 +58,47 @@ TEST_GROUP(sp_messaging)
+ 		msg->source_id = source_id;
+ 		msg->destination_id = dest_id;
+ 
+-		msg->args[0] = 0;
++		msg->args.args32[0] = 0;
+ 		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+-			msg->args[i + SP_MSG_ARG_OFFSET] = args[i];
++			msg->args.args32[i + SP_MSG_ARG_OFFSET] = args32[i];
+ 		}
+ 	}
+ 
+-	void fill_sp_msg(struct sp_msg * msg)
++	void fill_ffa_msg_64(struct ffa_direct_msg * msg)
+ 	{
+ 		int i = 0;
+ 
++		msg->function_id = FFA_MSG_SEND_DIRECT_REQ_64;
+ 		msg->source_id = source_id;
+ 		msg->destination_id = dest_id;
++
++		msg->args.args64[0] = 0;
+ 		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+-			msg->args[i] = args[i + SP_MSG_ARG_OFFSET];
++			msg->args.args64[i + SP_MSG_ARG_OFFSET] = args64[i];
++		}
++	}
++
++	void fill_sp_msg_32(struct sp_msg * msg)
++	{
++		int i = 0;
++
++		msg->source_id = source_id;
++		msg->destination_id = dest_id;
++		msg->is_64bit_message = false;
++		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
++			msg->args.args32[i] = args32[i + SP_MSG_ARG_OFFSET];
++		}
++	}
++
++	void fill_sp_msg_64(struct sp_msg * msg)
++	{
++		int i = 0;
++
++		msg->source_id = source_id;
++		msg->destination_id = dest_id;
++		msg->is_64bit_message = true;
++		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
++			msg->args.args64[i] = args64[i + SP_MSG_ARG_OFFSET];
+ 		}
+ 	}
+ 
+@@ -74,10 +110,19 @@ TEST_GROUP(sp_messaging)
+ 		UNSIGNED_LONGS_EQUAL(ffa_msg->source_id, sp_msg->source_id);
+ 		UNSIGNED_LONGS_EQUAL(ffa_msg->destination_id,
+ 				     sp_msg->destination_id);
+-		for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+-			UNSIGNED_LONGS_EQUAL(
+-				ffa_msg->args[i + SP_MSG_ARG_OFFSET],
+-				sp_msg->args[i]);
++		CHECK_EQUAL(FFA_IS_64_BIT_FUNC(ffa_msg->function_id), sp_msg->is_64bit_message);
++		if (sp_msg->is_64bit_message) {
++			for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
++				UNSIGNED_LONGS_EQUAL(
++					ffa_msg->args.args64[i + SP_MSG_ARG_OFFSET],
++					sp_msg->args.args64[i]);
++			}
++		} else {
++			for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
++				UNSIGNED_LONGS_EQUAL(
++					ffa_msg->args.args32[i + SP_MSG_ARG_OFFSET],
++					sp_msg->args.args32[i]);
++			}
+ 		}
+ 	}
+ 
+@@ -87,7 +132,7 @@ TEST_GROUP(sp_messaging)
+ 		struct ffa_direct_msg expected_ffa_req = { 0 };
+ 		struct sp_msg req = { 0 };
+ 
+-		fill_ffa_msg(&expected_ffa_req);
++		fill_ffa_msg_32(&expected_ffa_req);
+ 		expected_ffa_req.source_id = source_id;
+ 		expected_ffa_req.destination_id = dest_id;
+ 		expect_ffa_msg_wait(&expected_ffa_req, FFA_OK);
+@@ -103,8 +148,10 @@ TEST_GROUP(sp_messaging)
+ 
+ 	const uint16_t source_id = 0x1234;
+ 	const uint16_t dest_id = 0x5678;
+-	const uint32_t args[SP_MSG_ARG_COUNT] = { 0x01234567, 0x12345678,
+-						  0x23456789, 0x3456789a };
++	const uint32_t args32[SP_MSG_ARG_COUNT] = { 0x01234567, 0x12345678,
++						    0x23456789, 0x3456789a };
++	const uint64_t args64[SP_MSG_ARG_COUNT] = { 0x0123456776543210, 0x1234567887654321,
++						    0x2345678998765432, 0x3456789aa9876543 };
+ 	const sp_result result = -1;
+ 	const sp_msg empty_sp_msg = (const sp_msg){ 0 };
+ };
+@@ -126,7 +173,7 @@ TEST(sp_messaging, sp_msg_wait_ffa_error)
+ 
+ TEST(sp_messaging, sp_msg_wait)
+ {
+-	fill_ffa_msg(&ffa_msg);
++	fill_ffa_msg_32(&ffa_msg);
+ 	expect_ffa_msg_wait(&ffa_msg, FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_wait(&req));
+@@ -139,12 +186,12 @@ TEST(sp_messaging, sp_msg_wait_deny_rc_failure)
+ 	struct ffa_direct_msg rc_msg = { 0 };
+ 	ffa_result result = FFA_ABORTED;
+ 
+-	fill_ffa_msg(&rc_msg);
+-	rc_msg.args[0] = ROUTING_EXT_RC_BIT;
++	fill_ffa_msg_32(&rc_msg);
++	rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 	expect_ffa_msg_wait(&rc_msg, FFA_OK);
+ 
+-	fill_ffa_msg(&ffa_msg);
+-	expect_ffa_msg_send_direct_resp(
++	fill_ffa_msg_32(&ffa_msg);
++	expect_ffa_msg_send_direct_resp_32(
+ 		rc_msg.destination_id, rc_msg.source_id,
+ 		ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, result);
+@@ -157,12 +204,12 @@ TEST(sp_messaging, sp_msg_wait_deny_rc)
+ {
+ 	struct ffa_direct_msg rc_msg = { 0 };
+ 
+-	fill_ffa_msg(&rc_msg);
+-	rc_msg.args[0] = ROUTING_EXT_RC_BIT;
++	fill_ffa_msg_32(&rc_msg);
++	rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 	expect_ffa_msg_wait(&rc_msg, FFA_OK);
+ 
+-	fill_ffa_msg(&ffa_msg);
+-	expect_ffa_msg_send_direct_resp(
++	fill_ffa_msg_32(&ffa_msg);
++	expect_ffa_msg_send_direct_resp_32(
+ 		rc_msg.destination_id, rc_msg.source_id,
+ 		ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, FFA_OK);
+@@ -191,10 +238,10 @@ TEST(sp_messaging, sp_msg_send_direct_req_ffa_error)
+ 	ffa_result result = FFA_ABORTED;
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&req);
++	fill_sp_msg_32(&req);
+ 	memset(&resp, 0x5a, sizeof(resp));
+-	copy_sp_to_ffa_args(req.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_req(
++	copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_req_32(
+ 		req.source_id, req.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, result);
+@@ -203,14 +250,30 @@ TEST(sp_messaging, sp_msg_send_direct_req_ffa_error)
+ 	MEMCMP_EQUAL(&empty_sp_msg, &resp, sizeof(empty_sp_msg));
+ }
+ 
+-TEST(sp_messaging, sp_msg_send_direct_req_msg)
++TEST(sp_messaging, sp_msg_send_direct_req_msg_32)
+ {
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&req);
+-	fill_ffa_msg(&ffa_msg);
+-	copy_sp_to_ffa_args(req.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_req(
++	fill_sp_msg_32(&req);
++	fill_ffa_msg_32(&ffa_msg);
++	copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_req_32(
++		req.source_id, req.destination_id, expected_ffa_args[0],
++		expected_ffa_args[1], expected_ffa_args[2],
++		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
++
++	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&req, &resp));
++	ffa_and_sp_msg_equal(&ffa_msg, &resp);
++}
++
++TEST(sp_messaging, sp_msg_send_direct_req_msg_64)
++{
++	uint64_t expected_ffa_args[5] = { 0 };
++
++	fill_sp_msg_64(&req);
++	fill_ffa_msg_64(&ffa_msg);
++	copy_sp_to_ffa_args_64(req.args.args64, expected_ffa_args);
++	expect_ffa_msg_send_direct_req_64(
+ 		req.source_id, req.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+@@ -223,10 +286,10 @@ TEST(sp_messaging, sp_msg_send_direct_req_success)
+ {
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&req);
++	fill_sp_msg_32(&req);
+ 	ffa_msg.function_id = FFA_SUCCESS_32;
+-	copy_sp_to_ffa_args(req.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_req(
++	copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_req_32(
+ 		req.source_id, req.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+@@ -248,54 +311,54 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&rc_resp, FFA_OK);
+ 
+ 	/* Fowarding RC response to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
+-				       rc_resp.args[1], rc_resp.args[2],
+-				       rc_resp.args[3], rc_resp.args[4], &resp,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
++				       rc_resp.args.args32[1], rc_resp.args.args32[2],
++				       rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
+ 				       FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
+@@ -312,28 +375,28 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_error)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_err);
++	fill_ffa_msg_32(&rc_err);
+ 	rc_err.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_err.source_id = rc_root_id;
+ 	rc_err.destination_id = own_id;
+-	rc_err.args[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
+-	rc_err.args[1] = result;
++	rc_err.args.args32[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
++	rc_err.args.args32[1] = result;
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_err, FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_FFA(result),
+@@ -354,64 +417,64 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success_deny_request)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+ 	request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	request_to_deny.source_id = root_id;
+ 	request_to_deny.destination_id = own_id;
+-	request_to_deny.args[0] = 0;
++	request_to_deny.args.args32[0] = 0;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving a request to deny */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&request_to_deny, FFA_OK);
+ 
+ 	/* Sending error to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		own_id, root_id, ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_OK);
+ 
+ 	/* Fowarding RC response to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
+-				       rc_resp.args[1], rc_resp.args[2],
+-				       rc_resp.args[3], rc_resp.args[4], &resp,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
++				       rc_resp.args.args32[1], rc_resp.args.args32[2],
++				       rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
+ 				       FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
+@@ -431,65 +494,65 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success_invalid_req_src)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+ 	request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	/* This source ID should be denied in the current state. */
+ 	request_to_deny.source_id = rc_root_id;
+ 	request_to_deny.destination_id = own_id;
+-	request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
++	request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&request_to_deny, FFA_OK);
+ 
+ 	/* Sending error to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		own_id, rc_root_id, ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT,
+ 		SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_OK);
+ 
+ 	/* Fowarding RC response to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
+-				       rc_resp.args[1], rc_resp.args[2],
+-				       rc_resp.args[3], rc_resp.args[4], &resp,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
++				       rc_resp.args.args32[1], rc_resp.args.args32[2],
++				       rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
+ 				       FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
+@@ -509,58 +572,58 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_success)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+ 	request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	/* This source ID should be denied in the current state. */
+ 	request_to_deny.source_id = rc_root_id;
+ 	request_to_deny.destination_id = own_id;
+-	request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
++	request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&request_to_deny, FFA_OK);
+ 
+ 	/* Sending error to root which fails */
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		own_id, rc_root_id, (ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT),
+ 		SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_DENIED);
+ 
+@@ -568,9 +631,9 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_success)
+ 	expect_ffa_msg_wait(&rc_resp, FFA_OK);
+ 
+ 	/* Fowarding RC response to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
+-				       rc_resp.args[1], rc_resp.args[2],
+-				       rc_resp.args[3], rc_resp.args[4], &resp,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
++				       rc_resp.args.args32[1], rc_resp.args.args32[2],
++				       rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
+ 				       FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
+@@ -590,58 +653,58 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_fail_forwarding)
+ 	sp_msg sp_req = { 0 };
+ 	sp_msg sp_resp = { 0 };
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+ 	request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	/* This source ID should be denied in the current state. */
+ 	request_to_deny.source_id = rc_root_id;
+ 	request_to_deny.destination_id = own_id;
+-	request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
++	request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&request_to_deny, FFA_OK);
+ 
+ 	/* Sending error to root which fails */
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		own_id, rc_root_id, ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT,
+ 		SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_DENIED);
+ 
+@@ -649,7 +712,7 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_fail_forwarding)
+ 	expect_ffa_msg_wait(&rc_resp, result);
+ 
+ 	/* Fowarding RC error as FFA_MSG_WAIT failed  */
+-	expect_ffa_msg_send_direct_req(
++	expect_ffa_msg_send_direct_req_32(
+ 		own_id, rc_root_id, (ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT),
+ 		result, 0, 0, 0, &resp, FFA_OK);
+ 
+@@ -670,52 +733,52 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_return_rc_error_msg)
+ 	sp_msg sp_resp = { 0 };
+ 	ffa_result result = FFA_ABORTED;
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&rc_resp, result);
+ 
+ 	/* Fowarding RC error to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id,
+ 				       ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 				       SP_RESULT_FFA(result), 0, 0, 0, &resp,
+ 				       FFA_OK);
+@@ -737,54 +800,54 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_return_resp_fail)
+ 	sp_msg sp_resp = { 0 };
+ 	ffa_result result = FFA_ABORTED;
+ 
+-	fill_sp_msg(&sp_req);
++	fill_sp_msg_32(&sp_req);
+ 	sp_req.source_id = own_id;
+ 	sp_req.destination_id = rc_root_id;
+ 
+ 	req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	req.source_id = own_id;
+ 	req.destination_id = rc_root_id;
+-	copy_sp_to_ffa_args(sp_req.args, req.args);
++	copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
+ 
+-	fill_ffa_msg(&rc_req);
++	fill_ffa_msg_32(&rc_req);
+ 	rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	rc_req.source_id = rc_root_id;
+ 	rc_req.destination_id = own_id;
+-	rc_req.args[0] = ROUTING_EXT_RC_BIT;
++	rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&rc_resp);
++	fill_ffa_msg_32(&rc_resp);
+ 	rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
+ 	rc_resp.source_id = root_id;
+ 	rc_resp.destination_id = own_id;
+-	rc_resp.args[0] = ROUTING_EXT_RC_BIT;
++	rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_sp_msg(&sp_resp);
++	fill_sp_msg_32(&sp_resp);
+ 	sp_resp.source_id = rc_root_id;
+ 	sp_resp.destination_id = own_id;
+ 
+ 	resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
+ 	resp.source_id = rc_root_id;
+ 	resp.destination_id = own_id;
+-	copy_sp_to_ffa_args(sp_resp.args, resp.args);
++	copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
+ 
+ 	/* Initial request to current SP to set own_id */
+ 	wait_and_receive_request(root_id, own_id);
+ 
+ 	/* Sending request and receiving RC request from RC root */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
+-				       req.args[2], req.args[3], req.args[4],
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
++				       req.args.args32[2], req.args.args32[3], req.args.args32[4],
+ 				       &rc_req, FFA_OK);
+ 
+ 	/* Forwarding RC request to root and receiving RC response */
+-	expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
+-					rc_req.args[1], rc_req.args[2],
+-					rc_req.args[3], rc_req.args[4],
++	expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
++					rc_req.args.args32[1], rc_req.args.args32[2],
++					rc_req.args.args32[3], rc_req.args.args32[4],
+ 					&rc_resp, FFA_OK);
+ 
+ 	/* Fowarding RC response to RC root and receiving response */
+-	expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
+-				       rc_resp.args[1], rc_resp.args[2],
+-				       rc_resp.args[3], rc_resp.args[4], &resp,
++	expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
++				       rc_resp.args.args32[1], rc_resp.args.args32[2],
++				       rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
+ 				       result);
+ 
+ 	LONGS_EQUAL(SP_RESULT_FFA(result),
+@@ -812,10 +875,11 @@ TEST(sp_messaging, sp_msg_send_direct_resp_ffa_error)
+ 	ffa_result result = FFA_ABORTED;
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&resp);
++	fill_sp_msg_32(&resp);
+ 	memset(&req, 0x5a, sizeof(req));
+-	copy_sp_to_ffa_args(resp.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_resp(
++	req.is_64bit_message = false;
++	copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_resp_32(
+ 		resp.source_id, resp.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, result);
+@@ -825,14 +889,30 @@ TEST(sp_messaging, sp_msg_send_direct_resp_ffa_error)
+ 	MEMCMP_EQUAL(&empty_sp_msg, &req, sizeof(empty_sp_msg));
+ }
+ 
+-TEST(sp_messaging, sp_msg_send_direct_resp_msg)
++TEST(sp_messaging, sp_msg_send_direct_resp_msg_32)
+ {
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&resp);
+-	fill_ffa_msg(&ffa_msg);
+-	copy_sp_to_ffa_args(resp.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_resp(
++	fill_sp_msg_32(&resp);
++	fill_ffa_msg_32(&ffa_msg);
++	copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_resp_32(
++		resp.source_id, resp.destination_id, expected_ffa_args[0],
++		expected_ffa_args[1], expected_ffa_args[2],
++		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
++
++	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_resp(&resp, &req));
++	ffa_and_sp_msg_equal(&ffa_msg, &req);
++}
++
++TEST(sp_messaging, sp_msg_send_direct_resp_msg_64)
++{
++	uint64_t expected_ffa_args[5] = { 0 };
++
++	fill_sp_msg_64(&resp);
++	fill_ffa_msg_64(&ffa_msg);
++	copy_sp_to_ffa_args_64(resp.args.args64, expected_ffa_args);
++	expect_ffa_msg_send_direct_resp_64(
+ 		resp.source_id, resp.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+@@ -841,15 +921,16 @@ TEST(sp_messaging, sp_msg_send_direct_resp_msg)
+ 	ffa_and_sp_msg_equal(&ffa_msg, &req);
+ }
+ 
++
+ TEST(sp_messaging, sp_msg_send_direct_resp_success)
+ {
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 
+-	fill_sp_msg(&req);
+-	fill_sp_msg(&resp);
++	fill_sp_msg_32(&req);
++	fill_sp_msg_32(&resp);
+ 	ffa_msg.function_id = FFA_SUCCESS_32;
+-	copy_sp_to_ffa_args(resp.args, expected_ffa_args);
+-	expect_ffa_msg_send_direct_resp(
++	copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
++	expect_ffa_msg_send_direct_resp_32(
+ 		resp.source_id, resp.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+@@ -864,20 +945,20 @@ TEST(sp_messaging, sp_msg_send_direct_resp_deny_rc_failure)
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 	struct ffa_direct_msg rc_msg = { 0 };
+ 
+-	fill_sp_msg(&resp);
++	fill_sp_msg_32(&resp);
+ 
+-	fill_ffa_msg(&rc_msg);
+-	rc_msg.args[0] = ROUTING_EXT_RC_BIT;
++	fill_ffa_msg_32(&rc_msg);
++	rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&ffa_msg);
+-	copy_sp_to_ffa_args(resp.args, expected_ffa_args);
++	fill_ffa_msg_32(&ffa_msg);
++	copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
+ 
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		resp.source_id, resp.destination_id, expected_ffa_args[0],
+ 		expected_ffa_args[1], expected_ffa_args[2],
+ 		expected_ffa_args[3], expected_ffa_args[4], &rc_msg, FFA_OK);
+ 
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		rc_msg.destination_id, rc_msg.source_id,
+ 		ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, result);
+@@ -892,21 +973,21 @@ TEST(sp_messaging, sp_msg_send_direct_resp_deny_rc)
+ 	uint32_t expected_ffa_args[5] = { 0 };
+ 	struct ffa_direct_msg rc_msg = { 0 };
+ 
+-	fill_sp_msg(&resp);
++	fill_sp_msg_32(&resp);
+ 
+-	fill_ffa_msg(&rc_msg);
+-	rc_msg.args[0] = ROUTING_EXT_RC_BIT;
++	fill_ffa_msg_32(&rc_msg);
++	rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	fill_ffa_msg(&ffa_msg);
+-	copy_sp_to_ffa_args(resp.args, expected_ffa_args);
++	fill_ffa_msg_32(&ffa_msg);
++	copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
+ 
+-	expect_ffa_msg_send_direct_resp(resp.source_id, resp.destination_id, 0,
++	expect_ffa_msg_send_direct_resp_32(resp.source_id, resp.destination_id, 0,
+ 					expected_ffa_args[1],
+ 					expected_ffa_args[2],
+ 					expected_ffa_args[3],
+ 					expected_ffa_args[4], &rc_msg, FFA_OK);
+ 
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		rc_msg.destination_id, rc_msg.source_id,
+ 		ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, FFA_OK);
+@@ -933,13 +1014,14 @@ TEST(sp_messaging, sp_msg_send_rc_req_ffa_error)
+ {
+ 	ffa_result result = FFA_ABORTED;
+ 
+-	fill_sp_msg(&resp);
++	fill_sp_msg_32(&resp);
+ 	memset(&req, 0x5a, sizeof(req));
+-	fill_ffa_msg(&ffa_msg);
++	req.is_64bit_message = false;
++	fill_ffa_msg_32(&ffa_msg);
+ 
+-	expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
+-					ROUTING_EXT_RC_BIT, req.args[0],
+-					req.args[1], req.args[2], req.args[3],
++	expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
++					ROUTING_EXT_RC_BIT, req.args.args32[0],
++					req.args.args32[1], req.args.args32[2], req.args.args32[3],
+ 					&ffa_msg, result);
+ 
+ 	LONGS_EQUAL(SP_RESULT_FFA(result), sp_msg_send_rc_req(&req, &resp));
+@@ -953,22 +1035,22 @@ TEST(sp_messaging, sp_msg_send_rc_req_deny_fail_wait_fail)
+ 
+ 	wait_and_receive_request(root_id, own_id);
+ 
+-	fill_sp_msg(&req);
++	fill_sp_msg_32(&req);
+ 	req.source_id = own_id;
+ 	req.destination_id = root_id;
+ 
+-	fill_ffa_msg(&ffa_msg);
++	fill_ffa_msg_32(&ffa_msg);
+ 	ffa_msg.source_id = root_id;
+ 	ffa_msg.destination_id = own_id;
+ 	/* Should be RC message so it will be denied */
+-	ffa_msg.args[0] = 0;
++	ffa_msg.args.args32[0] = 0;
+ 
+-	expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
+-					ROUTING_EXT_RC_BIT, req.args[0],
+-					req.args[1], req.args[2], req.args[3],
++	expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
++					ROUTING_EXT_RC_BIT, req.args.args32[0],
++					req.args.args32[1], req.args.args32[2], req.args.args32[3],
+ 					&ffa_msg, FFA_OK);
+ 
+-	expect_ffa_msg_send_direct_resp(
++	expect_ffa_msg_send_direct_resp_32(
+ 		req.source_id, req.destination_id,
+ 		ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
+ 		SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &ffa_msg, result);
+@@ -987,19 +1069,19 @@ TEST(sp_messaging, sp_msg_send_rc_req_rc_error)
+ 
+ 	wait_and_receive_request(root_id, own_id);
+ 
+-	fill_sp_msg(&req);
++	fill_sp_msg_32(&req);
+ 	req.source_id = own_id;
+ 	req.destination_id = root_id;
+ 
+-	fill_ffa_msg(&ffa_msg);
++	fill_ffa_msg_32(&ffa_msg);
+ 	ffa_msg.source_id = root_id;
+ 	ffa_msg.destination_id = own_id;
+-	ffa_msg.args[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
+-	ffa_msg.args[1] = sp_err;
++	ffa_msg.args.args32[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
++	ffa_msg.args.args32[1] = sp_err;
+ 
+-	expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
+-					ROUTING_EXT_RC_BIT, req.args[0],
+-					req.args[1], req.args[2], req.args[3],
++	expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
++					ROUTING_EXT_RC_BIT, req.args.args32[0],
++					req.args.args32[1], req.args.args32[2], req.args.args32[3],
+ 					&ffa_msg, FFA_OK);
+ 
+ 	LONGS_EQUAL(sp_err, sp_msg_send_rc_req(&req, &resp));
+@@ -1013,18 +1095,18 @@ TEST(sp_messaging, sp_msg_send_rc_req_success)
+ 
+ 	wait_and_receive_request(root_id, own_id);
+ 
+-	fill_sp_msg(&req);
++	fill_sp_msg_32(&req);
+ 	req.source_id = own_id;
+ 	req.destination_id = root_id;
+ 
+-	fill_ffa_msg(&ffa_msg);
++	fill_ffa_msg_32(&ffa_msg);
+ 	ffa_msg.source_id = root_id;
+ 	ffa_msg.destination_id = own_id;
+-	ffa_msg.args[0] = ROUTING_EXT_RC_BIT;
++	ffa_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
+ 
+-	expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
+-					ROUTING_EXT_RC_BIT, req.args[0],
+-					req.args[1], req.args[2], req.args[3],
++	expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
++					ROUTING_EXT_RC_BIT, req.args.args32[0],
++					req.args.args32[1], req.args.args32[2], req.args.args32[3],
+ 					&ffa_msg, FFA_OK);
+ 
+ 	LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_rc_req(&req, &resp));
+diff --git a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
+index 4ad98fb..ca3d318 100644
+--- a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
++++ b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
+@@ -81,16 +81,17 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t
+ 
+ 	req.destination_id = this_context->dest_partition_id;
+ 	req.source_id = own_id;
+-	req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
++	req.is_64bit_message = false;
++	req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ 		FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(this_context->dest_iface_id, opcode);
+-	req.args[SP_CALL_ARGS_REQ_DATA_LEN] = (uint32_t)this_context->req_len;
+-	req.args[SP_CALL_ARGS_ENCODING] = this_context->rpc_caller.encoding;
++	req.args.args32[SP_CALL_ARGS_REQ_DATA_LEN] = (uint32_t)this_context->req_len;
++	req.args.args32[SP_CALL_ARGS_ENCODING] = this_context->rpc_caller.encoding;
+ 
+ 	/* Initialise the caller ID.  Depending on the call path, this may
+ 	 * be overridden by a higher privilege execution level, based on its
+ 	 * perspective of the caller identity.
+ 	 */
+-	req.args[SP_CALL_ARGS_CALLER_ID] = 0;
++	req.args.args32[SP_CALL_ARGS_CALLER_ID] = 0;
+ 
+ 	sp_res = sp_msg_send_direct_req(&req, &resp);
+ 	if (sp_res != SP_RESULT_OK) {
+@@ -98,9 +99,9 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t
+ 		goto out;
+ 	}
+ 
+-	this_context->resp_len = (size_t)resp.args[SP_CALL_ARGS_RESP_DATA_LEN];
+-	status = resp.args[SP_CALL_ARGS_RESP_RPC_STATUS];
+-	*opstatus = (rpc_status_t)((int32_t)resp.args[SP_CALL_ARGS_RESP_OP_STATUS]);
++	this_context->resp_len = (size_t)resp.args.args32[SP_CALL_ARGS_RESP_DATA_LEN];
++	status = resp.args.args32[SP_CALL_ARGS_RESP_RPC_STATUS];
++	*opstatus = (rpc_status_t)((int32_t)resp.args.args32[SP_CALL_ARGS_RESP_OP_STATUS]);
+ 
+ 	if (this_context->resp_len > this_context->shared_mem_required_size) {
+ 		EMSG("invalid response length");
+@@ -242,11 +243,12 @@ int ffarpc_caller_open(struct ffarpc_caller *caller, uint16_t dest_partition_id,
+ 
+ 	req.source_id = own_id;
+ 	req.destination_id = dest_partition_id;
+-	req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
++	req.is_64bit_message = false;
++	req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ 		FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_SHARE_BUF);
+-	req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & UINT32_MAX);
+-	req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(handle >> 32);
+-	req.args[SP_CALL_ARGS_SHARE_MEM_SIZE] = (uint32_t)(caller->shared_mem_required_size);
++	req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & UINT32_MAX);
++	req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(handle >> 32);
++	req.args.args32[SP_CALL_ARGS_SHARE_MEM_SIZE] = (uint32_t)(caller->shared_mem_required_size);
+ 
+ 	sp_res = sp_msg_send_direct_req(&req, &resp);
+ 	if (sp_res != SP_RESULT_OK) {
+@@ -273,10 +275,11 @@ int ffarpc_caller_close(struct ffarpc_caller *caller)
+ 
+ 	req.source_id = own_id;
+ 	req.destination_id = caller->dest_partition_id;
+-	req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
++	req.is_64bit_message = false;
++	req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ 		FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_UNSHARE_BUF);
+-	req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = handle_lo;
+-	req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = handle_hi;
++	req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = handle_lo;
++	req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = handle_hi;
+ 
+ 	sp_res = sp_msg_send_direct_req(&req, &resp);
+ 	if (sp_res != SP_RESULT_OK) {
+diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
+index 6a8cef0..c024196 100644
+--- a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
++++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
+@@ -260,8 +260,8 @@ void ffa_call_ep_receive(struct ffa_call_ep *call_ep,
+ 			 const struct sp_msg *req_msg,
+ 			 struct sp_msg *resp_msg)
+ {
+-	const uint32_t *req_args = req_msg->args;
+-	uint32_t *resp_args = resp_msg->args;
++	const uint32_t *req_args = req_msg->args.args32;
++	uint32_t *resp_args = resp_msg->args.args32;
+ 
+ 	uint16_t source_id = req_msg->source_id;
+ 	uint32_t ifaceid_opcode = req_args[SP_CALL_ARGS_IFACE_ID_OPCODE];
+diff --git a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
+index 09f1e2c..dc49e64 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
++++ b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include "components/rpc/mm_communicate/common/mm_communicate_call_args.h"
+@@ -127,15 +127,15 @@ void mm_communicate_call_ep_receive(struct mm_communicate_ep *mm_communicate_cal
+ 	uintptr_t buffer_address = 0;
+ 	size_t buffer_size = 0;
+ 
+-	buffer_address = req_msg->args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS];
+-	buffer_size = req_msg->args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE];
++	buffer_address = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS];
++	buffer_size = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE];
+ 
+ 	return_value = handle_mm_communicate(mm_communicate_call_ep, req_msg->source_id,
+ 					     buffer_address, buffer_size);
+ 
+-	resp_msg->args[MM_COMMUNICATE_CALL_ARGS_RETURN_ID] = ARM_SVC_ID_SP_EVENT_COMPLETE;
+-	resp_msg->args[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
+-	resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
+-	resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
+-	resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
++	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_ID] = ARM_SVC_ID_SP_EVENT_COMPLETE;
++	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
++	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
++	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
++	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
+ }
+diff --git a/deployments/smm-gateway/common/smm_gateway_sp.c b/deployments/smm-gateway/common/smm_gateway_sp.c
+index 2187fea..3697b7f 100644
+--- a/deployments/smm-gateway/common/smm_gateway_sp.c
++++ b/deployments/smm-gateway/common/smm_gateway_sp.c
+@@ -70,10 +70,10 @@ void __noreturn sp_main(struct ffa_init_info *init_info)
+ 	while (1) {
+ 		mm_communicate_call_ep_receive(&mm_communicate_call_ep, &req_msg, &resp_msg);
+ 
+-		ffa_msg_send_direct_resp(req_msg.destination_id,
+-					 req_msg.source_id, resp_msg.args[0],
+-					 resp_msg.args[1], resp_msg.args[2],
+-					 resp_msg.args[3], resp_msg.args[4],
++		ffa_msg_send_direct_resp_32(req_msg.destination_id,
++					 req_msg.source_id, resp_msg.args.args32[0],
++					 resp_msg.args.args32[1], resp_msg.args.args32[2],
++					 resp_msg.args.args32[3], resp_msg.args.args32[4],
+ 					 &req_msg);
+ 	}
+ 
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0022-Change-MM-communicate-RPC-protocol-of-call-endpoint.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0022-Change-MM-communicate-RPC-protocol-of-call-endpoint.patch
new file mode 100644
index 0000000..4090397
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0022-Change-MM-communicate-RPC-protocol-of-call-endpoint.patch
@@ -0,0 +1,497 @@
+From 0f02f04c7f0a7130874dc4bc1a500604d580c4dc Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Wed, 20 Jul 2022 15:19:17 +0200
+Subject: [PATCH 22/24] Change MM communicate RPC protocol of call endpoint
+
+Replace buffer address and size parameter by offset in buffer parameter
+and move to 64 bit FF-A direct message call. Deny all 32 bit direct
+messages in SMM gateway.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I7a69b440ff9842960229b2bfdd1b5ae5318d9c26
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../common/mm_communicate_call_args.h         |  15 ++-
+ .../endpoint/sp/mm_communicate_call_ep.c      |  58 ++++-----
+ .../endpoint/sp/test/mock_mm_service.cpp      |   6 +-
+ .../endpoint/sp/test/mock_mm_service.h        |   4 +-
+ .../sp/test/test_mm_communicate_call_ep.cpp   | 110 +++++++++++-------
+ .../endpoint/sp/test/test_mock_mm_service.cpp |   4 +-
+ .../smm-gateway/common/smm_gateway_sp.c       |  17 ++-
+ 7 files changed, 123 insertions(+), 91 deletions(-)
+
+diff --git a/components/rpc/mm_communicate/common/mm_communicate_call_args.h b/components/rpc/mm_communicate/common/mm_communicate_call_args.h
+index 7d7311d..280c04d 100644
+--- a/components/rpc/mm_communicate/common/mm_communicate_call_args.h
++++ b/components/rpc/mm_communicate/common/mm_communicate_call_args.h
+@@ -1,6 +1,6 @@
+ /* SPDX-License-Identifier: BSD-3-Clause */
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #ifndef MM_COMMUNICATE_CALL_ARGS_H_
+@@ -12,13 +12,12 @@
+  */
+ 
+ /* SP message arg indexes */
+-#define MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS	0
+-#define MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE	1
++#define MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_OFFSET	0
+ 
+-#define MM_COMMUNICATE_CALL_ARGS_RETURN_ID		0
+-#define MM_COMMUNICATE_CALL_ARGS_RETURN_CODE		1
+-#define MM_COMMUNICATE_CALL_ARGS_MBZ0			2
+-#define MM_COMMUNICATE_CALL_ARGS_MBZ1			3
+-#define MM_COMMUNICATE_CALL_ARGS_MBZ2			4
++#define MM_COMMUNICATE_CALL_ARGS_RETURN_CODE		0
++#define MM_COMMUNICATE_CALL_ARGS_MBZ0			1
++#define MM_COMMUNICATE_CALL_ARGS_MBZ1			2
++#define MM_COMMUNICATE_CALL_ARGS_MBZ2			3
++#define MM_COMMUNICATE_CALL_ARGS_MBZ3			4
+ 
+ #endif /* MM_COMMUNICATE_CALL_ARGS_H_ */
+diff --git a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
+index dc49e64..93aa0f4 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
++++ b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
+@@ -35,7 +35,8 @@ bool mm_communicate_call_ep_init(struct mm_communicate_ep *call_ep, uint8_t *com
+ 
+ static int32_t invoke_mm_service(struct mm_communicate_ep *call_ep, uint16_t source_id,
+ 				 struct mm_service_interface *iface,
+-				 EFI_MM_COMMUNICATE_HEADER *header)
++				 EFI_MM_COMMUNICATE_HEADER *header,
++				 size_t buffer_size)
+ {
+ 	rpc_status_t rpc_status = TS_RPC_ERROR_INTERNAL;
+ 	struct mm_service_call_req call_req = { 0 };
+@@ -49,11 +50,11 @@ static int32_t invoke_mm_service(struct mm_communicate_ep *call_ep, uint16_t sou
+ 	 */
+ 	call_req.req_buf.data = header->Data;
+ 	call_req.req_buf.data_len = header->MessageLength;
+-	call_req.req_buf.size = call_ep->comm_buffer_size - EFI_MM_COMMUNICATE_HEADER_SIZE;
++	call_req.req_buf.size = buffer_size;
+ 
+ 	call_req.resp_buf.data = header->Data;
+ 	call_req.resp_buf.data_len = 0;
+-	call_req.resp_buf.size = call_ep->comm_buffer_size - EFI_MM_COMMUNICATE_HEADER_SIZE;
++	call_req.resp_buf.size = buffer_size;
+ 
+ 	result = iface->receive(iface, &call_req);
+ 
+@@ -63,32 +64,38 @@ static int32_t invoke_mm_service(struct mm_communicate_ep *call_ep, uint16_t sou
+ }
+ 
+ static int32_t handle_mm_communicate(struct mm_communicate_ep *call_ep, uint16_t source_id,
+-				     uintptr_t buffer_addr, size_t buffer_size)
++				     size_t buffer_offset)
+ {
+-	uintptr_t buffer_arg = 0;
+-	size_t request_size = 0;
++	size_t header_end_offset = 0;
++	size_t request_end_offset = 0;
++	size_t buffer_size = 0;
+ 	EFI_MM_COMMUNICATE_HEADER *header = NULL;
+ 	unsigned int i = 0;
+ 
+-	/* Validating call args according to ARM MM spec 3.2.4 */
+-	if (buffer_addr == 0)
++	if (ADD_OVERFLOW(buffer_offset, EFI_MM_COMMUNICATE_HEADER_SIZE, &header_end_offset))
++		return MM_RETURN_CODE_INVALID_PARAMETER;
++
++	if (call_ep->comm_buffer_size < header_end_offset)
+ 		return MM_RETURN_CODE_INVALID_PARAMETER;
+ 
+ 	/* Validating comm buffer contents */
+-	header = (EFI_MM_COMMUNICATE_HEADER *)call_ep->comm_buffer;
+-	if (ADD_OVERFLOW(header->MessageLength, EFI_MM_COMMUNICATE_HEADER_SIZE, &request_size))
++	header = (EFI_MM_COMMUNICATE_HEADER *)(call_ep->comm_buffer + buffer_offset);
++	if (ADD_OVERFLOW(header_end_offset, header->MessageLength, &request_end_offset))
+ 		return MM_RETURN_CODE_INVALID_PARAMETER;
+ 
+-	if (call_ep->comm_buffer_size < request_size)
++	if (call_ep->comm_buffer_size < request_end_offset)
+ 		return MM_RETURN_CODE_INVALID_PARAMETER;
+ 
++	buffer_size = call_ep->comm_buffer_size - header_end_offset;
++
+ 	/* Finding iface_id by GUID */
+ 	for (i = 0; i < ARRAY_SIZE(call_ep->service_table); i++) {
+ 		const struct mm_service_entry *entry = &call_ep->service_table[i];
+ 
+ 		if (entry->iface != NULL &&
+ 		    memcmp(&header->HeaderGuid, &entry->guid, sizeof(entry->guid)) == 0)
+-			return invoke_mm_service(call_ep, source_id, entry->iface, header);
++			return invoke_mm_service(call_ep, source_id, entry->iface, header,
++						 buffer_size);
+ 	}
+ 
+ 	return MM_RETURN_CODE_NOT_SUPPORTED;
+@@ -123,19 +130,16 @@ void mm_communicate_call_ep_receive(struct mm_communicate_ep *mm_communicate_cal
+ 				    const struct ffa_direct_msg *req_msg,
+ 				    struct ffa_direct_msg *resp_msg)
+ {
+-	int32_t return_value = 0;
+-	uintptr_t buffer_address = 0;
+-	size_t buffer_size = 0;
+-
+-	buffer_address = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS];
+-	buffer_size = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE];
+-
+-	return_value = handle_mm_communicate(mm_communicate_call_ep, req_msg->source_id,
+-					     buffer_address, buffer_size);
+-
+-	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_ID] = ARM_SVC_ID_SP_EVENT_COMPLETE;
+-	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
+-	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
+-	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
+-	resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
++	int32_t return_value = MM_RETURN_CODE_NOT_SUPPORTED;
++	size_t buffer_offset = req_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_OFFSET];
++
++	return_value = handle_mm_communicate(mm_communicate_call_ep,
++						req_msg->source_id,
++						buffer_offset);
++
++	resp_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
++	resp_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
++	resp_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
++	resp_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
++	resp_msg->args.args64[MM_COMMUNICATE_CALL_ARGS_MBZ3] = 0;
+ }
+diff --git a/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.cpp b/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.cpp
+index a58c33a..0ae2a80 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.cpp
++++ b/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.cpp
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include <CppUTestExt/MockSupport.h>
+@@ -16,7 +16,7 @@ void mock_mm_service_init(void)
+ 
+ void expect_mock_mm_service_receive(struct mm_service_interface *iface,
+ 				    const struct mm_service_call_req *req,
+-				    int32_t result)
++				    int64_t result)
+ {
+ 	mock().expectOneCall("mm_service_receive").onObject(iface).
+ 		withOutputParameterReturning("resp_buf_data_len", &req->resp_buf.data_len,
+@@ -31,5 +31,5 @@ int32_t mock_mm_service_receive(struct mm_service_interface *iface,
+ 	return mock().actualCall("mm_service_receive").onObject(iface).
+ 		withOutputParameter("resp_buf_data_len", &req->resp_buf.data_len).
+ 		withParameterOfType("mm_service_call_req", "req", req).
+-		returnIntValue();
++		returnLongIntValue();
+ }
+diff --git a/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.h b/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.h
+index 768022d..56c8a26 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.h
++++ b/components/rpc/mm_communicate/endpoint/sp/test/mock_mm_service.h
+@@ -1,6 +1,6 @@
+ /* SPDX-License-Identifier: BSD-3-Clause */
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #ifndef MOCK_MM_SERVICE_H_
+@@ -16,7 +16,7 @@ void mock_mm_service_init(void);
+ 
+ void expect_mock_mm_service_receive(struct mm_service_interface *iface,
+ 				    const struct mm_service_call_req *req,
+-				    int32_t result);
++				    int64_t result);
+ 
+ int32_t mock_mm_service_receive(struct mm_service_interface *iface,
+ 				struct mm_service_call_req *req);
+diff --git a/components/rpc/mm_communicate/endpoint/sp/test/test_mm_communicate_call_ep.cpp b/components/rpc/mm_communicate/endpoint/sp/test/test_mm_communicate_call_ep.cpp
+index 55a61fb..5aaa3a6 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/test/test_mm_communicate_call_ep.cpp
++++ b/components/rpc/mm_communicate/endpoint/sp/test/test_mm_communicate_call_ep.cpp
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include <CppUTest/TestHarness.h>
+@@ -32,14 +32,14 @@ TEST_GROUP(mm_communicate_call_ep)
+ 		mock().clear();
+ 	}
+ 
+-	void check_sp_msg(const struct ffa_direct_msg *msg, uint32_t arg0,
+-			  uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4)
++	void check_sp_msg(const struct ffa_direct_msg *msg, uint64_t arg0,
++			  uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4)
+ 	{
+-		UNSIGNED_LONGLONGS_EQUAL(arg0, msg->args[0]);
+-		UNSIGNED_LONGLONGS_EQUAL(arg1, msg->args[1]);
+-		UNSIGNED_LONGLONGS_EQUAL(arg2, msg->args[2]);
+-		UNSIGNED_LONGLONGS_EQUAL(arg3, msg->args[3]);
+-		UNSIGNED_LONGLONGS_EQUAL(arg4,  msg->args[4]);
++		UNSIGNED_LONGLONGS_EQUAL(arg0, msg->args.args64[0]);
++		UNSIGNED_LONGLONGS_EQUAL(arg1, msg->args.args64[1]);
++		UNSIGNED_LONGLONGS_EQUAL(arg2, msg->args.args64[2]);
++		UNSIGNED_LONGLONGS_EQUAL(arg3, msg->args.args64[3]);
++		UNSIGNED_LONGLONGS_EQUAL(arg4,  msg->args.args64[4]);
+ 	}
+ 
+ 	struct mm_communicate_ep call_ep;
+@@ -114,59 +114,54 @@ TEST(mm_communicate_call_ep, attach_do_not_fit)
+ 	}
+ }
+ 
+-TEST(mm_communicate_call_ep, mm_communicate_no_buffer_arg)
++TEST(mm_communicate_call_ep, mm_communicate_offset_int_overflow)
+ {
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
++	req_msg.args.args64[0] = 0xffffffffffffffff;
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_INVALID_PARAMETER,
+-		     0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_INVALID_PARAMETER, 0, 0, 0, 0);
+ }
+ 
+-TEST(mm_communicate_call_ep, mm_communicate_length_overflow)
++TEST(mm_communicate_call_ep, mm_communicate_offset_overflow)
+ {
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
++	req_msg.args.args64[0] = sizeof(comm_buffer) - EFI_MM_COMMUNICATE_HEADER_SIZE + 1;
++
++	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_INVALID_PARAMETER, 0, 0, 0, 0);
++}
+ 
++TEST(mm_communicate_call_ep, mm_communicate_length_overflow)
++{
++	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+ 	header->MessageLength = UINT64_MAX - EFI_MM_COMMUNICATE_HEADER_SIZE + 1;
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_INVALID_PARAMETER,
+-		     0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_INVALID_PARAMETER, 0, 0, 0, 0);
+ }
+ 
+ TEST(mm_communicate_call_ep, mm_communicate_too_large)
+ {
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+-
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
+-
+ 	header->MessageLength = sizeof(comm_buffer) - EFI_MM_COMMUNICATE_HEADER_SIZE + 1;
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_INVALID_PARAMETER,
+-		     0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_INVALID_PARAMETER, 0, 0, 0, 0);
+ }
+ 
+ TEST(mm_communicate_call_ep, mm_communicate_no_handler)
+ {
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+-
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
+-
+ 	header->MessageLength = 0;
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_NOT_SUPPORTED,
+-		     0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_NOT_SUPPORTED, 0, 0, 0, 0);
+ }
+ 
+ TEST(mm_communicate_call_ep, mm_communicate_single_handler_not_matching)
+@@ -175,16 +170,11 @@ TEST(mm_communicate_call_ep, mm_communicate_single_handler_not_matching)
+ 
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+ 	mm_communicate_call_ep_attach_service(&call_ep, &guid0, &iface);
+-
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
+-
+ 	header->MessageLength = 0;
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_NOT_SUPPORTED,
+-		     0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_NOT_SUPPORTED, 0, 0, 0, 0);
+ }
+ 
+ TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching)
+@@ -211,19 +201,55 @@ TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching)
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+ 	mm_communicate_call_ep_attach_service(&call_ep, &guid0, &iface);
+ 
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
++	memcpy(&header->HeaderGuid, &guid0, sizeof(guid0));
++	header->MessageLength = req_len;
++
++	expect_mock_mm_service_receive(&iface, &req, MM_RETURN_CODE_SUCCESS);
++
++	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
++
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_SUCCESS, 0, 0, 0, 0);
++}
++
++TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching_with_offset)
++{
++	const size_t offset = 0x10;
++	EFI_MM_COMMUNICATE_HEADER *header = (EFI_MM_COMMUNICATE_HEADER *)(comm_buffer + offset);
++
++	const size_t req_len = 16;
++	struct mm_service_interface iface = {
++		.context = (void *)0x1234,
++		.receive = mock_mm_service_receive
++	};
++	struct mm_service_call_req req = {
++		.guid = &guid0,
++		.req_buf = {
++			.size = sizeof(comm_buffer) - EFI_MM_COMMUNICATE_HEADER_SIZE - offset,
++			.data_len = req_len,
++			.data = header->Data
++		},
++		.resp_buf = {
++			.size = sizeof(comm_buffer) - EFI_MM_COMMUNICATE_HEADER_SIZE - offset,
++			.data_len = 0,
++			.data = header->Data
++		},
++	};
++
++	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
++	mm_communicate_call_ep_attach_service(&call_ep, &guid0, &iface);
+ 
+ 	memcpy(&header->HeaderGuid, &guid0, sizeof(guid0));
+ 	header->MessageLength = req_len;
++	req_msg.args.args64[0] = offset;
+ 
+ 	expect_mock_mm_service_receive(&iface, &req, MM_RETURN_CODE_SUCCESS);
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_SUCCESS, 0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_SUCCESS, 0, 0, 0, 0);
+ }
+ 
++
+ TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching_error)
+ {
+ 	const size_t req_len = 16;
+@@ -248,9 +274,6 @@ TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching_error)
+ 	CHECK_TRUE(mm_communicate_call_ep_init(&call_ep, comm_buffer, sizeof(comm_buffer)));
+ 	mm_communicate_call_ep_attach_service(&call_ep, &guid0, &iface);
+ 
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
+-
+ 	memcpy(&header->HeaderGuid, &guid0, sizeof(guid0));
+ 	header->MessageLength = req_len;
+ 
+@@ -258,7 +281,7 @@ TEST(mm_communicate_call_ep, mm_communicate_single_handler_matching_error)
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_NO_MEMORY, 0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_NO_MEMORY, 0, 0, 0, 0);
+ }
+ 
+ TEST(mm_communicate_call_ep, mm_communicate_two_handlers)
+@@ -290,9 +313,6 @@ TEST(mm_communicate_call_ep, mm_communicate_two_handlers)
+ 	mm_communicate_call_ep_attach_service(&call_ep, &guid0, &iface0);
+ 	mm_communicate_call_ep_attach_service(&call_ep, &guid1, &iface1);
+ 
+-	req_msg.args[0] = (uintptr_t)comm_buffer;
+-	req_msg.args[1] = sizeof(comm_buffer);
+-
+ 	memcpy(&header->HeaderGuid, &guid1, sizeof(guid0));
+ 	header->MessageLength = req_len;
+ 
+@@ -300,5 +320,5 @@ TEST(mm_communicate_call_ep, mm_communicate_two_handlers)
+ 
+ 	mm_communicate_call_ep_receive(&call_ep, &req_msg, &resp_msg);
+ 
+-	check_sp_msg(&resp_msg, ARM_SVC_ID_SP_EVENT_COMPLETE, MM_RETURN_CODE_SUCCESS, 0, 0, 0);
++	check_sp_msg(&resp_msg, MM_RETURN_CODE_SUCCESS, 0, 0, 0, 0);
+ }
+diff --git a/components/rpc/mm_communicate/endpoint/sp/test/test_mock_mm_service.cpp b/components/rpc/mm_communicate/endpoint/sp/test/test_mock_mm_service.cpp
+index 360a8fa..600386e 100644
+--- a/components/rpc/mm_communicate/endpoint/sp/test/test_mock_mm_service.cpp
++++ b/components/rpc/mm_communicate/endpoint/sp/test/test_mock_mm_service.cpp
+@@ -1,6 +1,6 @@
+ // SPDX-License-Identifier: BSD-3-Clause
+ /*
+- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
++ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+  */
+ 
+ #include <CppUTest/TestHarness.h>
+@@ -44,7 +44,7 @@ TEST(mock_mm_service, receive)
+ 			.data = (void *)0x2345
+ 		}
+ 	};
+-	int32_t result = -123456;
++	int64_t result = -123456;
+ 
+ 	expect_mock_mm_service_receive(&iface, &req, result);
+ 	LONGS_EQUAL(result, mock_mm_service_receive(&iface, &req));
+diff --git a/deployments/smm-gateway/common/smm_gateway_sp.c b/deployments/smm-gateway/common/smm_gateway_sp.c
+index 3697b7f..3062877 100644
+--- a/deployments/smm-gateway/common/smm_gateway_sp.c
++++ b/deployments/smm-gateway/common/smm_gateway_sp.c
+@@ -11,6 +11,7 @@
+ #include "components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.h"
+ #include "components/service/smm_variable/frontend/mm_communicate/smm_variable_mm_service.h"
+ #include "platform/interface/memory_region.h"
++#include "protocols/common/mm/mm_smc.h"
+ #include <ffa_api.h>
+ #include <sp_api.h>
+ #include <sp_messaging.h>
+@@ -68,12 +69,20 @@ void __noreturn sp_main(struct ffa_init_info *init_info)
+ 	ffa_msg_wait(&req_msg);
+ 
+ 	while (1) {
++		if (FFA_IS_32_BIT_FUNC(req_msg.function_id)) {
++			EMSG("MM communicate over 32 bit FF-A messages is not supported");
++			ffa_msg_send_direct_resp_32(req_msg.destination_id, req_msg.source_id,
++						    MM_RETURN_CODE_NOT_SUPPORTED, 0, 0, 0, 0,
++						    &req_msg);
++			continue;
++		}
++
+ 		mm_communicate_call_ep_receive(&mm_communicate_call_ep, &req_msg, &resp_msg);
+ 
+-		ffa_msg_send_direct_resp_32(req_msg.destination_id,
+-					 req_msg.source_id, resp_msg.args.args32[0],
+-					 resp_msg.args.args32[1], resp_msg.args.args32[2],
+-					 resp_msg.args.args32[3], resp_msg.args.args32[4],
++		ffa_msg_send_direct_resp_64(req_msg.destination_id,
++					 req_msg.source_id, resp_msg.args.args64[0],
++					 resp_msg.args.args64[1], resp_msg.args.args64[2],
++					 resp_msg.args.args64[3], resp_msg.args.args64[4],
+ 					 &req_msg);
+ 	}
+ 
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0023-Change-MM-communicate-RPC-protocol-of-MM-caller.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0023-Change-MM-communicate-RPC-protocol-of-MM-caller.patch
new file mode 100644
index 0000000..4244225
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0023-Change-MM-communicate-RPC-protocol-of-MM-caller.patch
@@ -0,0 +1,100 @@
+From 96d226e4e0ea9c633dbc5d05ae2a7a2f4ba0f39e Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Fri, 22 Jul 2022 17:22:05 +0200
+Subject: [PATCH 23/24] Change MM communicate RPC protocol of MM caller
+
+Replace buffer address and size parameter by offset in buffer parameter
+and move to 64 bit FF-A direct message call. This change requires an
+updated version of the debugfs driver which supports 64 bit direct
+messages.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I003c1de7f9c3f45bbc52e4a51d622ec960fa7052
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../caller/linux/mm_communicate_caller.c      | 35 +++++++------------
+ .../LinuxFFAUserShim/LinuxFFAUserShim.cmake   |  2 +-
+ 2 files changed, 14 insertions(+), 23 deletions(-)
+
+diff --git a/components/rpc/mm_communicate/caller/linux/mm_communicate_caller.c b/components/rpc/mm_communicate/caller/linux/mm_communicate_caller.c
+index 0c505b4..0287acf 100644
+--- a/components/rpc/mm_communicate/caller/linux/mm_communicate_caller.c
++++ b/components/rpc/mm_communicate/caller/linux/mm_communicate_caller.c
+@@ -19,7 +19,7 @@
+ #include <string.h>
+ #include <errno.h>
+ 
+-#define KERNEL_MOD_REQ_VER_MAJOR 2
++#define KERNEL_MOD_REQ_VER_MAJOR 5
+ #define KERNEL_MOD_REQ_VER_MINOR 0
+ #define KERNEL_MOD_REQ_VER_PATCH 0
+ 
+@@ -294,37 +294,28 @@ static rpc_status_t call_invoke(
+ 
+ 		direct_msg.dst_id = s->dest_partition_id;
+ 
+-		direct_msg.args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS] = (uintptr_t)s->comm_buffer;
+-		direct_msg.args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE] = s->comm_buffer_size;
++		direct_msg.args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_OFFSET] = 0;
+ 
+ 		int kernel_op_status = ioctl(s->ffa_fd, FFA_IOC_MSG_SEND, &direct_msg);
+ 
+ 		if (kernel_op_status == 0) {
+-
+ 			/* Kernel send operation completed normally */
+-			uint32_t mm_return_id = direct_msg.args[MM_COMMUNICATE_CALL_ARGS_RETURN_ID];
+ 			int32_t mm_return_code = direct_msg.args[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE];
+ 
+-			if (mm_return_id == ARM_SVC_ID_SP_EVENT_COMPLETE) {
+-
+-				if (mm_return_code == MM_RETURN_CODE_SUCCESS) {
+-
+-					mm_communicate_serializer_header_decode(s->serializer,
+-						s->comm_buffer, (efi_status_t*)opstatus, resp_buf, resp_len);
+-
+-					if (*resp_len > s->req_len) {
++			if (mm_return_code == MM_RETURN_CODE_SUCCESS) {
++				mm_communicate_serializer_header_decode(
++					s->serializer, s->comm_buffer, (efi_status_t *)opstatus,
++					resp_buf, resp_len);
+ 
+-						s->scrub_len =
+-							mm_communicate_serializer_header_size(s->serializer) +
+-							*resp_len;
+-					}
++				if (*resp_len > s->req_len)
++					s->scrub_len =
++						mm_communicate_serializer_header_size(
++							s->serializer) + *resp_len;
+ 
+-					rpc_status = TS_RPC_CALL_ACCEPTED;
+-				}
+-				else {
++				rpc_status = TS_RPC_CALL_ACCEPTED;
++			} else {
+ 
+-					rpc_status = mm_return_code_to_rpc_status(mm_return_code);
+-				}
++				rpc_status = mm_return_code_to_rpc_status(mm_return_code);
+ 			}
+ 		}
+ 	}
+diff --git a/external/LinuxFFAUserShim/LinuxFFAUserShim.cmake b/external/LinuxFFAUserShim/LinuxFFAUserShim.cmake
+index 7ba64af..9c2252c 100644
+--- a/external/LinuxFFAUserShim/LinuxFFAUserShim.cmake
++++ b/external/LinuxFFAUserShim/LinuxFFAUserShim.cmake
+@@ -11,7 +11,7 @@
+ 
+ set(LINUX_FFA_USER_SHIM_URL "https://git.gitlab.arm.com/linux-arm/linux-trusted-services.git"
+ 	CACHE STRING "Linux FF-A user space shim repository URL")
+-set(LINUX_FFA_USER_SHIM_REFSPEC "v4.0.0"
++set(LINUX_FFA_USER_SHIM_REFSPEC "v5.0.0"
+ 	CACHE STRING "Linux FF-A user space shim git refspec")
+ 
+ set(LINUX_FFA_USER_SHIM_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/linux_ffa_user_shim-src"
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/files/0024-Deny-64-bit-FF-A-messages-in-FF-A-RPC-endpoint.patch b/meta-arm/meta-arm/recipes-security/trusted-services/files/0024-Deny-64-bit-FF-A-messages-in-FF-A-RPC-endpoint.patch
new file mode 100644
index 0000000..01cf523
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/files/0024-Deny-64-bit-FF-A-messages-in-FF-A-RPC-endpoint.patch
@@ -0,0 +1,70 @@
+From f173e99554512c982665c1d5d4b0543421177b09 Mon Sep 17 00:00:00 2001
+From: Imre Kis <imre.kis@arm.com>
+Date: Tue, 26 Jul 2022 17:06:46 +0200
+Subject: [PATCH 24/24] Deny 64 bit FF-A messages in FF-A RPC endpoint
+
+FF-A RPC protocol only allows 32 bit FF-A direct messages thus deny all
+64 bit messages in the RPC endpoint.
+
+Signed-off-by: Imre Kis <imre.kis@arm.com>
+Change-Id: I37c95425f80b6e2821b3f6b8649ceba8aa007bce
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ .../rpc/ffarpc/endpoint/ffarpc_call_ep.c      | 31 ++++++++++++-------
+ 1 file changed, 20 insertions(+), 11 deletions(-)
+
+diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
+index c024196..3035c16 100644
+--- a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
++++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
+@@ -12,6 +12,7 @@
+ #include <protocols/rpc/common/packed-c/status.h>
+ #include <trace.h>
+ #include <stddef.h>
++#include <string.h>
+ 
+ /* TODO: remove this when own ID will be available in libsp */
+ extern uint16_t own_id;
+@@ -260,17 +261,25 @@ void ffa_call_ep_receive(struct ffa_call_ep *call_ep,
+ 			 const struct sp_msg *req_msg,
+ 			 struct sp_msg *resp_msg)
+ {
+-	const uint32_t *req_args = req_msg->args.args32;
+-	uint32_t *resp_args = resp_msg->args.args32;
+-
+-	uint16_t source_id = req_msg->source_id;
+-	uint32_t ifaceid_opcode = req_args[SP_CALL_ARGS_IFACE_ID_OPCODE];
+-
+-	if (FFA_CALL_ARGS_EXTRACT_IFACE(ifaceid_opcode) == FFA_CALL_MGMT_IFACE_ID) {
+-		/* It's an RPC layer management request */
+-		handle_mgmt_msg(call_ep, source_id, req_args, resp_args);
++	resp_msg->is_64bit_message = req_msg->is_64bit_message;
++	memset(&resp_msg->args, 0x00, sizeof(resp_msg->args));
++
++	if (!req_msg->is_64bit_message) {
++		const uint32_t *req_args = req_msg->args.args32;
++		uint32_t *resp_args = resp_msg->args.args32;
++		uint16_t source_id = req_msg->source_id;
++		uint32_t ifaceid_opcode = req_args[SP_CALL_ARGS_IFACE_ID_OPCODE];
++
++		if (FFA_CALL_ARGS_EXTRACT_IFACE(ifaceid_opcode) == FFA_CALL_MGMT_IFACE_ID) {
++			/* It's an RPC layer management request */
++			handle_mgmt_msg(call_ep, source_id, req_args, resp_args);
++		} else {
++			/* Assume anything else is a service request */
++			handle_service_msg(call_ep, source_id, req_args, resp_args);
++		}
+ 	} else {
+-		/* Assume anything else is a service request */
+-		handle_service_msg(call_ep, source_id, req_args, resp_args);
++		EMSG("64 bit FF-A messages are not supported by the TS RPC layer");
++		resp_msg->args.args64[SP_CALL_ARGS_RESP_RPC_STATUS] =
++			TS_RPC_ERROR_INVALID_PARAMETER;
+ 	}
+ }
+-- 
+2.17.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/libts/0001-QEMU-MM-communication-buffer-address.patch b/meta-arm/meta-arm/recipes-security/trusted-services/libts/0001-QEMU-MM-communication-buffer-address.patch
new file mode 100644
index 0000000..2c21e6f
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/libts/0001-QEMU-MM-communication-buffer-address.patch
@@ -0,0 +1,29 @@
+From 1fe74d7d5008aed61feb34a8d5d8b5f9144a58b2 Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 16:33:13 +0100
+Subject: [PATCH] Update MM communication buffer address for qemuarm64 machine
+
+Upstream-Status: Inappropriate [qemuarm64 specific change]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ components/rpc/mm_communicate/caller/linux/carveout.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/components/rpc/mm_communicate/caller/linux/carveout.c b/components/rpc/mm_communicate/caller/linux/carveout.c
+index e3cdf16f..62845d30 100644
+--- a/components/rpc/mm_communicate/caller/linux/carveout.c
++++ b/components/rpc/mm_communicate/caller/linux/carveout.c
+@@ -12,8 +12,8 @@
+ #include "carveout.h"
+ 
+ /* Need to be aligned with carve-out used by StMM or smm-gateway. */
+-static const off_t carveout_pa = 0x0000000881000000;
+-static const size_t carveout_len = 0x8000;
++static const off_t carveout_pa = 0x42000000;
++static const size_t carveout_len = 0x1000;
+ 
+ int carveout_claim(uint8_t **buf, size_t *buf_size)
+ {
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/libts/tee-udev.rules b/meta-arm/meta-arm/recipes-security/trusted-services/libts/tee-udev.rules
new file mode 100644
index 0000000..216fe99
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/libts/tee-udev.rules
@@ -0,0 +1,2 @@
+# tee devices can only be accessed by the teeclnt group members
+KERNEL=="tee[0-9]*", TAG+="systemd", MODE="0660", GROUP="teeclnt"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/libts_%.bbappend b/meta-arm/meta-arm/recipes-security/trusted-services/libts_%.bbappend
new file mode 100644
index 0000000..f987e40
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/libts_%.bbappend
@@ -0,0 +1,3 @@
+# Update MM communication buffer address for qemuarm64 machine
+SRC_URI:append:qemuarm64-secureboot = "file://0001-QEMU-MM-communication-buffer-address.patch \
+"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/libts_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/libts_git.bb
new file mode 100644
index 0000000..dfcf8ce
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/libts_git.bb
@@ -0,0 +1,44 @@
+DESCRIPTION = "Trusted Services libts library for the arm-linux enviroment. \
+               Used for locating and accessing services from a Linux userspace client"
+
+TS_ENV = "arm-linux"
+
+require trusted-services.inc
+
+SRC_URI += "file://tee-udev.rules \
+           "
+
+OECMAKE_SOURCEPATH="${S}/deployments/libts/${TS_ENV}"
+
+DEPENDS           += "arm-ffa-tee arm-ffa-user"
+RRECOMMENDS:${PN} += "arm-ffa-tee"
+
+# arm-ffa-user.h is installed by arm-ffa-user recipe
+EXTRA_OECMAKE += "-DLINUX_FFA_USER_SHIM_INCLUDE_DIR:PATH=/usr/include \
+                 "
+
+# Unix group name for dev/tee* ownership.
+TEE_GROUP_NAME ?= "teeclnt"
+
+do_install:append () {
+    if ${@oe.utils.conditional('VIRTUAL-RUNTIME_dev_manager', 'busybox-mdev', 'false', 'true', d)}; then
+        install -d ${D}${nonarch_base_libdir}/udev/rules.d/
+        install -m 755 ${WORKDIR}/tee-udev.rules ${D}${nonarch_base_libdir}/udev/rules.d/
+        sed -i -e "s/teeclnt/${TEE_GROUP_NAME}/" ${D}${nonarch_base_libdir}/udev/rules.d/tee-udev.rules
+    fi
+
+    # Move the dynamic libraries into the standard place.
+    # Update a cmake files to use correct paths.
+    install -d ${D}${libdir}
+    mv ${D}${TS_INSTALL}/lib/libts* ${D}${libdir}
+
+    sed -i -e "s#/${TS_ENV}##g" ${D}${TS_INSTALL}/lib/cmake/libtsTargets-noconfig.cmake
+    sed -i -e 's#INTERFACE_INCLUDE_DIRECTORIES.*$#INTERFACE_INCLUDE_DIRECTORIES "\${_IMPORT_PREFIX}/${TS_ENV}/include"#' ${D}${TS_INSTALL}/lib/cmake/libtsTargets.cmake
+}
+
+inherit ${@oe.utils.conditional('VIRTUAL-RUNTIME_dev_manager', 'busybox-mdev', '', 'useradd', d)}
+USERADD_PACKAGES = "${PN}"
+GROUPADD_PARAM:${PN} = "--system ${TEE_GROUP_NAME}"
+
+FILES:${PN} = "${libdir}/libts.so.* ${nonarch_base_libdir}/udev/rules.d/"
+FILES:${PN}-dev = "${TS_INSTALL}/lib/cmake ${TS_INSTALL}/include ${libdir}/libts.so"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services-src.inc b/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services-src.inc
new file mode 100644
index 0000000..0251fef
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services-src.inc
@@ -0,0 +1,80 @@
+# Define sources of Trusted Service and all external dependencies
+
+LICENSE = "Apache-2.0 & BSD-3-Clause & BSD-2-Clause & Zlib"
+
+SRC_URI = "git://git.trustedfirmware.org/TS/trusted-services.git;protocol=https;branch=integration;name=trusted-services;destsuffix=git/trusted-services \
+           file://0004-correctly-find-headers-dir.patch \
+           file://0005-setting-sysroot-for-libgcc-lookup.patch \
+           file://0006-applying-lowercase-project-convention.patch \
+           file://0009-PSA-CRYPTO-API-INCLUDE.patch \
+           file://0010-change-libts-to-export-CMake-package.patch \
+           file://0011-Adapt-deployments-to-libts-changes.patch \
+           file://0017-Move-libsp-mocks-into-separate-component.patch \
+           file://0018-Add-mock-for-libsp-sp_discovery.patch \
+           file://0019-Add-mock-for-libsp-sp_memory_management.patch \
+           file://0020-Add-mock-for-libsp-sp_messaging.patch \
+           file://0021-Add-64-bit-direct-message-handling-to-libsp.patch \
+           file://0022-Change-MM-communicate-RPC-protocol-of-call-endpoint.patch \
+           file://0023-Change-MM-communicate-RPC-protocol-of-MM-caller.patch \
+           file://0024-Deny-64-bit-FF-A-messages-in-FF-A-RPC-endpoint.patch \
+"
+
+#latest on 05.07.22.
+SRCREV_trusted-services = "1b0c520279445fc4d85fc582eda5e5ff5f380c39"
+LIC_FILES_CHKSUM = "file://${S}/license.rst;md5=ea160bac7f690a069c608516b17997f4"
+
+S = "${WORKDIR}/git/trusted-services"
+PV ?= "0.0+git${SRCPV}"
+
+# DTC, tag "v1.6.1"
+SRC_URI += "git://github.com/dgibson/dtc;name=dtc;protocol=https;branch=main;destsuffix=git/dtc"
+SRCREV_dtc = "b6910bec11614980a21e46fbccc35934b671bd81"
+LIC_FILES_CHKSUM += "file://../dtc/README.license;md5=a1eb22e37f09df5b5511b8a278992d0e"
+
+# MbedTLS, tag "mbedtls-3.1.0"
+SRC_URI += "git://github.com/ARMmbed/mbedtls.git;name=mbedtls;protocol=https;branch=master;destsuffix=git/mbedtls"
+SRCREV_mbedtls = "d65aeb37349ad1a50e0f6c9b694d4b5290d60e49"
+LIC_FILES_CHKSUM += "file://../mbedtls/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+# Nanopb, tag "nanopb-0.4.6"
+SRC_URI += "git://github.com/nanopb/nanopb.git;name=nanopb;protocol=https;branch=master;destsuffix=git/nanopb"
+SRCREV_nanopb = "afc499f9a410fc9bbf6c9c48cdd8d8b199d49eb4"
+LIC_FILES_CHKSUM += "file://../nanopb/LICENSE.txt;md5=9db4b73a55a3994384112efcdb37c01f"
+
+# qcbor, tag "v1.0.0"
+SRC_URI += "git://github.com/laurencelundblade/QCBOR.git;name=qcbor;protocol=https;branch=master;destsuffix=git/qcbor"
+SRCREV_qcbor = "56b17bf9f74096774944bcac0829adcd887d391e"
+LIC_FILES_CHKSUM += "file://../qcbor/README.md;md5=e8ff2e88a722cdc55eddd0bb9aeca002"
+
+# T_Cose
+SRC_URI += "git://github.com/laurencelundblade/t_cose.git;name=tcose;protocol=https;branch=master;destsuffix=git/tcose"
+SRCREV_tcose = "fc3a4b2c7196ff582e8242de8bd4a1bc4eec577f"
+LIC_FILES_CHKSUM += "file://../tcose/LICENSE;md5=b2ebdbfb82602b97aa628f64cf4b65ad"
+
+# CppUTest,  tag "v3.8"
+SRC_URI += "git://github.com/cpputest/cpputest.git;name=cpputest;protocol=https;branch=master;destsuffix=git/cpputest"
+SRCREV_cpputest = "e25097614e1c4856036366877a02346c4b36bb5b"
+LIC_FILES_CHKSUM += "file://../cpputest/COPYING;md5=ce5d5f1fe02bcd1343ced64a06fd4177"
+
+# TS ships patches for external dependencies that needs to be applied
+apply_ts_patches() {
+    for p in ${S}/external/qcbor/*.patch; do
+        patch -p1 -N -d ${WORKDIR}/git/qcbor < ${p} || true
+    done
+    for p in ${S}/external/t_cose/*.patch; do
+        patch -p1 -N -d ${WORKDIR}/git/tcose < ${p} || true
+    done
+    for p in ${S}/external/CppUTest/*.patch; do
+        patch -p1 -d ${WORKDIR}/git/cpputest < ${p}
+    done
+}
+do_patch[postfuncs] += "apply_ts_patches"
+
+# Paths to dependencies required by some TS SPs/tools
+EXTRA_OECMAKE += "-DDTC_SOURCE_DIR=${WORKDIR}/git/dtc \
+                  -DCPPUTEST_SOURCE_DIR=${WORKDIR}/git/cpputest \
+                  -DNANOPB_SOURCE_DIR=${WORKDIR}/git/nanopb \
+                  -DT_COSE_SOURCE_DIR=${WORKDIR}/git/tcose \
+                  -DQCBOR_SOURCE_DIR=${WORKDIR}/git/qcbor \
+                  -DMBEDTLS_SOURCE_DIR=${WORKDIR}/git/mbedtls \
+                 "
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services.inc b/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services.inc
new file mode 100644
index 0000000..80c0849
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/trusted-services.inc
@@ -0,0 +1,52 @@
+SUMMARY ?= "The Trusted Services: framework for developing root-of-trust services"
+HOMEPAGE = "https://trusted-services.readthedocs.io/en/latest/index.html"
+
+LICENSE = "Apache-2.0 & BSD-3-Clause & Zlib"
+
+inherit python3native cmake
+
+COMPATIBLE_HOST = "aarch64.*-linux"
+
+require trusted-services-src.inc
+
+# By default bitbake includes only ${S} (i.e git/trusted-services) in the maps.
+# We also need to include the TS dependencies source trees.
+DEBUG_PREFIX_MAP:append = "-fmacro-prefix-map=${WORKDIR}/git=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
+ -fdebug-prefix-map=${WORKDIR}/git=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
+"
+
+TS_PLATFORM ?= "ts/mock"
+
+# SP images are embedded into optee-os image
+# FIP packaging is not supported yet
+SP_PACKAGING_METHOD ?= "embedded"
+
+SYSROOT_DIRS += "/usr/opteesp /usr/arm-linux"
+
+# TS cmake files use find_file() to search through source code and build dirs.
+# Yocto cmake class limits CMAKE_FIND_ROOT_PATH and find_file() fails.
+# Include the source tree and build dirs into searchable path.
+OECMAKE_EXTRA_ROOT_PATH = "${WORKDIR}/git/ ${WORKDIR}/build/"
+
+EXTRA_OECMAKE += '-DLIBGCC_LOCATE_CFLAGS="--sysroot=${STAGING_DIR_HOST}" \
+                  -DCROSS_COMPILE="${TARGET_PREFIX}" \
+                  -DSP_PACKAGING_METHOD="${SP_PACKAGING_METHOD}" \
+                  -DTS_PLATFORM="${TS_PLATFORM}" \
+                 '
+export CROSS_COMPILE="${TARGET_PREFIX}"
+
+# Default TS installation path
+TS_INSTALL = "/usr/${TS_ENV}"
+
+# Use the Yocto cmake toolchain for arm-linux TS deployments and
+# the TS opteesp toolchain for opteesp TS deployments
+EXTRA_OECMAKE += "${@oe.utils.conditional('TS_ENV', 'opteesp', \
+                    '-DCMAKE_TOOLCHAIN_FILE=${S}/environments/${TS_ENV}/default_toolchain_file.cmake', \
+                    '-DTS_EXTERNAL_LIB_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake', \
+                    d)} \
+                 "
+
+# Paths to pre-built dependencies required by some TS SPs/tools
+EXTRA_OECMAKE += "-Dlibts_DIR=${STAGING_DIR_HOST}${TS_INSTALL}/lib/cmake/ \
+                  -DNEWLIB_INSTALL_DIR=${STAGING_DIR_HOST}${TS_INSTALL}/newlib_install \
+                 "
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-demo_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-demo_git.bb
new file mode 100644
index 0000000..b0abb6f
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-demo_git.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "Trusted Services ts-demo deployment for arm-linux. \
+               Used for running simple TS demo from Linux user-space \
+               on an Arm platform with real deployments of trusted services."
+
+TS_ENV = "arm-linux"
+
+require trusted-services.inc
+
+DEPENDS        += "libts"
+RDEPENDS:${PN} += "libts"
+
+OECMAKE_SOURCEPATH="${S}/deployments/ts-demo/${TS_ENV}"
+
+FILES:${PN} = "${bindir}/ts-demo"
+
+do_install:append () {
+    install -d ${D}${bindir}
+    mv ${D}${TS_INSTALL}/bin/ts-demo ${D}${bindir}
+
+    rm -r --one-file-system ${D}${TS_INSTALL}
+}
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0003-Add-newlib-deployment.patch b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0003-Add-newlib-deployment.patch
new file mode 100644
index 0000000..e43e7d2
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0003-Add-newlib-deployment.patch
@@ -0,0 +1,85 @@
+From 03337e3a509eace9f55a46993cfaadee0e796f46 Mon Sep 17 00:00:00 2001
+From: Gyorgy Szing <Gyorgy.Szing@arm.com>
+Date: Fri, 14 Jan 2022 20:35:53 +0000
+Subject: [PATCH 1/1] Add newlib deployment
+
+This deployment allow building newlib directly and not part of SP
+builds. The resulting binary can be used as a pre-build binary for
+building SPs later.
+The intent is to help integration systems, where recursive build is
+problematic, and there is no direct support for building newlib.
+
+Change-Id: I770cdfd3c39eb7bf9764de74dfb191c321c49561
+Signed-off-by: Gyorgy Szing <Gyorgy.Szing@arm.com>
+
+Upstream-Status: Pending [In review]
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+
+---
+ deployments/newlib/opteesp/CMakeLists.txt | 38 +++++++++++++++++++++++
+ tools/b-test/test_data.yaml               |  4 +++
+ 2 files changed, 42 insertions(+)
+ create mode 100644 deployments/newlib/opteesp/CMakeLists.txt
+
+diff --git a/deployments/newlib/opteesp/CMakeLists.txt b/deployments/newlib/opteesp/CMakeLists.txt
+new file mode 100644
+index 00000000..593e0a96
+--- /dev/null
++++ b/deployments/newlib/opteesp/CMakeLists.txt
+@@ -0,0 +1,38 @@
++#-------------------------------------------------------------------------------
++# Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
++#
++# SPDX-License-Identifier: BSD-3-Clause
++#
++#-------------------------------------------------------------------------------
++cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
++include(../../deployment.cmake REQUIRED)
++
++#-------------------------------------------------------------------------------
++#  The CMakeLists.txt for building the newlib deployment for opteesp
++#
++#  Can be used to build the newlib library, which can be used to build SPs.
++#-------------------------------------------------------------------------------
++include(${TS_ROOT}/environments/opteesp/env.cmake)
++
++project(newlib C)
++
++# This is a dummy library not intended to be compiled ever. It is needed
++# to avoid opteesp specific newlib targeting files.
++add_library(dummy EXCLUDE_FROM_ALL)
++set(TGT dummy)
++# Build newlib as an external component.
++include(${TS_ROOT}/external/newlib/newlib.cmake)
++
++######################################## install
++if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
++	set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "location to install build output to." FORCE)
++endif()
++
++install(DIRECTORY ${NEWLIB_INSTALL_DIR} DESTINATION  ${TS_ENV})
++
++#get_property(_tmp_lib TARGET stdlib::c PROPERTY IMPORTED_LOCATION)
++#get_filename_component(_tmp_path ${_tmp_lib} DIRECTORY)
++#install(DIRECTORY ${_tmp_path} DESTINATION ${TS_ENV})
++
++#get_property(_tmp_path TARGET stdlib::c PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
++#install(DIRECTORY ${_tmp_path} DESTINATION ${TS_ENV})
+diff --git a/tools/b-test/test_data.yaml b/tools/b-test/test_data.yaml
+index 7caafa8b..6bfacc66 100644
+--- a/tools/b-test/test_data.yaml
++++ b/tools/b-test/test_data.yaml
+@@ -69,6 +69,10 @@ data:
+       os_id : "GNU/Linux"
+       params:
+             - "-GUnix Makefiles"
++    - name: "newlib-optee-arm"
++      src: "$TS_ROOT/deployments/newlib/opteesp"
++      params:
++          - "-GUnix Makefiles"
+     - name: "platform-inspect-arm-linux"
+       src: "$TS_ROOT/deployments/platform-inspect/arm-linux"
+       os_id : "GNU/Linux"
+-- 
+2.37.0
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0021-newlib-configure.patch b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0021-newlib-configure.patch
new file mode 100644
index 0000000..a9d291b
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib/0021-newlib-configure.patch
@@ -0,0 +1,72 @@
+From df66efc0db9899c41632091db11bfe2c05eec1fa Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:55:21 +0100
+Subject: [PATCH] Allow to define additional partameters for newlib configure.
+
+Do not skip newlib and libgloss when crosscompiling
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ ...-aarch64-linux-gcc-to-compile-bare-metal-lib.patch | 11 ++++++++++-
+ external/newlib/newlib.cmake                          |  6 ++++++
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/external/newlib/0001-Allow-aarch64-linux-gcc-to-compile-bare-metal-lib.patch b/external/newlib/0001-Allow-aarch64-linux-gcc-to-compile-bare-metal-lib.patch
+index f87ed5a..7533ed0 100644
+--- a/external/newlib/0001-Allow-aarch64-linux-gcc-to-compile-bare-metal-lib.patch
++++ b/external/newlib/0001-Allow-aarch64-linux-gcc-to-compile-bare-metal-lib.patch
+@@ -16,9 +16,18 @@ Signed-off-by: Gyorgy Szing <gyorgy.szing@arm.com>
+  2 files changed, 2 insertions(+), 2 deletions(-)
+ 
+ diff --git a/configure b/configure
+-index 5db52701..1eb71a80 100755
++index 5db527014..dce91609e 100755
+ --- a/configure
+ +++ b/configure
++@@ -2886,7 +2886,7 @@ esac
++
++ # Some are only suitable for cross toolchains.
++ # Remove these if host=target.
++-cross_only="target-libgloss target-newlib target-opcodes"
+++cross_only="target-opcodes"
++
++ case $is_cross_compiler in
++   no) skipdirs="${skipdirs} ${cross_only}" ;;
+ @@ -3659,7 +3659,7 @@ case "${target}" in
+    *-*-freebsd*)
+      noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+diff --git a/external/newlib/newlib.cmake b/external/newlib/newlib.cmake
+index 13eb78c..5ee99a5 100644
+--- a/external/newlib/newlib.cmake
++++ b/external/newlib/newlib.cmake
+@@ -168,6 +168,10 @@ if (NOT NEWLIB_LIBC_PATH)
+ 	string(REPLACE ";" " -isystem " CFLAGS_FOR_TARGET "${_gcc_include_dirs}")
+ 	set(CFLAGS_FOR_TARGET "-isystem ${CFLAGS_FOR_TARGET} -fpic")
+ 
++	# Split a newlib extra build parameter into a list of parameters
++	set(NEWLIB_EXTRAS ${NEWLIB_EXTRA})
++	separate_arguments(NEWLIB_EXTRAS)
++
+ 	# Newlib configure step
+ 	# CC env var must be unset otherwise configure will assume the cross compiler is the host
+ 	# compiler.
+@@ -175,6 +179,7 @@ if (NOT NEWLIB_LIBC_PATH)
+ 	execute_process(COMMAND
+ 		${CMAKE_COMMAND} -E env --unset=CC PATH=${COMPILER_PATH}:$ENV{PATH} ./configure
+ 			--target=${COMPILER_PREFIX}
++			--host=${COMPILER_PREFIX}
+ 			--prefix=${NEWLIB_INSTALL_DIR}
+ 			--enable-newlib-nano-formatted-io
+ 			--enable-newlib-nano-malloc
+@@ -182,6 +187,7 @@ if (NOT NEWLIB_LIBC_PATH)
+ 			--enable-newlib-reent-small
+ 			--enable-newlib-global-atexit
+ 			--disable-multilib
++			${NEWLIB_EXTRAS}
+ 			CFLAGS_FOR_TARGET=${CFLAGS_FOR_TARGET}
+ 			LDFLAGS_FOR_TARGET=-fpie
+ 		WORKING_DIRECTORY
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib_4.1.0.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib_4.1.0.bb
new file mode 100644
index 0000000..94038b5
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-newlib_4.1.0.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Newlib static libraries built with Trusted Services opteesp deployment options"
+
+TS_ENV = "opteesp"
+
+require trusted-services.inc
+
+SRC_URI += "git://sourceware.org/git/newlib-cygwin.git;name=newlib;protocol=https;branch=master;destsuffix=git/newlib \
+            file://0003-Add-newlib-deployment.patch \
+            file://0021-newlib-configure.patch \
+"
+
+# tag "newlib-0.4.1"
+SRCREV_newlib = "415fdd4279b85eeec9d54775ce13c5c412451e08"
+LIC_FILES_CHKSUM += "file://../newlib/COPYING.NEWLIB;md5=b8dda70da54e0efb49b1074f349d7749"
+
+EXTRA_OECMAKE += '-DNEWLIB_SOURCE_DIR=${WORKDIR}/git/newlib \
+                  -DNEWLIB_EXTRA="CFLAGS=--sysroot=${STAGING_DIR_HOST}" \
+                 '
+
+OECMAKE_SOURCEPATH = "${S}/deployments/newlib/${TS_ENV}/"
+
+# TS ships a patch that needs to be applied to newlib
+apply_ts_patch() {
+    for p in ${S}/external/newlib/*.patch; do
+        patch -p1 -d ${WORKDIR}/git/newlib < ${p}
+    done
+}
+do_patch[postfuncs] += "apply_ts_patch"
+
+FILES:${PN}-dev = "${TS_INSTALL}/newlib_install"
+FILES:${PN}-staticdev = "${TS_INSTALL}/newlib_install/*/lib/*.a"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-api-test-common_git.inc b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-api-test-common_git.inc
new file mode 100644
index 0000000..1e1be6a
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-api-test-common_git.inc
@@ -0,0 +1,36 @@
+SUMMARY = "Parts of PSA certification tests (psa-arch-test) for Trusted Services"
+
+TS_ENV = "arm-linux"
+
+require trusted-services.inc
+
+DEPENDS        += "libts"
+RDEPENDS:${PN} += "libts"
+
+SRC_URI += "git://github.com/ARM-software/psa-arch-tests.git;name=psatest;protocol=https;branch=main;destsuffix=git/psatest \
+            file://0012-psa-arch-test-toolchain.patch \
+           "
+
+SRCREV_psatest = "451aa087a40d02c7d04778235014c5619d126471"
+LIC_FILES_CHKSUM += "file://../psatest/LICENSE.md;md5=2a944942e1496af1886903d274dedb13"
+
+EXTRA_OECMAKE += "\
+                  -DPSA_ARCH_TESTS_SOURCE_DIR=${WORKDIR}/git/psatest \
+                 "
+
+# TS ships patches that need to be applied to psa-arch-tests
+apply_ts_patch() {
+    for p in ${S}/external/psa_arch_tests/*.patch; do
+        patch -p1 -d ${WORKDIR}/git/psatest < ${p}
+    done
+}
+do_patch[postfuncs] += "apply_ts_patch"
+
+FILES:${PN} = "${bindir}/${PSA_TEST}"
+
+do_install:append () {
+    install -d ${D}${bindir}
+    mv ${D}${TS_INSTALL}/bin/${PSA_TEST} ${D}${bindir}
+
+    rm -r --one-file-system ${D}${TS_INSTALL}
+}
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-crypto-api-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-crypto-api-test_git.bb
new file mode 100644
index 0000000..710d377
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-crypto-api-test_git.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "Crypto PSA certification tests (psa-arch-test)"
+
+TS_ENV = "arm-linux"
+
+require ts-psa-api-test-common_${PV}.inc
+
+OECMAKE_SOURCEPATH = "${S}/deployments/psa-api-test/crypto/${TS_ENV}"
+
+PSA_TEST = "psa-crypto-api-test"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test/0012-PSA-TARGET-QCBOR.patch b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test/0012-PSA-TARGET-QCBOR.patch
new file mode 100644
index 0000000..3b28e80
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test/0012-PSA-TARGET-QCBOR.patch
@@ -0,0 +1,29 @@
+From 3229ca31e59933608f82001c1cdcca9d0a0aa0e0 Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:19:08 +0100
+Subject: [PATCH] Subject: [PATCH] Pass PSA_TARGET_QCBOR to psa-arch-tests
+
+psa-arch-tests require they own version of qcbor library.
+Pass PSA_TARGET_QCBOR which defines where pre-fetched qcbor sources are.
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ external/psa_arch_tests/pas-arch-test-init-cache.cmake.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/external/psa_arch_tests/pas-arch-test-init-cache.cmake.in b/external/psa_arch_tests/pas-arch-test-init-cache.cmake.in
+index 5c63596..64196c2 100644
+--- a/external/psa_arch_tests/pas-arch-test-init-cache.cmake.in
++++ b/external/psa_arch_tests/pas-arch-test-init-cache.cmake.in
+@@ -10,6 +10,7 @@ set(CMAKE_TOOLCHAIN_FILE "@TS_EXTERNAL_LIB_TOOLCHAIN_FILE@" CACHE STRING "")
+ 
+ set(TOOLCHAIN INHERIT CACHE STRING "")
+ set(PSA_INCLUDE_PATHS "@PSA_ARCH_TESTS_EXTERNAL_INCLUDE_PATHS@"  CACHE STRING "")
++set(PSA_TARGET_QCBOR "@PSA_TARGET_QCBOR@"  CACHE STRING "")
+ set(SUITE "@TS_ARCH_TEST_SUITE@"  CACHE STRING "")
+ set(ARCH_TEST_EXTERNAL_DEFS "@PSA_ARCH_TEST_EXTERNAL_DEFS@"  CACHE STRING "")
+ set(CMAKE_VERBOSE_MAKEFILE OFF CACHE BOOL "")
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test_git.bb
new file mode 100644
index 0000000..73c5f61
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-iat-api-test_git.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Initial Attestation PSA certification tests (psa-arch-test) for Trusted Services"
+
+TS_ENV = "arm-linux"
+
+require ts-psa-api-test-common_${PV}.inc
+
+OECMAKE_SOURCEPATH = "${S}/deployments/psa-api-test/initial_attestation/${TS_ENV}"
+
+PSA_TEST = "psa-iat-api-test"
+
+# psa-arch-tests for INITIAL_ATTESTATION suite can't be built with pre-built qcbor
+# Fetch qcbor sources as a temp work-around and pass PSA_TARGET_QCBOR to psa-arch-tests
+SRC_URI += "git://github.com/laurencelundblade/QCBOR.git;name=psaqcbor;protocol=https;branch=master;destsuffix=git/psaqcbor \
+            file://0012-PSA-TARGET-QCBOR.patch \
+           "
+SRCREV_psaqcbor = "42272e466a8472948bf8fca076d113b81b99f0e0"
+
+EXTRA_OECMAKE += "-DPSA_TARGET_QCBOR=${WORKDIR}/git/psaqcbor \
+                 "
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-its-api-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-its-api-test_git.bb
new file mode 100644
index 0000000..32f2890
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-its-api-test_git.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "Internal Trusted Storage PSA certification tests (psa-arch-test) for Trusted Services"
+
+TS_ENV = "arm-linux"
+
+require ts-psa-api-test-common_${PV}.inc
+
+OECMAKE_SOURCEPATH = "${S}/deployments/psa-api-test/internal_trusted_storage/${TS_ENV}"
+
+PSA_TEST = "psa-its-api-test"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-ps-api-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-ps-api-test_git.bb
new file mode 100644
index 0000000..bcf1671
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-psa-ps-api-test_git.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "Protected Storage PSA certification tests (psa-arch-test) for Trusted Services"
+
+TS_ENV = "arm-linux"
+
+require ts-psa-api-test-common_${PV}.inc
+
+OECMAKE_SOURCEPATH = "${S}/deployments/psa-api-test/protected_storage/${TS_ENV}"
+
+PSA_TEST = "psa-ps-api-test"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-remote-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-remote-test_git.bb
new file mode 100644
index 0000000..203defe
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-remote-test_git.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Trusted Services ts-remote-test deployment for arm-linux."
+
+TS_ENV = "arm-linux"
+
+require trusted-services.inc
+
+DEPENDS        += "libts"
+RDEPENDS:${PN} += "libts"
+
+OECMAKE_SOURCEPATH = "${S}/deployments/ts-remote-test/${TS_ENV}"
+
+FILES:${PN} = "${bindir}/ts-remote-test"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-service-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-service-test_git.bb
new file mode 100644
index 0000000..3278c6c
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-service-test_git.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "Trusted Services ts-service-test deployment for arm-linux. \
+               Used for running service level tests from Linux user-space \
+               on an Arm platform with real deployments of trusted services."
+
+TS_ENV = "arm-linux"
+
+require trusted-services.inc
+
+DEPENDS        += "libts python3-protobuf-native"
+RDEPENDS:${PN} += "libts"
+
+OECMAKE_SOURCEPATH = "${S}/deployments/ts-service-test/${TS_ENV}"
+
+FILES:${PN} = "${bindir}/ts-service-test"
+
+do_install:append () {
+    install -d ${D}${bindir}
+    mv ${D}${TS_INSTALL}/bin/ts-service-test ${D}${bindir}
+
+    rm -r --one-file-system ${D}${TS_INSTALL}
+}
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-attestation_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-attestation_git.bb
new file mode 100644
index 0000000..eef05fe
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-attestation_git.bb
@@ -0,0 +1,7 @@
+DESCRIPTION = "Trusted Services attestation service provider"
+
+require ts-sp-common.inc
+
+SP_UUID = "${ATTESTATION_UUID}"
+
+OECMAKE_SOURCEPATH="${S}/deployments/attestation/${TS_ENV}"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-common.inc b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-common.inc
new file mode 100644
index 0000000..e46cd6b
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-common.inc
@@ -0,0 +1,29 @@
+# Common part of all Trusted Services SPs recipes
+
+TS_ENV = "opteesp"
+
+require trusted-services.inc
+require ts-uuid.inc
+
+DEPENDS += "dtc-native ts-newlib"
+
+FILES:${PN}-dev = "${TS_INSTALL}"
+
+# Secure Partition DTS file might be updated in bbapend files
+SP_DTS_FILE ?= "${D}${TS_INSTALL}/manifest/${SP_UUID}.dts"
+
+do_install:append() {
+    # Generate SP DTB which will be included automatically by optee-os build process
+    dtc -I dts -O dtb -o ${D}${TS_INSTALL}/manifest/${SP_UUID}.dtb ${SP_DTS_FILE}
+
+    # We do not need libs and headers
+    rm -r --one-file-system ${D}${TS_INSTALL}/lib
+    rm -r --one-file-system ${D}${TS_INSTALL}/include
+}
+
+# Use Yocto debug prefix maps for compiling assembler.
+EXTRA_OECMAKE += '-DCMAKE_ASM_FLAGS="${DEBUG_PREFIX_MAP}"'
+
+# Ignore that SP stripped.elf does not have GNU_HASH
+# Older versions of optee support SYSV hash only.
+INSANE_SKIP:${PN}-dev += "ldflags"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-crypto_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-crypto_git.bb
new file mode 100644
index 0000000..77a2855
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-crypto_git.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "Trusted Services crypto service provider"
+
+require ts-sp-common.inc
+
+SP_UUID = "${CRYPTO_UUID}"
+
+DEPENDS += "python3-protobuf-native"
+
+OECMAKE_SOURCEPATH="${S}/deployments/crypto/${TS_ENV}"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test/0013-env-test-no-std-libs.patch b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test/0013-env-test-no-std-libs.patch
new file mode 100644
index 0000000..f6269db
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test/0013-env-test-no-std-libs.patch
@@ -0,0 +1,33 @@
+From 7a0dcc40ea736dc20b25813dfc08e576c2615217 Mon Sep 17 00:00:00 2001
+From: Anton Antonov <Anton.Antonov@arm.com>
+Date: Wed, 31 Aug 2022 17:32:47 +0100
+Subject: [PATCH] Do not use standard libraries in env-test opteesp deployment
+
+In opteesp deployments newlib used used. The standard libraries should not be included.
+
+Upstream-Status: Pending
+Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
+---
+ deployments/env-test/opteesp/CMakeLists.txt | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/deployments/env-test/opteesp/CMakeLists.txt b/deployments/env-test/opteesp/CMakeLists.txt
+index cff00ff..60abc0d 100644
+--- a/deployments/env-test/opteesp/CMakeLists.txt
++++ b/deployments/env-test/opteesp/CMakeLists.txt
+@@ -56,9 +56,9 @@ include(../env-test.cmake REQUIRED)
+ #-------------------------------------------------------------------------------
+ add_platform(TARGET env-test)
+ 
+-if(CMAKE_CROSSCOMPILING)
+-	target_link_libraries(env-test PRIVATE stdc++ gcc m)
+-endif()
++#if(CMAKE_CROSSCOMPILING)
++#	target_link_libraries(env-test PRIVATE stdc++ gcc m)
++#endif()
+ 
+ #################################################################
+ 
+-- 
+2.25.1
+
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test_git.bb
new file mode 100644
index 0000000..9cd73cb
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-env-test_git.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Trusted Services test_runner service provider"
+
+require ts-sp-common.inc
+
+# Current version of env-test SP contains hard-coded values for FVP.
+COMPATIBLE_MACHINE ?= "invalid"
+
+SP_UUID = "${ENV_TEST_UUID}"
+
+OECMAKE_SOURCEPATH="${S}/deployments/env-test/${TS_ENV}"
+
+SRC_URI += "\
+            file://0013-env-test-no-std-libs.patch \
+"
diff --git a/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-its_git.bb b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-its_git.bb
new file mode 100644
index 0000000..4eb5dc5
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-security/trusted-services/ts-sp-its_git.bb
@@ -0,0 +1,7 @@
+DESCRIPTION = "Trusted Services internal secure storage service provider"
+
+require ts-sp-common.inc
+
+SP_UUID = "${ITS_UUID}"
+
+OECMAKE_SOURCEPATH="${S}/deployments/internal-trusted-storage/${TS_ENV}"