MLECO-3225: Using official support for Arm Cortex-M85 CPU.

 * CMake version requirement bumped up to 3.21.0
   * CMake 3.22.4 installed in the local Python virtualenv
 * CPU flags updated in toolchain files.
 * Using __ARM_FEATURE_DSP instead of potentially defining
   ARM_MATH_DSP wrongly.
 * CMake project version bumped up to 22.05.0

Changes also made for MLECO-3107 (pack generation):

 * TensorFlow Lite Micro CMSIS-pack version updated to
   1.22.02.
 * Change to using __ARM_FEATURE_DSP will also help the
   generated pack.

Partial changes for MLECO-3095:

 * CMSIS updated to version post 5.9.0
 * TensorFlow Lite Micro updated to latest available
 * Ethos-U driver and core-platform repositories updated
   to 20.05_rc2 tags.

Change-Id: I012c9e65897aed8ce589cff9bfe3a19efc3edeb9
Signed-off-by: Kshitij Sisodia <kshitij.sisodia@arm.com>
diff --git a/scripts/cmake/cmsis-dsp.cmake b/scripts/cmake/cmsis-dsp.cmake
index 73f6100..f22d5ef 100644
--- a/scripts/cmake/cmsis-dsp.cmake
+++ b/scripts/cmake/cmsis-dsp.cmake
@@ -68,16 +68,8 @@
     endif()
 endif ()
 
-# 5. Add any custom/conditional flags for compilation or linkage
-if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55" OR "${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
-    target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC
-        ARM_MATH_MVEI
-        ARM_MATH_DSP
-        ARM_MATH_LOOPUNROLL)
-elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL cortex-m33)
-    # Placeholder, if building with Cortex-M33
-endif()
-
+# 5. General compile definitions
+target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC ARM_MATH_LOOPUNROLL)
 
 # 6. Provide the library path for the top level CMake to use:
 set(CMSIS_DSP_LIB   "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${CMSIS_DSP_TARGET}.a")
diff --git a/scripts/cmake/cmsis-pack-gen/CMakeLists.txt b/scripts/cmake/cmsis-pack-gen/CMakeLists.txt
index 19787b6..db5cfff 100644
--- a/scripts/cmake/cmsis-pack-gen/CMakeLists.txt
+++ b/scripts/cmake/cmsis-pack-gen/CMakeLists.txt
@@ -22,7 +22,7 @@
 # here along with their dependencies.                   #
 #########################################################
 
-cmake_minimum_required(VERSION 3.15.6)
+cmake_minimum_required(VERSION 3.21.0)
 
 project(ml-embedded-eval-kit-api
         DESCRIPTION     "Platform agnostic API for all examples.")
diff --git a/scripts/cmake/cmsis-pack-gen/use-case-api.yml b/scripts/cmake/cmsis-pack-gen/use-case-api.yml
index 8796dff..fb0cbd9 100644
--- a/scripts/cmake/cmsis-pack-gen/use-case-api.yml
+++ b/scripts/cmake/cmsis-pack-gen/use-case-api.yml
@@ -23,7 +23,7 @@
 #
 # Ideal usage: from the root of the repository
 #
-# ml-embedded-eval-kit $ packgen -s ./source/                   \ # Source dir
+# ml-embedded-eval-kit $ packgen -s ./                          \ # Source dir (run this from repo root)
 #           -v ./scripts/cmake/cmsis-pack-gen/use-case-api.yml  \ # This file's path
 #           -o <path-to>/ml-embedded-eval-kit-pack              \ # Where to generate the ouput
 #           -i <path-to>/tensorflow.tensorflow-lite-micro.pdsc  \ # Tensorflow packs' PDSC file
@@ -41,18 +41,18 @@
   - name: "ml-embedded-eval-kit-uc-api"
     description: "Sample use case APIs derived from ml-embedded-eval-kit"
     vendor: "ARM"
-    license: ""
+    license: "LICENSE_APACHE_2.0.txt"
     url: "https://review.mlplatform.org/admin/repos/ml/ethos-u/ml-embedded-evaluation-kit/"
 
     requirements:
       packages:
-        - attributes: {vendor: "tensorflow", name: "tensorflow-lite-micro", version: "0.4.0"}
-        - attributes: {vendor: "ARM", name: "CMSIS", version: "5.9.0"}
+        - attributes: {vendor: "tensorflow", name: "tensorflow-lite-micro", version: "1.22.02"}
+        - attributes: {vendor: "ARM", name: "CMSIS", version: "5.8.0"}
 
     releases:
       - version: "22.05.0"
-        date: "2022-05-04"
-        description: "Experimental package"
+        date: "2022-05-23"
+        description: "Beta release package"
 
 #    @TODO: Add API header names and descriptions here (see placeholder below).
 #    apis:
diff --git a/scripts/cmake/platforms/mps3/build_configuration.cmake b/scripts/cmake/platforms/mps3/build_configuration.cmake
index 6e21d9b..749b1e1 100644
--- a/scripts/cmake/platforms/mps3/build_configuration.cmake
+++ b/scripts/cmake/platforms/mps3/build_configuration.cmake
@@ -22,18 +22,7 @@
         if (TARGET_SUBSYSTEM STREQUAL sse-300)
             set(CMAKE_SYSTEM_PROCESSOR cortex-m55 CACHE STRING "Cortex-M CPU to use")
         elseif(TARGET_SUBSYSTEM STREQUAL sse-310)
-            # For CMake versions older than 3.21, the compiler and linker flags for
-            # ArmClang are added by CMake automatically which makes it mandatory to
-            # define the system processor. For CMake versions 3.21 or later (that
-            # implement policy CMP0123) we use armv8.1-m as the arch until the
-            # toolchain officially supports Cortex-M85. For older version of CMake
-            # we revert to using Cortex-M55 as the processor (as this will work
-            # for M85 too).
-            if(POLICY CMP0123)
-                set(CMAKE_SYSTEM_ARCH armv8.1-m.main CACHE STRING "System arch to use")
-            else()
-                set(CMAKE_SYSTEM_PROCESSOR  cortex-m55)
-            endif()
+            set(CMAKE_SYSTEM_PROCESSOR cortex-m85 CACHE STRING "Cortex-M CPU to use")
         endif()
     endif()
 
diff --git a/scripts/cmake/tensorflow.cmake b/scripts/cmake/tensorflow.cmake
index 8a790bc..ac11542 100644
--- a/scripts/cmake/tensorflow.cmake
+++ b/scripts/cmake/tensorflow.cmake
@@ -51,7 +51,7 @@
 else()
     set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
 
-    if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
+    if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m85")
         # TensorFlow's generic makefile doesn't currently have a flow for Cortex-M85.
         # We build for Arm Cortex-M55 instead.
         # @TODO: check with latest TensorFlow package.
diff --git a/scripts/cmake/toolchains/bare-metal-armclang.cmake b/scripts/cmake/toolchains/bare-metal-armclang.cmake
index 97da76f..3db3320 100644
--- a/scripts/cmake/toolchains/bare-metal-armclang.cmake
+++ b/scripts/cmake/toolchains/bare-metal-armclang.cmake
@@ -25,40 +25,46 @@
 set(CMAKE_CROSSCOMPILING            true)
 set(CMAKE_SYSTEM_NAME               Generic)
 
-set(MIN_ARM_CLANG_VERSION           6.16)
-
 # Skip compiler test execution
 set(CMAKE_C_COMPILER_WORKS          1)
 set(CMAKE_CXX_COMPILER_WORKS        1)
 
 if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR AND NOT DEFINED CMAKE_SYSTEM_ARCH)
-    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55)
+    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55 CACHE STRING "Cortex-M CPU to use")
 endif()
 
 if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
     # Flags for cortex-m55
+    set(MIN_ARM_CLANG_VERSION       6.16)
     set(CPU_ID                      M55)
     set(CPU_COMPILE_DEF             CPU_CORTEX_${CPU_ID})
     set(ARM_CPU                     "ARMC${CPU_ID}")
-    set(FLOAT_ABI                   hard)
-    set(ARM_MATH_DSP                1)
-    set(ARM_MATH_LOOPUNROLL         1)
     set(CPU_HEADER_FILE             "${ARM_CPU}.h")
     set(CPU_COMPILE_OPTION          "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+    set(FLOAT_ABI_COMPILE_OPTION    "-mfloat-abi=hard")
     set(CPU_LINK_OPT                "--cpu=Cortex-${CPU_ID}")
-elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85 OR CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main)
-    # Flags for Cortex-M85
+elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85)
+    # Flags for cortex-m85
+    set(MIN_ARM_CLANG_VERSION       6.18)
+    set(CPU_ID                      M85)
+    set(CPU_COMPILE_DEF             CPU_CORTEX_${CPU_ID})
+    set(ARM_CPU                     "ARMC${CPU_ID}")
+    set(CPU_HEADER_FILE             "${ARM_CPU}.h")
+    set(CPU_COMPILE_OPTION          "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+    set(FLOAT_ABI_COMPILE_OPTION    "-mfloat-abi=hard")
+    set(CPU_LINK_OPT                "--cpu=Cortex-${CPU_ID}")
+elseif (CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main)
+    # Flags for generic armv8.1-m profile
+    set(MIN_ARM_CLANG_VERSION       6.16)
     set(CPU_ID                      ARMv81MML_DSP_DP_MVE_FP)
     set(ARM_CPU                     "ARMv81MML")
     set(CPU_COMPILE_DEF             ${CPU_ID})
-    set(FLOAT_ABI                   hard)
-    set(ARM_MATH_DSP                1)
-    set(ARM_MATH_LOOPUNROLL         1)
 
     # @TODO: Revise once we have the CPU file in CMSIS and CPU flags
     # are supported by toolchains.
     set(CPU_HEADER_FILE             "${CPU_ID}.h")
     set(CPU_COMPILE_OPTION          "-march=armv8.1-m.main+mve.fp+fp.dp")
+    set(FLOAT_ABI_COMPILE_OPTION    "-mfloat-abi=hard")
     set(CPU_LINK_OPT                "--cpu=8.1-M.Main.mve.fp")
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33)
     # Flags for cortex-m33 to go here
