firmware: add code_coverage to proto.

Also freshen python bindings.

BUG=b:179680444
TEST=CQ

Cq-Depend: chromium:2698243
Change-Id: Iedcbb39e0f5610b95191098a95fb8635d451a1a0
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2698176
Commit-Queue: LaMont Jones <lamontjones@chromium.org>
Commit-Queue: Michael Mortensen <mmortensen@google.com>
Tested-by: LaMont Jones <lamontjones@chromium.org>
Auto-Submit: LaMont Jones <lamontjones@chromium.org>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/firmware.py b/api/controller/firmware.py
index b8b8e7e..1941d05 100644
--- a/api/controller/firmware.py
+++ b/api/controller/firmware.py
@@ -24,7 +24,7 @@
 from chromite.lib import osutils
 
 
-def _call_entry(fw_loc, metric_proto, subcmd, **kwargs):
+def _call_entry(fw_loc, metric_proto, subcmd, *args, **kwargs):
   """Calls into firmware_builder.py with the specified subcmd."""
 
   if fw_loc == common_pb2.PLATFORM_EC:
@@ -40,7 +40,7 @@
                              'firmware_builder.py')
 
   with tempfile.NamedTemporaryFile() as tmpfile:
-    cmd = [entry_point, '--metrics', tmpfile.name]
+    cmd = [entry_point, '--metrics', tmpfile.name] + args
     for key, value in kwargs.items():
       cmd += [f'--{key.replace("_", "-")}', value]
     cmd += [subcmd]
@@ -80,8 +80,9 @@
 def BuildAllTotFirmware(input_proto, output_proto, _config):
   """Build all of the firmware targets at the specified location."""
 
+  args = ['--code-coverage'] if input_proto.code_coverage else []
   return _call_entry(input_proto.firmware_location, output_proto.metrics,
-                     'build')
+                     'build', *args)
 
 
 def _TestAllTotFirmwareResponse(_input_proto, output_proto, _config):
@@ -98,8 +99,9 @@
 def TestAllTotFirmware(input_proto, output_proto, _config):
   """Runs all of the firmware tests at the specified location."""
 
+  args = ['--code-coverage'] if input_proto.code_coverage else []
   return _call_entry(input_proto.firmware_location, output_proto.metrics,
-                     'test')
+                     'test', *args)
 
 
 def _BuildAllFirmwareResponse(_input_proto, output_proto, _config):
@@ -121,8 +123,9 @@
 def BuildAllFirmware(input_proto, output_proto, _config):
   """Build all of the firmware targets at the specified location."""
 
+  args = ['--code-coverage'] if input_proto.code_coverage else []
   return _call_entry(input_proto.firmware_location, output_proto.metrics,
-                     'build')
+                     'build', *args)
 
 
 def _TestAllFirmwareResponse(_input_proto, output_proto, _config):
@@ -139,8 +142,9 @@
 def TestAllFirmware(input_proto, output_proto, _config):
   """Runs all of the firmware tests at the specified location."""
 
+  args = ['--code-coverage'] if input_proto.code_coverage else []
   return _call_entry(input_proto.firmware_location, output_proto.metrics,
-                     'test')
+                     'test', *args)
 
 
 def _BundleFirmwareArtifactsResponse(_input_proto, output_proto, _config):
@@ -162,10 +166,14 @@
   with osutils.TempDir(delete=False) as tmpdir:
     info = input_proto.artifacts.output_artifacts[0]
     metadata_path = os.path.join(tmpdir, 'firmware_metadata.jsonpb')
+    args = []
+    if input_proto.artifacts.FIRMWARE_LCOV in info.artifact_types:
+      args += ['--code-coverage']
     resp = _call_entry(
         info.location,
         None,
         'bundle',
+        *args,
         output_dir=tmpdir,
         metadata=metadata_path)
     tarball_paths = []
diff --git a/api/gen/chromite/api/firmware_pb2.py b/api/gen/chromite/api/firmware_pb2.py
index f6266db..cece92e 100644
--- a/api/gen/chromite/api/firmware_pb2.py
+++ b/api/gen/chromite/api/firmware_pb2.py
@@ -22,7 +22,7 @@
   package='chromite.api',
   syntax='proto3',
   serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
