Add bcl_exynos/bcl_irq_trigger ftrace event

Bug: 341946760
Test: Build and confirm in the ui
Change-Id: Ie7f3a50ef03f62acd092fe27727691d03a3f60b6
diff --git a/Android.bp b/Android.bp
index ceb98b2..3a57165 100644
--- a/Android.bp
+++ b/Android.bp
@@ -6477,6 +6477,7 @@
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/filesystem/inode_file_map.proto",
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
@@ -6904,6 +6905,7 @@
     name: "perfetto_protos_perfetto_trace_ftrace_cpp",
     srcs: [
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
@@ -6992,6 +6994,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_cpp)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.gen.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/block.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.gen.cc",
@@ -7080,6 +7083,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_cpp)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.gen.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/block.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.gen.h",
@@ -7164,6 +7168,7 @@
     name: "perfetto_protos_perfetto_trace_ftrace_lite",
     srcs: [
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
@@ -7251,6 +7256,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_lite)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.pb.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/block.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.pb.cc",
@@ -7338,6 +7344,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_lite)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.pb.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/block.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.pb.h",
@@ -7422,6 +7429,7 @@
     name: "perfetto_protos_perfetto_trace_ftrace_zero",
     srcs: [
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
@@ -7510,6 +7518,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_zero)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.pbzero.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/block.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.pbzero.cc",
@@ -7598,6 +7607,7 @@
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(locations :perfetto_protos_perfetto_trace_ftrace_zero)",
     out: [
         "external/perfetto/protos/perfetto/trace/ftrace/android_fs.pbzero.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/bcl_exynos.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/binder.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/block.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/cgroup.pbzero.h",
@@ -14597,6 +14607,7 @@
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/filesystem/inode_file_map.proto",
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
@@ -15904,6 +15915,7 @@
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/filesystem/inode_file_map.proto",
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
diff --git a/BUILD b/BUILD
index 97ca505..132487e 100644
--- a/BUILD
+++ b/BUILD
@@ -5016,6 +5016,7 @@
     name = "protos_perfetto_trace_ftrace_protos",
     srcs = [
         "protos/perfetto/trace/ftrace/android_fs.proto",
+        "protos/perfetto/trace/ftrace/bcl_exynos.proto",
         "protos/perfetto/trace/ftrace/binder.proto",
         "protos/perfetto/trace/ftrace/block.proto",
         "protos/perfetto/trace/ftrace/cgroup.proto",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index aaa1971..1cb6085 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -21,6 +21,7 @@
   "test_bundle_wrapper.proto",
   "generic.proto",
   "android_fs.proto",
+  "bcl_exynos.proto",
   "binder.proto",
   "block.proto",
   "cgroup.proto",
diff --git a/protos/perfetto/trace/ftrace/bcl_exynos.proto b/protos/perfetto/trace/ftrace/bcl_exynos.proto
new file mode 100644
index 0000000..801a2ca
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/bcl_exynos.proto
@@ -0,0 +1,18 @@
+// Autogenerated by:
+// ../../src/tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+package perfetto.protos;
+
+message BclIrqTriggerFtraceEvent {
+  optional int32 id = 1;
+  optional int32 throttle = 2;
+  optional int32 cpu0_limit = 3;
+  optional int32 cpu1_limit = 4;
+  optional int32 cpu2_limit = 5;
+  optional int32 tpu_limit = 6;
+  optional int32 gpu_limit = 7;
+  optional int32 voltage = 8;
+  optional int32 capacity = 9;
+}
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index 7e1b236..6d9334e 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -21,6 +21,7 @@
 syntax = "proto2";
 
 import "protos/perfetto/trace/ftrace/android_fs.proto";
+import "protos/perfetto/trace/ftrace/bcl_exynos.proto";
 import "protos/perfetto/trace/ftrace/binder.proto";
 import "protos/perfetto/trace/ftrace/block.proto";
 import "protos/perfetto/trace/ftrace/cgroup.proto";
@@ -668,5 +669,6 @@
     MaliMaliPMMCUPENDONRELOADFtraceEvent mali_mali_PM_MCU_PEND_ON_RELOAD = 530;
     MaliMaliPMMCUPOWERDOWNFtraceEvent mali_mali_PM_MCU_POWER_DOWN = 531;
     MaliMaliPMMCURESETWAITFtraceEvent mali_mali_PM_MCU_RESET_WAIT = 532;
+    BclIrqTriggerFtraceEvent bcl_irq_trigger = 533;
   }
 }
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index c7a1537..fc8270e 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -6814,6 +6814,22 @@
 
 // End of protos/perfetto/trace/ftrace/android_fs.proto
 
