Switch `DataModel::Provider` interface to default enabled (except on linux where it stays as check) (#36042)

* Switch data model provider usage to default to enabled

* Decouple pump configuration and control from compatibility functions. Still 100% ember tied.

* Fix up some private/public dependencies: instance header should always be a private dependency

* Allow java (or generally dynamic server) controller builds to compile with dynamic dispatcher. Dynamic dispatcher seems to only care about commands so implemented all the rest as empty, which is not ideal

* Restyled by clang-format

* Restyled by gn

* Better dynamic dispatch implementation, removed extra TODO functions

* Restyled by whitespace

* Update dep a bit more

* Fix linter

* Fix linter again

* Update NXP to support various logging targets and for K32W0 enable progress logging and up (no detail/automation)

* Fix nxp compile (ordering issue)

* Update logic a bit to use log level for low power

* Update builds to consider low power already removing logs

* Make microwave oven cluster compilable

* Restyle

* Add codegen data model to darwin xproject: given that we add ember, we need these to access the ember bits as there is no app or data model to provide these

* Add missing override for darwin dispatch when codegen data model uses lower level methods for ember access

* Fix linter

* Add ability to track structural changes in ember for the purpose of codegen data model caching

* Fix typo: uint is unsigned

* Restyle

* Fix android to also provide a generation version

* Fix another uint/unsigned typo ... oops

* Add assertion of stack lock in darwin override of emberAfWriteAttribute

* Restyled by isort

* Remove formatting changes from python files

* Pick up restyle changes too

* Add comment on attribute laregest

* Use TLV-based encoding for ember data buffer.

This saves 2K of flash on some test devices, being much more
efficient in code size compared to using datamodel code.

* Restyled by clang-format

* Restyled by shfmt

* Undo unrelated change

* Add some casts to make android compiler happy

* Update darwin build project as well with the new files

* Updates based on code review

* Added unit tests for min/max int64 values

* Rename PascalString to PascalStringType

* Fix rename

* Restyle

* Add helper methods inside odd sized integers to localize code logic

* Restyled by clang-format

* Fix up negative ranges

* Fixed ranges

* Fix signed max bug and update unit tests

* Make android happy

* Typo fix

* Switch up unit tests

* Update a nullable check to make use of ValueToNullValue

* Add namespace prefix

* Update src/app/codegen-data-model-provider/EmberDataBuffer.cpp

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Update src/app/codegen-data-model-provider/EmberDataBuffer.h

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Correct comments:signed, not unsigned

* Use constructors for the buffer info

* Rename things to EmberAttributeDataBuffer

* Undo submodule updates

* Restyled by clang-format

* Use EmberAttributeDataBuffer for codegen provider _Read

* Fix comments

* Restyled by clang-format

* Update DynamicDispatcher comment

* Rename file

* Use a pointer for the subject descriptor.

This seems to save about 88 bytes of flash on a test NRF board.

* Restyle

* Fix include

* Fix include

* Also fix PW rpc

* This saves 136 bytes...

* More changes to save slightly more flash for code

* Restyle

* Fix typo

* Fix includes

* make more detailed logging optional in the codegen data model and enable it only on known large platforms

* Pull back the event path validity mixin, start with a datamodel implementation

* Fix compile logic after I moved things away

* Add one more check

* Restyle

* Fix typo

* Fix includes

* Restyle

* Move decodable lists bits as a non-template class to save flash

* Update src/app/InteractionModelEngine.cpp

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Rename method

* Restyle

* More renames

* Restyle

* Fix some renames

* Restyle

* A few more renames

* Restyle

* Use chip::app::IsSignedAttributeType

* Fix up put as well as naming for null value and comment

* Fix up nullable tests

* Test that you cannot decode a null value for non-nullable double and single

* Allow NAN for non-nullable floating points

* Add test case for non nullable bool

* Restyle

* Add a header for efr32

* Update src/app/codegen-data-model-provider/EmberAttributeDataBuffer.cpp

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Update src/app/codegen-data-model-provider/EmberAttributeDataBuffer.cpp

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Remove extra comment

* Replace switch with if

* Comment fix

* Another try to make efr32 build of tests happy

* Move includes around, to try to work around issues within efr32 compiles...

* more updates, this time local efr32 compiles

* Remove lookup tables from ember attribute data buffer

---------

Co-authored-by: Andrei Litvin <andreilitvin@google.com>
Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml
index c4b6eb1..f9c6392 100644
--- a/.github/workflows/examples-nxp.yaml
+++ b/.github/workflows/examples-nxp.yaml
@@ -70,7 +70,7 @@
               run: |
                   scripts/run_in_build_env.sh "\
                       ./scripts/build/build_examples.py \
-                      --target nxp-k32w0-freertos-lighting-factory \
+                      --target nxp-k32w0-freertos-lighting-factory-log-progress \
                       --target nxp-k32w0-freertos-contact-sensor-low-power-factory \
                       build \
                       --copy-artifacts-to out/artifacts \
@@ -79,7 +79,7 @@
               run: |
                   .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \
                     nxp k32w0+release light \
-                    out/artifacts/nxp-k32w0-freertos-lighting-factory/chip-k32w0x-light-example.elf \
+                    out/artifacts/nxp-k32w0-freertos-lighting-factory-log-progress/chip-k32w0x-light-example.elf \
                     /tmp/bloat_reports/
             - name: Get K32W0 contact sensor size stats
               run: |
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index a914e5a..68bf4b0 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -105,10 +105,8 @@
                      --known-failure app/reporting/reporting.cpp \
                      --known-failure app/reporting/tests/MockReportScheduler.cpp \
                      --known-failure app/reporting/tests/MockReportScheduler.h \
-                     --known-failure app/util/attribute-storage.cpp \
                      --known-failure app/util/attribute-storage-detail.h \
                      --known-failure app/util/attribute-storage.h \
-                     --known-failure app/util/attribute-table.cpp \
                      --known-failure app/util/attribute-table-detail.h \
                      --known-failure app/util/attribute-table.h \
                      --known-failure app/util/binding-table.cpp \
@@ -118,9 +116,7 @@
                      --known-failure app/util/DataModelHandler.h \
                      --known-failure app/util/ember-compatibility-functions.cpp \
                      --known-failure app/util/ember-compatibility-functions.h \
-                     --known-failure app/util/ember-global-attribute-access-interface.cpp \
                      --known-failure app/util/ember-global-attribute-access-interface.h \
-                     --known-failure app/util/ember-io-storage.cpp \
                      --known-failure app/util/ember-io-storage.h \
                      --known-failure app/util/endpoint-config-api.h \
                      --known-failure app/util/generic-callbacks.h \
@@ -135,7 +131,12 @@
                      --known-failure platform/GLibTypeDeleter.h \
                      --known-failure platform/SingletonConfigurationManager.cpp \
                   "
-
+                  # These ARE actually orphaned but due to dynamic-server we have code paths
+                  # for them. Keeping them as a list as they still need review ...
+                  #   --known-failure app/util/attribute-table.cpp \
+                  #   --known-failure app/util/ember-io-storage.cpp \
+                  #   --known-failure app/util/ember-global-attribute-access-interface.cpp \
+                  #   --known-failure app/util/attribute-storage.cpp \
             - name: Check for matter lint errors
               if: always()
               run: |
@@ -295,11 +296,13 @@
                       ':(exclude)examples/common/pigweed/rpc_services/Attributes.h'                          \
                       ':(exclude)src/app/codegen-data-model-provider/CodegenDataModelProvider_Write.cpp'     \
                       ':(exclude)src/app/codegen-data-model-provider/tests/EmberReadWriteOverride.cpp'       \
+                      ':(exclude)src/app/dynamic_server/DynamicDispatcher.cpp'                               \
                       ':(exclude)src/app/util/attribute-table.cpp'                                           \
                       ':(exclude)src/app/util/attribute-table.h'                                             \
                       ':(exclude)src/app/util/ember-compatibility-functions.cpp'                             \
                       ':(exclude)src/app/util/mock/CodegenEmberMocks.cpp'                                    \
                       ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt'          \
+                      ':(exclude)src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm'                  \
                       ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' \
                       && exit 1 || exit 0
 
diff --git a/build/chip/esp32/esp32_codegen.cmake b/build/chip/esp32/esp32_codegen.cmake
index 7febb08..9148912 100644
--- a/build/chip/esp32/esp32_codegen.cmake
+++ b/build/chip/esp32/esp32_codegen.cmake
@@ -75,7 +75,7 @@
 
     # When data model interface is used, provide a default code-generation data model as
     # part of zapgen. See `chip_data_model.cmake` for similar logic
-    set(CHIP_DATA_MODEL_INTERFACE "disabled" CACHE STRING "Data model interface option to use: enabled or disabled")
+    set(CHIP_DATA_MODEL_INTERFACE "enabled" CACHE STRING "Data model interface option to use: enabled or disabled")
 
     if ("${CHIP_DATA_MODEL_INTERFACE}" STREQUAL "enabled")
       target_sources(${COMPONENT_LIB} PRIVATE ${CODEGEN_DATA_MODEL_SOURCES})
diff --git a/config/esp32/components/chip/CMakeLists.txt b/config/esp32/components/chip/CMakeLists.txt
index fde6276..f203657 100644
--- a/config/esp32/components/chip/CMakeLists.txt
+++ b/config/esp32/components/chip/CMakeLists.txt
@@ -33,7 +33,7 @@
 
 set(CHIP_REQUIRE_COMPONENTS esp_eth freertos lwip bt mbedtls fatfs app_update console openthread nvs_flash spi_flash)
 
-set(CHIP_DATA_MODEL_INTERFACE "disabled" CACHE STRING "Data model interface option to use: enabled or disabled")
+set(CHIP_DATA_MODEL_INTERFACE "enabled" CACHE STRING "Data model interface option to use: enabled or disabled")
 
 if(NOT "${IDF_TARGET}" STREQUAL "esp32h2")
     list(APPEND CHIP_REQUIRE_COMPONENTS mdns)
diff --git a/config/mbed/CMakeLists.txt b/config/mbed/CMakeLists.txt
index 37dad13..e74127b 100644
--- a/config/mbed/CMakeLists.txt
+++ b/config/mbed/CMakeLists.txt
@@ -113,7 +113,7 @@
 endif()
 
 # Option can be set with `-DCHIP_DATA_MODEL_INTERFACE=enabled` or similar on the command line
-set(CHIP_DATA_MODEL_INTERFACE "disabled" CACHE STRING "Data model interface option to use: enabled or disabled")
+set(CHIP_DATA_MODEL_INTERFACE "enabled" CACHE STRING "Data model interface option to use: enabled or disabled")
 
 # ==============================================================================
 # Generate configuration for CHIP GN build system
diff --git a/config/zephyr/Kconfig b/config/zephyr/Kconfig
index 27598c7..c98628e 100644
--- a/config/zephyr/Kconfig
+++ b/config/zephyr/Kconfig
@@ -583,6 +583,7 @@
 
 config USE_CHIP_DATA_MODEL_INTERFACE
     bool "Use a DataModel::Provider interface for data access"
+    default y
     help
       This enables a level of indiraction in the CHIP interaction model engine in 
       accessing underlying data and executing operations such as 
diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn
index 0a000a2..8849d39 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -226,6 +226,10 @@
 
   deps = [ "${chip_root}/src/app:events" ]
 
+  # Temporary dependency: codegen data provider instance should be provided
+  # by the application
+  deps += [ "${chip_root}/src/app/codegen-data-model-provider:instance-header" ]
+
   public_deps = [
     ":app_config",
     ":command-handler-impl",
@@ -233,7 +237,6 @@
     ":paths",
     ":subscription-info-provider",
     "${chip_root}/src/app/MessageDef",
-    "${chip_root}/src/app/codegen-data-model-provider:instance-header",
     "${chip_root}/src/app/data-model-provider",
     "${chip_root}/src/app/icd/server:icd-server-config",
     "${chip_root}/src/app/icd/server:manager",
@@ -291,13 +294,23 @@
       "clusters/ota-provider/ota-provider.cpp",
       "dynamic_server/AccessControl.cpp",
       "dynamic_server/AccessControl.h",
+    ]
+
+    # DynamicDispatcher is actually an ember-override that takes over
+    # util/attribute-storage.cpp and util/attribute-table.cpp functions.
+    #
+    # We likely should formalize and change this with a proper DataModel::Provider that
+    # is consistent instead
+    sources += [
+      "${chip_root}/src/app/util/ember-global-attribute-access-interface.cpp",
+      "${chip_root}/src/app/util/ember-io-storage.cpp",
       "dynamic_server/DynamicDispatcher.cpp",
     ]
 
     public_deps += [
       ":global-attributes",
       "${chip_root}/src/access",
-      "${chip_root}/src/app/dynamic_server:mock-codegen-includes",
+      "${chip_root}/src/app/common:attribute-type",
     ]
 
     public_configs += [ ":config-controller-dynamic-server" ]
diff --git a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp
index 73a3eb8..c012ddb 100644
--- a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp
+++ b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp
@@ -248,11 +248,16 @@
 
     if (startAfterSetting.HasValue())
     {
+        ConcreteCommandPath commandPath(mEndpointId, OperationalState::Id, OperationalState::Commands::Start::Id);
+
+#if CHIP_CONFIG_USE_EMBER_DATA_MODEL
+        bool commandExists = ServerClusterCommandExists(commandPath) == Status::Success;
+#else
+        bool commandExists =
+            InteractionModelEngine::GetInstance()->GetDataModelProvider()->GetAcceptedCommandInfo(commandPath).has_value();
+#endif
         VerifyOrExit(
-            ServerClusterCommandExists(
-                ConcreteCommandPath(mEndpointId, OperationalState::Id, OperationalState::Commands::Start::Id)) == Status::Success,
-            status = Status::InvalidCommand;
-            ChipLogError(
+            commandExists, status = Status::InvalidCommand; ChipLogError(
                 Zcl,
                 "Microwave Oven Control: Failed to set cooking parameters, Start command of operational state is not supported"));
     }
diff --git a/src/app/common_flags.gni b/src/app/common_flags.gni
index e5d5748..4dbbcb4 100644
--- a/src/app/common_flags.gni
+++ b/src/app/common_flags.gni
@@ -32,7 +32,7 @@
   if (matter_enable_recommended && current_os == "linux") {
     chip_use_data_model_interface = "check"
   } else {
-    chip_use_data_model_interface = "disabled"
+    chip_use_data_model_interface = "enabled"
   }
 
   # Whether we call `chipDie` on DM `check` errors
diff --git a/src/app/dynamic_server/DynamicDispatcher.cpp b/src/app/dynamic_server/DynamicDispatcher.cpp
index e1f458f..0c9825d 100644
--- a/src/app/dynamic_server/DynamicDispatcher.cpp
+++ b/src/app/dynamic_server/DynamicDispatcher.cpp
@@ -32,7 +32,9 @@
 #include <app/WriteHandler.h>
 #include <app/data-model/Decode.h>
 #include <app/util/att-storage.h>
+#include <app/util/attribute-table.h>
 #include <app/util/endpoint-config-api.h>
+#include <cstddef>
 #include <lib/core/CHIPError.h>
 #include <lib/core/DataModelTypes.h>
 #include <lib/core/Optional.h>
@@ -57,6 +59,8 @@
 // AccessControl.cpp.
 constexpr EndpointId kSupportedEndpoint = 0;
 
+DataVersion gMockDataVersion = 0;
+
 } // anonymous namespace
 
 namespace chip {
@@ -381,3 +385,63 @@
 
     return nullptr;
 }
+
+unsigned emberAfMetadataStructureGeneration()
+{
+    // DynamicDispatcher at this point hardcodes a single OTA provider cluster.
+    // The structure does not change over time, so the current version stays at 0.
+    return 0;
+}
+
+Protocols::InteractionModel::Status emberAfWriteAttribute(const ConcreteAttributePath & path, const EmberAfWriteDataInput & input)
+{
+    return Protocols::InteractionModel::Status::UnsupportedAttribute;
+}
+
+Protocols::InteractionModel::Status emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attRecord,
+                                                             const EmberAfAttributeMetadata ** metadata, uint8_t * buffer,
+                                                             uint16_t readLength, bool write)
+{
+    return Protocols::InteractionModel::Status::UnsupportedAttribute;
+}
+
+void emberAfAttributeChanged(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId,
+                             AttributesChangedListener * listener)
+{
+    gMockDataVersion++;
+    listener->MarkDirty(AttributePathParams(endpoint, clusterId, attributeId));
+}
+
+DataVersion * emberAfDataVersionStorage(const ConcreteClusterPath & aConcreteClusterPath)
+{
+    return &gMockDataVersion;
+}
+
+Protocols::InteractionModel::Status emAfWriteAttributeExternal(const ConcreteAttributePath & path,
+                                                               const EmberAfWriteDataInput & input)
+{
+    return Protocols::InteractionModel::Status::UnsupportedAttribute;
+}
+
+Span<const EmberAfDeviceType> emberAfDeviceTypeListFromEndpointIndex(unsigned endpointIndex, CHIP_ERROR & err)
+{
+    err = CHIP_ERROR_NOT_IMPLEMENTED;
+    return Span<const EmberAfDeviceType>();
+}
+
+const EmberAfCluster * emberAfFindClusterInType(const EmberAfEndpointType * endpointType, ClusterId clusterId,
+                                                EmberAfClusterMask mask, uint8_t * index)
+{
+    if ((endpointType == &otaProviderEndpoint) && (clusterId == Clusters::OtaSoftwareUpdateProvider::Id))
+    {
+        return &otaProviderCluster;
+    }
+
+    return nullptr;
+}
+
+const EmberAfAttributeMetadata * emberAfLocateAttributeMetadata(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId)
+{
+    // no known attributes even for OTA
+    return nullptr;
+}
diff --git a/src/app/dynamic_server/mock_includes/zap-generated/endpoint_config.h b/src/app/dynamic_server/mock_includes/zap-generated/endpoint_config.h
index 80fa880..08227c5 100644
--- a/src/app/dynamic_server/mock_includes/zap-generated/endpoint_config.h
+++ b/src/app/dynamic_server/mock_includes/zap-generated/endpoint_config.h
@@ -21,3 +21,5 @@
 // Some overrides to see that this is not used as a real "endpoint_config" that contains data
 #define GENERATED_DEFAULTS #error "Not a real codegen. This is a temporary include for dynamic-overrides only"
 #define GENERATED_CLUSTERS #error "Not a real codegen. This is a temporary include for dynamic-overrides only"