-  serialized_pb=_b('\n\x1b\x63hromite/api/firmware.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x99\x04\n\rFwBuildMetric\x12\x13\n\x0btarget_name\x18\x01 \x01(\t\x12\x15\n\rplatform_name\x18\x02 \x01(\t\x12\x39\n\nfw_section\x18\x03 \x03(\x0b\x32%.chromite.api.FwBuildMetric.FwSection\x12:\n\x06zephyr\x18\x04 \x01(\x0b\x32(.chromite.api.FwBuildMetric.ZephyrTargetH\x00\x1a\xd2\x01\n\tFwSection\x12>\n\x06region\x18\x01 \x01(\x0e\x32..chromite.api.FwBuildMetric.FwSection.FwRegion\x12\x0c\n\x04used\x18\x02 \x01(\r\x12\r\n\x05total\x18\x03 \x01(\r\"h\n\x08\x46wRegion\x12\x15\n\x11\x46W_REGION_UNKNOWN\x10\x00\x12\t\n\x05\x45\x43_RO\x10\x01\x12\t\n\x05\x45\x43_RW\x10\x02\x12\r\n\tEC_RO_BSS\x10\x03\x12\r\n\tEC_RW_BSS\x10\x04\x12\x11\n\rEC_SHARED_MEM\x10\x05\x1a\x35\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\r\x12\r\n\x05minor\x18\x02 \x01(\r\x12\x0c\n\x04tiny\x18\x03 \x01(\r\x1aK\n\x0cZephyrTarget\x12;\n\x0ekernel_version\x18\x01 \x01(\x0b\x32#.chromite.api.FwBuildMetric.VersionB\x0c\n\nimage_type\"?\n\x11\x46wBuildMetricList\x12*\n\x05value\x18\x01 \x03(\x0b\x32\x1b.chromite.api.FwBuildMetric\"\x1c\n\x0c\x46wTestMetric\x12\x0c\n\x04name\x18\x01 \x01(\t\"=\n\x10\x46wTestMetricList\x12)\n\x05value\x18\x01 \x03(\x0b\x32\x1a.chromite.api.FwTestMetric\"u\n\x1a\x42uildAllTotFirmwareRequest\x12\x33\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x18.chromite.api.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\"O\n\x1b\x42uildAllTotFirmwareResponse\x12\x30\n\x07metrics\x18\x01 \x01(\x0b\x32\x1f.chromite.api.FwBuildMetricList\"t\n\x19TestAllTotFirmwareRequest\x12\x33\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x18.chromite.api.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\"M\n\x1aTestAllTotFirmwareResponse\x12/\n\x07metrics\x18\x01 \x01(\x0b\x32\x1e.chromite.api.FwTestMetricList\"p\n\x17\x42uildAllFirmwareRequest\x12\x31\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x16.chromiumos.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\"L\n\x18\x42uildAllFirmwareResponse\x12\x30\n\x07metrics\x18\x01 \x01(\x0b\x32\x1f.chromite.api.FwBuildMetricList\"o\n\x16TestAllFirmwareRequest\x12\x31\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x16.chromiumos.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\"J\n\x17TestAllFirmwareResponse\x12/\n\x07metrics\x18\x01 \x01(\x0b\x32\x1e.chromite.api.FwTestMetricList\"\xad\x01\n\x1e\x42undleFirmwareArtifactsRequest\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12+\n\x0bresult_path\x18\x03 \x01(\x0b\x32\x16.chromiumos.ResultPath\x12:\n\tartifacts\x18\x04 \x01(\x0b\x32\'.chromiumos.ArtifactsByService.Firmware\"e\n\x1f\x42undleFirmwareArtifactsResponse\x12\x42\n\tartifacts\x18\x01 \x01(\x0b\x32/.chromiumos.UploadedArtifactsByService.Firmware\"\x9a\x04\n\x14\x46irmwareArtifactInfo\x12>\n\x07objects\x18\x01 \x03(\x0b\x32-.chromite.api.FirmwareArtifactInfo.ObjectInfo\x1a\xc0\x02\n\x0bTarballInfo\x12\x13\n\x0b\x62\x63s_version\x18\x01 \x01(\t\x12\x1b\n\x13\x66irmware_image_name\x18\x02 \x01(\t\x12N\n\x04type\x18\x03 \x01(\x0e\x32@.chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type\x12G\n\x07version\x18\x04 \x01(\x0b\x32\x36.chromite.api.FirmwareArtifactInfo.TarballInfo.Version\x1a=\n\x0c\x46irmwareType\"-\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04MAIN\x10\x01\x12\x06\n\x02\x45\x43\x10\x02\x12\x06\n\x02PD\x10\x03\x1a\'\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x1a\x7f\n\nObjectInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x46\n\x0ctarball_info\x18\x02 \x01(\x0b\x32..chromite.api.FirmwareArtifactInfo.TarballInfoH\x00\x42\x16\n\x14\x66irmware_object_info*^\n\nFwLocation\x12\x17\n\x13\x46W_LOCATION_UNKNOWN\x10\x00\x12\x0f\n\x0bPLATFORM_EC\x10\x01\x12\x13\n\x0fPLATFORM_ZEPHYR\x10\x02\x12\x11\n\rPLATFORM_TI50\x10\x03\x32\xb3\x04\n\x0f\x46irmwareService\x12j\n\x13\x42uildAllTotFirmware\x12(.chromite.api.BuildAllTotFirmwareRequest\x1a).chromite.api.BuildAllTotFirmwareResponse\x12g\n\x12TestAllTotFirmware\x12\'.chromite.api.TestAllTotFirmwareRequest\x1a(.chromite.api.TestAllTotFirmwareResponse\x12\x61\n\x10\x42uildAllFirmware\x12%.chromite.api.BuildAllFirmwareRequest\x1a&.chromite.api.BuildAllFirmwareResponse\x12^\n\x0fTestAllFirmware\x12$.chromite.api.TestAllFirmwareRequest\x1a%.chromite.api.TestAllFirmwareResponse\x12v\n\x17\x42undleFirmwareArtifacts\x12,.chromite.api.BundleFirmwareArtifactsRequest\x1a-.chromite.api.BundleFirmwareArtifactsResponse\x1a\x10\xc2\xed\x1a\x0c\n\x08\x66irmware\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
+  serialized_pb=_b('\n\x1b\x63hromite/api/firmware.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x99\x04\n\rFwBuildMetric\x12\x13\n\x0btarget_name\x18\x01 \x01(\t\x12\x15\n\rplatform_name\x18\x02 \x01(\t\x12\x39\n\nfw_section\x18\x03 \x03(\x0b\x32%.chromite.api.FwBuildMetric.FwSection\x12:\n\x06zephyr\x18\x04 \x01(\x0b\x32(.chromite.api.FwBuildMetric.ZephyrTargetH\x00\x1a\xd2\x01\n\tFwSection\x12>\n\x06region\x18\x01 \x01(\x0e\x32..chromite.api.FwBuildMetric.FwSection.FwRegion\x12\x0c\n\x04used\x18\x02 \x01(\r\x12\r\n\x05total\x18\x03 \x01(\r\"h\n\x08\x46wRegion\x12\x15\n\x11\x46W_REGION_UNKNOWN\x10\x00\x12\t\n\x05\x45\x43_RO\x10\x01\x12\t\n\x05\x45\x43_RW\x10\x02\x12\r\n\tEC_RO_BSS\x10\x03\x12\r\n\tEC_RW_BSS\x10\x04\x12\x11\n\rEC_SHARED_MEM\x10\x05\x1a\x35\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\r\x12\r\n\x05minor\x18\x02 \x01(\r\x12\x0c\n\x04tiny\x18\x03 \x01(\r\x1aK\n\x0cZephyrTarget\x12;\n\x0ekernel_version\x18\x01 \x01(\x0b\x32#.chromite.api.FwBuildMetric.VersionB\x0c\n\nimage_type\"?\n\x11\x46wBuildMetricList\x12*\n\x05value\x18\x01 \x03(\x0b\x32\x1b.chromite.api.FwBuildMetric\"\x1c\n\x0c\x46wTestMetric\x12\x0c\n\x04name\x18\x01 \x01(\t\"=\n\x10\x46wTestMetricList\x12)\n\x05value\x18\x01 \x03(\x0b\x32\x1a.chromite.api.FwTestMetric\"\x8c\x01\n\x1a\x42uildAllTotFirmwareRequest\x12\x33\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x18.chromite.api.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x15\n\rcode_coverage\x18\x03 \x01(\x08\"O\n\x1b\x42uildAllTotFirmwareResponse\x12\x30\n\x07metrics\x18\x01 \x01(\x0b\x32\x1f.chromite.api.FwBuildMetricList\"\x8b\x01\n\x19TestAllTotFirmwareRequest\x12\x33\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x18.chromite.api.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x15\n\rcode_coverage\x18\x03 \x01(\x08\"M\n\x1aTestAllTotFirmwareResponse\x12/\n\x07metrics\x18\x01 \x01(\x0b\x32\x1e.chromite.api.FwTestMetricList\"\x87\x01\n\x17\x42uildAllFirmwareRequest\x12\x31\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x16.chromiumos.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x15\n\rcode_coverage\x18\x03 \x01(\x08\"L\n\x18\x42uildAllFirmwareResponse\x12\x30\n\x07metrics\x18\x01 \x01(\x0b\x32\x1f.chromite.api.FwBuildMetricList\"\x86\x01\n\x16TestAllFirmwareRequest\x12\x31\n\x11\x66irmware_location\x18\x01 \x01(\x0e\x32\x16.chromiumos.FwLocation\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12\x15\n\rcode_coverage\x18\x03 \x01(\x08\"J\n\x17TestAllFirmwareResponse\x12/\n\x07metrics\x18\x01 \x01(\x0b\x32\x1e.chromite.api.FwTestMetricList\"\xad\x01\n\x1e\x42undleFirmwareArtifactsRequest\x12\"\n\x06\x63hroot\x18\x02 \x01(\x0b\x32\x12.chromiumos.Chroot\x12+\n\x0bresult_path\x18\x03 \x01(\x0b\x32\x16.chromiumos.ResultPath\x12:\n\tartifacts\x18\x04 \x01(\x0b\x32\'.chromiumos.ArtifactsByService.Firmware\"e\n\x1f\x42undleFirmwareArtifactsResponse\x12\x42\n\tartifacts\x18\x01 \x01(\x0b\x32/.chromiumos.UploadedArtifactsByService.Firmware\"\x9a\x04\n\x14\x46irmwareArtifactInfo\x12>\n\x07objects\x18\x01 \x03(\x0b\x32-.chromite.api.FirmwareArtifactInfo.ObjectInfo\x1a\xc0\x02\n\x0bTarballInfo\x12\x13\n\x0b\x62\x63s_version\x18\x01 \x01(\t\x12\x1b\n\x13\x66irmware_image_name\x18\x02 \x01(\t\x12N\n\x04type\x18\x03 \x01(\x0e\x32@.chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type\x12G\n\x07version\x18\x04 \x01(\x0b\x32\x36.chromite.api.FirmwareArtifactInfo.TarballInfo.Version\x1a=\n\x0c\x46irmwareType\"-\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04MAIN\x10\x01\x12\x06\n\x02\x45\x43\x10\x02\x12\x06\n\x02PD\x10\x03\x1a\'\n\x07Version\x12\r\n\x05major\x18\x01 \x01(\x05\x12\r\n\x05minor\x18\x02 \x01(\x05\x1a\x7f\n\nObjectInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x46\n\x0ctarball_info\x18\x02 \x01(\x0b\x32..chromite.api.FirmwareArtifactInfo.TarballInfoH\x00\x42\x16\n\x14\x66irmware_object_info*^\n\nFwLocation\x12\x17\n\x13\x46W_LOCATION_UNKNOWN\x10\x00\x12\x0f\n\x0bPLATFORM_EC\x10\x01\x12\x13\n\x0fPLATFORM_ZEPHYR\x10\x02\x12\x11\n\rPLATFORM_TI50\x10\x03\x32\xb3\x04\n\x0f\x46irmwareService\x12j\n\x13\x42uildAllTotFirmware\x12(.chromite.api.BuildAllTotFirmwareRequest\x1a).chromite.api.BuildAllTotFirmwareResponse\x12g\n\x12TestAllTotFirmware\x12\'.chromite.api.TestAllTotFirmwareRequest\x1a(.chromite.api.TestAllTotFirmwareResponse\x12\x61\n\x10\x42uildAllFirmware\x12%.chromite.api.BuildAllFirmwareRequest\x1a&.chromite.api.BuildAllFirmwareResponse\x12^\n\x0fTestAllFirmware\x12$.chromite.api.TestAllFirmwareRequest\x1a%.chromite.api.TestAllFirmwareResponse\x12v\n\x17\x42undleFirmwareArtifacts\x12,.chromite.api.BundleFirmwareArtifactsRequest\x1a-.chromite.api.BundleFirmwareArtifactsResponse\x1a\x10\xc2\xed\x1a\x0c\n\x08\x66irmware\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
   ,
   dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,])
 
