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) {