+
+#define ATTRIBUTE_LARGEST (1003)
diff --git a/src/app/icd/client/BUILD.gn b/src/app/icd/client/BUILD.gn
index 4d59a62..b56bb98 100644
--- a/src/app/icd/client/BUILD.gn
+++ b/src/app/icd/client/BUILD.gn
@@ -46,7 +46,6 @@
   ]
   public_deps = [
     ":manager",
-    "${chip_root}/src/app",
     "${chip_root}/src/controller",
     "${chip_root}/src/lib/core",
     "${chip_root}/src/messaging",
diff --git a/src/app/util/mock/include/zap-generated/endpoint_config.h b/src/app/util/mock/include/zap-generated/endpoint_config.h
index 620e6e2..76781a4 100644
--- a/src/app/util/mock/include/zap-generated/endpoint_config.h
+++ b/src/app/util/mock/include/zap-generated/endpoint_config.h
@@ -1,4 +1,8 @@
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (3)
 
+// This is one of the defines that endpoint_config generally has. In particular this
+// can (and is) used to size I/O buffers for attribute reads (like ember-io-storage.cpp).
+//
+// Define this to a large number, matching what an all-clusters-app has.
 #define ATTRIBUTE_LARGEST (1003)
diff --git a/src/controller/java/BUILD.gn b/src/controller/java/BUILD.gn
index 2ae828a..c1e05cf 100644
--- a/src/controller/java/BUILD.gn
+++ b/src/controller/java/BUILD.gn
@@ -19,6 +19,7 @@
 import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/build/chip/java/rules.gni")
 import("${chip_root}/build/chip/tests.gni")
+import("${chip_root}/src/app/codegen-data-model-provider/model.gni")
 import("${chip_root}/src/app/common_flags.gni")
 import("${chip_root}/src/platform/device.gni")
 
@@ -171,6 +172,15 @@
     defines += [ "CHIP_CONFIG_SKIP_APP_SPECIFIC_GENERATED_HEADER_INCLUDES=1" ]
 
     deps += [ "${chip_root}/src/controller:nodatamodel" ]
+
+    # Temporary dependency: InteractionModelEngine NEEDS a codegen data model instance
+    # defined and application is supposed to provide it. This adds the sources
+    # in the same way "data_model" implementations do
+    #
+    # DynamicDispatcher in src/app:interaction-model implements the actual required
+    # ember callbacks in this case...
+    sources += codegen_data_model_SOURCES
+    public_deps = codegen_data_model_PUBLIC_DEPS
   } else {
     deps += [ "${chip_root}/src/controller/data_model" ]
   }