@@ -51,8 +51,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2396,
-  serialized_end=2490,
+  serialized_start=2492,
+  serialized_end=2586,
 )
 _sym_db.RegisterEnumDescriptor(_FWLOCATION)
 
@@ -126,8 +126,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2179,
-  serialized_end=2224,
+  serialized_start=2275,
+  serialized_end=2320,
 )
 _sym_db.RegisterEnumDescriptor(_FIRMWAREARTIFACTINFO_TARBALLINFO_FIRMWARETYPE_TYPE)
 
@@ -420,6 +420,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='code_coverage', full_name='chromite.api.BuildAllTotFirmwareRequest.code_coverage', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -432,8 +439,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=798,
-  serialized_end=915,
+  serialized_start=799,
+  serialized_end=939,
 )
 
 
@@ -463,8 +470,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=917,
-  serialized_end=996,
+  serialized_start=941,
+  serialized_end=1020,
 )
 
 
@@ -489,6 +496,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='code_coverage', full_name='chromite.api.TestAllTotFirmwareRequest.code_coverage', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -501,8 +515,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=998,
-  serialized_end=1114,
+  serialized_start=1023,
+  serialized_end=1162,
 )
 
 
@@ -532,8 +546,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1116,
-  serialized_end=1193,
+  serialized_start=1164,
+  serialized_end=1241,
 )
 
 
