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/source/math/CMakeLists.txt b/source/math/CMakeLists.txt
index eee8f75..462ffb3 100644
--- a/source/math/CMakeLists.txt
+++ b/source/math/CMakeLists.txt
@@ -33,7 +33,7 @@
 
 target_link_libraries(arm_math PRIVATE log)
 
-if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55" OR "${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
+if (${CMAKE_CROSSCOMPILING})
     include(${CMAKE_SCRIPTS_DIR}/cmsis-dsp.cmake)
     target_link_libraries(arm_math PUBLIC cmsis-dsp)
 endif ()
@@ -41,5 +41,4 @@
 message(STATUS "*******************************************************")
 message(STATUS "Library                                : " arm_math)
 message(STATUS "CMAKE_SYSTEM_PROCESSOR                 : " ${CMAKE_SYSTEM_PROCESSOR})
-message(STATUS "CMAKE_SYSTEM_ARCH                      : " ${CMAKE_SYSTEM_ARCH})
 message(STATUS "*******************************************************")
diff --git a/source/math/PlatformMath.cc b/source/math/PlatformMath.cc
index b666d29..8950941 100644
--- a/source/math/PlatformMath.cc
+++ b/source/math/PlatformMath.cc
@@ -24,31 +24,31 @@
 
     float MathUtils::CosineF32(float radians)
     {
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         return arm_cos_f32(radians);
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         return cosf(radians);
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     float MathUtils::SineF32(float radians)
     {
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         return arm_sin_f32(radians);
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         return sinf(radians);
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     float MathUtils::SqrtF32(float input)
     {
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         float output = 0.f;
         arm_sqrt_f32(input, &output);
         return output;
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         return sqrtf(input);
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     float MathUtils::MeanF32(float* ptrSrc, const uint32_t srcLen)
@@ -57,14 +57,14 @@
             return 0.f;
         }
 
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         float result = 0.f;
         arm_mean_f32(ptrSrc, srcLen, &result);
         return result;
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         float acc = std::accumulate(ptrSrc, ptrSrc + srcLen, 0.0);
         return acc/srcLen;
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     float MathUtils::StdDevF32(float* ptrSrc, const uint32_t srcLen,
@@ -73,7 +73,7 @@
         if (!srcLen) {
             return 0.f;
         }
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         /**
          * Note Standard deviation calculation can be off
          * by > 0.01 but less than < 0.1, according to
@@ -83,7 +83,7 @@
         float stdDev = 0;
         arm_std_f32(ptrSrc, srcLen, &stdDev);
         return stdDev;
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         auto VarianceFunction = [=](float acc, const float value) {
             return acc + (((value - mean) * (value - mean))/ srcLen);
         };
@@ -92,7 +92,7 @@
                                     VarianceFunction);
 
         return sqrtf(acc);
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     void MathUtils::FftInitF32(const uint16_t fftLen,
@@ -104,7 +104,7 @@
         fftInstance.m_optimisedOptionAvailable = false;
         fftInstance.m_type = type;
 
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         arm_status status = ARM_MATH_ARGUMENT_ERROR;
         switch (fftInstance.m_type) {
         case FftType::real:
@@ -125,7 +125,7 @@
         } else {
             fftInstance.m_optimisedOptionAvailable = true;
         }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
 
         debug("Optimised FFT will be used: %s.\n", fftInstance.m_optimisedOptionAvailable? "yes": "no");
 
@@ -203,12 +203,12 @@
         switch (fftInstance.m_type) {
         case FftType::real:
 
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
             if (fftInstance.m_optimisedOptionAvailable) {
                 arm_rfft_fast_f32(&fftInstance.m_instanceReal, input.data(), fftOutput.data(), 0);
                 return;
             }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
             FftRealF32(input, fftOutput);
             return;
 
@@ -217,13 +217,13 @@
                 printf_err("Complex FFT instance should have input size >= (FFT len x 2)");
                 return;
             }
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
             if (fftInstance.m_optimisedOptionAvailable) {
                 fftOutput = input; /* Complex function works in-place */
                 arm_cfft_f32(&fftInstance.m_instanceComplex, fftOutput.data(), 0, 1);
                 return;
             }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
             FftComplexF32(input, fftOutput);
             return;
 
@@ -236,15 +236,15 @@
     void MathUtils::VecLogarithmF32(std::vector <float>& input,
                                     std::vector <float>& output)
     {
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         arm_vlog_f32(input.data(), output.data(),
                      output.size());
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         for (auto in = input.begin(), out = output.begin();
              in != input.end() && out != output.end(); ++in, ++out) {
             *out = logf(*in);
         }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
     }
 
     float MathUtils::DotProductF32(float* srcPtrA, float* srcPtrB,
@@ -252,13 +252,13 @@
     {
         float output = 0.f;
 
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         arm_dot_prod_f32(srcPtrA, srcPtrB, srcLen, &output);
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         for (uint32_t i = 0; i < srcLen; ++i) {
             output += *srcPtrA++ * *srcPtrB++;
         }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
 
         return output;
     }
@@ -273,15 +273,15 @@
             return false;
         }
 
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         arm_cmplx_mag_squared_f32(ptrSrc, ptrDst, srcLen/2);
-#else /* ARM_MATH_DSP */
+#else  /* __ARM_FEATURE_DSP */
         for (uint32_t j = 0; j < srcLen/2; ++j) {
             const float real = *ptrSrc++;
             const float im = *ptrSrc++;
             *ptrDst++ = real*real + im*im;
         }
-#endif /* ARM_MATH_DSP */
+#endif /* __ARM_FEATURE_DSP */
         return true;
     }
 
diff --git a/source/math/include/PlatformMath.hpp b/source/math/include/PlatformMath.hpp
index 2bf7733..859716f 100644
--- a/source/math/include/PlatformMath.hpp
+++ b/source/math/include/PlatformMath.hpp
@@ -18,12 +18,12 @@
 #define PLATFORM_MATH_HPP
 
 /* See if ARM DSP functions can be used. */
-#if defined(ARM_MATH_DSP)
-    #include "arm_math.h"
-    #define M_PI    (PI)
-#else
-    #include <cmath>
-#endif
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
+#include "arm_math.h"
+#define M_PI (PI)
+#else /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */
+#include <cmath>
+#endif /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */
 
 #include <vector>
 #include <cstdint>
@@ -39,10 +39,10 @@
     };
 
     struct FftInstance {
-#if ARM_MATH_DSP
+#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
         arm_rfft_fast_instance_f32  m_instanceReal;
         arm_cfft_instance_f32       m_instanceComplex;
-#endif
+#endif /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */
         uint16_t                    m_fftLen{0};
         FftType                     m_type{FftType::real};
         bool                        m_optimisedOptionAvailable{false};
@@ -177,4 +177,4 @@
 } /* namespace app */
 } /* namespace arm */
 
-#endif /* PLATFORM_MATH_HPP */
\ No newline at end of file
+#endif /* PLATFORM_MATH_HPP */