@@ -81,18 +87,16 @@
 # Arch compile options:
 add_compile_options(
     -mthumb
-    -mfloat-abi=${FLOAT_ABI}
     --target=arm-arm-non-eabi
     -mlittle-endian
     -MD
-    ${CPU_COMPILE_OPTION})
+    ${CPU_COMPILE_OPTION}
+    ${FLOAT_ABI_COMPILE_OPTION})
 
 # Compile definitions:
 add_compile_definitions(
     CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\"
-    $<$<BOOL:${CPU_COMPILE_DEF}>:${CPU_COMPILE_DEF}>
-    $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP>
-    $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>)
+    $<$<BOOL:${CPU_COMPILE_DEF}>:${CPU_COMPILE_DEF}>)
 
 # Link options:
 add_link_options(${CPU_LINK_OPT})
diff --git a/scripts/cmake/toolchains/bare-metal-gcc.cmake b/scripts/cmake/toolchains/bare-metal-gcc.cmake
index a6d6c0e..9c1cd4f 100644
--- a/scripts/cmake/toolchains/bare-metal-gcc.cmake
+++ b/scripts/cmake/toolchains/bare-metal-gcc.cmake
@@ -30,7 +30,7 @@
 set(CMAKE_CXX_COMPILER_WORKS        1)
 
 if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR AND NOT DEFINED CMAKE_SYSTEM_ARCH)
-    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55)
+    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55 CACHE STRING "Cortex-M CPU to use")
 endif()
 
 if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
@@ -38,25 +38,26 @@
     set(CPU_ID                      M55)
     set(CPU_COMPILE_DEF             CPU_CORTEX_${CPU_ID})
     set(ARM_CPU                     "ARMC${CPU_ID}")
-    set(FLOAT_ABI                   hard)
-    set(ARM_MATH_DSP                1)
-    set(ARM_MATH_LOOPUNROLL         1)
     set(CPU_HEADER_FILE             "${ARM_CPU}.h")
     set(CPU_COMPILE_OPTION          "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+    set(FLOAT_ABI_COMPILE_OPTION    "-mfloat-abi=hard")
     set(CPU_LINK_OPT                "--cpu=Cortex-${CPU_ID}")
-elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85 OR CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main)
-    # Flags for Cortex-M85
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m85)
+    # Flags for cortex-m85
+    # @TODO: Current versions of GNU compiler do not support Cortex-M85, we compile for Cortex-M55 instead.
+    message(WARNING                 "Arm GNU Toolchain does not support Arm Cortex-M85 yet, switching to Cortex-M55.")
+    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55 CACHE STRING "Cortex-M CPU to use" FORCE)
+    # No need to duplicate the definitions here.
+    # Flags from Cortex-M55 will be added as this toolchain file will be read by CMake again.
+elseif (CMAKE_SYSTEM_ARCH STREQUAL armv8.1-m.main)
+    # Flags for generic target armv8.1-m.main (will work for cortex-m55 and cortex-m85
     set(CPU_ID                      ARMv81MML_DSP_DP_MVE_FP)
     set(ARM_CPU                     "ARMv81MML")
     set(CPU_COMPILE_DEF             ${CPU_ID})
     set(FLOAT_ABI                   hard)
-    set(ARM_MATH_DSP                1)
-    set(ARM_MATH_LOOPUNROLL         1)
-
-    # @TODO: Revise once we have the CPU file in CMSIS and CPU flags
-    # are supported by toolchains.
     set(CPU_HEADER_FILE             "${CPU_ID}.h")
     set(CPU_COMPILE_OPTION          "-march=armv8.1-m.main+mve.fp+fp.dp")
+    set(FLOAT_ABI_COMPILE_OPTION    "-mfloat-abi=hard")
     set(CPU_LINK_OPT                "--cpu=8.1-M.Main.mve.fp")
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33)
     # Flags for cortex-m33 to go here
@@ -81,23 +82,21 @@
 # Arch compile options:
 add_compile_options(
     -mthumb
-    -mfloat-abi=${FLOAT_ABI}
     -mlittle-endian
     -MD
+    ${FLOAT_ABI_COMPILE_OPTION}
     ${CPU_COMPILE_OPTION})
 
 # Compile definitions:
 add_compile_definitions(
-    CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\"
-    $<$<BOOL:${CPU_COMPILE_DEF}>:${CPU_COMPILE_DEF}>
-    $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP>
-    $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>)
+    $<$<BOOL:${CPU_HEADER_FILE}>:CPU_HEADER_FILE=\"${CPU_HEADER_FILE}\">
+    $<$<BOOL:${CPU_COMPILE_DEF}>:${CPU_COMPILE_DEF}>)
 
 # Link options:
 add_link_options(
     -mthumb
     ${CPU_COMPILE_OPTION}
-    -mfloat-abi=${FLOAT_ABI}
+    ${FLOAT_ABI_COMPILE_OPTION}
     -mlittle-endian
     --stats
     "SHELL:-Xlinker --gc-sections"