@@ -558,6 +572,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='code_coverage', full_name='chromite.api.BuildAllFirmwareRequest.code_coverage', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -570,8 +591,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1195,
-  serialized_end=1307,
+  serialized_start=1244,
+  serialized_end=1379,
 )
 
 
@@ -601,8 +622,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1309,
-  serialized_end=1385,
+  serialized_start=1381,
+  serialized_end=1457,
 )
 
 
@@ -627,6 +648,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='code_coverage', full_name='chromite.api.TestAllFirmwareRequest.code_coverage', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -639,8 +667,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1387,
-  serialized_end=1498,
+  serialized_start=1460,
+  serialized_end=1594,
 )
 
 
@@ -670,8 +698,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1500,
-  serialized_end=1574,
+  serialized_start=1596,
+  serialized_end=1670,
 )
 
 
@@ -715,8 +743,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1577,
-  serialized_end=1750,
+  serialized_start=1673,
+  serialized_end=1846,
 )
 
 
@@ -746,8 +774,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1752,
-  serialized_end=1853,
+  serialized_start=1848,
+  serialized_end=1949,
 )
 
 
@@ -771,8 +799,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2163,
-  serialized_end=2224,
+  serialized_start=2259,
+  serialized_end=2320,
 )
 
 _FIRMWAREARTIFACTINFO_TARBALLINFO_VERSION = _descriptor.Descriptor(
@@ -808,8 +836,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2226,
-  serialized_end=2265,
+  serialized_start=2322,
+  serialized_end=2361,
 )
 
 _FIRMWAREARTIFACTINFO_TARBALLINFO = _descriptor.Descriptor(
@@ -859,8 +887,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1945,
-  serialized_end=2265,
+  serialized_start=2041,
+  serialized_end=2361,
 )
 
 _FIRMWAREARTIFACTINFO_OBJECTINFO = _descriptor.Descriptor(
@@ -899,8 +927,8 @@
       name='firmware_object_info', full_name='chromite.api.FirmwareArtifactInfo.ObjectInfo.firmware_object_info',
       index=0, containing_type=None, fields=[]),
   ],
-  serialized_start=2267,
-  serialized_end=2394,
+  serialized_start=2363,
+  serialized_end=2490,
 )
 
 _FIRMWAREARTIFACTINFO = _descriptor.Descriptor(
@@ -929,8 +957,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1856,
-  serialized_end=2394,
+  serialized_start=1952,
+  serialized_end=2490,
 )
 
 _FWBUILDMETRIC_FWSECTION.fields_by_name['region'].enum_type = _FWBUILDMETRIC_FWSECTION_FWREGION
