assemble_vintf: auto infer manifest kernel fcm

Infer kernel FCM for devices with target FCM version
> R. For older devices, leave it untouched to use an
old behavior for compatibility checks (see next CL).

Test: libvintf_test
Bug: 139309488
Change-Id: Ib315a1c0e28398abd49e586e60a2b5cae79da5a4
diff --git a/AssembleVintf.cpp b/AssembleVintf.cpp
index 16df52a..bf9d530 100644
--- a/AssembleVintf.cpp
+++ b/AssembleVintf.cpp
@@ -328,12 +328,33 @@
             std::cerr << parser.error();
             return false;
         }
-        manifest->device.mKernel = std::make_optional<KernelInfo>();
-        manifest->device.mKernel->mVersion = kernelVer;
-        manifest->device.mKernel->mConfigs = parser.configs();
+
+        // Set version and configs in manifest.
+        auto kernel_info = std::make_optional<KernelInfo>();
+        kernel_info->mVersion = kernelVer;
+        kernel_info->mConfigs = parser.configs();
+        std::string error;
+        if (!manifest->mergeKernel(&kernel_info, &error)) {
+            std::cerr << error << "\n";
+            return false;
+        }
+
         return true;
     }
 
+    void inferDeviceManifestKernelFcm(HalManifest* manifest) {
+        // No target FCM version.
+        if (manifest->level() == Level::UNSPECIFIED) return;
+        // target FCM version < R: leave value untouched.
+        if (manifest->level() < Level::R) return;
+        // No need to infer when <kernel> tag is missing.
+        if (!manifest->kernel().has_value()) return;
+        // Kernel FCM already set.
+        if (manifest->kernel()->level() != Level::UNSPECIFIED) return;
+
+        manifest->device.mKernel->mLevel = manifest->level();
+    }
+
     bool assembleHalManifest(HalManifests* halManifests) {
         std::string error;
         HalManifest* halManifest = &halManifests->front().object;
@@ -372,6 +393,8 @@
             if (!setDeviceManifestKernel(halManifest)) {
                 return false;
             }
+
+            inferDeviceManifestKernelFcm(halManifest);
         }
 
         if (halManifest->mType == SchemaType::FRAMEWORK) {