From 9d2391f94416108ef14410bf5a187e7aeb6ec8f0 Mon Sep 17 00:00:00 2001 From: Jiri Ocenasek Date: Mon, 2 Nov 2026 13:48:51 +0100 Subject: [PATCH] NXP backend: Remove header files and reference them from eIQ Neutron SDK --- .github/workflows/pull.yml | 3 + backends/nxp/CMakeLists.txt | 4 +- backends/nxp/cmake/neutron_sdk.cmake | 48 +++ backends/nxp/runtime/NeutronBackend.cpp | 4 +- backends/nxp/runtime/NeutronDriver.h | 278 ------------------ backends/nxp/runtime/NeutronErrors.h | 74 ----- backends/nxp/runtime/targets.bzl | 2 - examples/nxp/executor_runner/CMakeLists.txt | 40 +-- .../executor_runner/nxp_executor_runner.cpp | 4 +- .../executorch_cifarnet/CMakeLists.txt | 4 + 10 files changed, 63 insertions(+), 398 deletions(-) create mode 100644 backends/nxp/cmake/neutron_sdk.cmake delete mode 100644 backends/nxp/runtime/NeutronDriver.h delete mode 100644 backends/nxp/runtime/NeutronErrors.h diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 52c009b5608..959ab0cf40b 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -1922,6 +1922,9 @@ jobs: CONDA_ENV=$(conda env list --json | jq -r ".envs | .[-1]") conda activate "${CONDA_ENV}" + # Install the eIQ Neutron SDK (provides the Neutron driver headers) + pip install -r backends/nxp/requirements-eiq.txt + # Build cmake -DEXECUTORCH_BUILD_NXP_NEUTRON=ON -DEXECUTORCH_BUILD_NXP_NEUTRON_EXTERNAL_MEM=ON -Bcmake-out . cmake --build cmake-out --target executorch_delegate_neutron --config Release diff --git a/backends/nxp/CMakeLists.txt b/backends/nxp/CMakeLists.txt index 20d57dfb4f5..02bd3945b89 100644 --- a/backends/nxp/CMakeLists.txt +++ b/backends/nxp/CMakeLists.txt @@ -3,6 +3,8 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/neutron_sdk.cmake) + set(_common_include_directories ${CMAKE_CURRENT_SOURCE_DIR}/../../..) add_compile_definitions(C10_USING_CUSTOM_GENERATED_MACROS) @@ -15,7 +17,7 @@ set(_neutron_sources ${CMAKE_CURRENT_SOURCE_DIR}/runtime/NeutronBackend.cpp) add_library(executorch_delegate_neutron STATIC ${_neutron_sources}) target_include_directories( executorch_delegate_neutron - PRIVATE ${_common_include_directories} + PRIVATE ${_common_include_directories} ${EIQ_NEUTRON_TARGET_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/runtime/core/portable_type/c10 ) install( diff --git a/backends/nxp/cmake/neutron_sdk.cmake b/backends/nxp/cmake/neutron_sdk.cmake new file mode 100644 index 00000000000..be354daac6e --- /dev/null +++ b/backends/nxp/cmake/neutron_sdk.cmake @@ -0,0 +1,48 @@ +# Copyright 2026 NXP +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +# Locates the eIQ Neutron SDK and the selected target. Sets: +# EIQ_NEUTRON_TARGET_DIR, EIQ_NEUTRON_TARGET_INCLUDE_DIR. + +if(NOT DEFINED EIQ_NEUTRON_TARGET) + set(EIQ_NEUTRON_TARGET + "imxrt700" + CACHE STRING "Neutron Target to build against" + ) +endif() + +find_package( + Python + COMPONENTS Interpreter + REQUIRED +) + +message(STATUS "Looking for eIQ Neutron SDK") +execute_process( + COMMAND + ${Python_EXECUTABLE} -c + "import eiq_neutron_sdk, os; print(os.path.dirname(eiq_neutron_sdk.__file__))" + OUTPUT_VARIABLE EIQ_NEUTRON_SDK_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE +) +message(STATUS "Looking for eIQ Neutron SDK -- found: ${EIQ_NEUTRON_SDK_PATH}") + +message(STATUS "Looking for Neutron target ${EIQ_NEUTRON_TARGET}") +set(EIQ_NEUTRON_TARGET_DIR + "${EIQ_NEUTRON_SDK_PATH}/target/${EIQ_NEUTRON_TARGET}" +) +if(NOT EXISTS ${EIQ_NEUTRON_TARGET_DIR}) + message( + FATAL_ERROR "Looking for Neutron target ${EIQ_NEUTRON_TARGET} -- not found" + ) +endif() +message( + STATUS + "Looking for Neutron target ${EIQ_NEUTRON_TARGET} -- found: ${EIQ_NEUTRON_TARGET_DIR}" +) + +set(EIQ_NEUTRON_TARGET_INCLUDE_DIR "${EIQ_NEUTRON_TARGET_DIR}/common/include" + "${EIQ_NEUTRON_TARGET_DIR}/driver/include" +) diff --git a/backends/nxp/runtime/NeutronBackend.cpp b/backends/nxp/runtime/NeutronBackend.cpp index 217b5e4bf5f..37b968231db 100644 --- a/backends/nxp/runtime/NeutronBackend.cpp +++ b/backends/nxp/runtime/NeutronBackend.cpp @@ -13,8 +13,8 @@ #include #include -#include "NeutronDriver.h" -#include "NeutronErrors.h" +#include +#include using namespace std; diff --git a/backends/nxp/runtime/NeutronDriver.h b/backends/nxp/runtime/NeutronDriver.h deleted file mode 100644 index 0d29f8b172b..00000000000 --- a/backends/nxp/runtime/NeutronDriver.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: BSD-3-Clause - * - * Interface for the NXP Neutron NPU driver. - */ - -#ifndef NEUTRON_DRIVER_H -#define NEUTRON_DRIVER_H - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include - -#include "NeutronErrors.h" - -/// Trace configuration to enable kernel level tracing. -#define TRACE_CONFIG_KERNEL_LEVEL (1U << 0) - -/// Trace confinguration to enable job level tracing. -#define TRACE_CONFIG_JOB_LEVEL (1U << 1) - -// Macro to define where to allocate memory for NeutronCtx -#ifndef NO_HEAP_USAGE -#define NO_HEAP_USAGE 0 -#endif - -/* Neutron Driver errors */ -#define GEN_NEUTRON_DRIVER_ERROR(category, code) \ - GEN_NEUTRON_ERROR(ERROR_COMPONENT_DRIVER, category, code) -#define GEN_NEUTRON_DRIVER_GENERIC_ERROR() \ - GEN_NEUTRON_DRIVER_ERROR(ERROR_CATEGORY_DRIVER_GENERIC, __LINE__) - -/// Type definition for a Neutron model handle. This is an identifier used to -/// uniquely identify a model. The convention is that the value -/// NEUTRON_INVALID_HANDLE handle corresponds to an invalid handle. -typedef void* NeutronModelHandle; - -typedef struct { - /// Neutron microcode buffer address. - /// The Neutron microcode is generated by the Neutron compiler tool. - /// The microcode buffer, 16 bytes aligned, is allocated and initialized by - /// the application or ML framework. The microcode buffer is passed by - /// reference to the Neutron firmware. The microcode buffer is specific for a - /// given ML model. - const void* microcode; - - /// Neutron weights buffer address. - /// The Neutron weights is generated by the Neutron compiler tool. - /// The weights buffer, 16 bytes aligned, is allocated and initialized by the - /// application or ML framework. The weights buffer address is passed by - /// reference to the Neutron-firmware. The weights buffer is specific for a - /// given ML model. - const void* weights; - - /// Neutron kernels buffer address. - /// The Neutron kernels are generated by the Neutron compiler tool. - /// The kernels buffer, 16 bytes aligned, is allocated and initialized by the - /// application or ML framework. The kernels buffer address is passed by - /// reference to the Neutron-firmware. The kernels buffer is specific for a - /// given ML model. - const void* kernels; - - /// Timeout seconds for the microcode running. - /// This timeout is the uplimit seconds that a user expect to complete, - /// default 60. - uint32_t timeoutSeconds; - -} NeutronModelConfig; - -typedef struct { - /// The input buffers of the model. - /// The input buffers are allocated and initialized by the application or ML - /// framework. The input buffers are passed by reference to the Neutron - /// firmware. - const void** inputs; - - /// The output buffers of the model. - /// The output buffers are allocated by the application or ML framework. - /// The output buffers are passed by reference to the Neutron firmware. - void** outputs; - - /// Scratch buffer required for computing model intermediate results. - /// If NULL, this buffer has to be allocated by the driver. - void* scratch; - - /// Scratch buffer required for prefetching model weights from FLASH to SRAM. - /// This buffer is used only for Neutron-C targets when the weight prefetch - /// option was explicitly used. If NULL, this buffer has to be allocated by - /// the driver. - void* scratchWeights; - -} NeutronDataConfig; - -typedef struct { - /// Sets whether tracing should be executed during firmware run or not. - /// If set to 0, tracing will not run. - /// If set to 1 - kernel level tracing. - /// If set to 2 - job level tracing. - /// If set to 3 - mixed level tracing - uint32_t traceConfig; - - /// Buffer to store collected trace data. - /// If it is NULLPTR, driver will allocate the memory, otherwise, application - /// can. - char* traceBuffer; - - /// What is the allocated memory for buffer. Needed to check if appending - /// string will be out of bounds. Application should set this, if the buffer - /// is allocated by application, otherwise driver will set the value. - size_t traceBufferSize; -} NeutronTraceConfig; - -/// This structure contains the prototypes for functions that have a custom -/// implementation. Any new functions or variables must be added at the end. -typedef struct { - /// This function performs the copying from FLASH to SRAM. - void (*copy)(void* dst, void* src, uint32_t size, uint32_t channel); - /// This is a blocking function that checks if the current copy has finished. - void (*wait)(uint32_t channel); -} NeutronConfig; - -/// This structure contains semantic version of the Neutron SDK -/// (major.minor.patch) and the SHA version (string and uint32_t). -typedef struct { - uint32_t major; - uint32_t minor; - uint32_t patch; - const char* hashString; - uint32_t hashUint32; -} NeutronSdkVersion; - -/* Invalid handle, returned by neutronModelPrepare() if an error occurred. */ -#define NEUTRON_INVALID_HANDLE NULL - -/// - Initialize the Neutron Driver library, setting initial values, do memory -/// allocation -/// for internal data structures, do memory mapping. -NeutronError neutronInit(); - -/// - Deinitialize the Neutron Driver library, releasing any resources aquired -/// by neutronInit -NeutronError neutronDeinit(); - -/// - Prepare Neutron execution for a model with custom firmware. -/// - This function is only available for Neutron-S. -NeutronError neutronCustomPrepare( - uint32_t* inputSize, - int32_t numInputs, - uint32_t* outputSize, - int32_t numOutputs, - const void* firmware, - size_t firmwareSize, - NeutronModelHandle* hdl); - -/// - Run Neutron custom firmware and get the results. -/// - This function is only available for Neutron-S. -NeutronError neutronCustomExec( - NeutronModelHandle hdl, - const NeutronDataConfig* neutron_dcfg); - -/// - Setup the input and output data ptr to use Neutron memory area. -/// - The input and ouput data ptr is stored in neutron_dcfg. -NeutronError neutronDataSetup( - NeutronModelHandle hdl, - NeutronDataConfig* neutron_dcfg); - -/// - Prepare Neutron execution for a model with the given configuration. -/// - This function only prepares the execution by transferring the parameters -/// to the firmware. -/// - This function allows caching a model and then running the same model but -/// with different -/// input data (assuming the new input data replaces the old input data by -/// reusing the same buffers). -/// - In case external allocated memory shall be used for the ModelHandle, e.g. -/// from the Tensorflow -/// tensor arena, hdl shall be a pointer to the start of the allocated memory -/// block. -// If a pointer to NULL is passed, memory will be allocated by the driver -/// from HEAP. If no HEAP is available, an error will be thrown. -NeutronError neutronModelPrepare( - const NeutronModelConfig* mcfg, - NeutronModelHandle* hdl); - -/// - Unprepare Neutron execution handle. -/// - This function releases the internal context data structures and the -/// reserved handle. -NeutronError neutronModelUnprepare(NeutronModelHandle hdl); - -/// - Perform Neutron execution in blocking mode. -NeutronError neutronRunBlocking( - NeutronModelHandle hdl, - const NeutronDataConfig* dcfg); - -/// - Perform Neutron execution in non-blocking mode. -/// - This functionality is only available for Neutron-S. -NeutronError neutronRunNonBlocking( - NeutronModelHandle hdl, - const NeutronDataConfig* dcfg); - -/// - Wait (block) for Neutron completion. -/// - This functionality is only available for Neutron-S. -NeutronError neutronWait(NeutronModelHandle hdl, const NeutronDataConfig* dcfg); - -/// - Query if the job is done by Neutron. -/// - This functionality is only available for neutronRunNonBlocking. -NeutronError neutronIsReady(NeutronModelHandle hdl, bool* isReady); - -#ifndef NDEBUG -/// - Set tracing information. -void neutronSetTrace(NeutronModelHandle hdl, NeutronTraceConfig* tcfg); - -/// - Get tracing result to buffer. -NeutronError -neutronGetTrace(NeutronModelHandle hdl, char** buffer, size_t* size); -#endif - -/// - Perform power management to suspend Neutron hardware. -// - This function disables the clock for Neutron. -NeutronError neutronSuspend(); - -/// - Perform power management to resume Neutron hardware. -// - This function enables the clock for Neutron. -NeutronError neutronResume(); - -/// - Used to initialize custom API's or variables implemented by external -/// application. -NeutronError neutronSetConfig(NeutronConfig* config); - -/// - Used to get NeutronContext size. -size_t neutronGetModelContextSize(); - -/// - Used to get Neutron SDK version. -NeutronSdkVersion neutronGetSdkVersion(); - -/// - Allocates size bytes and returns a pointer to the allocated memory. -/// The returned pointer address will be a multiple of the alignment. -/// Returns NULL on failure. -/// - alignment: Set to 0 if unsure of alignment requirements. -/// - This function is only available for Neutron-S in the Linux environment. -void* neutronMemAlloc(size_t alignment, size_t size); - -/// - Frees the memory buffer pointed to by ptr. -/// - This function is only available for Neutron-S in the Linux environment. -void neutronMemFree(void* ptr); - -/// - Allocates size bytes large buffer in DDR to be used for specialized -/// kernels (e.g. batch matmul) -/// Uses Linux CMA allocator -NeutronError allocateBuffer(uint64_t size, void** pBuffer, bool userspace); - -/// - Frees buffer allocated via allocateBuffer function -NeutronError releaseBuffer(void* buffer); - -/// - Clean/flush cache for DDR allocated buffer -/// TODO: rename function as "cleanCache" to satisfy neutron-software naming -/// convention -NeutronError clean_cache(const void* addr, int size); - -/// - Function for calling firmware for specialized kernel (matmul) -NeutronError matmul( - const void* info, - int sizeInfo, - const void* in, - int sizeIn, - const void* out, - int sizeOut, - int idxSlot); - -/// Other functions to control the state of driver/firmware. -#ifdef __cplusplus -} -#endif -#endif // NEUTRON_DRIVER_H diff --git a/backends/nxp/runtime/NeutronErrors.h b/backends/nxp/runtime/NeutronErrors.h deleted file mode 100644 index 071db8b44be..00000000000 --- a/backends/nxp/runtime/NeutronErrors.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2022-2024 NXP - * - * SPDX-License-Identifier: BSD-3-Clause - * - * Definition of the NXP Neutron NPU driver errors. - */ - -#ifndef NEUTRON_ERRORS_H -#define NEUTRON_ERRORS_H - -#include - -typedef int32_t NeutronError; - -/* - Generate error code. - A code is composed of (from least to most significant bit): - 3 bits = component id - 5 bits = category id - 23 bits = code - 1 bit = sign -*/ -#define GEN_NEUTRON_ERROR(component, category, code) \ - ((NeutronError)(((component & 0xF) << 0) | ((category & 0xF) << 3) | \ - ((code & 0x7FFFFF) << 8))) - -#define ENONE 0 - -#define GET_ERROR_COMPONENT(e) ((e >> 0) & 0x00000007) -#define GET_ERROR_CATEGORY(e) ((e >> 3) & 0x0000001F) -#define GET_ERROR_CODE(e) ((e >> 8) & 0x007FFFFF) - -/* Components ids*/ -// DO NOT USE 0x0 as component magic number! -typedef enum ERROR_COMPONENT_ID { - ERROR_COMPONENT_LIBRARY = 0x1, - ERROR_COMPONENT_FIRMWARE = 0x2, - ERROR_COMPONENT_DRIVER = 0x3 -} ERROR_COMPONENT_ID; - -/* Neutron Firmware error category codes */ -typedef enum ERROR_CATEGORY_FW { - ERROR_CATEGORY_FW_GENERIC, /* Generic error category */ - ERROR_CATEGORY_FW_UCODE, /* Microcode bad magic or version incompatible. */ - ERROR_CATEGORY_FW_BUFFER_OVERFLOW, /* Buffer overflow error category */ - ERROR_CATEGORY_FW_NULL_POINTER, /* Pointer is null */ - ERROR_CATEGORY_FW_INTR_ERROR, /* Interrupt triggering error */ - ERROR_CATEGORY_FW_DMAPI_ERROR, /* DM API parameter error */ -} ERROR_CATEGORY_FW; - -/* Neutron Driver error category codes */ -typedef enum ERROR_CATEGORY_DRIVER { - ERROR_CATEGORY_DRIVER_GENERIC, /* Generic error category */ - ERROR_CATEGORY_DRIVER_UNSUPPORTED, /* Unsupported function */ - ERROR_CATEGORY_DRIVER_UCODE, /* Microcode bad magic or version incompatible. - */ - ERROR_CATEGORY_DRIVER_INVALID, /* Invalid arguments */ - ERROR_CATEGORY_DRIVER_BAD_HANDLE, /* Bad inference handle */ - ERROR_CATEGORY_DRIVER_NO_MEMORY, /* Not enough memory */ - ERROR_CATEGORY_DRIVER_INTERNAL_FAULT, /* Internal error */ - ERROR_CATEGORY_DRIVER_UNKNOWN_ARCH, /* Unknown architecture */ - ERROR_CATEGORY_DRIVER_TRACE_NOT_RUN, /* Tracing did not run, but trace buffer - was requested. */ - ERROR_CATEGORY_DRIVER_TIMEOUT /* Timeout error. */ -} ERROR_CATEGORY_DRIVER; - -/// Retrieve component name as string from NeutronError code. -char* getNeutronErrorComponent(NeutronError ne); - -/// Retrieve catefory as string from NeutronError code. -char* getNeutronErrorCategory(NeutronError ne); - -#endif // NEUTRON_ERRORS_H diff --git a/backends/nxp/runtime/targets.bzl b/backends/nxp/runtime/targets.bzl index 9238fb2a487..87be7d36288 100644 --- a/backends/nxp/runtime/targets.bzl +++ b/backends/nxp/runtime/targets.bzl @@ -6,8 +6,6 @@ def define_common_targets(): name = "nxp_backend_base", srcs = ["NeutronBackend.cpp"], exported_headers = [ - "NeutronDriver.h", - "NeutronErrors.h", ], link_whole = True, # Constructor needed for backend registration. diff --git a/examples/nxp/executor_runner/CMakeLists.txt b/examples/nxp/executor_runner/CMakeLists.txt index eb1d74b2206..8b68268bcb8 100644 --- a/examples/nxp/executor_runner/CMakeLists.txt +++ b/examples/nxp/executor_runner/CMakeLists.txt @@ -11,52 +11,14 @@ option(EVENT_TRACER "Build with event tracing support" ON) set(NXP_RUNNER_DEFINES NEUTRON_CMODEL) set(NXP_RUNNER_LIBS) -set(EIQ_NEUTRON_TARGET - "imxrt700" - CACHE STRING "Neutron Target to build the executor_runner" -) set(EXECUTORCH_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../) -find_package( - Python - COMPONENTS Interpreter - REQUIRED -) +include(${EXECUTORCH_PATH}/backends/nxp/cmake/neutron_sdk.cmake) message(STATUS "Looking for Neutron Driver") if(NOT TARGET nd) message(STATUS "Looking for Neutron Driver -- not found") - message(STATUS "Looking for eIQ Neutron SDK") - execute_process( - COMMAND - ${Python_EXECUTABLE} -c - "import eiq_neutron_sdk, os; print(os.path.dirname(eiq_neutron_sdk.__file__))" - OUTPUT_VARIABLE EIQ_NEUTRON_SDK_PATH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - message( - STATUS "Looking for eIQ Neutron SDK -- found: ${EIQ_NEUTRON_SDK_PATH}" - ) - message(STATUS "Looking for Neutron target $CACHE{EIQ_NEUTRON_TARGET}") - set(EIQ_NEUTRON_TARGET_DIR - "${EIQ_NEUTRON_SDK_PATH}/target/$CACHE{EIQ_NEUTRON_TARGET}" - ) - if(NOT EXISTS ${EIQ_NEUTRON_TARGET_DIR}) - message( - FATAL_ERROR - "Looking for Neutron target $CACHE{EIQ_NEUTRON_TARGET} -- not found" - ) - else() - message( - STATUS - "Looking for Neutron target $CACHE{EIQ_NEUTRON_TARGET} -- found: ${EIQ_NEUTRON_TARGET_DIR}" - ) - endif() - - set(EIQ_NEUTRON_TARGET_INCLUDE_DIR "${EIQ_NEUTRON_TARGET_DIR}/common/include" - "${EIQ_NEUTRON_TARGET_DIR}/driver/include" - ) set(EIQ_NEUTRON_TARGET_DRIVER "${EIQ_NEUTRON_TARGET_DIR}/cmodel/libNeutronDriver.a" ) diff --git a/examples/nxp/executor_runner/nxp_executor_runner.cpp b/examples/nxp/executor_runner/nxp_executor_runner.cpp index f3ee8aeb479..16985e9866e 100644 --- a/examples/nxp/executor_runner/nxp_executor_runner.cpp +++ b/examples/nxp/executor_runner/nxp_executor_runner.cpp @@ -28,8 +28,8 @@ static uint8_t __attribute__(( static uint8_t __attribute__(( aligned(16))) tmp_allocator_pool[512 * 1024 * 1024U]; // 512 MB -#include -#include +#include +#include #ifdef NEUTRON_CMODEL // The following header is needed only for NSYS backend. diff --git a/examples/nxp/mcuxpresso/imxrt700/executorch_cifarnet/CMakeLists.txt b/examples/nxp/mcuxpresso/imxrt700/executorch_cifarnet/CMakeLists.txt index 0b0dd3f8849..17f0f9f6773 100644 --- a/examples/nxp/mcuxpresso/imxrt700/executorch_cifarnet/CMakeLists.txt +++ b/examples/nxp/mcuxpresso/imxrt700/executorch_cifarnet/CMakeLists.txt @@ -25,6 +25,9 @@ set(MCUX_SDK_PROJECT_NAME executorch_cifarnet.elf) set(EXECUTORCH_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../..) +set(EIQ_NEUTRON_TARGET imxrt700) +include(${EXECUTORCH_ROOT_DIR}/backends/nxp/cmake/neutron_sdk.cmake) + # CPU and FPU flags required for Cortex-M33 with single-precision FPU. set(CPU_FLAGS "-mcpu=cortex-m33 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16") set(CPU_DEFINES @@ -87,6 +90,7 @@ target_include_directories( ${MCUX_SDK_PROJECT_NAME} PRIVATE ${MODEL_DIR} + ${EIQ_NEUTRON_TARGET_INCLUDE_DIR} ${SdkRootDirPath}/arch/arm/CMSIS/Core/Include ${SdkRootDirPath}/devices/RT/RT700/MIMXRT798S ${SdkRootDirPath}/devices/RT/RT700/MIMXRT798S/cm33_core0