@@ -1162,8 +1190,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=_b('\302\355\032\014\n\010firmware\020\001'),
-  serialized_start=2493,
-  serialized_end=3056,
+  serialized_start=2589,
+  serialized_end=3152,
   methods=[
   _descriptor.MethodDescriptor(
     name='BuildAllTotFirmware',
diff --git a/api/gen/device/config_pb2.py b/api/gen/device/config_pb2.py
index 1d13085..f4117b9 100644
--- a/api/gen/device/config_pb2.py
+++ b/api/gen/device/config_pb2.py
@@ -20,7 +20,7 @@
   package='device',
   syntax='proto3',
   serialized_options=_b('Z0go.chromium.org/chromiumos/infra/proto/go/device'),
-  serialized_pb=_b('\n\x13\x64\x65vice/config.proto\x12\x06\x64\x65vice\x1a\x16\x64\x65vice/config_id.proto\"\xaa\x18\n\x06\x43onfig\x12\x1c\n\x02id\x18\x01 \x01(\x0b\x32\x10.device.ConfigId\x12.\n\x0b\x66orm_factor\x18\x03 \x01(\x0e\x32\x19.device.Config.FormFactor\x12\x12\n\ngpu_family\x18\x04 \x01(\t\x12)\n\x08graphics\x18\x05 \x01(\x0e\x32\x17.device.Config.Graphics\x12\x39\n\x11hardware_features\x18\x06 \x03(\x0e\x32\x1e.device.Config.HardwareFeature\x12)\n\x05power\x18\x08 \x01(\x0e\x32\x1a.device.Config.PowerSupply\x12\'\n\x07storage\x18\t \x01(\x0e\x32\x16.device.Config.Storage\x12\x45\n\x1bvideo_acceleration_supports\x18\n \x03(\x0e\x32 .device.Config.VideoAcceleration\x12\x1f\n\x03soc\x18\x0b \x01(\x0e\x32\x12.device.Config.SOC\x12\x0b\n\x03tam\x18\x0c \x03(\t\x12\n\n\x02\x65\x65\x18\r \x03(\t\x12\x1f\n\x03odm\x18\x0e \x01(\x0e\x32\x12.device.Config.ODM\x12\x17\n\x0fodm_email_group\x18\x0f \x01(\t\x12\x1f\n\x03oem\x18\x10 \x01(\x0e\x32\x12.device.Config.OEM\x12\x17\n\x0foem_email_group\x18\x11 \x01(\t\x12\x17\n\x0fsoc_email_group\x18\x12 \x01(\t\x12\x1e\n\x16\x66irmware_configuration\x18\x13 \x01(\r\x12(\n\x03\x63pu\x18\x14 \x01(\x0e\x32\x1b.device.Config.Architecture\x12\x1d\n\x02\x65\x63\x18\x15 \x01(\x0e\x32\x11.device.Config.EC\"\xec\x01\n\nFormFactor\x12\x1b\n\x17\x46ORM_FACTOR_UNSPECIFIED\x10\x00\x12\x19\n\x15\x46ORM_FACTOR_CLAMSHELL\x10\x01\x12\x1b\n\x17\x46ORM_FACTOR_CONVERTIBLE\x10\x02\x12\x1a\n\x16\x46ORM_FACTOR_DETACHABLE\x10\x03\x12\x1a\n\x16\x46ORM_FACTOR_CHROMEBASE\x10\x04\x12\x19\n\x15\x46ORM_FACTOR_CHROMEBOX\x10\x05\x12\x19\n\x15\x46ORM_FACTOR_CHROMEBIT\x10\x06\x12\x1b\n\x17\x46ORM_FACTOR_CHROMESLATE\x10\x07\"G\n\x08Graphics\x12\x18\n\x14GRAPHICS_UNSPECIFIED\x10\x00\x12\x0f\n\x0bGRAPHICS_GL\x10\x01\x12\x10\n\x0cGRAPHICS_GLE\x10\x02\"\xa3\x03\n\x0fHardwareFeature\x12 \n\x1cHARDWARE_FEATURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aHARDWARE_FEATURE_BLUETOOTH\x10\x01\x12\x1d\n\x19HARDWARE_FEATURE_FLASHROM\x10\x02\x12\x1f\n\x1bHARDWARE_FEATURE_HOTWORDING\x10\x03\x12%\n!HARDWARE_FEATURE_INTERNAL_DISPLAY\x10\x04\x12 \n\x1cHARDWARE_FEATURE_LUCID_SLEEP\x10\x05\x12\x1b\n\x17HARDWARE_FEATURE_WEBCAM\x10\x06\x12\x1b\n\x17HARDWARE_FEATURE_STYLUS\x10\x07\x12\x1d\n\x19HARDWARE_FEATURE_TOUCHPAD\x10\x08\x12 \n\x1cHARDWARE_FEATURE_TOUCHSCREEN\x10\t\x12(\n$HARDWARE_FEATURE_DETACHABLE_KEYBOARD\x10\n\x12 \n\x1cHARDWARE_FEATURE_FINGERPRINT\x10\x0b\"_\n\x0bPowerSupply\x12\x1c\n\x18POWER_SUPPLY_UNSPECIFIED\x10\x00\x12\x18\n\x14POWER_SUPPLY_BATTERY\x10\x01\x12\x18\n\x14POWER_SUPPLY_AC_ONLY\x10\x02\"x\n\x07Storage\x12\x17\n\x13STORAGE_UNSPECIFIED\x10\x00\x12\x0f\n\x0bSTORAGE_SSD\x10\x01\x12\x0f\n\x0bSTORAGE_HDD\x10\x02\x12\x0f\n\x0bSTORAGE_MMC\x10\x03\x12\x10\n\x0cSTORAGE_NVME\x10\x04\x12\x0f\n\x0bSTORAGE_UFS\x10\x05\"\x9c\x03\n\x11VideoAcceleration\x12\x15\n\x11VIDEO_UNSPECIFIED\x10\x00\x12\x1b\n\x17VIDEO_ACCELERATION_H264\x10\x01\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_H264\x10\x02\x12\x1a\n\x16VIDEO_ACCELERATION_VP8\x10\x03\x12\x1e\n\x1aVIDEO_ACCELERATION_ENC_VP8\x10\x04\x12\x1a\n\x16VIDEO_ACCELERATION_VP9\x10\x05\x12\x1e\n\x1aVIDEO_ACCELERATION_ENC_VP9\x10\x06\x12\x1c\n\x18VIDEO_ACCELERATION_VP9_2\x10\x07\x12 \n\x1cVIDEO_ACCELERATION_ENC_VP9_2\x10\x08\x12\x1b\n\x17VIDEO_ACCELERATION_H265\x10\t\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_H265\x10\n\x12\x1b\n\x17VIDEO_ACCELERATION_MJPG\x10\x0b\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_MJPG\x10\x0c\"\xa9\x05\n\x03SOC\x12\x13\n\x0fSOC_UNSPECIFIED\x10\x00\x12\x13\n\x0fSOC_AMBERLAKE_Y\x10\x01\x12\x13\n\x0fSOC_APOLLO_LAKE\x10\x02\x12\x11\n\rSOC_BAY_TRAIL\x10\x03\x12\x10\n\x0cSOC_BRASWELL\x10\x04\x12\x11\n\rSOC_BROADWELL\x10\x05\x12\x15\n\x11SOC_CANNON_LAKE_Y\x10\x06\x12\x14\n\x10SOC_COMET_LAKE_U\x10\x07\x12\x13\n\x0fSOC_EXYNOS_5250\x10\x08\x12\x13\n\x0fSOC_EXYNOS_5420\x10\t\x12\x13\n\x0fSOC_GEMINI_LAKE\x10\n\x12\x0f\n\x0bSOC_HASWELL\x10\x0b\x12\x12\n\x0eSOC_ICE_LAKE_Y\x10\x0c\x12\x12\n\x0eSOC_IVY_BRIDGE\x10\r\x12\x12\n\x0eSOC_KABYLAKE_U\x10\x0e\x12\x14\n\x10SOC_KABYLAKE_U_R\x10\x0f\x12\x12\n\x0eSOC_KABYLAKE_Y\x10\x10\x12\x0e\n\nSOC_MT8173\x10\x11\x12\x0e\n\nSOC_MT8176\x10\x12\x12\x0e\n\nSOC_MT8183\x10\x13\x12\x0f\n\x0bSOC_PICASSO\x10\x14\x12\x12\n\x0eSOC_PINE_TRAIL\x10\x15\x12\x0e\n\nSOC_RK3288\x10\x16\x12\x0e\n\nSOC_RK3399\x10\x17\x12\x14\n\x10SOC_SANDY_BRIDGE\x10\x18\x12\x0e\n\nSOC_SDM845\x10\x19\x12\x11\n\rSOC_SKYLAKE_U\x10\x1a\x12\x11\n\rSOC_SKYLAKE_Y\x10\x1b\x12\x14\n\x10SOC_STONEY_RIDGE\x10\x1c\x12\x10\n\x0cSOC_TEGRA_K1\x10\x1d\x12\x16\n\x12SOC_WHISKEY_LAKE_U\x10\x1e\x12\x0e\n\nSOC_SC7180\x10\x1f\x12\x13\n\x0fSOC_JASPER_LAKE\x10 \x12\x12\n\x0eSOC_TIGER_LAKE\x10!\x12\x0e\n\nSOC_MT8192\x10\"\"n\n\x03ODM\x12\x13\n\x0fODM_UNSPECIFIED\x10\x00\x12\x0e\n\nODM_QUANTA\x10\x01\x12\x0f\n\x0bODM_BITLAND\x10\x02\x12\x0f\n\x0bODM_SAMSUNG\x10\x03\x12\x10\n\x0cODM_PEGATRON\x10\x04\x12\x0e\n\nODM_COMPAL\x10\x05\"~\n\x03OEM\x12\x13\n\x0fOEM_UNSPECIFIED\x10\x00\x12\x0c\n\x08OEM_ACER\x10\x01\x12\x0c\n\x08OEM_DELL\x10\x02\x12\x0f\n\x0bOEM_SAMSUNG\x10\x03\x12\n\n\x06OEM_HP\x10\x04\x12\x0e\n\nOEM_LENOVO\x10\x05\x12\x0c\n\x08OEM_ASUS\x10\x06\x12\x0b\n\x07OEM_NEC\x10\x07\"S\n\x0c\x41rchitecture\x12\x1a\n\x16\x41RCHITECTURE_UNDEFINED\x10\x00\x12\x07\n\x03X86\x10\x01\x12\n\n\x06X86_64\x10\x02\x12\x07\n\x03\x41RM\x10\x03\x12\t\n\x05\x41RM64\x10\x04\"5\n\x02\x45\x43\x12\x12\n\x0e\x45\x43_UNSPECIFIED\x10\x00\x12\r\n\tEC_CHROME\x10\x01\x12\x0c\n\x08\x45\x43_WILCO\x10\x02J\x04\x08\x02\x10\x03R\x07\x63\x61rrier\"-\n\nAllConfigs\x12\x1f\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x0e.device.ConfigB2Z0go.chromium.org/chromiumos/infra/proto/go/deviceb\x06proto3')
+  serialized_pb=_b('\n\x13\x64\x65vice/config.proto\x12\x06\x64\x65vice\x1a\x16\x64\x65vice/config_id.proto\"\xbe\x18\n\x06\x43onfig\x12\x1c\n\x02id\x18\x01 \x01(\x0b\x32\x10.device.ConfigId\x12.\n\x0b\x66orm_factor\x18\x03 \x01(\x0e\x32\x19.device.Config.FormFactor\x12\x12\n\ngpu_family\x18\x04 \x01(\t\x12)\n\x08graphics\x18\x05 \x01(\x0e\x32\x17.device.Config.Graphics\x12\x39\n\x11hardware_features\x18\x06 \x03(\x0e\x32\x1e.device.Config.HardwareFeature\x12)\n\x05power\x18\x08 \x01(\x0e\x32\x1a.device.Config.PowerSupply\x12\'\n\x07storage\x18\t \x01(\x0e\x32\x16.device.Config.Storage\x12\x45\n\x1bvideo_acceleration_supports\x18\n \x03(\x0e\x32 .device.Config.VideoAcceleration\x12\x1f\n\x03soc\x18\x0b \x01(\x0e\x32\x12.device.Config.SOC\x12\x0b\n\x03tam\x18\x0c \x03(\t\x12\n\n\x02\x65\x65\x18\r \x03(\t\x12\x1f\n\x03odm\x18\x0e \x01(\x0e\x32\x12.device.Config.ODM\x12\x17\n\x0fodm_email_group\x18\x0f \x01(\t\x12\x1f\n\x03oem\x18\x10 \x01(\x0e\x32\x12.device.Config.OEM\x12\x17\n\x0foem_email_group\x18\x11 \x01(\t\x12\x17\n\x0fsoc_email_group\x18\x12 \x01(\t\x12\x1e\n\x16\x66irmware_configuration\x18\x13 \x01(\r\x12(\n\x03\x63pu\x18\x14 \x01(\x0e\x32\x1b.device.Config.Architecture\x12\x1d\n\x02\x65\x63\x18\x15 \x01(\x0e\x32\x11.device.Config.EC\"\xec\x01\n\nFormFactor\x12\x1b\n\x17\x46ORM_FACTOR_UNSPECIFIED\x10\x00\x12\x19\n\x15\x46ORM_FACTOR_CLAMSHELL\x10\x01\x12\x1b\n\x17\x46ORM_FACTOR_CONVERTIBLE\x10\x02\x12\x1a\n\x16\x46ORM_FACTOR_DETACHABLE\x10\x03\x12\x1a\n\x16\x46ORM_FACTOR_CHROMEBASE\x10\x04\x12\x19\n\x15\x46ORM_FACTOR_CHROMEBOX\x10\x05\x12\x19\n\x15\x46ORM_FACTOR_CHROMEBIT\x10\x06\x12\x1b\n\x17\x46ORM_FACTOR_CHROMESLATE\x10\x07\"G\n\x08Graphics\x12\x18\n\x14GRAPHICS_UNSPECIFIED\x10\x00\x12\x0f\n\x0bGRAPHICS_GL\x10\x01\x12\x10\n\x0cGRAPHICS_GLE\x10\x02\"\xa3\x03\n\x0fHardwareFeature\x12 \n\x1cHARDWARE_FEATURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aHARDWARE_FEATURE_BLUETOOTH\x10\x01\x12\x1d\n\x19HARDWARE_FEATURE_FLASHROM\x10\x02\x12\x1f\n\x1bHARDWARE_FEATURE_HOTWORDING\x10\x03\x12%\n!HARDWARE_FEATURE_INTERNAL_DISPLAY\x10\x04\x12 \n\x1cHARDWARE_FEATURE_LUCID_SLEEP\x10\x05\x12\x1b\n\x17HARDWARE_FEATURE_WEBCAM\x10\x06\x12\x1b\n\x17HARDWARE_FEATURE_STYLUS\x10\x07\x12\x1d\n\x19HARDWARE_FEATURE_TOUCHPAD\x10\x08\x12 \n\x1cHARDWARE_FEATURE_TOUCHSCREEN\x10\t\x12(\n$HARDWARE_FEATURE_DETACHABLE_KEYBOARD\x10\n\x12 \n\x1cHARDWARE_FEATURE_FINGERPRINT\x10\x0b\"_\n\x0bPowerSupply\x12\x1c\n\x18POWER_SUPPLY_UNSPECIFIED\x10\x00\x12\x18\n\x14POWER_SUPPLY_BATTERY\x10\x01\x12\x18\n\x14POWER_SUPPLY_AC_ONLY\x10\x02\"x\n\x07Storage\x12\x17\n\x13STORAGE_UNSPECIFIED\x10\x00\x12\x0f\n\x0bSTORAGE_SSD\x10\x01\x12\x0f\n\x0bSTORAGE_HDD\x10\x02\x12\x0f\n\x0bSTORAGE_MMC\x10\x03\x12\x10\n\x0cSTORAGE_NVME\x10\x04\x12\x0f\n\x0bSTORAGE_UFS\x10\x05\"\x9c\x03\n\x11VideoAcceleration\x12\x15\n\x11VIDEO_UNSPECIFIED\x10\x00\x12\x1b\n\x17VIDEO_ACCELERATION_H264\x10\x01\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_H264\x10\x02\x12\x1a\n\x16VIDEO_ACCELERATION_VP8\x10\x03\x12\x1e\n\x1aVIDEO_ACCELERATION_ENC_VP8\x10\x04\x12\x1a\n\x16VIDEO_ACCELERATION_VP9\x10\x05\x12\x1e\n\x1aVIDEO_ACCELERATION_ENC_VP9\x10\x06\x12\x1c\n\x18VIDEO_ACCELERATION_VP9_2\x10\x07\x12 \n\x1cVIDEO_ACCELERATION_ENC_VP9_2\x10\x08\x12\x1b\n\x17VIDEO_ACCELERATION_H265\x10\t\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_H265\x10\n\x12\x1b\n\x17VIDEO_ACCELERATION_MJPG\x10\x0b\x12\x1f\n\x1bVIDEO_ACCELERATION_ENC_MJPG\x10\x0c\"\xbd\x05\n\x03SOC\x12\x13\n\x0fSOC_UNSPECIFIED\x10\x00\x12\x13\n\x0fSOC_AMBERLAKE_Y\x10\x01\x12\x13\n\x0fSOC_APOLLO_LAKE\x10\x02\x12\x11\n\rSOC_BAY_TRAIL\x10\x03\x12\x10\n\x0cSOC_BRASWELL\x10\x04\x12\x11\n\rSOC_BROADWELL\x10\x05\x12\x15\n\x11SOC_CANNON_LAKE_Y\x10\x06\x12\x14\n\x10SOC_COMET_LAKE_U\x10\x07\x12\x13\n\x0fSOC_EXYNOS_5250\x10\x08\x12\x13\n\x0fSOC_EXYNOS_5420\x10\t\x12\x13\n\x0fSOC_GEMINI_LAKE\x10\n\x12\x0f\n\x0bSOC_HASWELL\x10\x0b\x12\x12\n\x0eSOC_ICE_LAKE_Y\x10\x0c\x12\x12\n\x0eSOC_IVY_BRIDGE\x10\r\x12\x12\n\x0eSOC_KABYLAKE_U\x10\x0e\x12\x14\n\x10SOC_KABYLAKE_U_R\x10\x0f\x12\x12\n\x0eSOC_KABYLAKE_Y\x10\x10\x12\x0e\n\nSOC_MT8173\x10\x11\x12\x0e\n\nSOC_MT8176\x10\x12\x12\x0e\n\nSOC_MT8183\x10\x13\x12\x0f\n\x0bSOC_PICASSO\x10\x14\x12\x12\n\x0eSOC_PINE_TRAIL\x10\x15\x12\x0e\n\nSOC_RK3288\x10\x16\x12\x0e\n\nSOC_RK3399\x10\x17\x12\x14\n\x10SOC_SANDY_BRIDGE\x10\x18\x12\x0e\n\nSOC_SDM845\x10\x19\x12\x11\n\rSOC_SKYLAKE_U\x10\x1a\x12\x11\n\rSOC_SKYLAKE_Y\x10\x1b\x12\x14\n\x10SOC_STONEY_RIDGE\x10\x1c\x12\x10\n\x0cSOC_TEGRA_K1\x10\x1d\x12\x16\n\x12SOC_WHISKEY_LAKE_U\x10\x1e\x12\x0e\n\nSOC_SC7180\x10\x1f\x12\x13\n\x0fSOC_JASPER_LAKE\x10 \x12\x12\n\x0eSOC_TIGER_LAKE\x10!\x12\x0e\n\nSOC_MT8192\x10\"\x12\x12\n\x0eSOC_ALDER_LAKE\x10#\"n\n\x03ODM\x12\x13\n\x0fODM_UNSPECIFIED\x10\x00\x12\x0e\n\nODM_QUANTA\x10\x01\x12\x0f\n\x0bODM_BITLAND\x10\x02\x12\x0f\n\x0bODM_SAMSUNG\x10\x03\x12\x10\n\x0cODM_PEGATRON\x10\x04\x12\x0e\n\nODM_COMPAL\x10\x05\"~\n\x03OEM\x12\x13\n\x0fOEM_UNSPECIFIED\x10\x00\x12\x0c\n\x08OEM_ACER\x10\x01\x12\x0c\n\x08OEM_DELL\x10\x02\x12\x0f\n\x0bOEM_SAMSUNG\x10\x03\x12\n\n\x06OEM_HP\x10\x04\x12\x0e\n\nOEM_LENOVO\x10\x05\x12\x0c\n\x08OEM_ASUS\x10\x06\x12\x0b\n\x07OEM_NEC\x10\x07\"S\n\x0c\x41rchitecture\x12\x1a\n\x16\x41RCHITECTURE_UNDEFINED\x10\x00\x12\x07\n\x03X86\x10\x01\x12\n\n\x06X86_64\x10\x02\x12\x07\n\x03\x41RM\x10\x03\x12\t\n\x05\x41RM64\x10\x04\"5\n\x02\x45\x43\x12\x12\n\x0e\x45\x43_UNSPECIFIED\x10\x00\x12\r\n\tEC_CHROME\x10\x01\x12\x0c\n\x08\x45\x43_WILCO\x10\x02J\x04\x08\x02\x10\x03R\x07\x63\x61rrier\"-\n\nAllConfigs\x12\x1f\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x0e.device.ConfigB2Z0go.chromium.org/chromiumos/infra/proto/go/deviceb\x06proto3')
   ,
   dependencies=[device_dot_config__id__pb2.DESCRIPTOR,])
 
@@ -436,11 +436,15 @@
       name='SOC_MT8192', index=34, number=34,
       serialized_options=None,
       type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SOC_ALDER_LAKE', index=35, number=35,
+      serialized_options=None,
+      type=None),
   ],
   containing_type=None,
   serialized_options=None,
   serialized_start=2094,