+// Begin of protos/perfetto/trace/ftrace/bcl_exynos.proto
+
+message BclIrqTriggerFtraceEvent {
+  optional int32 id = 1;
+  optional int32 throttle = 2;
+  optional int32 cpu0_limit = 3;
+  optional int32 cpu1_limit = 4;
+  optional int32 cpu2_limit = 5;
+  optional int32 tpu_limit = 6;
+  optional int32 gpu_limit = 7;
+  optional int32 voltage = 8;
+  optional int32 capacity = 9;
+}
+
+// End of protos/perfetto/trace/ftrace/bcl_exynos.proto
+
 // Begin of protos/perfetto/trace/ftrace/binder.proto
 
 message BinderTransactionFtraceEvent {
@@ -10963,6 +10979,7 @@
     MaliMaliPMMCUPENDONRELOADFtraceEvent mali_mali_PM_MCU_PEND_ON_RELOAD = 530;
     MaliMaliPMMCUPOWERDOWNFtraceEvent mali_mali_PM_MCU_POWER_DOWN = 531;
     MaliMaliPMMCURESETWAITFtraceEvent mali_mali_PM_MCU_RESET_WAIT = 532;
+    BclIrqTriggerFtraceEvent bcl_irq_trigger = 533;
   }
 }
 
diff --git a/src/tools/ftrace_proto_gen/event_list b/src/tools/ftrace_proto_gen/event_list
index 132949c..8d1463c 100644
--- a/src/tools/ftrace_proto_gen/event_list
+++ b/src/tools/ftrace_proto_gen/event_list
@@ -527,3 +527,4 @@
 mali/mali_PM_MCU_PEND_ON_RELOAD
 mali/mali_PM_MCU_POWER_DOWN
 mali/mali_PM_MCU_RESET_WAIT
+bcl_exynos/bcl_irq_trigger
diff --git a/src/trace_processor/importers/common/track_tracker.cc b/src/trace_processor/importers/common/track_tracker.cc
index a2ba1f8..b217d5b 100644
--- a/src/trace_processor/importers/common/track_tracker.cc
+++ b/src/trace_processor/importers/common/track_tracker.cc
@@ -47,6 +47,8 @@
       return "Thermals";
     case TrackTracker::Group::kClockFrequency:
       return "Clock Freqeuncy";
+    case TrackTracker::Group::kBatteryMitigation:
+      return "Battery Mitigation";
     case TrackTracker::Group::kSizeSentinel:
       PERFETTO_FATAL("Unexpected size passed as group");
   }
diff --git a/src/trace_processor/importers/common/track_tracker.h b/src/trace_processor/importers/common/track_tracker.h
index c066204..261b562 100644
--- a/src/trace_processor/importers/common/track_tracker.h
+++ b/src/trace_processor/importers/common/track_tracker.h
@@ -43,6 +43,7 @@
     kDeviceState,
     kThermals,
     kClockFrequency,