diff --git a/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm b/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm
index d212429..f719e07 100644
--- a/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm
+++ b/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm
@@ -50,6 +50,15 @@
     return Protocols::InteractionModel::Status::UnsupportedAttribute;
 }
 
+Protocols::InteractionModel::Status emberAfWriteAttribute(const ConcreteAttributePath & path, const EmberAfWriteDataInput & input)
+{
+    assertChipStackLockedByCurrentThread();
+
+    // All of our attributes are handled via AttributeAccessInterface, so this
+    // should be unreached.
+    return Protocols::InteractionModel::Status::UnsupportedAttribute;
+}
+
 namespace chip {
 namespace app {
 
diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj
index a21e90d..7893475 100644
--- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj
+++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj
@@ -266,6 +266,26 @@
 		754784672BFE93B00089C372 /* MTRDeviceStorageBehaviorConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 754784632BFE65B70089C372 /* MTRDeviceStorageBehaviorConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		754F3DF427FBB94B00E60580 /* MTREventTLVValueDecoder_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 754F3DF327FBB94B00E60580 /* MTREventTLVValueDecoder_Internal.h */; };
 		7560FD1C27FBBD3F005E85B3 /* MTREventTLVValueDecoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7560FD1B27FBBD3F005E85B3 /* MTREventTLVValueDecoder.mm */; };