-  serialized_end=2775,
+  serialized_end=2795,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIG_SOC)
 
@@ -477,8 +481,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2777,
-  serialized_end=2887,
+  serialized_start=2797,
+  serialized_end=2907,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIG_ODM)
 
@@ -523,8 +527,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2889,
-  serialized_end=3015,
+  serialized_start=2909,
+  serialized_end=3035,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIG_OEM)
 
@@ -557,8 +561,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3017,
-  serialized_end=3100,
+  serialized_start=3037,
+  serialized_end=3120,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIG_ARCHITECTURE)
 
@@ -583,8 +587,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3102,
-  serialized_end=3155,
+  serialized_start=3122,
+  serialized_end=3175,
 )
 _sym_db.RegisterEnumDescriptor(_CONFIG_EC)
 
@@ -753,7 +757,7 @@
   oneofs=[
   ],
   serialized_start=56,
-  serialized_end=3170,
+  serialized_end=3190,
 )
 
 
@@ -783,8 +787,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3172,
-  serialized_end=3217,
+  serialized_start=3192,
+  serialized_end=3237,
 )
 
 _CONFIG.fields_by_name['id'].message_type = device_dot_config__id__pb2._CONFIGID
diff --git a/api/gen/test_platform/service_version_pb2.py b/api/gen/test_platform/service_version_pb2.py
index 66b8ab0..4c7a968 100644
--- a/api/gen/test_platform/service_version_pb2.py
+++ b/api/gen/test_platform/service_version_pb2.py
@@ -19,7 +19,7 @@
   package='test_platform',
   syntax='proto3',
   serialized_options=_b('Z7go.chromium.org/chromiumos/infra/proto/go/test_platform'),
-  serialized_pb=_b('\n#test_platform/service_version.proto\x12\rtest_platform\"3\n\x0eServiceVersion\x12\x13\n\x0bskylab_tool\x18\x02 \x01(\x03J\x04\x08\x01\x10\x02R\x06globalB9Z7go.chromium.org/chromiumos/infra/proto/go/test_platformb\x06proto3')
+  serialized_pb=_b('\n#test_platform/service_version.proto\x12\rtest_platform\"K\n\x0eServiceVersion\x12\x13\n\x0bskylab_tool\x18\x02 \x01(\x03\x12\x16\n\x0e\x63rosfleet_tool\x18\x03 \x01(\x03J\x04\x08\x01\x10\x02R\x06globalB9Z7go.chromium.org/chromiumos/infra/proto/go/test_platformb\x06proto3')
 )
 
 
@@ -39,6 +39,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='crosfleet_tool', full_name='test_platform.ServiceVersion.crosfleet_tool', index=1,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -52,7 +59,7 @@
   oneofs=[
   ],
   serialized_start=54,
-  serialized_end=105,
+  serialized_end=129,
 )
 
 DESCRIPTOR.message_types_by_name['ServiceVersion'] = _SERVICEVERSION