+    kBatteryMitigation,
 
     // Keep this last.
     kSizeSentinel,
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index c5c6547..3fd5e92 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@
 namespace trace_processor {
 namespace {
 
-std::array<FtraceMessageDescriptor, 533> descriptors{{
+std::array<FtraceMessageDescriptor, 534> descriptors{{
     {nullptr, 0, {}},
     {nullptr, 0, {}},
     {nullptr, 0, {}},
@@ -5867,6 +5867,22 @@
             {"info_val", ProtoSchemaType::kUint64},
         },
     },
+    {
+        "bcl_exynos_bcl_irq_trigger",
+        9,
+        {
+            {},
+            {"id", ProtoSchemaType::kInt32},
+            {"throttle", ProtoSchemaType::kInt32},
+            {"cpu0_limit", ProtoSchemaType::kInt32},
+            {"cpu1_limit", ProtoSchemaType::kInt32},
+            {"cpu2_limit", ProtoSchemaType::kInt32},
+            {"tpu_limit", ProtoSchemaType::kInt32},
+            {"gpu_limit", ProtoSchemaType::kInt32},
+            {"voltage", ProtoSchemaType::kInt32},
+            {"capacity", ProtoSchemaType::kInt32},
+        },
+    },
 }};
 
 }  // namespace
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index e368073..21a199a 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -46,6 +46,7 @@
 
 #include "protos/perfetto/common/gpu_counter_descriptor.pbzero.h"
 #include "protos/perfetto/trace/ftrace/android_fs.pbzero.h"
+#include "protos/perfetto/trace/ftrace/bcl_exynos.pbzero.h"
 #include "protos/perfetto/trace/ftrace/binder.pbzero.h"
 #include "protos/perfetto/trace/ftrace/cma.pbzero.h"
 #include "protos/perfetto/trace/ftrace/cpuhp.pbzero.h"
@@ -341,6 +342,15 @@
       ion_total_unknown_id_(context->storage->InternString("mem.ion.unknown")),
       ion_change_unknown_id_(
           context->storage->InternString("mem.ion_change.unknown")),
+      bcl_irq_id_(context_->storage->InternString("bcl_irq_id")),
+      bcl_irq_throttle_(context_->storage->InternString("bcl_irq_throttle")),
+      bcl_irq_cpu0_(context_->storage->InternString("bcl_irq_cpu0")),
+      bcl_irq_cpu1_(context_->storage->InternString("bcl_irq_cpu1")),
+      bcl_irq_cpu2_(context_->storage->InternString("bcl_irq_cpu2")),
+      bcl_irq_tpu_(context_->storage->InternString("bcl_irq_tpu")),
+      bcl_irq_gpu_(context_->storage->InternString("bcl_irq_gpu")),
+      bcl_irq_voltage_(context_->storage->InternString("bcl_irq_voltage")),
+      bcl_irq_capacity_(context_->storage->InternString("bcl_irq_capacity")),
       signal_generate_id_(context->storage->InternString("signal_generate")),
       signal_deliver_id_(context->storage->InternString("signal_deliver")),
       oom_score_adj_id_(context->storage->InternString("oom_score_adj")),
@@ -1284,6 +1294,10 @@
         ParseDevicePmCallbackEnd(ts, fld_bytes);
         break;
       }
+      case FtraceEvent::kBclIrqTriggerFieldNumber: {
+        ParseBclIrq(ts, fld_bytes);
+        break;
+      }
       default:
         break;
     }
@@ -1874,6 +1888,59 @@
   }
 }
 
+void FtraceParser::ParseBclIrq(int64_t ts, protozero::ConstBytes data) {
+  protos::pbzero::BclIrqTriggerFtraceEvent::Decoder bcl(data.data, data.size);
+  int throttle = bcl.throttle();
+  // id
+  TrackId track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_id_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.id() : -1,
+                                       track);
+  // throttle
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_throttle_);
+  context_->event_tracker->PushCounter(ts, throttle, track);
+  // cpu0_limit
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_cpu0_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.cpu0_limit() : 0,
+                                       track);
+  // cpu1_limit
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_cpu1_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.cpu1_limit() : 0,
+                                       track);
+  // cpu2_limit
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_cpu2_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.cpu2_limit() : 0,
+                                       track);
+  // tpu_limit
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_tpu_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.tpu_limit(): 0,
+                                       track);
+  // gpu_limit
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_gpu_);
+  context_->event_tracker->PushCounter(ts,
+                                       throttle ? bcl.gpu_limit() : 0,
+                                       track);
+  // voltage
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_voltage_);
+  context_->event_tracker->PushCounter(ts, bcl.voltage(), track);
+  // capacity
+  track = context_->track_tracker->InternGlobalCounterTrack(
+      TrackTracker::Group::kBatteryMitigation, bcl_irq_capacity_);
+  context_->event_tracker->PushCounter(ts, bcl.capacity(), track);
+}
+
 void FtraceParser::ParseDmaHeapStat(int64_t timestamp,
                                     uint32_t pid,
                                     protozero::ConstBytes data) {
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.h b/src/trace_processor/importers/ftrace/ftrace_parser.h
index 2520572..97aa089 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.h
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.h
@@ -106,6 +106,7 @@
                                 protozero::ConstBytes,
                                 bool grow);
   void ParseIonStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
