tp: Integrate out-of-tree Wattson SoC models into stdlib

Route dynamically imported Wattson SoC models from storage tables into
Wattson SQL stdlib pipeline.

Assigns highest priority to custom device models in _wattson_device_map,
and merges custom topology and empirical power curves with in-tree tables
using UNION ALL. All downstream power estimations and UI continuous
tracks function seamlessly for both in-tree and out-of-tree devices.
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_1d.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_1d.sql
index c60556f..9813b87 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_1d.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_1d.sql
@@ -18,4 +18,14 @@
 -- rows come from the wattson plugin (see
 -- src/trace_processor/plugins/wattson/).
 CREATE PERFETTO TABLE _device_curves_1d AS
+SELECT
+  (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+  policy,
+  freq_khz,
+  static_mw AS static,
+  active_mw AS active,
+  idle0_mw AS idle0,
+  idle1_mw AS idle1
+FROM __intrinsic_wattson_custom_curves_cpu_1d
+UNION ALL
 SELECT * FROM __intrinsic_wattson_curves_cpu_1d();
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_2d.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_2d.sql
index 1295ac8..c91fb96 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_2d.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/cpu_2d.sql
@@ -18,4 +18,17 @@
 -- come from the wattson plugin (see
 -- src/trace_processor/plugins/wattson/).
 CREATE PERFETTO TABLE _device_curves_2d AS
+SELECT
+  (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+  policy,
+  freq_khz,
+  dep_policy,
+  dep_freq,
+  static_mw AS static,
+  active_mw AS active,
+  idle0_mw AS idle0,
+  idle1_mw AS idle1,
+  interconnect_mw AS interconnect
+FROM __intrinsic_wattson_custom_curves_cpu_2d
+UNION ALL
 SELECT * FROM __intrinsic_wattson_curves_cpu_2d();
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/gpu.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/gpu.sql
index 1bd28f3..0e3bef3 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/gpu.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/gpu.sql
@@ -16,4 +16,12 @@
 -- Device specific GPU curves. The rows come from the wattson plugin
 -- (see src/trace_processor/plugins/wattson/).
 CREATE PERFETTO TABLE _gpu_device_curves AS
+SELECT
+  (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+  freq_khz,
+  active_mw AS active,
+  idle1_mw AS idle1,
+  idle2_mw AS idle2
+FROM __intrinsic_wattson_custom_curves_gpu
+UNION ALL
 SELECT * FROM __intrinsic_wattson_curves_gpu();
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/l3.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/l3.sql
index e518c02..a870bbf 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/l3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/l3.sql
@@ -16,4 +16,13 @@
 -- Device specific L3 curves. The rows come from the wattson plugin
 -- (see src/trace_processor/plugins/wattson/).
 CREATE PERFETTO TABLE _device_curves_l3 AS
+SELECT
+  (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+  freq_khz,
+  dep_policy,
+  dep_freq,
+  l3_hit_mw AS l3_hit,
+  l3_miss_mw AS l3_miss
+FROM __intrinsic_wattson_custom_curves_l3
+UNION ALL
 SELECT * FROM __intrinsic_wattson_curves_l3();
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tpu.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tpu.sql
index a279b8a..2517fe7 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tpu.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/curves/tpu.sql
@@ -16,4 +16,12 @@
 -- Device specific TPU curves. The rows come from the wattson plugin
 -- (see src/trace_processor/plugins/wattson/).
 CREATE PERFETTO TABLE _tpu_device_curves AS
+SELECT
+  (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+  cluster,
+  requests,
+  freq,
+  active_mw AS active
+FROM __intrinsic_wattson_custom_curves_tpu
+UNION ALL
 SELECT * FROM __intrinsic_wattson_curves_tpu();
diff --git a/src/trace_processor/perfetto_sql/stdlib/wattson/device_infos.sql b/src/trace_processor/perfetto_sql/stdlib/wattson/device_infos.sql
index b1af6ab..a8e16f4 100644
--- a/src/trace_processor/perfetto_sql/stdlib/wattson/device_infos.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/wattson/device_infos.sql
@@ -20,6 +20,13 @@
 -- Device specific info for deep idle time offsets
 CREATE PERFETTO TABLE _device_cpu_deep_idle_offsets AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+      cpu,
+      offset_ns
+    FROM __intrinsic_wattson_custom_deep_idle_offset
+  ),
   data(device, cpu, offset_ns) AS (
     SELECT *
     FROM (
@@ -112,6 +119,8 @@
         ), ("SM8750", 7, 0)
     ) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;
 
 CREATE PERFETTO TABLE _linux_soc_compatible_map AS
@@ -196,6 +205,8 @@
   soc_model AS (
     SELECT
       coalesce(
+        -- Get custom dynamic model if present
+        (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1),
         -- Get guest model from metadata, which takes precedence if set
         (
           SELECT coalesce(map.wattson_device, m.str_value)
@@ -255,6 +266,13 @@
 -- Device specific mapping from CPU to policy
 CREATE PERFETTO TABLE _cpu_to_policy_map AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+      cpu,
+      policy
+    FROM __intrinsic_wattson_custom_cpu_policy
+  ),
   data(device, cpu, policy) AS (
     SELECT *
     FROM (
@@ -342,6 +360,8 @@
         ), ("SM8750", 5, 0), ("SM8750", 6, 6), ("SM8750", 7, 6)
     ) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;
 
 -- Prefilter table based on device
@@ -388,10 +408,19 @@
 -- Devices that require using devfreq
 CREATE PERFETTO TABLE _use_devfreq AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device
+    FROM __intrinsic_wattson_custom_device_info
+    WHERE
+      use_devfreq = 1
+  ),
   data(device) AS (
     SELECT *
     FROM (VALUES ("Tensor G4"), ("Tensor G5"), ("Tensor G6")) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;
 
 -- Creates non-empty table if device needs devfreq
@@ -410,6 +439,13 @@
 -- Devices that require idle state mapping
 CREATE PERFETTO TABLE _idle_state_map AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+      nominal_idle,
+      override_idle
+    FROM __intrinsic_wattson_custom_idle_state_map
+  ),
   data(device, nominal_idle, override_idle) AS (
     SELECT *
     FROM (
@@ -447,6 +483,8 @@
         ), ("SXR2230P", 2, 1)
     ) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;
 
 -- idle_mapping override filtered for device
@@ -466,6 +504,12 @@
 -- frequency (as opposed to the default, vote by power)
 CREATE PERFETTO TABLE _vote_by_freq AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+      cpu
+    FROM __intrinsic_wattson_custom_vote_by_freq
+  ),
   data(device, cpu) AS (
     SELECT *
     FROM (
@@ -477,6 +521,8 @@
         ), ("Tensor G6", 4), ("Tensor G6", 5), ("Tensor G6", 6)
     ) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;
 
 -- Gets all CPUs on device and whether the CPU vote is be freq or power
@@ -497,8 +543,18 @@
 -- Device specific mapping to GPU ID
 CREATE PERFETTO TABLE _gpuid_map AS
 WITH
+  custom_data AS (
+    SELECT
+      (SELECT device_name FROM __intrinsic_wattson_custom_device_info LIMIT 1) AS device,
+      gpu_id
+    FROM __intrinsic_wattson_custom_device_info
+    WHERE
+      gpu_id IS NOT NULL
+  ),
   data(device, gpu_id) AS (
     SELECT *
     FROM (VALUES ("Tensor G5", 0), ("Tensor G6", 0), ("Tensor", 1)) AS _values
   )
+SELECT * FROM custom_data
+UNION ALL
 SELECT * FROM data;