[PATCH i-g-t 10/10] tools/vmtb: Platform enabling: PTL and BMG support

Adam Miszczak
2026-02-24T08:25:40Z

Add PCI Device IDs and example vGPU profiles for
Panther Lake (PTL) and Battlemage (BMG).
Remove unused ATS-M references.

Signed-off-by: Adam Miszczak <adam.miszczak@linux.intel.com>
---
tools/vmtb/bench/configurators/pci.py | 43 +++++---
.../{Flex170.json => Bmg_g21_12.json} | 58 +++++------
.../resources/vgpu_profiles/Ptl.json | 97 +++++++++++++++++++
3 files changed, 154 insertions(+), 44 deletions(-)
rename tools/vmtb/vmm_flows/resources/vgpu_profiles/{Flex170.json => Bmg_g21_12.json} (73%)
create mode 100644 tools/vmtb/vmm_flows/resources/vgpu_profiles/Ptl.json

diff --git a/tools/vmtb/bench/configurators/pci.py b/tools/vmtb/bench/configurators/pci.py
index 8e8afb138..0b524d3c2 100644
--- a/tools/vmtb/bench/configurators/pci.py
+++ b/tools/vmtb/bench/configurators/pci.py
@@ -1,13 +1,13 @@
# SPDX-License-Identifier: MIT
-# Copyright © 2024 Intel Corporation
+# Copyright © 2024-2026 Intel Corporation

import enum
import typing

class GpuModel(str, enum.Enum):
- ATSM150 = 'Arctic Sound M150 (ATS-M1)'
- ATSM75 = 'Arctic Sound M75 (ATS-M3)'
+ PTL = 'Panther Lake (PTL)'
+ BMG = 'Battlemage (BMG)'
Unknown = 'Unknown'

def __str__(self) -> str:
@@ -21,28 +21,41 @@ def get_gpu_model(pci_id: str) -> GpuModel:

def get_vgpu_profiles_file(gpu_model: GpuModel) -> str:
"""Return vGPU profile definition JSON file for a given GPU model."""
- if gpu_model == GpuModel.ATSM150:
- vgpu_device_file = 'Flex170.json'
- elif gpu_model == GpuModel.ATSM75:
- vgpu_device_file = 'Flex140.json'
+ if gpu_model == GpuModel.PTL:
+ vgpu_device_file = 'Ptl.json'
+ elif gpu_model == GpuModel.BMG:
+ vgpu_device_file = 'Bmg_g21_12.json'
else: # GpuModel.Unknown
vgpu_device_file = 'N/A'

return vgpu_device_file