+  void ParseBclIrq(int64_t timestamp, protozero::ConstBytes);
   void ParseDmaHeapStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
   void ParseSignalGenerate(int64_t timestamp, protozero::ConstBytes);
   void ParseSignalDeliver(int64_t timestamp,
@@ -336,6 +337,15 @@
   const StringId dma_buffer_id_;
   const StringId ion_total_unknown_id_;
   const StringId ion_change_unknown_id_;
+  const StringId bcl_irq_id_;
+  const StringId bcl_irq_throttle_;
+  const StringId bcl_irq_cpu0_;
+  const StringId bcl_irq_cpu1_;
+  const StringId bcl_irq_cpu2_;
+  const StringId bcl_irq_tpu_;
+  const StringId bcl_irq_gpu_;
+  const StringId bcl_irq_voltage_;
+  const StringId bcl_irq_capacity_;
   const StringId signal_generate_id_;
   const StringId signal_deliver_id_;
   const StringId oom_score_adj_id_;
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index 2c5231d..7a5d793 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -157,6 +157,40 @@
        kUnsetFtraceId,
        436,
        kUnsetSize},
+      {"bcl_irq_trigger",
+       "bcl_exynos",
+       {
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "id", 1, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "throttle", 2, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "cpu0_limit", 3, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "cpu1_limit", 4, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "cpu2_limit", 5, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "tpu_limit", 6, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "gpu_limit", 7, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "voltage", 8, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "capacity", 9, ProtoSchemaType::kInt32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+       },
+       kUnsetFtraceId,
+       533,
+       kUnsetSize},
       {"binder_transaction",
        "binder",
        {
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/bcl_exynos/bcl_irq_trigger/format b/src/traced/probes/ftrace/test/data/synthetic/events/bcl_exynos/bcl_irq_trigger/format
new file mode 100644
index 0000000..4df557b
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/bcl_exynos/bcl_irq_trigger/format
@@ -0,0 +1,19 @@
+name: bcl_irq_trigger
+ID: 1127
+format:
+	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
+	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
+	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
+	field:int common_pid;	offset:4;	size:4;	signed:1;
+
+	field:int id;	offset:8;	size:4;	signed:1;
+	field:int throttle;	offset:12;	size:4;	signed:1;
+	field:int cpu0_limit;	offset:16;	size:4;	signed:1;
+	field:int cpu1_limit;	offset:20;	size:4;	signed:1;
+	field:int cpu2_limit;	offset:24;	size:4;	signed:1;
+	field:int tpu_limit;	offset:28;	size:4;	signed:1;
+	field:int gpu_limit;	offset:32;	size:4;	signed:1;
+	field:int voltage;	offset:36;	size:4;	signed:1;
+	field:int capacity;	offset:40;	size:4;	signed:1;
+
+print fmt: "bcl irq %d trig %d: cpu0=%d, cpu1=%d, cpu2=%d, tpu=%d, gpu=%d, volt=%d cap=%d", REC->id, REC->throttle, REC->cpu0_limit, REC->cpu1_limit, REC->cpu2_limit, REC->tpu_limit, REC->gpu_limit, REC->voltage, REC->capacity
\ No newline at end of file