+		7592BCF32CBEE98C00EB74A0 /* Instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCF12CBEE98C00EB74A0 /* Instance.h */; };
+		7592BCF42CBEE98C00EB74A0 /* EmberMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCEF2CBEE98C00EB74A0 /* EmberMetadata.h */; };
+		7592BCF52CBEE98C00EB74A0 /* CodegenDataModelProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCEB2CBEE98C00EB74A0 /* CodegenDataModelProvider.h */; };
+		7592BCF62CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCED2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp */; };
+		7592BCF72CBEE98C00EB74A0 /* Instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCF22CBEE98C00EB74A0 /* Instance.cpp */; };
+		7592BCF82CBEE98C00EB74A0 /* EmberMetadata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCF02CBEE98C00EB74A0 /* EmberMetadata.cpp */; };
+		7592BCF92CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCEC2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp */; };
+		7592BCFA2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCEE2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp */; };
+		7592BCFB2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCED2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp */; };
+		7592BCFC2CBEE98C00EB74A0 /* Instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCF22CBEE98C00EB74A0 /* Instance.cpp */; };
+		7592BCFD2CBEE98C00EB74A0 /* EmberMetadata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCF02CBEE98C00EB74A0 /* EmberMetadata.cpp */; };
+		7592BCFE2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCEC2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp */; };
+		7592BCFF2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BCEE2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp */; };
+		7592BD002CBEE98C00EB74A0 /* Instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCF12CBEE98C00EB74A0 /* Instance.h */; };
+		7592BD012CBEE98C00EB74A0 /* EmberMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCEF2CBEE98C00EB74A0 /* EmberMetadata.h */; };
+		7592BD022CBEE98C00EB74A0 /* CodegenDataModelProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BCEB2CBEE98C00EB74A0 /* CodegenDataModelProvider.h */; };
+		7592BD0B2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BD0A2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp */; };
+		7592BD0C2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BD092CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h */; };
+		7592BD0D2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7592BD092CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h */; };
+		7592BD0E2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7592BD0A2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp */; };
 		7596A83E28751220004DAE0E /* MTRBaseClusters_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7596A83D28751220004DAE0E /* MTRBaseClusters_Internal.h */; };
 		7596A84428762729004DAE0E /* MTRDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7596A84228762729004DAE0E /* MTRDevice.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		7596A84528762729004DAE0E /* MTRDevice.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7596A84328762729004DAE0E /* MTRDevice.mm */; };