-# PCI Device IDs: ATS-M150 (M1)
-_atsm150_pci_ids = {
- '56C0': GpuModel.ATSM150,
- '56C2': GpuModel.ATSM150
+# PCI Device IDs: PTL
+_ptl_pci_ids = {
+ 'B080': GpuModel.PTL,
+ 'B081': GpuModel.PTL,
+ 'B082': GpuModel.PTL,
+ 'B083': GpuModel.PTL,
+ 'B084': GpuModel.PTL,
+ 'B085': GpuModel.PTL,
+ 'B086': GpuModel.PTL,
+ 'B087': GpuModel.PTL,
+ 'B08F': GpuModel.PTL,
+ 'B090': GpuModel.PTL,
+ 'B0A0': GpuModel.PTL,
+ 'B0B0': GpuModel.PTL,
+ 'FD80': GpuModel.PTL,
+ 'FD81': GpuModel.PTL
}

-# PCI Device IDs: ATS-M75 (M3)
-_atsm75_pci_ids = {
- '56C1': GpuModel.ATSM75
+# PCI Device IDs: BMG (G21 - VRAM: 12GB / other)
+_bmg_pci_ids = {
+ 'E20B': GpuModel.BMG # B36 / 12GB
}

# All PCI Device IDs to GPU Device Names mapping
-pci_ids: typing.Dict[str, GpuModel] = {**_atsm150_pci_ids, **_atsm75_pci_ids}
+pci_ids: typing.Dict[str, GpuModel] = {**_ptl_pci_ids,
+ **_bmg_pci_ids}
diff --git a/tools/vmtb/vmm_flows/resources/vgpu_profiles/Flex170.json b/tools/vmtb/vmm_flows/resources/vgpu_profiles/Bmg_g21_12.json
similarity index 73%
rename from tools/vmtb/vmm_flows/resources/vgpu_profiles/Flex170.json
rename to tools/vmtb/vmm_flows/resources/vgpu_profiles/Bmg_g21_12.json
index ff1fa7e20..75ca907ab 100644
--- a/tools/vmtb/vmm_flows/resources/vgpu_profiles/Flex170.json
+++ b/tools/vmtb/vmm_flows/resources/vgpu_profiles/Bmg_g21_12.json
@@ -1,58 +1,58 @@
{
- "version": "1.1",
+ "version": "1.2",
"PFResources": {
"Default": "MinimumPFResources",
"Profile": {
"MinimumPFResources": {
- "LocalMemoryEccOn": 402653184,
- "LocalMemoryEccOff": 402653184,
- "Contexts": 1024,
+ "LocalMemoryEccOn": 134217728,
+ "LocalMemoryEccOff": 134217728,
+ "Contexts": 256,
"Doorbells": 16,
- "GGTTSize": 268435456
+ "GGTTSize": 67108864
}
}
},
"vGPUResources": {
"Default": null,
"Profile": {
- "Flex170_16": {
+ "Bmg_12": {
"VFCount": 1,
- "LocalMemoryEccOff": 16777216000,
- "LocalMemoryEccOn": 2147483648,
+ "LocalMemoryEccOff": 12717129728,
+ "LocalMemoryEccOn": 12717129728,
"Contexts": 1024,
"Doorbells": 240,
"GGTTSize": 4026531840
},
- "Flex170_8": {
+ "Bmg_6": {
"VFCount": 2,
- "LocalMemoryEccOff": 8388608000,
- "LocalMemoryEccOn": 2147483648,
+ "LocalMemoryEccOff": 6341787648,
+ "LocalMemoryEccOn": 6341787648,
"Contexts": 1024,
"Doorbells": 120,
"GGTTSize": 2013265920
},
- "Flex170_4": {
- "VFCount": 4,
- "LocalMemoryEccOff": 4194304000,
- "LocalMemoryEccOn": 2147483648,
+ "Bmg_4": {
+ "VFCount": 3,
+ "LocalMemoryEccOff": 4211081216,
+ "LocalMemoryEccOn": 4211081216,
"Contexts": 1024,
- "Doorbells": 60,
- "GGTTSize": 1006632960
+ "Doorbells": 80,
+ "GGTTSize": 1342177280
},
- "Flex170_2": {
- "VFCount": 8,
- "LocalMemoryEccOff": 2097152000,
- "LocalMemoryEccOn": 1073741824,
+ "Bmg_2": {
+ "VFCount": 6,
+ "LocalMemoryEccOff": 2080374784,
+ "LocalMemoryEccOn": 2080374784,
"Contexts": 1024,
- "Doorbells": 30,
- "GGTTSize": 503316480
+ "Doorbells": 40,
+ "GGTTSize": 671088640
},
- "Flex170_1": {
- "VFCount": 16,
- "LocalMemoryEccOff": 1048576000,
- "LocalMemoryEccOn": 536870912,
+ "Bmg_1": {
+ "VFCount": 12,
+ "LocalMemoryEccOff": 1023410176,
+ "LocalMemoryEccOn": 1023410176,
"Contexts": 1024,
- "Doorbells": 15,
+ "Doorbells": 20,
"GGTTSize": 251658240
}
}
@@ -110,4 +110,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/tools/vmtb/vmm_flows/resources/vgpu_profiles/Ptl.json b/tools/vmtb/vmm_flows/resources/vgpu_profiles/Ptl.json
new file mode 100644
index 000000000..efc61bce1
--- /dev/null
+++ b/tools/vmtb/vmm_flows/resources/vgpu_profiles/Ptl.json
@@ -0,0 +1,97 @@
+{
+ "version": "0.1",
+ "PFResources": {
+ "Default": "MinimumPFResources",
+ "Profile": {
+ "MinimumPFResources": {
+ "LocalMemoryEccOn": 0,
+ "LocalMemoryEccOff": 0,
+ "Contexts": 256,
+ "Doorbells": 16,
+ "GGTTSize": 67108864
+ }
+ }
+ },
+ "vGPUResources": {
+ "Default": null,
+ "Profile": {
+ "Ptl_1": {
+ "VFCount": 1,
+ "LocalMemoryEccOff": 0,
+ "LocalMemoryEccOn": 0,
+ "Contexts": 1024,
+ "Doorbells": 240,
+ "GGTTSize": 4026531840
+ },
+ "Ptl_2": {
+ "VFCount": 2,
+ "LocalMemoryEccOff": 0,
+ "LocalMemoryEccOn": 0,
+ "Contexts": 1024,
+ "Doorbells": 120,
+ "GGTTSize": 2013265920
+ },
+ "Ptl_4": {
+ "VFCount": 4,
+ "LocalMemoryEccOff": 0,
+ "LocalMemoryEccOn": 0,
+ "Contexts": 1024,
+ "Doorbells": 60,
+ "GGTTSize": 1006632960
+ }
+ }
+ },
+ "vGPUScheduler": {
+ "Default": "Flexible_30fps_GPUTimeSlicing",
+ "Profile": {
+ "Flexible_30fps_GPUTimeSlicing": {
+ "GPUTimeSlicing": {
+ "ScheduleIfIdle": false,
+ "PFExecutionQuantum": 20,
+ "PFPreemptionTimeout": 20000,
+ "VFAttributes": {
+ "VFExecutionQuantum": "lambda VFCount : max( 32 // VFCount, 1)",
+ "VFPreemptionTimeout": "lambda VFCount : 128000 if (VFCount == 1) else max( 64000 // VFCount, 16000)"
+ }
+ }
+ },
+ "Fixed_30fps_GPUTimeSlicing": {
+ "GPUTimeSlicing": {
+ "ScheduleIfIdle": true,
+ "PFExecutionQuantum": 20,
+ "PFPreemptionTimeout": 20000,
+ "VFAttributes": {
+ "VFExecutionQuantum": "lambda VFCount : max( 32 // VFCount, 1)",
+ "VFPreemptionTimeout": "lambda VFCount : 128000 if (VFCount == 1) else max( 64000 // VFCount, 16000)"
+ }
+ }
+ },
+ "Flexible_BurstableQoS_GPUTimeSlicing": {
+ "GPUTimeSlicing": {
+ "ScheduleIfIdle": false,
+ "PFExecutionQuantum": 20,
+ "PFPreemptionTimeout": 20000,
+ "VFAttributes": {
+ "VFExecutionQuantum": "lambda VFCount : min((2000 // max(VFCount-1,1)*0.5, 50))",
+ "VFPreemptionTimeout": "lambda VFCount : (2000 // max(VFCount-1,1) - min((2000 // max(VFCount-1,1))*0.5, 50))*1000"
+ }
+ }
+ }
+ }
+ },
+ "vGPUSecurity": {
+ "Default": "Disabled",
+ "Profile": {
+ "Disabled": {
+ "ResetAfterVfSwitch": false,
+ "GuCSamplingPeriod": 0,
+ "GuCThresholdCATError": 0,
+ "GuCThresholdPageFault": 0,
+ "GuCThresholdH2GStorm": 0,
+ "GuCThresholdDbStorm": 0,
+ "GuCThresholdGTIrqStorm": 0,
+ "GuCThresholdEngineReset": 0
+ }
+ }
+ }
+}
\ No newline at end of file
--
2.39.1