@@ -729,6 +749,16 @@
 		754784662BFE6B890089C372 /* MTRDeviceStorageBehaviorConfiguration_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceStorageBehaviorConfiguration_Internal.h; sourceTree = "<group>"; };
 		754F3DF327FBB94B00E60580 /* MTREventTLVValueDecoder_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTREventTLVValueDecoder_Internal.h; sourceTree = "<group>"; };
 		7560FD1B27FBBD3F005E85B3 /* MTREventTLVValueDecoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTREventTLVValueDecoder.mm; sourceTree = "<group>"; };
+		7592BCEB2CBEE98C00EB74A0 /* CodegenDataModelProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CodegenDataModelProvider.h; sourceTree = "<group>"; };
+		7592BCEC2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CodegenDataModelProvider.cpp; sourceTree = "<group>"; };
+		7592BCED2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CodegenDataModelProvider_Read.cpp; sourceTree = "<group>"; };
+		7592BCEE2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CodegenDataModelProvider_Write.cpp; sourceTree = "<group>"; };
+		7592BCEF2CBEE98C00EB74A0 /* EmberMetadata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EmberMetadata.h; sourceTree = "<group>"; };
+		7592BCF02CBEE98C00EB74A0 /* EmberMetadata.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EmberMetadata.cpp; sourceTree = "<group>"; };
+		7592BCF12CBEE98C00EB74A0 /* Instance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Instance.h; sourceTree = "<group>"; };
+		7592BCF22CBEE98C00EB74A0 /* Instance.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Instance.cpp; sourceTree = "<group>"; };
+		7592BD092CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EmberAttributeDataBuffer.h; sourceTree = "<group>"; };
+		7592BD0A2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EmberAttributeDataBuffer.cpp; sourceTree = "<group>"; };
 		7596A83D28751220004DAE0E /* MTRBaseClusters_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRBaseClusters_Internal.h; sourceTree = "<group>"; };
 		7596A84228762729004DAE0E /* MTRDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDevice.h; sourceTree = "<group>"; };
 		7596A84328762729004DAE0E /* MTRDevice.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDevice.mm; sourceTree = "<group>"; };
@@ -1127,6 +1157,7 @@
 		1E857311265519DE0050A4D9 /* app */ = {
 			isa = PBXGroup;
 			children = (
+				7521D2932CBECE3F00218E16 /* codegen-data-model-provider */,
 				75A202E72BA8DBB700A771DD /* reporting */,
 				5143041F2914CED9004DC7FE /* generic-callback-stubs.cpp */,
 				514C79F22B62ED5500DD6D7B /* attribute-storage.cpp */,
@@ -1287,6 +1318,23 @@
 			path = ServerEndpoint;
 			sourceTree = "<group>";
 		};
+		7521D2932CBECE3F00218E16 /* codegen-data-model-provider */ = {
+			isa = PBXGroup;
+			children = (
+				7592BD092CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h */,
+				7592BD0A2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp */,
+				7592BCEB2CBEE98C00EB74A0 /* CodegenDataModelProvider.h */,
+				7592BCEC2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp */,
+				7592BCED2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp */,
+				7592BCEE2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp */,
+				7592BCEF2CBEE98C00EB74A0 /* EmberMetadata.h */,
+				7592BCF02CBEE98C00EB74A0 /* EmberMetadata.cpp */,
+				7592BCF12CBEE98C00EB74A0 /* Instance.h */,
+				7592BCF22CBEE98C00EB74A0 /* Instance.cpp */,
+			);
+			path = "codegen-data-model-provider";
+			sourceTree = "<group>";
+		};
 		75A202E72BA8DBB700A771DD /* reporting */ = {
 			isa = PBXGroup;
 			children = (
@@ -1673,6 +1721,7 @@
 				037C3DCE2991BD5100B7EEE2 /* CHIPCommandBridge.h in Headers */,
 				512431272BA0C8BF000BC136 /* SetMRPParametersCommand.h in Headers */,
 				037C3DD22991BD5200B7EEE2 /* InteractiveCommands.h in Headers */,
+				7592BD0D2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h in Headers */,
 				037C3DAF2991BD4F00B7EEE2 /* DeviceControllerDelegateBridge.h in Headers */,
 				B4FCD5712B603A6300832859 /* DownloadLogCommand.h in Headers */,
 				037C3DC32991BD5100B7EEE2 /* Commands.h in Headers */,
@@ -1704,6 +1753,9 @@
 				037C3DB72991BD5000B7EEE2 /* ModelCommandBridge.h in Headers */,
 				037C3DC52991BD5100B7EEE2 /* StorageManagementCommand.h in Headers */,
 				037C3DCC2991BD5100B7EEE2 /* MTRError_Utils.h in Headers */,
+				7592BD002CBEE98C00EB74A0 /* Instance.h in Headers */,
+				7592BD012CBEE98C00EB74A0 /* EmberMetadata.h in Headers */,
+				7592BD022CBEE98C00EB74A0 /* CodegenDataModelProvider.h in Headers */,
 				037C3DAD2991BD4F00B7EEE2 /* PairingCommandBridge.h in Headers */,
 				037C3DBB2991BD5000B7EEE2 /* Commands.h in Headers */,
 				512431262BA0C8BA000BC136 /* ResetMRPParametersCommand.h in Headers */,
@@ -1819,6 +1871,7 @@
 				51E51FC0282AD37A00FC978D /* MTRDeviceControllerStartupParams_Internal.h in Headers */,
 				3DECCB702934AECD00585AEC /* MTRLogging.h in Headers */,
 				1E4D654E29C208DD00BC3478 /* MTRCommissionableBrowserResult.h in Headers */,
+				7592BD0C2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.h in Headers */,
 				9B231B042C62EF650030EB37 /* (null) in Headers */,
 				515BE4ED2B72C0C5000BC1FD /* MTRUnfairLock.h in Headers */,
 				998F286F26D55EC5001846C6 /* MTRP256KeypairBridge.h in Headers */,
@@ -1833,6 +1886,9 @@
 				51D0B12E2B6177FD006E3511 /* MTRAccessGrant.h in Headers */,
 				5109E9B52CB8B5DF0006884B /* MTRDeviceType.h in Headers */,
 				1E4D655029C208DD00BC3478 /* MTRCommissionableBrowserDelegate.h in Headers */,
+				7592BCF32CBEE98C00EB74A0 /* Instance.h in Headers */,
+				7592BCF42CBEE98C00EB74A0 /* EmberMetadata.h in Headers */,
+				7592BCF52CBEE98C00EB74A0 /* CodegenDataModelProvider.h in Headers */,
 				7596A84828762783004DAE0E /* MTRAsyncCallbackWorkQueue.h in Headers */,
 				5A7947E527C0129F00434CF2 /* MTRDeviceController+XPC.h in Headers */,
 				51E95DFB2A78443C00A434F0 /* MTRSessionResumptionStorageBridge.h in Headers */,
@@ -1992,11 +2048,17 @@
 				0395470F2992DB37006D42A8 /* complete.c in Sources */,
 				03F430A82994112B00166449 /* editline.c in Sources */,
 				03F430AA2994113500166449 /* sysunix.c in Sources */,
+				7592BD0E2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp in Sources */,
 				B45373BF2A9FEA9100807602 /* adopt.c in Sources */,
 				B4F773CB2CB54B61008C6B23 /* LeakChecker.mm in Sources */,
 				B45373D12A9FEB0C00807602 /* alloc.c in Sources */,
 				B45373DD2A9FEB5300807602 /* base64-decode.c in Sources */,
 				B45373D22A9FEB0C00807602 /* buflist.c in Sources */,
+				7592BCFB2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp in Sources */,
+				7592BCFC2CBEE98C00EB74A0 /* Instance.cpp in Sources */,
+				7592BCFD2CBEE98C00EB74A0 /* EmberMetadata.cpp in Sources */,
+				7592BCFE2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp in Sources */,
+				7592BCFF2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp in Sources */,
 				B45373C12A9FEA9100807602 /* close.c in Sources */,
 				B45373D42A9FEB0C00807602 /* context.c in Sources */,
 				B45373E52A9FEBA400807602 /* date.c in Sources */,
@@ -2096,6 +2158,11 @@
 				515C1C6F284F9FFB00A48F0C /* MTRFramework.mm in Sources */,
 				51029DF6293AA6100087AFB0 /* MTROperationalCertificateIssuer.mm in Sources */,
 				27A53C1827FBC6920053F131 /* MTRAttestationTrustStoreBridge.mm in Sources */,
+				7592BCF62CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp in Sources */,
+				7592BCF72CBEE98C00EB74A0 /* Instance.cpp in Sources */,
+				7592BCF82CBEE98C00EB74A0 /* EmberMetadata.cpp in Sources */,
+				7592BCF92CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp in Sources */,
+				7592BCFA2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp in Sources */,
 				93B2CF9A2B56E45C00E4D187 /* MTRClusterNames.mm in Sources */,
 				998F287126D56940001846C6 /* MTRP256KeypairBridge.mm in Sources */,
 				516416012B6B483C00D5CE11 /* MTRIMDispatch.mm in Sources */,
@@ -2153,6 +2220,7 @@
 				5109E9B42CB8B5DF0006884B /* MTRDeviceType.mm in Sources */,
 				3D843757294AD25A0070D20A /* MTRCertificateInfo.mm in Sources */,
 				5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.mm in Sources */,
+				7592BD0B2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp in Sources */,
 				5A6FEC9027B563D900F25F42 /* MTRDeviceControllerOverXPC.mm in Sources */,
 				516415FC2B6ACA8300D5CE11 /* MTRServerAccessControl.mm in Sources */,
 				B289D4222639C0D300D4E314 /* MTROnboardingPayloadParser.mm in Sources */,