From 5615f76b3de847791e4a51020ba1da2de17cd57c Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 03:39:17 +0800 Subject: [PATCH 01/12] testdata: add MI355X node fixtures for hardware-free regression tests Captured from nodepool-gpu-7b3016af2911 (kernel 6.8.0-136): KFD topology, amdgpu_xcp devices, per-GPU partition state, and amd-smi static, partition, memory-partition and per-GPU partition JSON. SPI captures document the zero-registration behavior on this kernel (XCP render minors absent from KFD topology). Signed-off-by: Reza Jelveh --- testdata/amdsmi-mi355x.json | 10 + testdata/amdsmi-partition-g0-mi355x.json | 326 +++ testdata/amdsmi-partition-g1-mi355x.json | 326 +++ testdata/amdsmi-partition-g2-mi355x.json | 326 +++ testdata/amdsmi-partition-g3-mi355x.json | 326 +++ testdata/amdsmi-partition-g4-mi355x.json | 326 +++ testdata/amdsmi-partition-g5-mi355x.json | 326 +++ testdata/amdsmi-partition-g6-mi355x.json | 326 +++ testdata/amdsmi-partition-g7-mi355x.json | 326 +++ testdata/amdsmi-partition-m-mi355x.json | 44 + testdata/amdsmi-partition-mi355x.json | 2538 +++++++++++++++++ testdata/amdsmi-static-mi355x.json | 2400 ++++++++++++++++ testdata/sysfs-mi355x-spx/README.md | 32 + .../class/kfd/kfd/topology/nodes/0/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/1/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/10/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/11/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/12/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/13/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/14/properties | Bin 0 -> 4096 bytes .../kfd/kfd/topology/nodes/15/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/2/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/3/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/4/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/5/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/6/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/7/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/8/properties | Bin 0 -> 4096 bytes .../class/kfd/kfd/topology/nodes/9/properties | Bin 0 -> 4096 bytes .../devices/platform/amdgpu_xcp_0/drm/card2 | 0 .../platform/amdgpu_xcp_0/drm/renderD129 | 0 .../devices/platform/amdgpu_xcp_0/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_0/uevent | 1 + .../devices/platform/amdgpu_xcp_1/drm/card3 | 0 .../platform/amdgpu_xcp_1/drm/renderD130 | 0 .../devices/platform/amdgpu_xcp_1/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_1/uevent | 1 + .../devices/platform/amdgpu_xcp_10/drm/card13 | 0 .../platform/amdgpu_xcp_10/drm/renderD140 | 0 .../devices/platform/amdgpu_xcp_10/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_10/uevent | 1 + .../devices/platform/amdgpu_xcp_11/drm/card14 | 0 .../platform/amdgpu_xcp_11/drm/renderD141 | 0 .../devices/platform/amdgpu_xcp_11/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_11/uevent | 1 + .../devices/platform/amdgpu_xcp_12/drm/card15 | 0 .../platform/amdgpu_xcp_12/drm/renderD142 | 0 .../devices/platform/amdgpu_xcp_12/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_12/uevent | 1 + .../devices/platform/amdgpu_xcp_13/drm/card16 | 0 .../platform/amdgpu_xcp_13/drm/renderD143 | 0 .../devices/platform/amdgpu_xcp_13/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_13/uevent | 1 + .../devices/platform/amdgpu_xcp_14/drm/card18 | 0 .../platform/amdgpu_xcp_14/drm/renderD145 | 0 .../devices/platform/amdgpu_xcp_14/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_14/uevent | 1 + .../devices/platform/amdgpu_xcp_15/drm/card19 | 0 .../platform/amdgpu_xcp_15/drm/renderD146 | 0 .../devices/platform/amdgpu_xcp_15/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_15/uevent | 1 + .../devices/platform/amdgpu_xcp_16/drm/card20 | 0 .../platform/amdgpu_xcp_16/drm/renderD147 | 0 .../devices/platform/amdgpu_xcp_16/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_16/uevent | 1 + .../devices/platform/amdgpu_xcp_17/drm/card21 | 0 .../platform/amdgpu_xcp_17/drm/renderD148 | 0 .../devices/platform/amdgpu_xcp_17/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_17/uevent | 1 + .../devices/platform/amdgpu_xcp_18/drm/card22 | 0 .../platform/amdgpu_xcp_18/drm/renderD149 | 0 .../devices/platform/amdgpu_xcp_18/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_18/uevent | 1 + .../devices/platform/amdgpu_xcp_19/drm/card23 | 0 .../platform/amdgpu_xcp_19/drm/renderD150 | 0 .../devices/platform/amdgpu_xcp_19/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_19/uevent | 1 + .../devices/platform/amdgpu_xcp_2/drm/card4 | 0 .../platform/amdgpu_xcp_2/drm/renderD131 | 0 .../devices/platform/amdgpu_xcp_2/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_2/uevent | 1 + .../devices/platform/amdgpu_xcp_20/drm/card24 | 0 .../platform/amdgpu_xcp_20/drm/renderD151 | 0 .../devices/platform/amdgpu_xcp_20/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_20/uevent | 1 + .../devices/platform/amdgpu_xcp_21/drm/card26 | 0 .../platform/amdgpu_xcp_21/drm/renderD153 | 0 .../devices/platform/amdgpu_xcp_21/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_21/uevent | 1 + .../devices/platform/amdgpu_xcp_22/drm/card27 | 0 .../platform/amdgpu_xcp_22/drm/renderD154 | 0 .../devices/platform/amdgpu_xcp_22/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_22/uevent | 1 + .../devices/platform/amdgpu_xcp_23/drm/card28 | 0 .../platform/amdgpu_xcp_23/drm/renderD155 | 0 .../devices/platform/amdgpu_xcp_23/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_23/uevent | 1 + .../devices/platform/amdgpu_xcp_24/drm/card29 | 0 .../platform/amdgpu_xcp_24/drm/renderD156 | 0 .../devices/platform/amdgpu_xcp_24/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_24/uevent | 1 + .../devices/platform/amdgpu_xcp_25/drm/card30 | 0 .../platform/amdgpu_xcp_25/drm/renderD157 | 0 .../devices/platform/amdgpu_xcp_25/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_25/uevent | 1 + .../devices/platform/amdgpu_xcp_26/drm/card31 | 0 .../platform/amdgpu_xcp_26/drm/renderD158 | 0 .../devices/platform/amdgpu_xcp_26/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_26/uevent | 1 + .../devices/platform/amdgpu_xcp_27/drm/card32 | 0 .../platform/amdgpu_xcp_27/drm/renderD159 | 0 .../devices/platform/amdgpu_xcp_27/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_27/uevent | 1 + .../devices/platform/amdgpu_xcp_28/drm/card34 | 0 .../platform/amdgpu_xcp_28/drm/renderD161 | 0 .../devices/platform/amdgpu_xcp_28/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_28/uevent | 1 + .../devices/platform/amdgpu_xcp_29/drm/card35 | 0 .../platform/amdgpu_xcp_29/drm/renderD162 | 0 .../devices/platform/amdgpu_xcp_29/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_29/uevent | 1 + .../devices/platform/amdgpu_xcp_3/drm/card5 | 0 .../platform/amdgpu_xcp_3/drm/renderD132 | 0 .../devices/platform/amdgpu_xcp_3/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_3/uevent | 1 + .../devices/platform/amdgpu_xcp_30/drm/card36 | 0 .../platform/amdgpu_xcp_30/drm/renderD163 | 0 .../devices/platform/amdgpu_xcp_30/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_30/uevent | 1 + .../devices/platform/amdgpu_xcp_31/drm/card37 | 0 .../platform/amdgpu_xcp_31/drm/renderD164 | 0 .../devices/platform/amdgpu_xcp_31/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_31/uevent | 1 + .../devices/platform/amdgpu_xcp_32/drm/card38 | 0 .../platform/amdgpu_xcp_32/drm/renderD165 | 0 .../devices/platform/amdgpu_xcp_32/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_32/uevent | 1 + .../devices/platform/amdgpu_xcp_33/drm/card39 | 0 .../platform/amdgpu_xcp_33/drm/renderD166 | 0 .../devices/platform/amdgpu_xcp_33/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_33/uevent | 1 + .../devices/platform/amdgpu_xcp_34/drm/card40 | 0 .../platform/amdgpu_xcp_34/drm/renderD167 | 0 .../devices/platform/amdgpu_xcp_34/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_34/uevent | 1 + .../devices/platform/amdgpu_xcp_35/drm/card42 | 0 .../platform/amdgpu_xcp_35/drm/renderD169 | 0 .../devices/platform/amdgpu_xcp_35/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_35/uevent | 1 + .../devices/platform/amdgpu_xcp_36/drm/card43 | 0 .../platform/amdgpu_xcp_36/drm/renderD170 | 0 .../devices/platform/amdgpu_xcp_36/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_36/uevent | 1 + .../devices/platform/amdgpu_xcp_37/drm/card44 | 0 .../platform/amdgpu_xcp_37/drm/renderD171 | 0 .../devices/platform/amdgpu_xcp_37/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_37/uevent | 1 + .../devices/platform/amdgpu_xcp_38/drm/card45 | 0 .../platform/amdgpu_xcp_38/drm/renderD172 | 0 .../devices/platform/amdgpu_xcp_38/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_38/uevent | 1 + .../devices/platform/amdgpu_xcp_39/drm/card46 | 0 .../platform/amdgpu_xcp_39/drm/renderD173 | 0 .../devices/platform/amdgpu_xcp_39/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_39/uevent | 1 + .../devices/platform/amdgpu_xcp_4/drm/card6 | 0 .../platform/amdgpu_xcp_4/drm/renderD133 | 0 .../devices/platform/amdgpu_xcp_4/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_4/uevent | 1 + .../devices/platform/amdgpu_xcp_40/drm/card47 | 0 .../platform/amdgpu_xcp_40/drm/renderD174 | 0 .../devices/platform/amdgpu_xcp_40/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_40/uevent | 1 + .../devices/platform/amdgpu_xcp_41/drm/card48 | 0 .../platform/amdgpu_xcp_41/drm/renderD175 | 0 .../devices/platform/amdgpu_xcp_41/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_41/uevent | 1 + .../devices/platform/amdgpu_xcp_42/drm/card50 | 0 .../platform/amdgpu_xcp_42/drm/renderD177 | 0 .../devices/platform/amdgpu_xcp_42/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_42/uevent | 1 + .../devices/platform/amdgpu_xcp_43/drm/card51 | 0 .../platform/amdgpu_xcp_43/drm/renderD178 | 0 .../devices/platform/amdgpu_xcp_43/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_43/uevent | 1 + .../devices/platform/amdgpu_xcp_44/drm/card52 | 0 .../platform/amdgpu_xcp_44/drm/renderD179 | 0 .../devices/platform/amdgpu_xcp_44/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_44/uevent | 1 + .../devices/platform/amdgpu_xcp_45/drm/card53 | 0 .../platform/amdgpu_xcp_45/drm/renderD180 | 0 .../devices/platform/amdgpu_xcp_45/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_45/uevent | 1 + .../devices/platform/amdgpu_xcp_46/drm/card54 | 0 .../platform/amdgpu_xcp_46/drm/renderD181 | 0 .../devices/platform/amdgpu_xcp_46/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_46/uevent | 1 + .../devices/platform/amdgpu_xcp_47/drm/card55 | 0 .../platform/amdgpu_xcp_47/drm/renderD182 | 0 .../devices/platform/amdgpu_xcp_47/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_47/uevent | 1 + .../devices/platform/amdgpu_xcp_48/drm/card56 | 0 .../platform/amdgpu_xcp_48/drm/renderD183 | 0 .../devices/platform/amdgpu_xcp_48/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_48/uevent | 1 + .../devices/platform/amdgpu_xcp_49/drm/card58 | 0 .../platform/amdgpu_xcp_49/drm/renderD185 | 0 .../devices/platform/amdgpu_xcp_49/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_49/uevent | 1 + .../devices/platform/amdgpu_xcp_5/drm/card7 | 0 .../platform/amdgpu_xcp_5/drm/renderD134 | 0 .../devices/platform/amdgpu_xcp_5/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_5/uevent | 1 + .../devices/platform/amdgpu_xcp_50/drm/card59 | 0 .../platform/amdgpu_xcp_50/drm/renderD186 | 0 .../devices/platform/amdgpu_xcp_50/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_50/uevent | 1 + .../devices/platform/amdgpu_xcp_51/drm/card60 | 0 .../platform/amdgpu_xcp_51/drm/renderD187 | 0 .../devices/platform/amdgpu_xcp_51/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_51/uevent | 1 + .../devices/platform/amdgpu_xcp_52/drm/card61 | 0 .../platform/amdgpu_xcp_52/drm/renderD188 | 0 .../devices/platform/amdgpu_xcp_52/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_52/uevent | 1 + .../devices/platform/amdgpu_xcp_53/drm/card62 | 0 .../platform/amdgpu_xcp_53/drm/renderD189 | 0 .../devices/platform/amdgpu_xcp_53/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_53/uevent | 1 + .../devices/platform/amdgpu_xcp_54/drm/card63 | 0 .../platform/amdgpu_xcp_54/drm/renderD190 | 0 .../devices/platform/amdgpu_xcp_54/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_54/uevent | 1 + .../platform/amdgpu_xcp_55/drm/card192 | 0 .../platform/amdgpu_xcp_55/drm/renderD191 | 0 .../devices/platform/amdgpu_xcp_55/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_55/uevent | 1 + .../devices/platform/amdgpu_xcp_6/drm/card8 | 0 .../platform/amdgpu_xcp_6/drm/renderD135 | 0 .../devices/platform/amdgpu_xcp_6/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_6/uevent | 1 + .../devices/platform/amdgpu_xcp_7/drm/card10 | 0 .../platform/amdgpu_xcp_7/drm/renderD137 | 0 .../devices/platform/amdgpu_xcp_7/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_7/uevent | 1 + .../devices/platform/amdgpu_xcp_8/drm/card11 | 0 .../platform/amdgpu_xcp_8/drm/renderD138 | 0 .../devices/platform/amdgpu_xcp_8/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_8/uevent | 1 + .../devices/platform/amdgpu_xcp_9/drm/card12 | 0 .../platform/amdgpu_xcp_9/drm/renderD139 | 0 .../devices/platform/amdgpu_xcp_9/modalias | 1 + .../sys/devices/platform/amdgpu_xcp_9/uevent | 1 + .../0000:05:00.0/available_compute_partition | 1 + .../0000:05:00.0/available_memory_partition | 1 + .../0000:05:00.0/current_compute_partition | 1 + .../0000:05:00.0/current_memory_partition | 1 + .../drivers/pci:amdgpu/0000:05:00.0/drm/card9 | 0 .../pci:amdgpu/0000:05:00.0/drm/controlD73 | 0 .../pci:amdgpu/0000:05:00.0/drm/renderD136 | 0 .../drivers/pci:amdgpu/0000:05:00.0/numa_node | 1 + .../0000:15:00.0/available_compute_partition | 1 + .../0000:15:00.0/available_memory_partition | 1 + .../0000:15:00.0/current_compute_partition | 1 + .../0000:15:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:15:00.0/drm/card25 | 0 .../pci:amdgpu/0000:15:00.0/drm/controlD89 | 0 .../pci:amdgpu/0000:15:00.0/drm/renderD152 | 0 .../drivers/pci:amdgpu/0000:15:00.0/numa_node | 1 + .../0000:65:00.0/available_compute_partition | 1 + .../0000:65:00.0/available_memory_partition | 1 + .../0000:65:00.0/current_compute_partition | 1 + .../0000:65:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:65:00.0/drm/card17 | 0 .../pci:amdgpu/0000:65:00.0/drm/controlD81 | 0 .../pci:amdgpu/0000:65:00.0/drm/renderD144 | 0 .../drivers/pci:amdgpu/0000:65:00.0/numa_node | 1 + .../0000:75:00.0/available_compute_partition | 1 + .../0000:75:00.0/available_memory_partition | 1 + .../0000:75:00.0/current_compute_partition | 1 + .../0000:75:00.0/current_memory_partition | 1 + .../drivers/pci:amdgpu/0000:75:00.0/drm/card1 | 0 .../pci:amdgpu/0000:75:00.0/drm/controlD65 | 0 .../pci:amdgpu/0000:75:00.0/drm/renderD128 | 0 .../drivers/pci:amdgpu/0000:75:00.0/numa_node | 1 + .../0000:85:00.0/available_compute_partition | 1 + .../0000:85:00.0/available_memory_partition | 1 + .../0000:85:00.0/current_compute_partition | 1 + .../0000:85:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:85:00.0/drm/card41 | 0 .../pci:amdgpu/0000:85:00.0/drm/controlD105 | 0 .../pci:amdgpu/0000:85:00.0/drm/renderD168 | 0 .../drivers/pci:amdgpu/0000:85:00.0/numa_node | 1 + .../0000:95:00.0/available_compute_partition | 1 + .../0000:95:00.0/available_memory_partition | 1 + .../0000:95:00.0/current_compute_partition | 1 + .../0000:95:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:95:00.0/drm/card57 | 0 .../pci:amdgpu/0000:95:00.0/drm/controlD121 | 0 .../pci:amdgpu/0000:95:00.0/drm/renderD184 | 0 .../drivers/pci:amdgpu/0000:95:00.0/numa_node | 1 + .../0000:e5:00.0/available_compute_partition | 1 + .../0000:e5:00.0/available_memory_partition | 1 + .../0000:e5:00.0/current_compute_partition | 1 + .../0000:e5:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:e5:00.0/drm/card49 | 0 .../pci:amdgpu/0000:e5:00.0/drm/controlD113 | 0 .../pci:amdgpu/0000:e5:00.0/drm/renderD176 | 0 .../drivers/pci:amdgpu/0000:e5:00.0/numa_node | 1 + .../0000:f5:00.0/available_compute_partition | 1 + .../0000:f5:00.0/available_memory_partition | 1 + .../0000:f5:00.0/current_compute_partition | 1 + .../0000:f5:00.0/current_memory_partition | 1 + .../pci:amdgpu/0000:f5:00.0/drm/card33 | 0 .../pci:amdgpu/0000:f5:00.0/drm/controlD97 | 0 .../pci:amdgpu/0000:f5:00.0/drm/renderD160 | 0 .../drivers/pci:amdgpu/0000:f5:00.0/numa_node | 1 + 317 files changed, 7784 insertions(+) create mode 100644 testdata/amdsmi-mi355x.json create mode 100644 testdata/amdsmi-partition-g0-mi355x.json create mode 100644 testdata/amdsmi-partition-g1-mi355x.json create mode 100644 testdata/amdsmi-partition-g2-mi355x.json create mode 100644 testdata/amdsmi-partition-g3-mi355x.json create mode 100644 testdata/amdsmi-partition-g4-mi355x.json create mode 100644 testdata/amdsmi-partition-g5-mi355x.json create mode 100644 testdata/amdsmi-partition-g6-mi355x.json create mode 100644 testdata/amdsmi-partition-g7-mi355x.json create mode 100644 testdata/amdsmi-partition-m-mi355x.json create mode 100644 testdata/amdsmi-partition-mi355x.json create mode 100644 testdata/amdsmi-static-mi355x.json create mode 100644 testdata/sysfs-mi355x-spx/README.md create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/12/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/7/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/card2 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/renderD129 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/card3 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/renderD130 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/card13 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/renderD140 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/card14 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/renderD141 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/card15 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/renderD142 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/card16 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/renderD143 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/card18 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/renderD145 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/card19 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/renderD146 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/card20 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/renderD147 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/card21 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/renderD148 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/card22 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/renderD149 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/card23 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/renderD150 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/card4 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/renderD131 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/card24 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/renderD151 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/card26 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/renderD153 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/card27 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/renderD154 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/card28 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/renderD155 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/card29 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/renderD156 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/card30 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/renderD157 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/card31 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/renderD158 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/card32 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/renderD159 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/card34 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/renderD161 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/card35 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/renderD162 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/card5 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/renderD132 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/card36 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/renderD163 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/card37 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/renderD164 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/card38 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/renderD165 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/card39 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/renderD166 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/card40 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/renderD167 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/card42 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/renderD169 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/card43 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/renderD170 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/card44 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/renderD171 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/card45 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/renderD172 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/card46 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/renderD173 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/card6 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/renderD133 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/card47 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/renderD174 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/card48 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/renderD175 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/card50 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/renderD177 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/card51 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/renderD178 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/card52 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/renderD179 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/card53 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/renderD180 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/card54 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/renderD181 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/card55 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/renderD182 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/card56 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/renderD183 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/card58 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/renderD185 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/card7 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/renderD134 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/card59 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/renderD186 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/card60 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/renderD187 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/card61 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/renderD188 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/card62 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/renderD189 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/card63 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/renderD190 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/card192 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/renderD191 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/card8 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/renderD135 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/card10 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/renderD137 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/card11 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/renderD138 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/card12 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/renderD139 create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias create mode 100644 testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/card9 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/controlD73 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/renderD136 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/card25 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/controlD89 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/renderD152 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/card17 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/controlD81 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/renderD144 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/card1 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/controlD65 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/renderD128 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/card41 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/controlD105 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/renderD168 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/card57 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/controlD121 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/renderD184 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/card49 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/controlD113 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/renderD176 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/card33 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/controlD97 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/renderD160 create mode 100644 testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node diff --git a/testdata/amdsmi-mi355x.json b/testdata/amdsmi-mi355x.json new file mode 100644 index 00000000..25b9f4db --- /dev/null +++ b/testdata/amdsmi-mi355x.json @@ -0,0 +1,10 @@ +{ + "0000:05:00.0": {"uuid": "c6ff75a3-0000-1000-802a-c130ee448403", "type": "AMD Instinct MI355X"}, + "0000:15:00.0": {"uuid": "f3ff75a3-0000-1000-802c-b37ceef6feb5", "type": "AMD Instinct MI355X"}, + "0000:65:00.0": {"uuid": "8aff75a3-0000-1000-80a2-810481bf6315", "type": "AMD Instinct MI355X"}, + "0000:75:00.0": {"uuid": "08ff75a3-0000-1000-80da-82c12ef81b5d", "type": "AMD Instinct MI355X"}, + "0000:85:00.0": {"uuid": "cfff75a3-0000-1000-8010-e0d8795d487e", "type": "AMD Instinct MI355X"}, + "0000:95:00.0": {"uuid": "13ff75a3-0000-1000-8003-b4d1d1d0c537", "type": "AMD Instinct MI355X"}, + "0000:e5:00.0": {"uuid": "64ff75a3-0000-1000-8002-daab8ae76e4e", "type": "AMD Instinct MI355X"}, + "0000:f5:00.0": {"uuid": "e8ff75a3-0000-1000-808f-a10fb8782ebc", "type": "AMD Instinct MI355X"} +} diff --git a/testdata/amdsmi-partition-g0-mi355x.json b/testdata/amdsmi-partition-g0-mi355x.json new file mode 100644 index 00000000..4ab0ba3f --- /dev/null +++ b/testdata/amdsmi-partition-g0-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 0, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 0, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g1-mi355x.json b/testdata/amdsmi-partition-g1-mi355x.json new file mode 100644 index 00000000..b27a5952 --- /dev/null +++ b/testdata/amdsmi-partition-g1-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 1, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 1, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g2-mi355x.json b/testdata/amdsmi-partition-g2-mi355x.json new file mode 100644 index 00000000..87d4cc7e --- /dev/null +++ b/testdata/amdsmi-partition-g2-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 2, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 2, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g3-mi355x.json b/testdata/amdsmi-partition-g3-mi355x.json new file mode 100644 index 00000000..7df265e5 --- /dev/null +++ b/testdata/amdsmi-partition-g3-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 3, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 3, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g4-mi355x.json b/testdata/amdsmi-partition-g4-mi355x.json new file mode 100644 index 00000000..35abc9b2 --- /dev/null +++ b/testdata/amdsmi-partition-g4-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 4, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 4, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g5-mi355x.json b/testdata/amdsmi-partition-g5-mi355x.json new file mode 100644 index 00000000..ca677a09 --- /dev/null +++ b/testdata/amdsmi-partition-g5-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 5, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 5, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g6-mi355x.json b/testdata/amdsmi-partition-g6-mi355x.json new file mode 100644 index 00000000..18131e3d --- /dev/null +++ b/testdata/amdsmi-partition-g6-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 6, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 6, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-g7-mi355x.json b/testdata/amdsmi-partition-g7-mi355x.json new file mode 100644 index 00000000..c93bbbee --- /dev/null +++ b/testdata/amdsmi-partition-g7-mi355x.json @@ -0,0 +1,326 @@ +{ + "current_partition": [ + { + "gpu_id": 7, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 7, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-partition-m-mi355x.json b/testdata/amdsmi-partition-m-mi355x.json new file mode 100644 index 00000000..16e1d1de --- /dev/null +++ b/testdata/amdsmi-partition-m-mi355x.json @@ -0,0 +1,44 @@ +{ + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ] +} diff --git a/testdata/amdsmi-partition-mi355x.json b/testdata/amdsmi-partition-mi355x.json new file mode 100644 index 00000000..b5ce2d5d --- /dev/null +++ b/testdata/amdsmi-partition-mi355x.json @@ -0,0 +1,2538 @@ +{ + "current_partition": [ + { + "gpu_id": 0, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 1, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 2, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 3, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 4, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 5, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 6, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + }, + { + "gpu_id": 7, + "memory": "NPS1", + "accelerator_type": "SPX", + "accelerator_profile_index": 0, + "partition_id": "0" + } + ], + "memory_partition": [ + { + "gpu_id": 0, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 1, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 2, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 3, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 4, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 5, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 6, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + }, + { + "gpu_id": 7, + "memory_partition_caps": "NPS1,NPS2", + "current_memory_partition": "NPS1" + } + ], + "partition_profiles": [ + { + "gpu_id": 0, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 1, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 2, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 3, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 4, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 5, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 6, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "gpu_id": 7, + "profile_index": 0, + "memory_partition_caps": "NPS1", + "accelerator_type": "SPX*", + "partition_id": "0", + "num_partitions": 1, + "num_resources": 4, + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 1, + "memory_partition_caps": "NPS1,NPS2", + "accelerator_type": "DPX", + "partition_id": "N/A", + "num_partitions": 2, + "num_resources": 4, + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 2, + "memory_partition_caps": "NPS1", + "accelerator_type": "QPX", + "partition_id": "N/A", + "num_partitions": 4, + "num_resources": 4, + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": 3, + "memory_partition_caps": "NPS1", + "accelerator_type": "CPX", + "partition_id": "N/A", + "num_partitions": 8, + "num_resources": 4, + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "gpu_id": "", + "profile_index": "", + "memory_partition_caps": "", + "accelerator_type": "", + "partition_id": "", + "num_partitions": "", + "num_resources": "", + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ], + "partition_resources": [ + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + }, + { + "resource_index": 0, + "resource_type": "XCC", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 1, + "resource_type": "DECODER", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 2, + "resource_type": "DMA", + "resource_instances": 16, + "resources_shared": 1 + }, + { + "resource_index": 3, + "resource_type": "JPEG", + "resource_instances": 40, + "resources_shared": 1 + }, + { + "resource_index": 4, + "resource_type": "XCC", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 5, + "resource_type": "DECODER", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 6, + "resource_type": "DMA", + "resource_instances": 8, + "resources_shared": 1 + }, + { + "resource_index": 7, + "resource_type": "JPEG", + "resource_instances": 20, + "resources_shared": 1 + }, + { + "resource_index": 8, + "resource_type": "XCC", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 9, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 10, + "resource_type": "DMA", + "resource_instances": 4, + "resources_shared": 1 + }, + { + "resource_index": 11, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 1 + }, + { + "resource_index": 12, + "resource_type": "XCC", + "resource_instances": 1, + "resources_shared": 1 + }, + { + "resource_index": 13, + "resource_type": "DECODER", + "resource_instances": 1, + "resources_shared": 2 + }, + { + "resource_index": 14, + "resource_type": "DMA", + "resource_instances": 2, + "resources_shared": 1 + }, + { + "resource_index": 15, + "resource_type": "JPEG", + "resource_instances": 10, + "resources_shared": 2 + } + ] +} diff --git a/testdata/amdsmi-static-mi355x.json b/testdata/amdsmi-static-mi355x.json new file mode 100644 index 00000000..efae3a97 --- /dev/null +++ b/testdata/amdsmi-static-mi355x.json @@ -0,0 +1,2400 @@ +{ + "gpu_data": [ + { + "gpu": 0, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xC62AC130EE448403", + "oam_id": 6, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:05:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011231", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 1, + "affinity": 1, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "16-31" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "144-159" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "102 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 1, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xF32CB37CEEF6FEB5", + "oam_id": 7, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:15:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000244", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 2, + "affinity": 2, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "32-47" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "160-175" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "101 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 2, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x8AA2810481BF6315", + "oam_id": 5, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:65:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524014648", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 3, + "affinity": 3, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "48-63" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "176-191" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "95 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 3, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x08DA82C12EF81B5D", + "oam_id": 4, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:75:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525001464", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 0, + "affinity": 0, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "0-15" + }, + "cpu_list_1": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_2": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "128-143" + }, + "cpu_list_3": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + } + }, + "socket_affinity": { + "socket_0": 0 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "94 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 4, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xCF10E0D8795D487E", + "oam_id": 2, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:85:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011384", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 5, + "affinity": 5, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "80-95" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "00000000FFFF0000", + "cpu_cores_affinity": "208-223" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "115 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 5, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x1303B4D1D1D0C537", + "oam_id": 3, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:95:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000354", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 6, + "affinity": 6, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "96-111" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "0000FFFF00000000", + "cpu_cores_affinity": "224-239" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "96 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 6, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0x6402DAAB8AE76E4E", + "oam_id": 1, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:e5:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36220-0C", + "product_serial": "692524011434", + "fru_id": "113-AMDG362200C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 7, + "affinity": 7, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "112-127" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "FFFF000000000000", + "cpu_cores_affinity": "240-255" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "105 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "41 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + }, + { + "gpu": 7, + "asic": { + "market_name": "AMD Instinct MI355X", + "vendor_id": "0x1002", + "vendor_name": "Advanced Micro Devices Inc. [AMD/ATI]", + "subvendor_id": "0x1002", + "device_id": "0x75a3", + "subsystem_id": "0x75a3", + "rev_id": "0x00", + "asic_serial": "0xE88FA10FB8782EBC", + "oam_id": 0, + "num_compute_units": 256, + "target_graphics_version": "gfx950" + }, + "bus": { + "bdf": "0000:f5:00.0", + "max_pcie_width": 16, + "max_pcie_speed": { + "value": 32, + "unit": "GT/s" + }, + "pcie_interface_version": "Gen 5", + "slot_type": "OAM" + }, + "vbios": { + "name": "AMD MI355X", + "build_date": "2025/10/23 15:17", + "part_number": "113-M355-01-1K1-010C", + "version": "023.040.001.008.000001" + }, + "limit": { + "max_power": { + "value": 1400, + "unit": "W" + }, + "min_power": { + "value": 0, + "unit": "W" + }, + "socket_power": { + "value": 1400, + "unit": "W" + }, + "slowdown_edge_temperature": "N/A", + "slowdown_hotspot_temperature": { + "value": 100, + "unit": "C" + }, + "slowdown_vram_temperature": { + "value": 115, + "unit": "C" + }, + "shutdown_edge_temperature": "N/A", + "shutdown_hotspot_temperature": { + "value": 112, + "unit": "C" + }, + "shutdown_vram_temperature": { + "value": 125, + "unit": "C" + } + }, + "driver": { + "name": "amdgpu", + "version": "6.14.14" + }, + "board": { + "model_number": "102-G36221-0C", + "product_serial": "692525000358", + "fru_id": "113-AMDG362210C90-100-300000193", + "product_name": "AMD Instinct MI355 OAM", + "manufacturer_name": "AMD" + }, + "ras": { + "eeprom_version": "0x30000", + "bad_page_threshold": 128, + "parity_schema": "DISABLED", + "single_bit_schema": "DISABLED", + "double_bit_schema": "DISABLED", + "poison_schema": "ENABLED", + "ecc_block_state": { + "UMC": "ENABLED", + "SDMA": "ENABLED", + "GFX": "ENABLED", + "MMHUB": "ENABLED", + "ATHUB": "ENABLED", + "PCIE_BIF": "ENABLED", + "HDP": "ENABLED", + "XGMI_WAFL": "ENABLED", + "DF": "ENABLED", + "SMN": "ENABLED", + "SEM": "DISABLED", + "MP0": "ENABLED", + "MP1": "ENABLED", + "FUSE": "DISABLED", + "MCA": "ENABLED", + "VCN": "ENABLED", + "JPEG": "ENABLED", + "IH": "ENABLED", + "MPIO": "ENABLED" + } + }, + "soc_pstate": "N/A", + "xgmi_plpd": "N/A", + "process_isolation": "Disabled", + "numa": { + "node": 4, + "affinity": 4, + "cpu_affinity": { + "cpu_list_0": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_1": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "64-79" + }, + "cpu_list_2": { + "bitmask": "0000000000000000", + "cpu_cores_affinity": "N/A" + }, + "cpu_list_3": { + "bitmask": "000000000000FFFF", + "cpu_cores_affinity": "192-207" + } + }, + "socket_affinity": { + "socket_0": 0, + "socket_1": 1 + } + }, + "vram": { + "type": "UNKNOWN", + "vendor": "UNKNOWN", + "size": { + "value": 294896, + "unit": "MB" + }, + "bit_width": 8192, + "max_bandwidth": { + "value": 8192, + "unit": "GB/s" + } + }, + "cache_info": [ + { + "cache": 0, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 32, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 256 + }, + { + "cache": 1, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 2, + "cache_properties": [ + "INST_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 64, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 3, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 2, + "num_cache_instance": 112 + }, + { + "cache": 4, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 16, + "unit": "KB" + }, + "cache_level": 1, + "max_num_cu_shared": 1, + "num_cache_instance": 32 + }, + { + "cache": 5, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 4096, + "unit": "KB" + }, + "cache_level": 2, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + }, + { + "cache": 6, + "cache_properties": [ + "DATA_CACHE", + "SIMD_CACHE" + ], + "cache_size": { + "value": 262144, + "unit": "KB" + }, + "cache_level": 3, + "max_num_cu_shared": 256, + "num_cache_instance": 1 + } + ], + "clock": { + "sys": { + "current level": 0, + "frequency_levels": { + "Level 0": "95 MHz", + "Level 1": "500 MHz", + "Level 2": "2400 MHz" + } + }, + "mem": { + "current level": 0, + "frequency_levels": { + "Level 0": "2000 MHz" + } + }, + "df": { + "current level": 0, + "frequency_levels": { + "Level 0": "1250 MHz" + } + }, + "soc": { + "current level": 0, + "frequency_levels": { + "Level 0": "42 MHz", + "Level 1": "1200 MHz" + } + }, + "dcef": "N/A", + "vclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "vclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "59 MHz" + } + }, + "dclk0": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + }, + "dclk1": { + "current level": 0, + "frequency_levels": { + "Level 0": "48 MHz" + } + } + } + } + ] +} diff --git a/testdata/sysfs-mi355x-spx/README.md b/testdata/sysfs-mi355x-spx/README.md new file mode 100644 index 00000000..9bfacc75 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/README.md @@ -0,0 +1,32 @@ +Captured from nodepool-gpu-7b3016af2911 (144.202.57.22), kernel 6.8.0-136-generic, +8x AMD Instinct MI355X (gfx950, device_id 0x75a3) in SPX/NPS1, kubelet +device-plugin daemonset on 2026-08-19. + +Mirrors the /sys layout the plugin reads: + +- sys/class/kfd/kfd/topology/nodes/*/properties: KFD topology, trimmed to the + nodes/*/properties files the discovery code parses (drm_render_minor, + location_id, unique_id). +- sys/module/amdgpu/drivers/pci:amdgpu//: one dir per whole GPU with the + compute/memory partition state and the drm entry names (card, controlD, + renderD placeholders). +- sys/devices/platform/amdgpu_xcp_*/: 56 XCD devices (7 per GPU), each with + uevent, modalias and its drm card/renderD names. On this kernel the XCP + render minors are absent from KFD topology, so discovery skips them. + +Sibling fixtures with the same node's data: + +- amdsmi-mi355x.json: AMD SMI UUIDs and market names for the 8 BDFs (UUIDs + from the node register annotation, market names from amd-smi static). +- amdsmi-static-mi355x.json: raw `amd-smi static --json` output (asic serial, + vram, clocks, RAS, xgmi links). +- amdsmi-partition-mi355x.json: raw `amd-smi partition --json` output + (current memory/compute partition per GPU, partition profiles and resources). +- amdsmi-partition-m-mi355x.json: raw `amd-smi partition -m --json` output + (per-GPU memory partition capabilities and current setting). +- amdsmi-partition-g0..g7-mi355x.json: raw `amd-smi partition -g --json` + output, one file per GPU. Identical except gpu_id: 4 profiles (SPX, DPX, + QPX, CPX) with per-profile partition counts, XCC instances and other + resource instances. amd-smi GPU IDs follow the sorted BDF order (ID 0 = + 0000:05:00.0 ... ID 7 = 0000:f5:00.0), same order the plugin sorts topology + keys. diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/0/properties new file mode 100644 index 0000000000000000000000000000000000000000..c40e455d221e98c19d4610c863f3a4621558dd7d GIT binary patch literal 4096 zcmeH@O>V>>428Sq6gfgVS+uvY7{d^h04YD2Oiy1!(u`X51eLRh;MvCSeYh0B5Otz| z@wpo=B3Y-7TQ8h;aFu@guD=SDIG*jjumNWKtiOxpviwlq1RguUDtasFuHSb&uTE}o zmn%KH=m^yS^~@^K@l%8KFkMM7zXe|$n0um99fn&BKDQB4WQ_80#%P(Ew6DAs@? literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/1/properties new file mode 100644 index 0000000000000000000000000000000000000000..5c60c58218a02581571a650b19907537c9012482 GIT binary patch literal 4096 zcmeH^TXKUi3`P6xRb&Y?`Dk~eabyQP;79!+q^qxNh&%0c1s(Ch;Cm%Y_kf`Q`lu7V zi_53WStMiCaT-^u zTD3@D-=cVw znMw}FTWM;!iWVZZ&?sx1k0ecog0!9*E-5Qv-?gUf(l%Q2m;O<7IUx3gwFv|47F|;F r>?Ytc1ERN~Wcn+YVGu9;FaajO1egF5U;<2l2`~XBzyz4Uza;Pl@4vp- literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/10/properties new file mode 100644 index 0000000000000000000000000000000000000000..46e7c0e815b0598061dbd1a28cde426ad00b39bc GIT binary patch literal 4096 zcmeH_TehPh5Jmf&Q7{B~s4yB90b*DYuu+oS9(@;@$Gts;CLgYNs){;ii&=^?DZ3S( zC2qJws}J`1LORM(a6z4PyuLaJGTL0;13e#*Pipp`4uKZB{7^<@o_mzHaN6o#i(apk z@R5sAkO2k#PVnwM3^!0NB| bYXlmBMxYUB1R8-xpb=;U8i7XOza;P%5Xk}+ literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/11/properties new file mode 100644 index 0000000000000000000000000000000000000000..a01e00dd9e69d0942362e85def52bb45ec1e95a9 GIT binary patch literal 4096 zcmeH_TehPh5Jmf&Q7{B~s4yB90b*DYuu+oS9(@;@$Gts;#t)Yqs;G0en58I_vRmO@ z;)Xl4`e2_6(ov3r3+klf^;JQT(dP1Q==p$rQnUY52(-}UhcY7boTI#j(^mHy^jcEF zM=nOuQxx<=-SrJ7EH0~R2MaXY6+Zts<)gZuFc~^D{ggTsOHk8&#REsRU!8M`+ul_r zowNRW24nPyxogK97bhPbhIHjUSMB>)9>vv-DHw==!F5g>I5Jsp=2B%iaymcMrt{=B zb#r<3DPr06U59Qi+LR$W=A9JCx|=tU#A4PF(xW*Uy+L(VdNvNorl5TUL^cPNp&2Fz zA5+Ez_*^_>gHkyNP6%V8kdjEjdd_zQs|{KmaaK$}(qjt#t&?xHzl$qR+D{5%?=p)z zws5@$5c=3vX1=PkNnt6QgDnVH6U?gKl=_dr`1$@uz&Ko(MW6iaw=YbEkc^HLaD7w? z*sVL2Ni8`om~hF_p5ogvgrX8X_^Hv!*i+h%V=pD^1!aN>xm$i11DE9=ujb{IG4T4U cJ&iyk&~>{fV} zxM6};AMEpo5++b^L7jBGzA7j(+FafZo#>HIYWANBi59l}PzGe4bCkER+v;9}UcZcr zLC8T$iGqHpyS~AM#bs6PV2NhC!sj2Sd{oyHraeK^Pl=#df|~9t?ggs->YP*D_O2@F zob}f;7-vV!T|4HuIQi%>q$}^aYG23WQC!`af`JGaT<5fbBa`)JE>(str}IN?I!|s> zHBfLpZx5%FU+JIIfMjWAC&=j z>rQ1-OHK=>Viagk@ogK*P>CM=)abMyx&d-aHt?SCfp9qCdj1b%;I{nZ)x5lN4qkt? brx9ob8i7Wj5oiP&fkvPaXapL8|B=97D?b7& literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/13/properties new file mode 100644 index 0000000000000000000000000000000000000000..f4c7095d840db5970cb2f86f6601d52af012e0d1 GIT binary patch literal 4096 zcmeH_U6QLH5QXnEt6&L$sIVG}ATd+~yeLU#RzHoJpIO7;gQbUV`kW8UoRx{mF7VD_ z#RM(R562HBj3aNoI_YqIR#0TLxx5-$-XRy&s+&!V zivdg05`u0v3^74;%!w3eus3HQ$$%R|X^W<4^a|CR!U>0p=(P*LXh>cq=!VhWg_t0? zKo0_ii4GNvbUo`uD;h?-zHRsOe;5O|rCgy8ujc8sX~65h`cwjy YKqXKKR05SiB~S@e0+m1|@D~aE0G($7ApigX literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/14/properties new file mode 100644 index 0000000000000000000000000000000000000000..898a3fe712178d533588fff2fd6501ad0bdc336c GIT binary patch literal 4096 zcmeH_U6!LD5QXQNRj>p=R9Fp%05O~hI4DVaRzHR2r+c~>{fV} zxM6};AMA5M3F9cZpiVkoUlkM?Z7%PIo)5?;HTzG6Knq)bC?hh@Im%l&ZFR3fuO*{= zdGMN(99c)O26*z)|g2=bYlUcU4K} ztiPVYI(Ed|wPTKplaCHVy7Hc@_I)gm;_Ai}3`D@-I;RaBnXET+sWKcnogZq`d2*Y& zxxD%mu_Qeq=;oqL8KPrOq(Ii)yn!SZcZAX&&B^Eus;knA0hrqqw2#2Z=Abfk!|32+ z%9xG=x_Af&wQ>-g(ykkYlvIkY=X__d+Mv~uXT|IzJ*ME_I{jArySVbi{lp;lF0-g( z3)g!9sgGS{=BqlJ6qd3%*n)&L!mR35sXqyfpYLx59fupU=#!uQ_Jx@cvST9yULTbK zck51NQcF$?rd)Egr}%aZWvE0CeroiQk)a>hC^!I?g!KL4_+boOmVd08m({KVtH0XQ a2s8qXKqJryGy;u4BhUym0*%0bN#HL6Dgo^P literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/15/properties new file mode 100644 index 0000000000000000000000000000000000000000..618f4eec95694d4d3ec115a2cce75569bd3ff78b GIT binary patch literal 4096 zcmeH_YqFyt5QXPAt6&L$sIVG}05Mbq9F!z?RzHpAaqnzlNL5mL=%&y4(q<{jr0iDs zEpfvHtv=Z23nh%B;DS2oczsn+WVE@w8+tw6#^}6`Js%+Jm)BH;kMPi2EASx zu%ma5{o-RX^-Y)^aj!xx0;>ZUYxIXPuq^*rH7~1O2UdTz bPb1I>Gy;u4BhUym0*yc;& literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/2/properties new file mode 100644 index 0000000000000000000000000000000000000000..959b6ab07e508fdae5a57e90b5c60309a243ebab GIT binary patch literal 4096 zcmeH@Z*IdN48`}EQ{)I)J88X*MU9)H2FUo6raS!%Ni%KQ2`1-51n=3{?}t+X43QH5 zi_hKhpptcFyYs$^1SmH zy}(`1{O&{%>IPk}Mw9sXNnkzP&MXYS1z#Kt_rz9hhD!`Sw-#1(jQX+XXrY?4jvzl+ zPh5s&9|_H8trgcru<)(!md22I8H_sPb(M$90$Im_GRzc{4W4Uf@+L$M%4b8fMP9x| z38*udY))|6)^ZaaL~h|x&iW8px>^p>dTO|2oQ8GRnsS$x!P&p`k3waGxF@VlIKgW1 uBQ?)z0**I83~nl!y5q6$)r)*WKnMr{As_^VfDjM@LO=)z0U_`&348%umA>Bq literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/3/properties new file mode 100644 index 0000000000000000000000000000000000000000..56653faf43c30d14c0e4f9961bf73c16d16c2ffd GIT binary patch literal 4096 zcmeH@Z*IdN48`}EQ{)I~D{Z@tMU9)H2FUo6raS!%Ni%KQ2`1-51n=3{?}t+X43QH5 zi_hKZsFHPNyYIPk}Mw9sXNnkzP&MXYS1z#Kt_rz9hhD!`Sw-#1(jQX+XXrY?4jvzl+ zPh5s&9|_H8trgcru<)(!md22I8H_sPb(M$90$Im_GRzc{4W4Uf@+L$M%4b8fMP9x| z38*udY))|6)^ZaaL~h|x&iW8px>^p>dTO|2oQ8GRnsS$x!P&p`k3waGxF@VlIKgW1 uBQ?)z0**I83~nl!y3?ue)r)*WKnMr{As_^VfDjM@LO=)z0U_`&348$#;J(@b literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/4/properties new file mode 100644 index 0000000000000000000000000000000000000000..840b6fca995c09cb0456958b3acf16ad510894c9 GIT binary patch literal 4096 zcmeH@O>)B^428Sq6h4BJESlSBh)^6R23&p|r>C#Ljyvu21RZ(df%hb&_u*6kL!`w2 z;&XR8s$`wnZoP8k;G+Hg?Vr_joPH?p3bz?x4ZoGBI~>pJl$XGB z^a2k(^TQKGs4H~68cpKkCxP{Fzpya;7JP9qJQ7>A8Llz-+*(-CG3w_Yq@`-oI)eOQ zJ#iV9eIzuWwN_jg!NRw?TN*>=WiaZDw^bgl3uGM!$}m$*Hh8X`$(s;4DW46^7J2y= zC7{k+vN^$NTgy#!5V?g%IqO4Y>1H`d>#5Q1M=S8wtO0U;m+gn$qb0zyCt2mv7=1cbnUB=7~I@xKlL literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/5/properties new file mode 100644 index 0000000000000000000000000000000000000000..cbe29a136fd8c8ee83f051f3c34367e79e2e33a5 GIT binary patch literal 4096 zcmeH@Z*IdN48`}EQ{)I~D{Z@tMU9)H2FUo6raS!%Ni%KQ2`1-51n=3{?}t+X43QH5 zi_hKZsFHPNyYxs*->?5K1thM602o}E8-O?B`FN0BMysq+aSs?2;P==XevcYrhOx}dZN%?GOw#du3 zC;@fmlFbQD+gfg-gUBsB%2^*GOIOQ5T2Bp^jMK30T2t=QGC2E}{!yrG5ch<&2`5-B uex&AEO~CO6h`~)IQ+GP`y?T*P2nYcoAOwVf5D)@FKnMr{As__)BY`hu(Z31+ literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/6/properties new file mode 100644 index 0000000000000000000000000000000000000000..1db7703eacc78b52c36ea1df3ce1f90ca3bc1575 GIT binary patch literal 4096 zcmeH@Z*IdN48`}EQ{)I~E3LbYMU9)H2FUo6W;^{1Ni%KQ2`1-51n=3{?}t+X43QH5 zi_hKZsFHPNyY005iESGyQMK?UIwGicw6P+x}65 zQ3C4BC7TnRwzb?u2a#KNl(RlWmTs1Vw4NF+8K+_0wWi#qWpMT{{k>4xAnplk6Hc&N u{7B8Sntxs*->?5K1thM602o}E8-O?B`FN0BMysh$ZT_Ec?P==XevcYrhOx}dZN%?GOw#du3 zC;@fmlFbQD+gfg-gUBsB%2^*GOE=3wT2Bp^jMK30T2t=QGC2E}{$8kT5ch<&2`5-B uex&AEO~COEh`~)IQ+GP`y?T*P2nYcoAOwVf5D)@FKnMr{As__)BY`i2;lB(3 literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/8/properties new file mode 100644 index 0000000000000000000000000000000000000000..eaa8f58512c5c090a52c7903ee609760527c6183 GIT binary patch literal 4096 zcmeH_TehPh5Jmf&Q7{BvDvX9jfEZR3Y?LIoN8g3!ac@td$%iW*s;G0eWtXCD%6^4s zi5n(p4YPZ`P{IV7{j5(WUSAaySz|BnhEDV-Bt3;sg+vQmekcR7&pA3cxNY^XL9bUv z#USJ`2pDJ{`fhG8Vewg4J6NL0t?>7c*CFcb3DcgS@ux&kEVCZ(EA9oV{ra3!-1e?2 znViknGZ<$_%w0R?_&A2>F{CT+xq3gx>L{*mY{7@YbxIpJve|6*Qf0VuJU{ei^5{2x z^LY&^VnsSa(9K7eGDOFMD2bfE1q(?W=7iD?P05-Ks;k13>KJlqHX#BdmuH=!8%EC| zri>|*=n^0t)T&+zN;w~-QdCLa0ldm!b+ge&o)xo?^cd&x*6Fv}-^G_F?k5JhciBZB zN4V|*e3s)>+v%#$HqA@fJRCv78e!6PRq96q zxI2F;qh4}aFcnImJ;k?cC_^O%@KdArd{BK)dM;r9x`7XTH~g>`cI6+Z_T`jwaQdtL b8i7Wj5oiP&fkvPaXapL8MxYV+KMDK=8D#;- literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties b/testdata/sysfs-mi355x-spx/sys/class/kfd/kfd/topology/nodes/9/properties new file mode 100644 index 0000000000000000000000000000000000000000..70f046f9dcb53d4296f7fd6c2e687a21b7544f55 GIT binary patch literal 4096 zcmeH_TehPh5Jmf&Q7{Bv3XFzDkQi13Y}6#TN8g3!ac@td@xvvDD(ajqZr+T`#V_#Q z(uxUMLL8n8N|->=M{~02`l_JFS$BCibfQNgn<;!M6q?!mLy^cm=a?|SX^VdidMz0h zQYa}ELD4?U-QHlr?2D;(utL+Yz~>)tLNeDAraeL9Pl=$kMKj(P+zV9u&AH^X?p;-~ zrP!}$FwTycyLQa+X$;9@NVmP`ntdPZqqw?p8wMg^aGCN7j$E;;yHpvD9M2E4+A{jp z+JFr39%zshG@+ZXTj_vJ;oT`I{jArd-L0q_LG9zyWDJ! zEnKewgg$nSo37^Ua-6r-!xjXr2_{o-O8rM*{Cs~S-~ukpY)@ed>lbE9Y0e}ATpyJI z_Q9XF(aa^!mp5ogvl%XvJ@Uv4AOlrZURzh&vbJ-EOTYfkPm*pR??&Xzp@cOGg bjX)#N2s8qXKqJryGy;u4BhU!^mjwO-@<;*d literal 0 HcmV?d00001 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/card2 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/card2 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/renderD129 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/drm/renderD129 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias new file mode 100644 index 00000000..7f8019c3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_0 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent new file mode 100644 index 00000000..e569a6ff --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_0/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_0 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/card3 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/card3 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/renderD130 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/drm/renderD130 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias new file mode 100644 index 00000000..2b514268 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_1 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent new file mode 100644 index 00000000..f06a40e9 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_1/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_1 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/card13 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/card13 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/renderD140 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/drm/renderD140 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias new file mode 100644 index 00000000..e93b1e4e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_10 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent new file mode 100644 index 00000000..ba344bc9 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_10/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_10 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/card14 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/card14 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/renderD141 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/drm/renderD141 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias new file mode 100644 index 00000000..0cb77f07 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_11 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent new file mode 100644 index 00000000..4bc6ad7e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_11/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_11 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/card15 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/card15 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/renderD142 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/drm/renderD142 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias new file mode 100644 index 00000000..fd2f0e13 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_12 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent new file mode 100644 index 00000000..8508841a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_12/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_12 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/card16 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/card16 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/renderD143 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/drm/renderD143 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias new file mode 100644 index 00000000..31808b11 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_13 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent new file mode 100644 index 00000000..14decb5f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_13/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_13 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/card18 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/card18 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/renderD145 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/drm/renderD145 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias new file mode 100644 index 00000000..191a269e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_14 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent new file mode 100644 index 00000000..197b0ad7 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_14/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_14 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/card19 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/card19 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/renderD146 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/drm/renderD146 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias new file mode 100644 index 00000000..04f9f8c1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_15 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent new file mode 100644 index 00000000..3e899b1a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_15/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_15 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/card20 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/card20 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/renderD147 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/drm/renderD147 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias new file mode 100644 index 00000000..f3683aac --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_16 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent new file mode 100644 index 00000000..13f01b7d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_16/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_16 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/card21 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/card21 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/renderD148 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/drm/renderD148 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias new file mode 100644 index 00000000..e0223436 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_17 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent new file mode 100644 index 00000000..2f66a86f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_17/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_17 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/card22 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/card22 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/renderD149 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/drm/renderD149 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias new file mode 100644 index 00000000..a1418969 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_18 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent new file mode 100644 index 00000000..3365d032 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_18/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_18 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/card23 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/card23 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/renderD150 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/drm/renderD150 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias new file mode 100644 index 00000000..32762592 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_19 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent new file mode 100644 index 00000000..d496da5a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_19/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_19 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/card4 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/card4 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/renderD131 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/drm/renderD131 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias new file mode 100644 index 00000000..90124db4 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_2 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent new file mode 100644 index 00000000..7fd17f88 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_2/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_2 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/card24 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/card24 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/renderD151 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/drm/renderD151 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias new file mode 100644 index 00000000..e2221537 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_20 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent new file mode 100644 index 00000000..4c29a858 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_20/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_20 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/card26 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/card26 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/renderD153 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/drm/renderD153 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias new file mode 100644 index 00000000..a454716f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_21 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent new file mode 100644 index 00000000..b2f689ea --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_21/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_21 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/card27 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/card27 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/renderD154 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/drm/renderD154 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias new file mode 100644 index 00000000..ca885797 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_22 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent new file mode 100644 index 00000000..7fb0cfe8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_22/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_22 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/card28 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/card28 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/renderD155 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/drm/renderD155 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias new file mode 100644 index 00000000..7375599e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_23 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent new file mode 100644 index 00000000..03fd5dd8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_23/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_23 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/card29 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/card29 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/renderD156 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/drm/renderD156 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias new file mode 100644 index 00000000..8f77723f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_24 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent new file mode 100644 index 00000000..63c1d498 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_24/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_24 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/card30 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/card30 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/renderD157 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/drm/renderD157 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias new file mode 100644 index 00000000..5d5ae6fe --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_25 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent new file mode 100644 index 00000000..e6c8f8ff --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_25/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_25 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/card31 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/card31 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/renderD158 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/drm/renderD158 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias new file mode 100644 index 00000000..799f53ce --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_26 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent new file mode 100644 index 00000000..45afd1a7 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_26/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_26 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/card32 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/card32 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/renderD159 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/drm/renderD159 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias new file mode 100644 index 00000000..b2919d0b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_27 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent new file mode 100644 index 00000000..a4b42c68 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_27/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_27 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/card34 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/card34 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/renderD161 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/drm/renderD161 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias new file mode 100644 index 00000000..a2d8201d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_28 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent new file mode 100644 index 00000000..8ea851a0 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_28/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_28 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/card35 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/card35 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/renderD162 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/drm/renderD162 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias new file mode 100644 index 00000000..be5f57ae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_29 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent new file mode 100644 index 00000000..91494426 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_29/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_29 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/card5 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/card5 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/renderD132 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/drm/renderD132 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias new file mode 100644 index 00000000..dca702df --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_3 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent new file mode 100644 index 00000000..91b40a0a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_3/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_3 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/card36 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/card36 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/renderD163 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/drm/renderD163 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias new file mode 100644 index 00000000..e75282af --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_30 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent new file mode 100644 index 00000000..d212323b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_30/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_30 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/card37 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/card37 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/renderD164 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/drm/renderD164 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias new file mode 100644 index 00000000..917f649c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_31 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent new file mode 100644 index 00000000..605d2272 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_31/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_31 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/card38 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/card38 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/renderD165 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/drm/renderD165 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias new file mode 100644 index 00000000..2635db15 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_32 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent new file mode 100644 index 00000000..425474a2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_32/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_32 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/card39 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/card39 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/renderD166 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/drm/renderD166 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias new file mode 100644 index 00000000..e62bd731 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_33 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent new file mode 100644 index 00000000..994aeede --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_33/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_33 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/card40 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/card40 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/renderD167 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/drm/renderD167 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias new file mode 100644 index 00000000..c7fd3e31 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_34 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent new file mode 100644 index 00000000..9190fb47 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_34/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_34 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/card42 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/card42 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/renderD169 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/drm/renderD169 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias new file mode 100644 index 00000000..fa48c831 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_35 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent new file mode 100644 index 00000000..639c2e7c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_35/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_35 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/card43 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/card43 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/renderD170 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/drm/renderD170 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias new file mode 100644 index 00000000..6bbba2e6 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_36 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent new file mode 100644 index 00000000..09606724 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_36/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_36 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/card44 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/card44 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/renderD171 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/drm/renderD171 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias new file mode 100644 index 00000000..1aa8bd8c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_37 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent new file mode 100644 index 00000000..e93514f1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_37/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_37 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/card45 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/card45 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/renderD172 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/drm/renderD172 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias new file mode 100644 index 00000000..bfb2ac37 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_38 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent new file mode 100644 index 00000000..a7552a4b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_38/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_38 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/card46 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/card46 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/renderD173 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/drm/renderD173 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias new file mode 100644 index 00000000..aa263bc8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_39 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent new file mode 100644 index 00000000..0e498cb5 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_39/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_39 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/card6 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/card6 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/renderD133 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/drm/renderD133 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias new file mode 100644 index 00000000..569e7edc --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_4 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent new file mode 100644 index 00000000..ed56a94a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_4/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_4 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/card47 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/card47 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/renderD174 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/drm/renderD174 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias new file mode 100644 index 00000000..2b6a7b65 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_40 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent new file mode 100644 index 00000000..c5319378 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_40/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_40 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/card48 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/card48 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/renderD175 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/drm/renderD175 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias new file mode 100644 index 00000000..55703a19 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_41 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent new file mode 100644 index 00000000..46194321 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_41/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_41 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/card50 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/card50 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/renderD177 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/drm/renderD177 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias new file mode 100644 index 00000000..732fe641 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_42 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent new file mode 100644 index 00000000..7c3c7e2d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_42/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_42 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/card51 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/card51 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/renderD178 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/drm/renderD178 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias new file mode 100644 index 00000000..295e83bf --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_43 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent new file mode 100644 index 00000000..720bf722 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_43/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_43 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/card52 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/card52 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/renderD179 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/drm/renderD179 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias new file mode 100644 index 00000000..f2138962 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_44 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent new file mode 100644 index 00000000..ec1c42db --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_44/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_44 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/card53 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/card53 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/renderD180 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/drm/renderD180 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias new file mode 100644 index 00000000..a9058e80 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_45 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent new file mode 100644 index 00000000..87c865ed --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_45/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_45 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/card54 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/card54 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/renderD181 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/drm/renderD181 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias new file mode 100644 index 00000000..4d6fe0c2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_46 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent new file mode 100644 index 00000000..76a57a94 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_46/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_46 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/card55 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/card55 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/renderD182 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/drm/renderD182 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias new file mode 100644 index 00000000..fe27fe90 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_47 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent new file mode 100644 index 00000000..f04b194e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_47/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_47 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/card56 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/card56 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/renderD183 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/drm/renderD183 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias new file mode 100644 index 00000000..7163091c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_48 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent new file mode 100644 index 00000000..3a413fb2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_48/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_48 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/card58 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/card58 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/renderD185 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/drm/renderD185 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias new file mode 100644 index 00000000..29db1033 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_49 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent new file mode 100644 index 00000000..553387e8 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_49/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_49 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/card7 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/card7 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/renderD134 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/drm/renderD134 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias new file mode 100644 index 00000000..2c505964 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_5 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent new file mode 100644 index 00000000..55bc239d --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_5/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_5 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/card59 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/card59 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/renderD186 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/drm/renderD186 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias new file mode 100644 index 00000000..551cb5f3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_50 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent new file mode 100644 index 00000000..b0083457 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_50/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_50 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/card60 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/card60 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/renderD187 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/drm/renderD187 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias new file mode 100644 index 00000000..7fe63fcd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_51 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent new file mode 100644 index 00000000..34f49073 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_51/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_51 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/card61 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/card61 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/renderD188 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/drm/renderD188 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias new file mode 100644 index 00000000..2a23629a --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_52 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent new file mode 100644 index 00000000..06a210f2 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_52/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_52 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/card62 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/card62 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/renderD189 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/drm/renderD189 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias new file mode 100644 index 00000000..1f3771d3 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_53 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent new file mode 100644 index 00000000..a1d17002 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_53/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_53 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/card63 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/card63 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/renderD190 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/drm/renderD190 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias new file mode 100644 index 00000000..46f5ff15 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_54 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent new file mode 100644 index 00000000..ccdd026f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_54/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_54 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/card192 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/card192 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/renderD191 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/drm/renderD191 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias new file mode 100644 index 00000000..e8cd2348 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_55 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent new file mode 100644 index 00000000..64207169 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_55/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_55 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/card8 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/card8 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/renderD135 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/drm/renderD135 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias new file mode 100644 index 00000000..d432ac5f --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_6 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent new file mode 100644 index 00000000..db26aa78 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_6/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_6 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/card10 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/card10 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/renderD137 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/drm/renderD137 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias new file mode 100644 index 00000000..a1aea587 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_7 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent new file mode 100644 index 00000000..96815496 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_7/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_7 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/card11 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/card11 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/renderD138 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/drm/renderD138 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias new file mode 100644 index 00000000..1b917441 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_8 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent new file mode 100644 index 00000000..683f7105 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_8/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_8 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/card12 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/card12 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/renderD139 b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/drm/renderD139 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias new file mode 100644 index 00000000..c97c489b --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/modalias @@ -0,0 +1 @@ +platform:amdgpu_xcp_9 diff --git a/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent new file mode 100644 index 00000000..469085fd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/devices/platform/amdgpu_xcp_9/uevent @@ -0,0 +1 @@ +MODALIAS=platform:amdgpu_xcp_9 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/card9 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/card9 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/controlD73 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/controlD73 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/renderD136 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/drm/renderD136 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:05:00.0/numa_node @@ -0,0 +1 @@ +1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/card25 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/card25 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/controlD89 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/controlD89 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/renderD152 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/drm/renderD152 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node new file mode 100644 index 00000000..0cfbf088 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:15:00.0/numa_node @@ -0,0 +1 @@ +2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/card17 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/card17 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/controlD81 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/controlD81 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/renderD144 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/drm/renderD144 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node new file mode 100644 index 00000000..00750edc --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:65:00.0/numa_node @@ -0,0 +1 @@ +3 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/card1 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/card1 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/controlD65 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/controlD65 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/renderD128 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/drm/renderD128 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:75:00.0/numa_node @@ -0,0 +1 @@ +0 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/card41 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/card41 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/controlD105 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/controlD105 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/renderD168 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/drm/renderD168 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node new file mode 100644 index 00000000..7ed6ff82 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:85:00.0/numa_node @@ -0,0 +1 @@ +5 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/card57 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/card57 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/controlD121 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/controlD121 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/renderD184 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/drm/renderD184 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node new file mode 100644 index 00000000..1e8b3149 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:95:00.0/numa_node @@ -0,0 +1 @@ +6 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/card49 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/card49 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/controlD113 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/controlD113 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/renderD176 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/drm/renderD176 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node new file mode 100644 index 00000000..7f8f011e --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:e5:00.0/numa_node @@ -0,0 +1 @@ +7 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition new file mode 100644 index 00000000..114e0298 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_compute_partition @@ -0,0 +1 @@ +SPX, DPX, QPX, CPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition new file mode 100644 index 00000000..f2308fb1 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/available_memory_partition @@ -0,0 +1 @@ +NPS1, NPS2 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition new file mode 100644 index 00000000..a1920f41 --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_compute_partition @@ -0,0 +1 @@ +SPX diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition new file mode 100644 index 00000000..11b78bae --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/current_memory_partition @@ -0,0 +1 @@ +NPS1 diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/card33 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/card33 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/controlD97 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/controlD97 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/renderD160 b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/drm/renderD160 new file mode 100644 index 00000000..e69de29b diff --git a/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node new file mode 100644 index 00000000..b8626c4c --- /dev/null +++ b/testdata/sysfs-mi355x-spx/sys/module/amdgpu/drivers/pci:amdgpu/0000:f5:00.0/numa_node @@ -0,0 +1 @@ +4 From 4c6e4b1922adb87e2c44fbcff4aa886bd4bdbd93 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 03:39:26 +0800 Subject: [PATCH 02/12] amdgpu: configurable sysfs root, amdsmi memory-partition and profile lookups GetAMDGPUs takes a sysfs root (defaults to /sys) so discovery can run against captured fixtures. GetAMDSCurrentMemoryPartitions and GetAMDGPUPartitionProfiles extend the cgo AMD SMI layer: the first resolves the current NPS mode per BDF, the second the accelerator partition profiles (SPX/DPX/QPX/CPX with partition geometry) from amdsmi_get_gpu_accelerator_partition_profile_config. Signed-off-by: Reza Jelveh --- internal/pkg/amdgpu/amdgpu.go | 63 +++++++++- internal/pkg/amdgpu/amdgpu_test.go | 110 ++++++++++++++++- internal/pkg/amdgpu/amdsmi.go | 192 +++++++++++++++++++++++++++++ 3 files changed, 358 insertions(+), 7 deletions(-) diff --git a/internal/pkg/amdgpu/amdgpu.go b/internal/pkg/amdgpu/amdgpu.go index e7e9028f..323c7b66 100644 --- a/internal/pkg/amdgpu/amdgpu.go +++ b/internal/pkg/amdgpu/amdgpu.go @@ -72,6 +72,7 @@ import ( "os" "path/filepath" "regexp" + "sort" "strconv" "strings" @@ -215,19 +216,24 @@ func GetDevIdsFromTopology(topoRootParam ...string) map[int]string { } // GetAMDGPUs return a map of AMD GPU on a node identified by the part of the pci address -func GetAMDGPUs() map[string]map[string]interface{} { - if _, err := os.Stat("/sys/module/amdgpu/drivers/"); err != nil { +func GetAMDGPUs(sysfsRoot ...string) map[string]map[string]interface{} { + root := "/sys" + if len(sysfsRoot) == 1 { + root = sysfsRoot[0] + } + + if _, err := os.Stat(filepath.Join(root, "module/amdgpu/drivers/")); err != nil { glog.Fatalf("amdgpu driver unavailable. exiting with exit code 2. error: %s", err) } //ex: /sys/module/amdgpu/drivers/pci:amdgpu/0000:19:00.0 - matches, _ := filepath.Glob("/sys/module/amdgpu/drivers/pci:amdgpu/[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]:*") + matches, _ := filepath.Glob(filepath.Join(root, "module/amdgpu/drivers/pci:amdgpu/[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]:*")) devID := "" devices := make(map[string]map[string]interface{}) card, renderD, nodeId := 0, 128, 0 - renderDevIds := GetDevIdsFromTopology() - renderNodeIds := GetNodeIdsFromTopology() + renderDevIds := GetDevIdsFromTopology(filepath.Join(root, "class/kfd/kfd")) + renderNodeIds := GetNodeIdsFromTopology(filepath.Join(root, "class/kfd/kfd")) for _, path := range matches { computePartitionFile := filepath.Join(path, "current_compute_partition") @@ -287,7 +293,7 @@ func GetAMDGPUs() map[string]map[string]interface{} { // certain products have additional devices (such as MI300's partitions) //ex: /sys/devices/platform/amdgpu_xcp_30 - platformMatches, _ := filepath.Glob("/sys/devices/platform/amdgpu_xcp_*") + platformMatches, _ := filepath.Glob(filepath.Join(root, "devices/platform/amdgpu_xcp_*")) for _, path := range platformMatches { glog.Info(path) @@ -594,6 +600,51 @@ func GetROCrUUIDsFromTopology(topoRootParam ...string) map[int]string { return uuids } +// GetROCrIndexesFromTopology returns the ROCr agent index of every KFD GPU +// node with unique_id 0, which ROCr addresses by index instead of GPU-. +func GetROCrIndexesFromTopology(topoRootParam ...string) map[int]int { + topoRoot := "/sys/class/kfd/kfd" + if len(topoRootParam) == 1 { + topoRoot = topoRootParam[0] + } + + type nodeInfo struct { + num int + renderD int + uniqueID uint64 + } + var nodes []nodeInfo + paths, err := filepath.Glob(topoRoot + "/topology/nodes/*/properties") + if err != nil { + glog.Errorf("glob KFD topology nodes: %v", err) + return nil + } + for _, p := range paths { + num, err := strconv.Atoi(filepath.Base(filepath.Dir(p))) + if err != nil { + continue + } + renderMinor, err := ParseTopologyProperties(p, topoDrmRenderMinorRe) + if err != nil || renderMinor <= 0 { + continue + } + uniqueID, err := parseTopologyUniqueID(p) + if err != nil { + continue + } + nodes = append(nodes, nodeInfo{num: num, renderD: int(renderMinor), uniqueID: uniqueID}) + } + sort.Slice(nodes, func(i, j int) bool { return nodes[i].num < nodes[j].num }) + + indexes := make(map[int]int) + for i, n := range nodes { + if n.uniqueID == 0 { + indexes[n.renderD] = i + } + } + return indexes +} + func parseTopologyUniqueID(path string) (uint64, error) { f, err := os.Open(path) if err != nil { diff --git a/internal/pkg/amdgpu/amdgpu_test.go b/internal/pkg/amdgpu/amdgpu_test.go index 641d3624..60033a57 100644 --- a/internal/pkg/amdgpu/amdgpu_test.go +++ b/internal/pkg/amdgpu/amdgpu_test.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "os" "path/filepath" "reflect" "regexp" @@ -54,7 +55,9 @@ func TestFirmwareVersionConsistent(t *testing.T) { parseDebugFSFirmwareInfo("/sys/kernel/debug/dri/" + card[4:] + "/amdgpu_firmware_info") featVersion, fwVersion, err := GetFirmwareVersions(card) if err != nil { - t.Errorf("Fail to get firmware version %s", err.Error()) + // Device exists but the DRM node is not usable (e.g. accel not + // working on handheld/APU kernels); nothing to compare. + t.Skipf("Skipping, DRM device %s not usable: %s", card, err.Error()) } for k := range featVersion { @@ -275,3 +278,108 @@ func TestROCrUUIDsFromTopology(t *testing.T) { t.Errorf("ROCr UUIDs = %#v, want %#v", got, want) } } + +func writeTopologyProperties(t *testing.T, root string, node int, renderMinor, uniqueID uint64) { + t.Helper() + dir := filepath.Join(root, "topology", "nodes", fmt.Sprintf("%d", node)) + if err := os.MkdirAll(dir, 0o755); err != nil { + t.Fatal(err) + } + content := fmt.Sprintf("simd_count 24\ndrm_render_minor %d\nunique_id %d\n", renderMinor, uniqueID) + if err := os.WriteFile(filepath.Join(dir, "properties"), []byte(content), 0o644); err != nil { + t.Fatal(err) + } +} + +// mi355xSysfs is the captured sysfs tree of an 8x MI355X node in SPX/NPS1 on +// kernel 6.8.0-136 (testdata/sysfs-mi355x-spx/README.md). +const mi355xSysfs = "../../../testdata/sysfs-mi355x-spx/sys" +const mi355xKFD = mi355xSysfs + "/class/kfd/kfd" + +func TestGetAMDGPUsFromFixture(t *testing.T) { + devices := GetAMDGPUs(mi355xSysfs) + + want := map[string]struct { + card, renderD, nodeId, numaNode int + devID string + }{ + "0000:75:00.0": {card: 1, renderD: 128, nodeId: 8, numaNode: 0, devID: "0000:75:00:0"}, + "0000:05:00.0": {card: 9, renderD: 136, nodeId: 9, numaNode: 1, devID: "0000:05:00:0"}, + "0000:65:00.0": {card: 17, renderD: 144, nodeId: 10, numaNode: 3, devID: "0000:65:00:0"}, + "0000:15:00.0": {card: 25, renderD: 152, nodeId: 11, numaNode: 2, devID: "0000:15:00:0"}, + "0000:f5:00.0": {card: 33, renderD: 160, nodeId: 12, numaNode: 4, devID: "0000:f5:00:0"}, + "0000:85:00.0": {card: 41, renderD: 168, nodeId: 13, numaNode: 5, devID: "0000:85:00:0"}, + "0000:e5:00.0": {card: 49, renderD: 176, nodeId: 14, numaNode: 7, devID: "0000:e5:00:0"}, + "0000:95:00.0": {card: 57, renderD: 184, nodeId: 15, numaNode: 6, devID: "0000:95:00:0"}, + } + if len(devices) != len(want) { + t.Fatalf("GetAMDGPUs returned %d devices, want %d: %v", len(devices), len(want), devices) + } + for bdf, exp := range want { + dev, ok := devices[bdf] + if !ok { + t.Errorf("missing device %s", bdf) + continue + } + if dev["card"] != exp.card || dev["renderD"] != exp.renderD || dev["nodeId"] != exp.nodeId || dev["numaNode"] != exp.numaNode { + t.Errorf("%s: got card=%v renderD=%v nodeId=%v numaNode=%v, want card=%d renderD=%d nodeId=%d numaNode=%d", + bdf, dev["card"], dev["renderD"], dev["nodeId"], dev["numaNode"], exp.card, exp.renderD, exp.nodeId, exp.numaNode) + } + if dev["devID"] != exp.devID { + t.Errorf("%s: devID=%v, want %s", bdf, dev["devID"], exp.devID) + } + if dev["computePartitionType"] != "spx" || dev["memoryPartitionType"] != "nps1" { + t.Errorf("%s: partition=%v/%v, want spx/nps1", bdf, dev["computePartitionType"], dev["memoryPartitionType"]) + } + } + for key := range devices { + if strings.HasPrefix(key, "amdgpu_xcp_") { + t.Errorf("unexpected XCP entry %s: this kernel does not publish XCP render minors in KFD topology", key) + } + } +} + +func TestGetDevIdsFromTopologyMI355X(t *testing.T) { + got := GetDevIdsFromTopology(mi355xKFD) + want := map[int]string{ + 128: "0000:75:00:0", 136: "0000:05:00:0", 144: "0000:65:00:0", 152: "0000:15:00:0", + 160: "0000:f5:00:0", 168: "0000:85:00:0", 176: "0000:e5:00:0", 184: "0000:95:00:0", + } + if !reflect.DeepEqual(got, want) { + t.Errorf("renderDevIds = %#v, want %#v", got, want) + } +} + +func TestGetROCrUUIDsFromTopologyMI355X(t *testing.T) { + got := GetROCrUUIDsFromTopology(mi355xKFD) + want := map[int]string{ + 128: "GPU-08da82c12ef81b5d", + 136: "GPU-c62ac130ee448403", + 144: "GPU-8aa2810481bf6315", + 152: "GPU-f32cb37ceef6feb5", + 160: "GPU-e88fa10fb8782ebc", + 168: "GPU-cf10e0d8795d487e", + 176: "GPU-6402daab8ae76e4e", + 184: "GPU-1303b4d1d1d0c537", + } + if !reflect.DeepEqual(got, want) { + t.Errorf("ROCr UUIDs = %#v, want %#v", got, want) + } +} + +func TestGetROCrIndexesFromTopology(t *testing.T) { + root := t.TempDir() + // node 0 is the CPU (no renderD), node 1 is an APU with unique_id 0, + // node 2 is a discrete GPU with a real unique_id. + writeTopologyProperties(t, root, 0, 0, 0) + writeTopologyProperties(t, root, 1, 128, 0) + writeTopologyProperties(t, root, 2, 129, 5) + + got := GetROCrIndexesFromTopology(root) + if idx, ok := got[128]; !ok || idx != 0 { + t.Errorf("index for renderD128 = %d, %v; want 0, true", idx, ok) + } + if _, ok := got[129]; ok { + t.Error("renderD129 has a real unique_id and must not get an index fallback") + } +} diff --git a/internal/pkg/amdgpu/amdsmi.go b/internal/pkg/amdgpu/amdsmi.go index 55f9f47d..51e86cef 100644 --- a/internal/pkg/amdgpu/amdsmi.go +++ b/internal/pkg/amdgpu/amdsmi.go @@ -58,6 +58,57 @@ static amdsmi_status_t amdsmi_product_name_for_bdf(const char *bdf_text, snprintf(market_name, AMDSMI_MAX_STRING_LENGTH, "%s", asic_info.market_name); return AMDSMI_STATUS_SUCCESS; } + +static amdsmi_status_t amdsmi_partition_profiles_for_bdf( + const char *bdf_text, amdsmi_accelerator_partition_profile_config_t *config) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_get_gpu_accelerator_partition_profile_config(processor, config); +} + +static uint32_t amdsmi_nps_cap_mask(amdsmi_nps_caps_t caps) { + return caps.nps_cap_mask; +} + +static amdsmi_status_t amdsmi_memory_partition_for_bdf(const char *bdf_text, + char *memory_partition) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_get_gpu_memory_partition(processor, memory_partition, + AMDSMI_MAX_STRING_LENGTH); +} */ import "C" @@ -150,6 +201,147 @@ func GetAMDSMIProductNames(bdfs []string) (map[string]string, error) { return namesByBDF, nil } +// GetAMDSCurrentMemoryPartitions resolves the current memory partition (NPS1, +// NPS2, ...) by PCI BDF through the AMD SMI C API, lowercased for the +// sysfs spelling used in topology device data. +func GetAMDSCurrentMemoryPartitions(bdfs []string) (map[string]string, error) { + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + partitionByBDF := make(map[string]string, len(bdfs)) + var failures []string + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" { + continue + } + cBDF := C.CString(bdf) + var partition [C.AMDSMI_MAX_STRING_LENGTH]C.char + status := C.amdsmi_memory_partition_for_bdf(cBDF, &partition[0]) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + continue + } + if value := strings.ToLower(strings.TrimSpace(C.GoString(&partition[0]))); value != "" { + partitionByBDF[bdf] = value + partitionByBDF[rawBDF] = value + } + } + if len(failures) > 0 { + return partitionByBDF, fmt.Errorf("AMD SMI memory-partition lookup failed for %s", strings.Join(failures, ", ")) + } + return partitionByBDF, nil +} + +// PartitionProfile describes one accelerator partition profile a GPU can be +// set to: the profile_index passed to amdsmi_set_gpu_accelerator_partition_profile, +// the partition type, the memory partition modes it supports and the resulting +// partition geometry. +type PartitionProfile struct { + ProfileIndex int + Type string + MemoryCaps string + NumPartitions int + XCCPerPartition int +} + +// GetAMDGPUPartitionProfiles resolves the accelerator partition profiles each +// GPU supports (SPX/DPX/QPX/CPX with partition counts), keyed by BDF. +func GetAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, error) { + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + profilesByBDF := make(map[string][]PartitionProfile, len(bdfs)) + var failures []string + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" { + continue + } + cBDF := C.CString(bdf) + var config C.amdsmi_accelerator_partition_profile_config_t + status := C.amdsmi_partition_profiles_for_bdf(cBDF, &config) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + continue + } + profiles := make([]PartitionProfile, 0, int(config.num_profiles)) + for i := 0; i < int(config.num_profiles); i++ { + profile := config.profiles[i] + profiles = append(profiles, PartitionProfile{ + ProfileIndex: int(profile.profile_index), + Type: acceleratorPartitionTypeString(profile.profile_type), + MemoryCaps: npsCapsString(C.amdsmi_nps_cap_mask(profile.memory_caps)), + NumPartitions: int(profile.num_partitions), + XCCPerPartition: xccPerPartition(config, profile.profile_index), + }) + } + profilesByBDF[bdf] = profiles + profilesByBDF[rawBDF] = profiles + } + if len(failures) > 0 { + return profilesByBDF, fmt.Errorf("AMD SMI partition-profile lookup failed for %s", strings.Join(failures, ", ")) + } + return profilesByBDF, nil +} + +func xccPerPartition(config C.amdsmi_accelerator_partition_profile_config_t, profileIndex C.uint) int { + for j := 0; j < int(config.num_resource_profiles); j++ { + res := config.resource_profiles[j] + if res.profile_index == profileIndex && res.resource_type == C.AMDSMI_ACCELERATOR_XCC { + return int(res.partition_resource) + } + } + return 0 +} + +func acceleratorPartitionTypeString(t C.amdsmi_accelerator_partition_type_t) string { + switch t { + case C.AMDSMI_ACCELERATOR_PARTITION_SPX: + return "SPX" + case C.AMDSMI_ACCELERATOR_PARTITION_DPX: + return "DPX" + case C.AMDSMI_ACCELERATOR_PARTITION_TPX: + return "TPX" + case C.AMDSMI_ACCELERATOR_PARTITION_QPX: + return "QPX" + case C.AMDSMI_ACCELERATOR_PARTITION_CPX: + return "CPX" + } + return "" +} + +func npsCapsString(mask C.uint) string { + caps := make([]string, 0, 4) + if mask&1 != 0 { + caps = append(caps, "NPS1") + } + if mask&2 != 0 { + caps = append(caps, "NPS2") + } + if mask&4 != 0 { + caps = append(caps, "NPS4") + } + if mask&8 != 0 { + caps = append(caps, "NPS8") + } + return strings.Join(caps, ",") +} + func normalizeBDF(bdf string) string { bdf = strings.ToLower(strings.TrimSpace(bdf)) // KFD topology uses domain:bus:device:function, while AMD SMI expects From f201f2ee915a894a8fdce692bed7e2be0ed85dc2 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 03:39:26 +0800 Subject: [PATCH 03/12] plugin: injectable AMD SMI seams, fixture-backed registration test WithSysfsRoot, WithAmdSMI and WithAMDSPartitionProfiles constructor options let registration run without hardware or AMD SMI; nil means the real /sys and cgo implementations. Registration overrides the sysfs memory partition with the amdsmi value and advertises available partition profiles per whole GPU in customInfo. TestRegistrationFromFixture drives the full flow against the captured MI355X tree and pins the kernel 6.8 zero-registration behavior; TestPartitionProfilesFromFixture pins the fixture profile truth. Signed-off-by: Reza Jelveh --- internal/pkg/plugin/plugin.go | 547 +++++++++++++++++++++-------- internal/pkg/plugin/plugin_test.go | 338 ++++++++++++++++++ 2 files changed, 743 insertions(+), 142 deletions(-) diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index d5a4d62f..fa78974f 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -47,23 +47,61 @@ import ( const defaultSplitCount = 10 +// ModeAnnotation selects the allocation mode per pod: absent or "rocm" is +// soft CU masking, a compute partition type ("spx"/"cpx"/...) whole partitions. +const ModeAnnotation = "hami.io/amd-mode" + +func IsPartitionMode(mode string) bool { + switch mode { + case "spx", "cpx", "dpx", "qpx": + return true + } + return false +} + +func stripPartitionModeSuffix(id string) string { + if idx := strings.LastIndex(id, "#"); idx > 0 && IsPartitionMode(id[idx+1:]) { + return id[:idx] + } + return id +} + // Plugin is identical to DevicePluginServer interface of device plugin API. type AMDGPUPlugin struct { - AMDGPUs map[string]map[string]interface{} - Heartbeat chan bool - signal chan os.Signal - disableWatchAndRegister chan bool - ackDisableWatchAndRegister chan bool - deviceCache []*utils.DeviceInfo - Resource string - devAllocator allocator.Policy - allocatorInitError bool + AMDGPUs map[string]map[string]interface{} + // sysfsRoot overrides the /sys mount root used by device discovery; tests + // point it at testdata, empty means /sys. + sysfsRoot string + // amdsmiUUIDLookup, amdsmiProductNameLookup and amdsmiMemoryPartitionLookup + // are injectable for tests; nil means the AMD SMI cgo implementation. + amdsmiUUIDLookup, amdsmiProductNameLookup, amdsmiMemoryPartitionLookup func([]string) (map[string]string, error) + // amdsmiPartitionProfileLookup is injectable for tests; nil means the AMD + // SMI cgo implementation. + amdsmiPartitionProfileLookup func([]string) (map[string][]amdgpu.PartitionProfile, error) + Heartbeat chan bool + signal chan os.Signal + disableWatchAndRegister chan bool + ackDisableWatchAndRegister chan bool + deviceCache []*utils.DeviceInfo + Resource string + devAllocator allocator.Policy + allocatorInitError bool // amdSMIUUIDToTopology maps the stable AMD SMI device UUID published in // DeviceInfo.ID back to the local topology key required during Allocate. amdSMIUUIDToTopology map[string]string // amdSMIUUIDToROCrUUID maps the scheduler-facing AMD SMI UUID to the UUID // spelling understood by ROCR_VISIBLE_DEVICES. amdSMIUUIDToROCrUUID map[string]string + // rocrUUIDToTopology maps ROCr-visible ids (GPU-, or the agent + // index on APUs without a Device Serial Number) to topology keys. + rocrUUIDToTopology map[string]string + // sortedBDFs holds the registered PCI BDFs in list order (sorted topology + // keys). Upstream HAMi invents flat "AMDGPU-" device ids over node + // capacity; device i resolves to GPU sortedBDFs[i/defaultSplitCount]. + sortedBDFs []string + // bdfToROCrUUID maps a topology key to its ROCr UUID, for resolving + // whole-GPU allocations from kubelet device ids. + bdfToROCrUUID map[string]string } type AMDGPUPluginOption func(*AMDGPUPlugin) @@ -93,6 +131,29 @@ func WithResource(res string) AMDGPUPluginOption { } } +func WithSysfsRoot(root string) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.sysfsRoot = root + } +} + +// WithAmdSMI injects the AMD SMI lookups so registration runs without AMD SMI. +func WithAmdSMI(uuidLookup, productNameLookup, memoryPartitionLookup func([]string) (map[string]string, error)) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.amdsmiUUIDLookup = uuidLookup + p.amdsmiProductNameLookup = productNameLookup + p.amdsmiMemoryPartitionLookup = memoryPartitionLookup + } +} + +// WithAMDSPartitionProfiles injects the accelerator partition profile lookup +// so registration runs without AMD SMI. +func WithAMDSPartitionProfiles(lookup func([]string) (map[string][]amdgpu.PartitionProfile, error)) AMDGPUPluginOption { + return func(p *AMDGPUPlugin) { + p.amdsmiPartitionProfileLookup = lookup + } +} + // Start is an optional interface that could be implemented by plugin. // If case Start is implemented, it will be executed by Manager after // plugin instantiation and before its registration to kubelet. This @@ -110,7 +171,7 @@ func (p *AMDGPUPlugin) Start() error { p.ackDisableWatchAndRegister = make(chan bool, 1) } signal.Notify(p.signal, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) - err := p.devAllocator.Init(getDevices(), "") + err := p.devAllocator.Init(p.getDevices(), "") if err != nil { glog.Errorf("allocator init failed. Falling back to kubelet default allocation. Error %v", err) p.allocatorInitError = true @@ -155,39 +216,101 @@ func (p *AMDGPUPlugin) RegisterInAnnotation() error { return err } +// isSchedulableTopologyKey: a partitioned GPU parent has no capacity of its +// own and never registers. +func isSchedulableTopologyKey(key string, deviceData map[string]interface{}) bool { + if !strings.HasPrefix(key, "amdgpu_xcp_") { + computePartitionType, _ := deviceData["computePartitionType"].(string) + return computePartitionType == "" + } + return true +} + +// Registers the whole-partition form of an XCP entry; the soft entry stays +// for CU-masked rocm-mode pods. +func (p *AMDGPUPlugin) registerHardEntry(key string, deviceData map[string]interface{}, info *utils.DeviceInfo) bool { + if !strings.HasPrefix(key, "amdgpu_xcp_") { + return false + } + computePartitionType, ok := deviceData["computePartitionType"].(string) + if !ok || computePartitionType == "" { + return false + } + info.ID = info.ID + "#" + computePartitionType + info.Mode = computePartitionType + info.Count = 1 + return true +} + func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { - p.AMDGPUs = amdgpu.GetAMDGPUs() + root := p.sysfsRoot + if root == "" { + root = "/sys" + } + uuidLookup, nameLookup, memoryPartitionLookup := p.amdsmiUUIDLookup, p.amdsmiProductNameLookup, p.amdsmiMemoryPartitionLookup + if uuidLookup == nil { + uuidLookup = amdgpu.GetAMDSMIUUIDs + } + if nameLookup == nil { + nameLookup = amdgpu.GetAMDSMIProductNames + } + if memoryPartitionLookup == nil { + memoryPartitionLookup = amdgpu.GetAMDSCurrentMemoryPartitions + } + partitionProfileLookup := p.amdsmiPartitionProfileLookup + if partitionProfileLookup == nil { + partitionProfileLookup = amdgpu.GetAMDGPUPartitionProfiles + } + p.AMDGPUs = amdgpu.GetAMDGPUs(root) + + keys := make([]string, 0, len(p.AMDGPUs)) + for key := range p.AMDGPUs { + keys = append(keys, key) + } + sort.Strings(keys) - // Resolve a stable per-device UUID through the AMD SMI C API. Unlike the - // node labeller, this is not an aggregated node-level value and supports - // SR-IOV virtual functions. + // Maps must exist even when empty so Allocate never dereferences nil. + p.amdSMIUUIDToTopology = make(map[string]string, len(p.AMDGPUs)) + p.amdSMIUUIDToROCrUUID = make(map[string]string, len(p.AMDGPUs)) + p.rocrUUIDToTopology = make(map[string]string, len(p.AMDGPUs)) + p.sortedBDFs = make([]string, 0, len(p.AMDGPUs)) + p.bdfToROCrUUID = make(map[string]string, len(p.AMDGPUs)) + + // Resolve a stable per-device UUID through the AMD SMI C API for whole + // GPUs. XCP partitions share the parent PCI BDF, so the BDF-keyed AMD SMI + // lookup would collide; their IDs are ROCr UUIDs (unique per KFD node). bdfs := make([]string, 0, len(p.AMDGPUs)) for _, deviceData := range p.AMDGPUs { if bdf, ok := deviceData["devID"].(string); ok { bdfs = append(bdfs, bdf) } } - amdSMIUUIDs, err := amdgpu.GetAMDSMIUUIDs(bdfs) + amdSMIUUIDs, err := uuidLookup(bdfs) if err != nil { glog.Warningf("AMD SMI UUID lookup incomplete; GPUs without an AMD SMI UUID will not be registered: %v", err) } - p.amdSMIUUIDToTopology = make(map[string]string, len(amdSMIUUIDs)) - p.amdSMIUUIDToROCrUUID = make(map[string]string, len(amdSMIUUIDs)) - rocrUUIDs := amdgpu.GetROCrUUIDsFromTopology() - amdSMIProductNames, err := amdgpu.GetAMDSMIProductNames(bdfs) + rocrUUIDs := amdgpu.GetROCrUUIDsFromTopology(filepath.Join(root, "class/kfd/kfd")) + rocrIndexes := amdgpu.GetROCrIndexesFromTopology(filepath.Join(root, "class/kfd/kfd")) + amdSMIProductNames, err := nameLookup(bdfs) if err != nil { glog.Warningf("AMD SMI product-name lookup incomplete; using amd-gpu where necessary: %v", err) } - - keys := make([]string, 0, len(p.AMDGPUs)) - for key := range p.AMDGPUs { - keys = append(keys, key) + memoryPartitions, err := memoryPartitionLookup(bdfs) + if err != nil { + glog.Warningf("AMD SMI memory-partition lookup incomplete; keeping sysfs values: %v", err) + } + partitionProfiles, err := partitionProfileLookup(bdfs) + if err != nil { + glog.Warningf("AMD SMI partition-profile lookup incomplete: %v", err) } - sort.Strings(keys) - out := make([]*utils.DeviceInfo, 0, len(keys)) + out := make([]*utils.DeviceInfo, 0, len(keys)*2) for _, key := range keys { deviceData := p.AMDGPUs[key] + if !isSchedulableTopologyKey(key, deviceData) { + glog.Infof("skip topology entry %s (no allocatable capacity)", key) + continue + } card, _ := deviceData["card"].(int) numa, _ := deviceData["numaNode"].(int) @@ -201,13 +324,6 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { glog.Errorf("skip GPU %s: missing PCI BDF in topology", key) continue } - uuid, found := amdSMIUUIDs[strings.ToLower(bdf)] - if !found || uuid == "" { - // Do not fall back to a node/BDF-derived ID. The scheduler must only - // see stable, hardware-bound AMD SMI UUIDs. - glog.Errorf("skip GPU %s: AMD SMI did not return a UUID for topology BDF %s", key, bdf) - continue - } renderD, ok := deviceData["renderD"].(int) if !ok || renderD <= 0 { glog.Errorf("skip GPU %s: missing or invalid render node in topology", key) @@ -215,23 +331,56 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { } rocrUUID, found := rocrUUIDs[renderD] if !found || rocrUUID == "" { - glog.Errorf("skip GPU %s: no ROCr UUID found for renderD%d", key, renderD) - continue + // APUs without a PCI Device Serial Number report unique_id 0 and + // ROCr addresses them by agent index instead of a GPU- UUID. + if idx, ok := rocrIndexes[renderD]; ok { + rocrUUID = strconv.Itoa(idx) + } else { + glog.Errorf("skip GPU %s: no ROCr UUID found for renderD%d", key, renderD) + continue + } + } + p.rocrUUIDToTopology[rocrUUID] = key + p.bdfToROCrUUID[key] = rocrUUID + p.sortedBDFs = append(p.sortedBDFs, key) + + // Soft entry ID: AMD SMI UUID for whole GPUs, ROCr UUID for partitions. + infoID := rocrUUID + if !strings.HasPrefix(key, "amdgpu_xcp_") { + uuid, found := amdSMIUUIDs[strings.ToLower(bdf)] + if !found || uuid == "" { + // Do not fall back to a node/BDF-derived ID. The scheduler must + // only see stable, hardware-bound AMD SMI UUIDs. + glog.Errorf("skip GPU %s: AMD SMI did not return a UUID for topology BDF %s", key, bdf) + continue + } + p.amdSMIUUIDToTopology[uuid] = key + p.amdSMIUUIDToROCrUUID[uuid] = rocrUUID + infoID = uuid + // AMD SMI reports the current memory partition for whole GPUs; + // prefer it over the sysfs read used for XCP fallback. + if partition, ok := memoryPartitions[strings.ToLower(bdf)]; ok && partition != "" { + deviceData["memoryPartitionType"] = partition + } + } + + customInfo := map[string]any{"pciBDF": strings.ToLower(bdf)} + if strings.HasPrefix(key, "amdgpu_xcp_") { + memoryPartitionType, _ := deviceData["memoryPartitionType"].(string) + computePartitionType, _ := deviceData["computePartitionType"].(string) + customInfo["partitionProfile"] = computePartitionType + "_" + memoryPartitionType + } else if profiles, ok := partitionProfiles[strings.ToLower(bdf)]; ok { + // Whole GPUs advertise the modes they can be set to; XCP entries + // advertise the mode they are currently partitioned into. + customInfo["partitionProfiles"] = profiles } - // Keep BDF in the annotation for consumers that need to locate the - // device node. Allocate uses the in-memory UUID -> topology map below. - p.amdSMIUUIDToTopology[uuid] = key - p.amdSMIUUIDToROCrUUID[uuid] = rocrUUID - // key is the standard PCI BDF spelling (domain:bus:device.function). - // The KFD topology bdf above uses a fourth colon-separated component. - customInfo := map[string]any{"pciBDF": strings.ToLower(key)} deviceType := "amd-gpu" if productName, ok := amdSMIProductNames[strings.ToLower(bdf)]; ok && productName != "" { deviceType = productName } - out = append(out, &utils.DeviceInfo{ - ID: uuid, + soft := &utils.DeviceInfo{ + ID: infoID, Index: uint(card), Count: defaultSplitCount, Devmem: capacity.VRAMMiB, @@ -242,7 +391,11 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { Health: true, DeviceVendor: "amd", CustomInfo: customInfo, - }) + } + out = append(out, soft) + if p.registerHardEntry(key, deviceData, soft) { + glog.Infof("registered hard partition device %s (mode %s) alongside soft device %s", soft.ID, soft.Mode, infoID) + } } return out @@ -304,14 +457,28 @@ func (p *AMDGPUPlugin) WatchAndRegister(disableWatchAndRegister <-chan bool, ack } } -func getDevices() []*allocator.Device { +func kubeletDeviceID(key string, splitIdx int) string { + return fmt.Sprintf("%s#%d", key, splitIdx) +} + +func hardKubeletDeviceID(key string, deviceData map[string]interface{}) string { + if computePartitionType, _ := deviceData["computePartitionType"].(string); computePartitionType != "" { + return fmt.Sprintf("%s#%s", key, computePartitionType) + } + return "" +} + +func (p *AMDGPUPlugin) getDevices() []*allocator.Device { devices := amdgpu.GetAMDGPUs() var deviceList []*allocator.Device for id, deviceData := range devices { + if !isSchedulableTopologyKey(id, deviceData) { + continue + } for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { device := &allocator.Device{ - Id: fmt.Sprintf("%s#%d", id, splitIdx), + Id: kubeletDeviceID(id, splitIdx), Card: deviceData["card"].(int), RenderD: deviceData["renderD"].(int), DevId: deviceData["devID"].(string), @@ -322,6 +489,18 @@ func getDevices() []*allocator.Device { } deviceList = append(deviceList, device) } + if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { + deviceList = append(deviceList, &allocator.Device{ + Id: hardID, + Card: deviceData["card"].(int), + RenderD: deviceData["renderD"].(int), + DevId: deviceData["devID"].(string), + ComputePartitionType: deviceData["computePartitionType"].(string), + MemoryPartitionType: deviceData["memoryPartitionType"].(string), + NodeId: deviceData["nodeId"].(int), + NumaNode: deviceData["numaNode"].(int), + }) + } } return deviceList } @@ -439,6 +618,41 @@ func (p *AMDGPUPlugin) PreStartContainer(ctx context.Context, r *pluginapi.PreSt return &pluginapi.PreStartContainerResponse{}, nil } +// kubeletDevicesFor publishes defaultSplitCount soft slice slots plus one +// whole-partition device for XCP entries; the pod annotation picks per pod. +func (p *AMDGPUPlugin) kubeletDevicesFor(id string, deviceData map[string]interface{}) []*pluginapi.Device { + numas := []int64{int64(deviceData["numaNode"].(int))} + glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) + + numaNodes := make([]*pluginapi.NUMANode, len(numas)) + for j, v := range numas { + numaNodes[j] = &pluginapi.NUMANode{ + ID: int64(v), + } + } + + devs := make([]*pluginapi.Device, 0, defaultSplitCount+1) + for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { + devs = append(devs, &pluginapi.Device{ + ID: kubeletDeviceID(id, splitIdx), + Health: pluginapi.Healthy, + Topology: &pluginapi.TopologyInfo{ + Nodes: numaNodes, + }, + }) + } + if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { + devs = append(devs, &pluginapi.Device{ + ID: hardID, + Health: pluginapi.Healthy, + Topology: &pluginapi.TopologyInfo{ + Nodes: numaNodes, + }, + }) + } + return devs +} + // ListAndWatch returns a stream of List of Devices // Whenever a Device state change or a Device disappears, ListAndWatch // returns the new list @@ -448,7 +662,7 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin glog.Infof("Found %d AMDGPUs", len(p.AMDGPUs)) - devs := make([]*pluginapi.Device, 0, len(p.AMDGPUs)*defaultSplitCount) + devs := make([]*pluginapi.Device, 0, len(p.AMDGPUs)*(defaultSplitCount+1)) var isHomogeneous bool isHomogeneous = amdgpu.IsHomogeneous() // Initialize a map to store partitionType based device list @@ -458,59 +672,32 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin // limit scope for hwloc func() { for id, device := range p.AMDGPUs { - numas := []int64{int64(device["numaNode"].(int))} - glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) - - numaNodes := make([]*pluginapi.NUMANode, len(numas)) - for j, v := range numas { - numaNodes[j] = &pluginapi.NUMANode{ - ID: int64(v), - } - } - - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - dev := &pluginapi.Device{ - ID: fmt.Sprintf("%s#%d", id, splitIdx), - Health: pluginapi.Healthy, - Topology: &pluginapi.TopologyInfo{ - Nodes: numaNodes, - }, - } - devs = append(devs, dev) + if !isSchedulableTopologyKey(id, device) { + continue } + devs = append(devs, p.kubeletDevicesFor(id, device)...) } }() + glog.Infof("ListAndWatch: sending %d split devices (homogeneous)", len(devs)) s.Send(&pluginapi.ListAndWatchResponse{Devices: devs}) } else { func() { for id, device := range p.AMDGPUs { - numas := []int64{int64(device["numaNode"].(int))} - glog.Infof("Watching GPU with bus ID: %s NUMA Node: %+v", id, numas) - - numaNodes := make([]*pluginapi.NUMANode, len(numas)) - for j, v := range numas { - numaNodes[j] = &pluginapi.NUMANode{ - ID: int64(v), - } + if !isSchedulableTopologyKey(id, device) { + continue } - partitionType := device["computePartitionType"].(string) + "_" + device["memoryPartitionType"].(string) - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - dev := &pluginapi.Device{ - ID: fmt.Sprintf("%s#%d", id, splitIdx), - Health: pluginapi.Healthy, - Topology: &pluginapi.TopologyInfo{ - Nodes: numaNodes, - }, - } - // Append a split device belonging to this partition type. + for _, dev := range p.kubeletDevicesFor(id, device) { resourceTypeDevs[partitionType] = append(resourceTypeDevs[partitionType], dev) } } }() // Send the appropriate list of devices based on the partitionType if devList, exists := resourceTypeDevs[p.Resource]; exists { + glog.Infof("ListAndWatch: sending %d split devices for resource %s", len(devList), p.Resource) s.Send(&pluginapi.ListAndWatchResponse{Devices: devList}) + } else { + glog.Warningf("ListAndWatch: no devices for resource %s; partition types: %v", p.Resource, resourceTypeDevs) } } @@ -553,6 +740,7 @@ loop: func (p *AMDGPUPlugin) GetPreferredAllocation(ctx context.Context, req *pluginapi.PreferredAllocationRequest) (*pluginapi.PreferredAllocationResponse, error) { response := &pluginapi.PreferredAllocationResponse{} for _, req := range req.ContainerRequests { + glog.Infof("GetPreferredAllocation: available=%v must=%v size=%d", req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, req.AllocationSize) allocated_ids, err := p.devAllocator.Allocate(req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, int(req.AllocationSize)) if err != nil { glog.Errorf("unable to get preferred allocation list. Error:%v", err) @@ -568,22 +756,65 @@ func (p *AMDGPUPlugin) GetPreferredAllocation(ctx context.Context, req *pluginap // deviceDataFromAllocationUUID resolves the AMD SMI UUID published in // DeviceInfo.ID to the local topology required to prepare a container. +// parseAMDGPUIndex extracts the flat counter from upstream HAMi's +// "-AMDGPU-" device ids, or -1 for any other id spelling. +func parseAMDGPUIndex(id string) int { + idx := strings.LastIndex(id, "AMDGPU-") + if idx < 0 { + return -1 + } + n, err := strconv.Atoi(id[idx+len("AMDGPU-"):]) + if err != nil { + return -1 + } + return n +} + func (p *AMDGPUPlugin) deviceDataFromAllocationUUID(uuid, _ string) (map[string]interface{}, error) { + uuid = stripPartitionModeSuffix(uuid) if topoKey, ok := p.amdSMIUUIDToTopology[uuid]; ok { if d, found := p.AMDGPUs[topoKey]; found { return d, nil } return nil, fmt.Errorf("AMD SMI UUID %q resolves to unavailable topology key %q", uuid, topoKey) } - - return nil, fmt.Errorf("no local GPU topology entry for AMD SMI UUID %q", uuid) + if topoKey, ok := p.rocrUUIDToTopology[uuid]; ok { + if d, found := p.AMDGPUs[topoKey]; found { + return d, nil + } + return nil, fmt.Errorf("ROCr UUID %q resolves to unavailable topology key %q", uuid, topoKey) + } + if i := parseAMDGPUIndex(uuid); i >= 0 { + // Upstream HAMi device i is the i-th split slot in registration order. + gpuIdx := i / defaultSplitCount + if gpuIdx < len(p.sortedBDFs) { + if d, found := p.AMDGPUs[p.sortedBDFs[gpuIdx]]; found { + return d, nil + } + } + } + return nil, fmt.Errorf("no local GPU topology entry for device id %q", uuid) } func (p *AMDGPUPlugin) rocrUUIDFromAllocationUUID(uuid string) (string, error) { + // XCP partitions publish ROCr UUIDs as DeviceInfo.ID, optionally with a + // "#" hard-entry suffix. + uuid = stripPartitionModeSuffix(uuid) + if strings.HasPrefix(uuid, "GPU-") { + return uuid, nil + } if rocrUUID, ok := p.amdSMIUUIDToROCrUUID[uuid]; ok && rocrUUID != "" { return rocrUUID, nil } - return "", fmt.Errorf("no ROCr UUID for AMD SMI UUID %q", uuid) + if i := parseAMDGPUIndex(uuid); i >= 0 { + gpuIdx := i / defaultSplitCount + if gpuIdx < len(p.sortedBDFs) { + if rocrUUID, ok := p.bdfToROCrUUID[p.sortedBDFs[gpuIdx]]; ok && rocrUUID != "" { + return rocrUUID, nil + } + } + } + return "", fmt.Errorf("no ROCr UUID for device id %q", uuid) } // Allocate is called during container creation so that the Device @@ -592,75 +823,55 @@ func (p *AMDGPUPlugin) rocrUUIDFromAllocationUUID(uuid string) (string, error) { func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) { response := &pluginapi.AllocateResponse{} - // resolve device allocation from annotation glog.Infof("Allocate request: %+v", r) nodename := os.Getenv(utils.NodeNameEnvName) + hostHookPath := os.Getenv("HOST_HOOK_PATH") + + // Whole-GPU allocations (upstream HAMi 2.9, Usedcores=0) carry no cores, so + // kubelet device ids are resolved when the annotation path is unavailable. current, err := utils.GetPendingPod(ctx, nodename) if err != nil { - return &pluginapi.AllocateResponse{}, err + glog.Warningf("no pending pod on %s, falling back to kubelet device ids: %v", nodename, err) } - podDevices := current.Annotations[utils.DeviceAllocation] - podCuAllocList := map[string]string{} - if raw := strings.TrimSpace(current.Annotations[utils.CuAllocation]); raw != "" { - if err := json.Unmarshal([]byte(raw), &podCuAllocList); err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("parse existing %s: %w", utils.CuAllocation, err) + var podDevices string + var podCuAllocList map[string]string + var cuAllocationSnapshot map[string]cuallocation.Allocation + if current != nil { + podDevices = current.Annotations[utils.DeviceAllocation] + podCuAllocList = map[string]string{} + if raw := strings.TrimSpace(current.Annotations[utils.CuAllocation]); raw != "" { + if err := json.Unmarshal([]byte(raw), &podCuAllocList); err != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, fmt.Errorf("parse existing %s: %w", utils.CuAllocation, err) + } } - } - // Pod annotations are the source of truth. The scheduler keeps the node - // locked until this allocation is persisted, so a direct API read gives us - // the complete bitmap committed by all preceding Pods without depending on - // informer delivery. - cuAllocationSnapshot, err := p.rebuildCUAllocations(ctx, nodename) - if err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("rebuild CU allocation for node %s: %w", nodename, err) - } - hostHookPath := os.Getenv("HOST_HOOK_PATH") - glog.Infof("Allocate pod name is %s/%s, annotation is %+v", current.Namespace, current.Name, current.Annotations) - - for idx := range r.ContainerRequests { - currentCtr, devreq, err := utils.GetNextDeviceRequest("amd", *current) - glog.Infof("deviceAllocateFromAnnotation(container=%s)=%+v", currentCtr.Name, devreq) + // Pod annotations are the source of truth: the scheduler holds the node + // lock until the allocation persists, so a direct read beats informer delivery. + cuAllocationSnapshot, err = p.rebuildCUAllocations(ctx, nodename) if err != nil { utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, err - } - if len(devreq) != len(r.ContainerRequests[idx].DevicesIDs) { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("device number not matched") + return &pluginapi.AllocateResponse{}, fmt.Errorf("rebuild CU allocation for node %s: %w", nodename, err) } + glog.Infof("Allocate pod name is %s/%s, annotation is %+v", current.Namespace, current.Name, current.Annotations) + } + for idx := range r.ContainerRequests { car := pluginapi.ContainerAllocateResponse{ Envs: map[string]string{}, } - rocrVisibleDevices := make([]string, 0, len(devreq)) + rocrVisibleDevices := make([]string, 0, len(r.ContainerRequests[idx].DevicesIDs)) - // KFD + DRI from annotation UUID topology. car.Devices = append(car.Devices, &pluginapi.DeviceSpec{ HostPath: "/dev/kfd", ContainerPath: "/dev/kfd", Permissions: "rw", }) - for _, d := range devreq { - glog.Infof("Allocating device from annotation UUID: %s", d.UUID) - deviceData, topoErr := p.deviceDataFromAllocationUUID(d.UUID, nodename) - if topoErr != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, topoErr - } + appendDeviceNodes := func(deviceData map[string]interface{}) error { cardMinor, cok := deviceData["card"].(int) renderMinor, rok := deviceData["renderD"].(int) if !cok || !rok { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, fmt.Errorf("invalid card/renderD in topology for UUID %q", d.UUID) - } - rocrUUID, rocrErr := p.rocrUUIDFromAllocationUUID(d.UUID) - if rocrErr != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, rocrErr + return fmt.Errorf("invalid card/renderD in topology") } - rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) for _, pair := range []struct { kind string minor int @@ -675,15 +886,68 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques Permissions: "rw", }) } + return nil } - err = utils.EraseNextDeviceTypeFromAnnotation("amd", *current) - if err != nil { - utils.PodAllocationFailed(nodename, current, NodeLockName) - return &pluginapi.AllocateResponse{}, err + var devreq utils.ContainerDevices + currentCtrName := "" + fromAnnotation := false + if current != nil { + if ctr, d, rerr := utils.GetNextDeviceRequest("amd", *current); rerr == nil && len(d) == len(r.ContainerRequests[idx].DevicesIDs) { + currentCtrName, devreq, fromAnnotation = ctr.Name, d, true + } } + glog.Infof("deviceAllocateFromAnnotation(container=%s)=%+v fromAnnotation=%v", currentCtrName, devreq, fromAnnotation) + + if fromAnnotation { + for _, d := range devreq { + glog.Infof("Allocating device from annotation UUID: %s", d.UUID) + deviceData, topoErr := p.deviceDataFromAllocationUUID(d.UUID, nodename) + if topoErr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, topoErr + } + if nerr := appendDeviceNodes(deviceData); nerr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, fmt.Errorf("topology for UUID %q: %w", d.UUID, nerr) + } + rocrUUID, rocrErr := p.rocrUUIDFromAllocationUUID(d.UUID) + if rocrErr != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, rocrErr + } + rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) + } + } else { + // Whole-GPU fallback: resolve kubelet's own device ids ("BDF#slot"). + for _, id := range r.ContainerRequests[idx].DevicesIDs { + bdf := strings.SplitN(id, "#", 2)[0] + deviceData, found := p.AMDGPUs[bdf] + if !found { + return &pluginapi.AllocateResponse{}, fmt.Errorf("no topology entry for kubelet device id %q", id) + } + if nerr := appendDeviceNodes(deviceData); nerr != nil { + return &pluginapi.AllocateResponse{}, fmt.Errorf("topology for kubelet device id %q: %w", id, nerr) + } + rocrUUID, ok := p.bdfToROCrUUID[bdf] + if !ok || rocrUUID == "" { + return &pluginapi.AllocateResponse{}, fmt.Errorf("no ROCr UUID for kubelet device id %q", id) + } + rocrVisibleDevices = append(rocrVisibleDevices, rocrUUID) + } + } + car.Envs["ROCR_VISIBLE_DEVICES"] = strings.Join(rocrVisibleDevices, ",") + + // CU slicing applies only when the scheduler handed out cores. Upstream + // HAMi's AMD driver always requests whole GPUs (Usedcores=0), so the CU + // mask, memory limit and LD_AUDIT hook are skipped there. + if fromAnnotation && len(devreq) > 0 && devreq[0].Usedcores > 0 { + err = utils.EraseNextDeviceTypeFromAnnotation("amd", *current) + if err != nil { + utils.PodAllocationFailed(nodename, current, NodeLockName) + return &pluginapi.AllocateResponse{}, err + } - if len(devreq) > 0 { hsaCuSets := make([]string, 0, len(devreq)) for _, d := range devreq { if d.UUID == "" { @@ -734,9 +998,6 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques } } car.Envs["HSA_CU_MASK"] = strings.Join(hsaCuSets, ";") - // ROCr renumbers devices after this list is applied. HSA_CU_MASK uses - // those container-local indices, so it is built in the same order. - car.Envs["ROCR_VISIBLE_DEVICES"] = strings.Join(rocrVisibleDevices, ",") car.Envs["HIP_DEVICE_MEMORY_LIMIT"] = fmt.Sprintf("%vm", devreq[0].Usedmem) car.Envs["LD_AUDIT"] = "/usr/local/vgpu/libamvgpu.so" } @@ -778,8 +1039,10 @@ func (p *AMDGPUPlugin) Allocate(ctx context.Context, r *pluginapi.AllocateReques } } + if current != nil { + utils.PodAllocationTrySuccess(nodename, podDevices, NodeLockName, current) + } glog.Infoln("Allocate Response", response.ContainerResponses) - utils.PodAllocationTrySuccess(nodename, podDevices, NodeLockName, current) return response, nil } diff --git a/internal/pkg/plugin/plugin_test.go b/internal/pkg/plugin/plugin_test.go index b4d12a38..29327111 100644 --- a/internal/pkg/plugin/plugin_test.go +++ b/internal/pkg/plugin/plugin_test.go @@ -17,9 +17,14 @@ package plugin import ( + "encoding/json" + "os" + "path/filepath" + "strconv" "strings" "testing" + "github.com/Project-HAMi/amd-device-plugin/internal/pkg/amdgpu" "github.com/Project-HAMi/amd-device-plugin/internal/pkg/cuallocation" "github.com/Project-HAMi/amd-device-plugin/internal/pkg/utils" corev1 "k8s.io/api/core/v1" @@ -159,3 +164,336 @@ func assertAllocationWord(t *testing.T, allocations map[string]cuallocation.Allo t.Fatalf("allocation word for %s = %#x, want %#x", uuid, allocation[0], want) } } + +func TestIsSchedulableTopologyKey(t *testing.T) { + wholeGPU := map[string]interface{}{"computePartitionType": "spx", "memoryPartitionType": "nps1"} + partitionedParent := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + noPartition := map[string]interface{}{"computePartitionType": "", "memoryPartitionType": ""} + xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + + if !isSchedulableTopologyKey("amdgpu_xcp_30", xcp) { + t.Error("XCP partition should be schedulable") + } + if isSchedulableTopologyKey("0000:05:00.0", wholeGPU) { + t.Error("SPX-partitioned GPU parent has no capacity and must be skipped") + } + if isSchedulableTopologyKey("0000:15:00.0", partitionedParent) { + t.Error("partitioned GPU parent has no capacity and must be skipped") + } + if !isSchedulableTopologyKey("0000:75:00.0", noPartition) { + t.Error("GPU without partition support should be schedulable") + } +} + +func TestHardEntryRegistration(t *testing.T) { + xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + noPartition := map[string]interface{}{"computePartitionType": "", "memoryPartitionType": ""} + wholeGPU := map[string]interface{}{"computePartitionType": "spx", "memoryPartitionType": "nps1"} + + soft := &utils.DeviceInfo{ID: "GPU-466450b96fbde849", Count: defaultSplitCount, Mode: ""} + if !(&AMDGPUPlugin{}).registerHardEntry("amdgpu_xcp_30", xcp, soft) { + t.Fatal("XCP partition should register a hard entry") + } + if soft.ID != "GPU-466450b96fbde849#cpx" || soft.Mode != "cpx" || soft.Count != 1 { + t.Fatalf("hard entry = %+v, want suffixed ID, Mode=cpx, Count=1", soft) + } + + soft = &utils.DeviceInfo{ID: "uuid-1", Count: defaultSplitCount} + if (&AMDGPUPlugin{}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { + t.Fatal("hard entries are only for XCP partitions, not GPU parents") + } + soft = &utils.DeviceInfo{ID: "uuid-2", Count: defaultSplitCount} + if (&AMDGPUPlugin{}).registerHardEntry("0000:75:00.0", noPartition, soft) { + t.Fatal("GPU without partitions should not get a hard entry") + } +} + +func TestStripPartitionModeSuffix(t *testing.T) { + for id, want := range map[string]string{ + "GPU-466450b96fbde849#cpx": "GPU-466450b96fbde849", + "GPU-466450b96fbde849#spx": "GPU-466450b96fbde849", + "GPU-466450b96fbde849": "GPU-466450b96fbde849", + "GPU-466450b96fbde849#0": "GPU-466450b96fbde849#0", + "8eff74b5-0000-1000-801b-b56457addd1b": "8eff74b5-0000-1000-801b-b56457addd1b", + } { + if got := stripPartitionModeSuffix(id); got != want { + t.Errorf("stripPartitionModeSuffix(%q) = %q, want %q", id, got, want) + } + } +} + +func TestHardKubeletDeviceID(t *testing.T) { + xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} + if got := hardKubeletDeviceID("amdgpu_xcp_30", xcp); got != "amdgpu_xcp_30#cpx" { + t.Errorf("hardKubeletDeviceID(xcp) = %q", got) + } + if got := hardKubeletDeviceID("0000:75:00.0", map[string]interface{}{}); got != "" { + t.Errorf("hardKubeletDeviceID(whole) = %q, want empty", got) + } +} + +// hasAMDGPU mirrors the amdgpu package gate: real hardware required. +func hasAMDGPU() bool { + vendorFiles, _ := filepath.Glob("/sys/class/drm/card[0-9]*/device/vendor") + for _, vendorFile := range vendorFiles { + b, err := os.ReadFile(vendorFile) + if err == nil && strings.TrimSpace(string(b)) == "0x1002" { + return true + } + } + return false +} + +func TestRocmModeRegistrationOnHardware(t *testing.T) { + if !hasAMDGPU() { + t.Skip("no AMD GPU on this machine") + } + p := &AMDGPUPlugin{} + devices := p.getAPIDevices() + if len(devices) == 0 { + t.Fatal("rocm mode registered no devices on a machine with an AMD GPU") + } + for _, d := range devices { + if d.ID == "" { + t.Errorf("device with empty ID: %+v", d) + } + if d.Mode != "" { + t.Errorf("rocm mode device %s has Mode=%q, want empty", d.ID, d.Mode) + } + if d.Count != defaultSplitCount { + t.Errorf("device %s Count=%d, want %d", d.ID, d.Count, defaultSplitCount) + } + t.Logf("registered: %s (count=%d, CUs=%d, mem=%dMiB, type=%s)", d.ID, d.Count, d.Devcore, d.Devmem, d.Type) + } +} + +type amdsmiGolden struct { + UUID string `json:"uuid"` + Type string `json:"type"` +} + +func loadAmdsmiGolden(t *testing.T, path string) map[string]amdsmiGolden { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + golden := map[string]amdsmiGolden{} + if err := json.Unmarshal(b, &golden); err != nil { + t.Fatal(err) + } + return golden +} + +// flexibleInt tolerates the amd-smi JSON quirk of "" for header fields on +// resource-only rows. +type flexibleInt int + +func (f *flexibleInt) UnmarshalJSON(b []byte) error { + s := strings.Trim(string(b), `"`) + if s == "" { + *f = 0 + return nil + } + v, err := strconv.Atoi(s) + *f = flexibleInt(v) + return err +} + +// loadPartitionProfilesGolden parses a raw amd-smi partition -g capture into +// PartitionProfile. Profile rows carry the header fields; the following rows +// only detail other resource types (DECODER/DMA/JPEG) and are skipped. +func loadPartitionProfilesGolden(t *testing.T, path string) []amdgpu.PartitionProfile { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var raw struct { + PartitionProfiles []struct { + ProfileIndex flexibleInt `json:"profile_index"` + MemoryCaps string `json:"memory_partition_caps"` + AcceleratorType string `json:"accelerator_type"` + NumPartitions flexibleInt `json:"num_partitions"` + ResourceType string `json:"resource_type"` + ResourceInstances flexibleInt `json:"resource_instances"` + } `json:"partition_profiles"` + } + if err := json.Unmarshal(b, &raw); err != nil { + t.Fatal(err) + } + profiles := []amdgpu.PartitionProfile{} + for _, row := range raw.PartitionProfiles { + if row.AcceleratorType == "" { + continue + } + profiles = append(profiles, amdgpu.PartitionProfile{ + ProfileIndex: int(row.ProfileIndex), + Type: strings.TrimSuffix(row.AcceleratorType, "*"), + MemoryCaps: row.MemoryCaps, + NumPartitions: int(row.NumPartitions), + XCCPerPartition: int(row.ResourceInstances), + }) + } + return profiles +} + +func TestPartitionProfilesFromFixture(t *testing.T) { + profiles := loadPartitionProfilesGolden(t, "../../../testdata/amdsmi-partition-g3-mi355x.json") + want := []amdgpu.PartitionProfile{ + {ProfileIndex: 0, Type: "SPX", MemoryCaps: "NPS1", NumPartitions: 1, XCCPerPartition: 8}, + {ProfileIndex: 1, Type: "DPX", MemoryCaps: "NPS1,NPS2", NumPartitions: 2, XCCPerPartition: 4}, + {ProfileIndex: 2, Type: "QPX", MemoryCaps: "NPS1", NumPartitions: 4, XCCPerPartition: 2}, + {ProfileIndex: 3, Type: "CPX", MemoryCaps: "NPS1", NumPartitions: 8, XCCPerPartition: 1}, + } + if len(profiles) != len(want) { + t.Fatalf("parsed %d profiles, want %d: %+v", len(profiles), len(want), profiles) + } + for i := range want { + if profiles[i] != want[i] { + t.Errorf("profile[%d] = %+v, want %+v", i, profiles[i], want[i]) + } + } +} + +// fixtureBDF converts the topology spelling (0000:75:00:0) to the PCI +// spelling (0000:75:00.0) used as the amdsmi fixture key. +func fixtureBDF(bdf string) string { + if i := strings.LastIndex(bdf, ":"); i >= 0 { + return bdf[:i] + "." + bdf[i+1:] + } + return bdf +} + +// loadMemoryPartitionGolden reads the raw amd-smi partition -m capture; the +// file is gpu_id-keyed, so it can only confirm uniformity, not per-BDF values. +func loadMemoryPartitionGolden(t *testing.T, path string) []string { + t.Helper() + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + var raw struct { + MemoryPartition []struct { + GPUID int `json:"gpu_id"` + Current string `json:"current_memory_partition"` + } `json:"memory_partition"` + } + if err := json.Unmarshal(b, &raw); err != nil { + t.Fatal(err) + } + parts := make([]string, len(raw.MemoryPartition)) + for _, g := range raw.MemoryPartition { + parts[g.GPUID] = strings.ToLower(g.Current) + } + return parts +} + +// TestRegistrationFromFixture drives the full registration flow against the +// captured MI355X sysfs tree (kernel 6.8.0-136) with an injected AMD SMI +// golden, so it runs on machines without GPUs or AMD SMI. On this kernel the +// XCP render minors are absent from KFD topology, so discovery yields only +// the 8 whole-GPU entries and every one of them is an SPX-partitioned parent +// without allocatable capacity: nothing registers. Pinning that behavior; +// fixing XCP discovery on this kernel must flip the expected count to 8 soft +// + 56 hard entries. +func TestRegistrationFromFixture(t *testing.T) { + root := "../../../testdata/sysfs-mi355x-spx/sys" + golden := loadAmdsmiGolden(t, "../../../testdata/amdsmi-mi355x.json") + memoryPartitions := loadMemoryPartitionGolden(t, "../../../testdata/amdsmi-partition-m-mi355x.json") + for i, partition := range memoryPartitions { + if partition != "nps1" { + t.Fatalf("fixture GPU %d memory partition %q, want nps1", i, partition) + } + } + profiles := loadPartitionProfilesGolden(t, "../../../testdata/amdsmi-partition-g3-mi355x.json") + profileBDFs := map[string]bool{} + + p := NewAMDGPUPlugin( + WithSysfsRoot(root), + WithAmdSMI( + func(bdfs []string) (map[string]string, error) { + uuidByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + uuidByBDF[bdf] = entry.UUID + } + } + return uuidByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + namesByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + namesByBDF[bdf] = entry.Type + } + } + return namesByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + partitionsByBDF := map[string]string{} + for _, bdf := range bdfs { + partitionsByBDF[bdf] = memoryPartitions[0] + } + return partitionsByBDF, nil + }, + ), + WithAMDSPartitionProfiles(func(bdfs []string) (map[string][]amdgpu.PartitionProfile, error) { + profilesByBDF := map[string][]amdgpu.PartitionProfile{} + for _, bdf := range bdfs { + profileBDFs[bdf] = true + profilesByBDF[bdf] = profiles + } + return profilesByBDF, nil + }), + ) + devices := p.getAPIDevices() + if len(devices) != 0 { + t.Fatalf("registered %d devices, want 0 on this kernel: %+v", len(devices), devices) + } + if len(p.AMDGPUs) != 8 { + t.Fatalf("discovery returned %d entries, want 8 whole GPUs: %v", len(p.AMDGPUs), p.AMDGPUs) + } + if len(profileBDFs) != 8 { + t.Errorf("partition-profile lookup consulted %d BDFs, want 8: %v", len(profileBDFs), profileBDFs) + } + for key, deviceData := range p.AMDGPUs { + if strings.HasPrefix(key, "amdgpu_xcp_") { + t.Error("XCP entries must not reach registration on this kernel") + } + if cpt, _ := deviceData["computePartitionType"].(string); cpt != "spx" { + t.Errorf("%s: computePartitionType %q, want spx", key, cpt) + } + if mpt, _ := deviceData["memoryPartitionType"].(string); mpt != "nps1" { + t.Errorf("%s: memoryPartitionType %q, want nps1 from amd-smi", key, mpt) + } + } +} + +func TestDeviceDataFromROCrUUID(t *testing.T) { + p := &AMDGPUPlugin{ + AMDGPUs: map[string]map[string]interface{}{ + "amdgpu_xcp_30": {"card": 8, "renderD": 136}, + }, + rocrUUIDToTopology: map[string]string{ + "GPU-466450b96fbde849": "amdgpu_xcp_30", + }, + } + + for _, uuid := range []string{"GPU-466450b96fbde849", "GPU-466450b96fbde849#cpx"} { + device, err := p.deviceDataFromAllocationUUID(uuid, "node-a") + if err != nil { + t.Fatalf("resolve ROCr UUID %q: %v", uuid, err) + } + if device["card"] != 8 { + t.Fatalf("resolved device = %#v, want card 8", device) + } + rocrUUID, err := p.rocrUUIDFromAllocationUUID(uuid) + if err != nil { + t.Fatalf("resolve ROCr UUID %q: %v", uuid, err) + } + if rocrUUID != "GPU-466450b96fbde849" { + t.Fatalf("rocrUUID = %q, want passthrough of the partition ID", rocrUUID) + } + } +} From 8231d94f225e70073cc977277448f4525538ac7d Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 03:39:26 +0800 Subject: [PATCH 04/12] README: document partition profiles and mode-change semantics Explains the per-GPU profile table (SPX/DPX/QPX/CPX with partition x XCC geometry), profile_index semantics, the idle requirement for partition changes, and the per-GPU compute vs node-wide memory reload distinction. Signed-off-by: Reza Jelveh --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/README.md b/README.md index 9ac39e23..d43c7a22 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,81 @@ Verify registration: kubectl get node -o jsonpath='{.metadata.annotations.hami\.io/node-amd-register}' ``` +## Operating modes + +The plugin follows HAMi's Ascend vNPU model: one plugin registration, per-pod mode +selection. Every device is registered in both forms and the scheduler picks the +form per pod based on the pod annotation `hami.io/amd-mode`: + +- absent or `rocm` (default): soft mode. The device is published as a CU-maskable + device (Count 10) and the scheduler allocates CU slices via the amd-hami-core + hook library (`HSA_CU_MASK`, `HIP_DEVICE_MEMORY_LIMIT`, `LD_AUDIT`). +- `spx`, `cpx`, `dpx` or `qpx`: hard partition mode. The same XCP compute + partition is published as a whole device (Count 1, ID `#`) + and the scheduler allocates it exclusively without a CU mask. The node must be + switched to the matching compute partition profile first, e.g.: + + ```bash + echo spx > /sys/class/drm/card0/device/current_compute_partition + echo nps1 > /sys/class/drm/card0/device/current_memory_partition + reboot # partition changes require a reset + ``` + + Physical Instinct parts expose XCP compute partitions and serve both modes, + discrete GPUs and AI MAX APUs (MI300A/MI350A) alike. Virtio Instinct devices + (SR-IOV VFs) and partition-less embedded APUs register no hard entries and + only serve rocm mode; `hami.io/amd-mode: spx` cannot be scheduled there. + +The register annotation (`hami.io/node-amd-register`) carries one entry per +form: soft entries have `Mode` empty, hard entries carry `Mode` equal to the +compute partition type. The scheduler branches on `Mode` exactly like HAMi +branches on the NVIDIA `MigMode` and the Ascend `huawei.com/vnpu-mode` values. +Allocated devices must be written back as the published `DeviceInfo.ID` +(`amd-smi` UUID for whole GPUs, `GPU-` or `#` for +partitions); the plugin resolves all of them. + +Whole-GPU devices whose KFD `unique_id` is 0 (embedded APUs without a PCI +Device Serial Number) cannot be addressed by `GPU-`; ROCr addresses +them by agent index and the plugin publishes that index as the ROCr-visible +id. Such nodes expose no XCP partitions and only serve rocm mode; parts with a +PCI Device Serial Number register by `GPU-` instead. + +### Partition profiles + +An Instinct GPU can be carved into compute partitions; which partitions exist +and how they split the silicon depends on the selected profile. MI355X-class +GPUs (8 XCCs) support four profiles, reported per GPU by +`amd-smi partition -g --json`: + +| profile | type | memory caps | partitions x XCC | +|---------|------------|-------------|-------------------| +| 0 | SPX (default) | NPS1 | 1 x 8 | +| 1 | DPX | NPS1,NPS2 | 2 x 4 | +| 2 | QPX | NPS1 | 4 x 2 | +| 3 | CPX | NPS1 | 8 x 1 | + +- `profile` is the `profile_index` passed to the AMD SMI setter + (`amdsmi_set_gpu_accelerator_partition_profile`). The amd-smi CLI marks the + current profile with `*` (SPX here). +- `partitions x XCC` is what the profile yields: e.g. QPX splits the GPU into + 4 partitions of 2 XCCs each. Every partition appears as an XCP device + (`/sys/devices/platform/amdgpu_xcp_*`) and is registered by the plugin as a + hard entry of that mode. +- `memory caps` lists the NPS modes the profile can run with (DPX also works + under NPS2; the others are NPS1-only on this part). + +Changing the profile requires the GPU to be idle (no workloads; see the +`amdsmi_set_gpu_*_partition` docs). Compute partition changes are per-GPU and +take effect live - the XCP devices appear without a reset. A memory partition +change requires an amdgpu driver reload, which resets the device nodes of +every GPU on the node: that is a node-wide quiet-window operation, not a +single-GPU one. + +The plugin registers the partitions of the mode each GPU is currently in, and +advertises the available profiles per GPU (`partitionProfiles` in +DeviceInfo.CustomInfo of the register annotation) so schedulers can see which +modes a GPU can be switched to. + ## Memory-isolation compatibility CU isolation and device visibility use ROCr interfaces and are independent of the workload image's libc. Fractional-memory enforcement is different: it depends on loading `/usr/local/vgpu/libamvgpu.so` through glibc `LD_AUDIT`. From e09a30ae4ac790d0d75d967e62f40c006bc62751 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 03:39:39 +0800 Subject: [PATCH 05/12] allocator, utils, labeller: nil-guard stale device ids, dual allocation keys Best-effort policy skips stale kubelet device ids across plugin restarts instead of panicking in sort.Slice. Allocation reads the committed hami.io/amd-devices-allocated payload and falls back to the fork's own to-allocate annotation. Labeller Dockerfile picks up the glibc patch. Signed-off-by: Reza Jelveh --- internal/pkg/allocator/besteffort_policy.go | 6 ++- internal/pkg/utils/types.go | 31 ++++++----- internal/pkg/utils/utils.go | 57 +++++++++++---------- labeller.Dockerfile | 4 +- 4 files changed, 56 insertions(+), 42 deletions(-) diff --git a/internal/pkg/allocator/besteffort_policy.go b/internal/pkg/allocator/besteffort_policy.go index 38828659..f8b19160 100644 --- a/internal/pkg/allocator/besteffort_policy.go +++ b/internal/pkg/allocator/besteffort_policy.go @@ -61,7 +61,11 @@ func NewBestEffortPolicy() *BestEffortPolicy { func (b *BestEffortPolicy) getDevicesFromIds(ids []string) []*Device { var res []*Device for _, id := range ids { - res = append(res, b.devicesMap[id]) + // Stale kubelet device ids across plugin restarts resolve to nil; skip + // them so Allocate errors cleanly instead of panicking in sort.Slice. + if d := b.devicesMap[id]; d != nil { + res = append(res, d) + } } return res } diff --git a/internal/pkg/utils/types.go b/internal/pkg/utils/types.go index 874bc8b8..97b1aba6 100644 --- a/internal/pkg/utils/types.go +++ b/internal/pkg/utils/types.go @@ -102,17 +102,17 @@ const ( ) type DeviceInfo struct { - ID string `json:"id,omitempty"` - Index uint `json:"index,omitempty"` - Count int32 `json:"count,omitempty"` - Devmem int32 `json:"devmem,omitempty"` - Devcore int32 `json:"devcore,omitempty"` - Type string `json:"type,omitempty"` - Numa int `json:"numa,omitempty"` - Mode string `json:"mode,omitempty"` - Health bool `json:"health,omitempty"` - DeviceVendor string `json:"devicevendor,omitempty"` - CustomInfo map[string]any `json:"custominfo,omitempty"` + ID string `json:"id,omitempty"` + Index uint `json:"index,omitempty"` + Count int32 `json:"count,omitempty"` + Devmem int32 `json:"devmem,omitempty"` + Devcore int32 `json:"devcore,omitempty"` + Type string `json:"type,omitempty"` + Numa int `json:"numa,omitempty"` + Mode string `json:"mode,omitempty"` + Health bool `json:"health,omitempty"` + DeviceVendor string `json:"devicevendor,omitempty"` + CustomInfo map[string]any `json:"custominfo,omitempty"` } type ContainerDevice struct { @@ -157,7 +157,12 @@ var ( func init() { InRequestDevices = make(map[string]string) - InRequestDevices["amd"] = DeviceToAllocate + // Upstream HAMi (>= 2.9) writes the committed allocation under + // hami.io/amd-devices-allocated. The fork's own scheduler writes the same + // payload under hami.io/amd-devices-to-allocate first. Read both; the + // second key is only consulted when the first has no payload. + InRequestDevices["amd"] = DeviceAllocation + InRequestDevices["amd-pending"] = DeviceToAllocate SupportDevices = make(map[string]string) SupportDevices["amd"] = DeviceAllocation } @@ -257,4 +262,4 @@ func EncodePodDevices(checklist map[string]string, pd PodDevices) map[string]str } glog.Infof("Encoded pod Devices %s\n", res) return res -} \ No newline at end of file +} diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index d8eaeeb6..a5459bf4 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -292,13 +292,15 @@ func GetNextDeviceRequest(dtype string, p corev1.Pod) (corev1.Container, Contain klog.Infof("pod annotation decode value is %+v", pdevices) res := ContainerDevices{} - pd, ok := pdevices[dtype] - if !ok { - return corev1.Container{}, res, fmt.Errorf("device request not found") - } - for ctridx, ctrDevice := range pd { - if len(ctrDevice) > 0 { - return p.Spec.Containers[ctridx], ctrDevice, nil + for _, key := range []string{dtype, dtype + "-pending"} { + pd, ok := pdevices[key] + if !ok { + continue + } + for ctridx, ctrDevice := range pd { + if len(ctrDevice) > 0 { + return p.Spec.Containers[ctridx], ctrDevice, nil + } } } return corev1.Container{}, res, fmt.Errorf("device request not found") @@ -309,26 +311,29 @@ func EraseNextDeviceTypeFromAnnotation(dtype string, p corev1.Pod) error { if err != nil { return err } - res := PodSingleDevice{} - pd, ok := pdevices[dtype] - if !ok { - return fmt.Errorf("erase device annotation not found") - } - found := false - for _, val := range pd { - if found { - res = append(res, val) - } else { - if len(val) > 0 { - found = true - res = append(res, ContainerDevices{}) - } else { + for _, key := range []string{dtype, dtype + "-pending"} { + pd, ok := pdevices[key] + if !ok || len(pd) == 0 { + continue + } + res := PodSingleDevice{} + found := false + for _, val := range pd { + if found { res = append(res, val) + } else { + if len(val) > 0 { + found = true + res = append(res, ContainerDevices{}) + } else { + res = append(res, val) + } } } + klog.Infoln("After erase res=", res) + newannos := make(map[string]string) + newannos[InRequestDevices[key]] = EncodePodSingleDevice(res) + return PatchPodAnnotations(&p, newannos) } - klog.Infoln("After erase res=", res) - newannos := make(map[string]string) - newannos[InRequestDevices[dtype]] = EncodePodSingleDevice(res) - return PatchPodAnnotations(&p, newannos) -} \ No newline at end of file + return fmt.Errorf("erase device annotation not found") +} diff --git a/labeller.Dockerfile b/labeller.Dockerfile index 65858284..f31bf9ff 100644 --- a/labeller.Dockerfile +++ b/labeller.Dockerfile @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM docker.io/golang:1.23.6-alpine3.21 +FROM docker.io/golang:1.25.13-alpine3.23 RUN apk --no-cache add git pkgconfig build-base libdrm-dev wget RUN mkdir -p /go/src/github.com/Project-HAMi/amd-device-plugin ADD . /go/src/github.com/Project-HAMi/amd-device-plugin @@ -25,7 +25,7 @@ RUN echo "73A2, C0, AMD Radeon Pro W6900X" >> /go/src/github.com/Project-HAMi/ RUN echo "73AB, C0, AMD Radeon Pro W6800X" >> /go/src/github.com/Project-HAMi/amd-device-plugin/cmd/k8s-node-labeller/amdgpu.ids RUN echo "74BC, 00, AMD Instinct MI308X HF VF" >> /go/src/github.com/Project-HAMi/amd-device-plugin/cmd/k8s-node-labeller/amdgpu.ids -FROM alpine:3.21.3 +FROM alpine:3.23 LABEL \ org.opencontainers.image.source="https://github.com/Project-HAMi/amd-device-plugin" \ org.opencontainers.image.authors="Project-HAMi maintainers" \ From b4cdf74f944ffbb23d12c44eecdb15ec9c22a722 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 04:00:51 +0800 Subject: [PATCH 06/12] plugin, amdgpu: advertise per-XCP capacity as an even share of the GPU XCP partitions share their parent's PCI BDF. Their registered capacity is now the whole-GPU VRAM and CU count divided by the number of XCP partitions, computed once at start from the libdrm whole-GPU read. Floor division under-advertises rather than over-committing. Signed-off-by: Reza Jelveh --- README.md | 31 ++++++++++++++++++++++++++ internal/pkg/amdgpu/amdgpu.go | 10 +++++++++ internal/pkg/amdgpu/amdgpu_test.go | 27 +++++++++++++++++++++++ internal/pkg/plugin/plugin.go | 35 +++++++++++++++++++++++++----- 4 files changed, 98 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d43c7a22..81330dd0 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,37 @@ advertises the available profiles per GPU (`partitionProfiles` in DeviceInfo.CustomInfo of the register annotation) so schedulers can see which modes a GPU can be switched to. +### Profile storage + +The profile data lives in this plugin's own register annotation +(`hami.io/node-amd-register`), following the storage model of HAMi's NVIDIA +device plugin, which is the reference implementation in the Project-HAMi/HAMi +scheduler repository and not part of this repository. That plugin queries +NVML at registration and publishes the per-GPU MIG profile capacity +(`migProfiles` inside each device entry of `hami.io/node-nvidia-register`); +the scheduler never queries hardware and reads profile capacity from the +annotation instead. This plugin mirrors the model on the AMD side: it +discovers the profiles from AMD SMI at registration and publishes them per +whole GPU under `custominfo.partitionProfiles`, one entry per profile with +`profile_index`, partition type, memory caps, partition count and XCC per +partition. + +The difference from MIG is the switching cadence, not the idle requirement: +changing either a MIG mode or an AMD partition profile requires an idle GPU +(HAMi's NVIDIA plugin start-up refuses to reset MIG-enabled GPUs that still +have running allocations). MIG mode enablement is a one-time node-level +operation at plugin start-up that resets the GPU; afterwards MIG instances +are carved on demand from the fixed NVML profile menu. An AMD compute partition switch +is per-GPU and takes effect live - the XCP devices appear without a reset - +while a memory partition switch requires a node-wide amdgpu driver reload. In +both cases the stored profiles are the static menu of what the silicon can +do, and the annotation carries the current mode (the device entries +themselves, with their `Mode` and `partitionProfile` fields) next to the +modes the GPU can be switched to (`custominfo.partitionProfiles`). +Allocation state stays where HAMi keeps it for every device: in the pod +annotations, as XCP device IDs for hard partitions and as +`hami.io/amd-cu-allocated` CU ranges in soft mode. + ## Memory-isolation compatibility CU isolation and device visibility use ROCr interfaces and are independent of the workload image's libc. Fractional-memory enforcement is different: it depends on loading `/usr/local/vgpu/libamvgpu.so` through glibc `LD_AUDIT`. diff --git a/internal/pkg/amdgpu/amdgpu.go b/internal/pkg/amdgpu/amdgpu.go index 323c7b66..55be9fcf 100644 --- a/internal/pkg/amdgpu/amdgpu.go +++ b/internal/pkg/amdgpu/amdgpu.go @@ -145,6 +145,16 @@ type DeviceCapacity struct { CUCount int32 } +// PartitionCapacity divides whole-GPU capacity across a GPU's XCP partitions. +// Floor division under-advertises rather than over-committing. +func PartitionCapacity(whole DeviceCapacity, partitions int) DeviceCapacity { + if partitions > 1 { + whole.VRAMMiB /= int32(partitions) + whole.CUCount /= int32(partitions) + } + return whole +} + // GetDeviceCapacity reads VRAM and active CU count through libdrm_amdgpu for // one DRM card. It intentionally avoids node-scoped labels so heterogeneous // nodes and SR-IOV virtual functions retain per-device values. diff --git a/internal/pkg/amdgpu/amdgpu_test.go b/internal/pkg/amdgpu/amdgpu_test.go index 60033a57..6ccf8a3e 100644 --- a/internal/pkg/amdgpu/amdgpu_test.go +++ b/internal/pkg/amdgpu/amdgpu_test.go @@ -383,3 +383,30 @@ func TestGetROCrIndexesFromTopology(t *testing.T) { t.Error("renderD129 has a real unique_id and must not get an index fallback") } } + +func TestPartitionCapacity(t *testing.T) { + // MI355X whole-GPU values: 294896 MB VRAM (amdsmi-static fixture) and + // 304 CUs (8 XCCs x 38). + whole := DeviceCapacity{VRAMMiB: 287984, CUCount: 304} + + tests := []struct { + name string + partitions int + wantVRAMMiB int32 + wantCUCount int32 + }{ + {"SPX", 1, 287984, 304}, + {"DPX", 2, 143992, 152}, + {"QPX", 4, 71996, 76}, + {"CPX", 8, 35998, 38}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := PartitionCapacity(whole, tt.partitions) + if got.VRAMMiB != tt.wantVRAMMiB || got.CUCount != tt.wantCUCount { + t.Errorf("PartitionCapacity(%d) = %d MiB, %d CUs; want %d MiB, %d CUs", + tt.partitions, got.VRAMMiB, got.CUCount, tt.wantVRAMMiB, tt.wantCUCount) + } + }) + } +} diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index fa78974f..7198174d 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -263,6 +263,30 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { } p.AMDGPUs = amdgpu.GetAMDGPUs(root) + // Whole-GPU capacity is read once per GPU through libdrm. XCP partitions + // share their parent's PCI BDF and get an even share of that capacity. + wholeCardByBDF := make(map[string]int) + xcpCountByBDF := make(map[string]int) + for key, deviceData := range p.AMDGPUs { + bdf, _ := deviceData["devID"].(string) + if bdf == "" { + continue + } + if strings.HasPrefix(key, "amdgpu_xcp_") { + xcpCountByBDF[bdf]++ + } else { + wholeCardByBDF[bdf], _ = deviceData["card"].(int) + } + } + capacityByBDF := make(map[string]amdgpu.DeviceCapacity, len(wholeCardByBDF)) + for bdf, card := range wholeCardByBDF { + if capacity, err := amdgpu.GetDeviceCapacity(fmt.Sprintf("card%d", card)); err != nil { + glog.Warningf("libdrm capacity lookup failed for GPU %s (card%d): %v", bdf, card, err) + } else { + capacityByBDF[bdf] = capacity + } + } + keys := make([]string, 0, len(p.AMDGPUs)) for key := range p.AMDGPUs { keys = append(keys, key) @@ -314,16 +338,17 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { card, _ := deviceData["card"].(int) numa, _ := deviceData["numaNode"].(int) - capacity, capacityErr := amdgpu.GetDeviceCapacity(fmt.Sprintf("card%d", card)) - if capacityErr != nil { - glog.Warningf("libdrm capacity lookup failed for GPU %s (card%d): %v", key, card, capacityErr) - } - bdf, ok := deviceData["devID"].(string) if !ok || bdf == "" { glog.Errorf("skip GPU %s: missing PCI BDF in topology", key) continue } + capacity := capacityByBDF[bdf] + if strings.HasPrefix(key, "amdgpu_xcp_") { + // XCP partitions advertise an even share of the whole GPU's + // VRAM and CU count, not the full-GPU capacity. + capacity = amdgpu.PartitionCapacity(capacity, xcpCountByBDF[bdf]) + } renderD, ok := deviceData["renderD"].(int) if !ok || renderD <= 0 { glog.Errorf("skip GPU %s: missing or invalid render node in topology", key) From ee530f3256e770452fc169b66c70a6ccc82f83da Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 04:00:59 +0800 Subject: [PATCH 07/12] testdata, README: xgmi/topology fixtures, per-XCP capacity, memory-partition rationale Store amd-smi xgmi and topology node captures next to the existing fixtures. Document the profile storage model (register annotation, mirroring HAMi's MIG storage), the per-XCP capacity derivation, and why NPS memory partitions are not an allocation mechanism for HAMi. Signed-off-by: Reza Jelveh --- README.md | 82 ++- testdata/amdsmi-topology-mi355x.json | 882 ++++++++++++++++++++++++ testdata/amdsmi-xgmi-mi355x.json | 976 +++++++++++++++++++++++++++ testdata/sysfs-mi355x-spx/README.md | 4 + 4 files changed, 1917 insertions(+), 27 deletions(-) create mode 100644 testdata/amdsmi-topology-mi355x.json create mode 100644 testdata/amdsmi-xgmi-mi355x.json diff --git a/README.md b/README.md index 81330dd0..043b8131 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,12 @@ change requires an amdgpu driver reload, which resets the device nodes of every GPU on the node: that is a node-wide quiet-window operation, not a single-GPU one. +Each XCP entry is published with an even share of the whole-GPU capacity: +VRAM and CU count divided by the number of XCP partitions of that GPU. Floor +division is used, so the advertised values under-commit rather than +over-commit. Soft entries keep the whole-GPU capacity; soft mode slices it +with CU masks. + The plugin registers the partitions of the mode each GPU is currently in, and advertises the available profiles per GPU (`partitionProfiles` in DeviceInfo.CustomInfo of the register annotation) so schedulers can see which @@ -150,35 +156,57 @@ modes a GPU can be switched to. ### Profile storage -The profile data lives in this plugin's own register annotation -(`hami.io/node-amd-register`), following the storage model of HAMi's NVIDIA -device plugin, which is the reference implementation in the Project-HAMi/HAMi -scheduler repository and not part of this repository. That plugin queries -NVML at registration and publishes the per-GPU MIG profile capacity -(`migProfiles` inside each device entry of `hami.io/node-nvidia-register`); -the scheduler never queries hardware and reads profile capacity from the -annotation instead. This plugin mirrors the model on the AMD side: it -discovers the profiles from AMD SMI at registration and publishes them per -whole GPU under `custominfo.partitionProfiles`, one entry per profile with -`profile_index`, partition type, memory caps, partition count and XCC per -partition. - -The difference from MIG is the switching cadence, not the idle requirement: -changing either a MIG mode or an AMD partition profile requires an idle GPU -(HAMi's NVIDIA plugin start-up refuses to reset MIG-enabled GPUs that still -have running allocations). MIG mode enablement is a one-time node-level -operation at plugin start-up that resets the GPU; afterwards MIG instances -are carved on demand from the fixed NVML profile menu. An AMD compute partition switch -is per-GPU and takes effect live - the XCP devices appear without a reset - -while a memory partition switch requires a node-wide amdgpu driver reload. In -both cases the stored profiles are the static menu of what the silicon can -do, and the annotation carries the current mode (the device entries -themselves, with their `Mode` and `partitionProfile` fields) next to the -modes the GPU can be switched to (`custominfo.partitionProfiles`). -Allocation state stays where HAMi keeps it for every device: in the pod -annotations, as XCP device IDs for hard partitions and as +Profile data is stored in this plugin's register annotation +(`hami.io/node-amd-register`), in the same shape HAMi's NVIDIA device plugin +uses for MIG profiles (that plugin lives in the Project-HAMi/HAMi scheduler +repository, not here). It queries NVML at registration and publishes per-GPU +MIG profile capacity as `migProfiles` inside each device entry of +`hami.io/node-nvidia-register`; the scheduler reads the annotation and never +queries hardware. This plugin does the same on the AMD side: it discovers the +profiles from AMD SMI at registration and publishes them per whole GPU under +`custominfo.partitionProfiles`, one entry per profile with `profile_index`, +partition type, memory caps, partition count and XCC per partition. + +Both MIG and AMD partition switching require an idle GPU. HAMi's NVIDIA +plugin start-up refuses to reset MIG-enabled GPUs that still have running +allocations, and the AMD SMI setter rejects the switch when workloads are +running. What differs is when switching happens and what it costs: + +- MIG: enablement is a one-time node-level operation at plugin start-up and + resets the GPU; afterwards instances are carved on demand from the fixed + NVML profile menu. +- AMD: a compute partition switch is per-GPU and live - the XCP devices + appear without a reset; a memory partition switch requires a node-wide + amdgpu driver reload. + +In both cases the stored profiles are a static menu of what the silicon can +do. The annotation carries the current mode (the device entries themselves, +with their `Mode` and `partitionProfile` fields) alongside the modes the GPU +can be switched to (`custominfo.partitionProfiles`). Allocation state stays +in the pod annotations, as XCP device IDs for hard partitions and `hami.io/amd-cu-allocated` CU ranges in soft mode. +### Memory partitions are not an allocation mechanism + +Memory partitions (NPS1/NPS2/NPS4/NPS8) are a NUMA-domain knob: they control +how the GPU's memory is interleaved across NUMA nodes at the system level, +not which pods get which bytes. They are fixed at boot (BIOS/PSP) and +changing them requires an amdgpu driver reload that resets the device nodes +of every GPU on the node. + +HAMi does not read or change the memory partition. Per-pod memory limits are +enforced in software (`HIP_DEVICE_MEMORY_LIMIT` and the `libamvgpu.so` +hook), so the NPS mode has no effect on what the scheduler can allocate. +The allocation-relevant memory number is the per-XCP slice described above, +derived at plugin start from the whole-GPU capacity and the current +partition count. + +Using memory partitions for scheduling would only make sense if workloads +needed OS-level NUMA locality per partition (NPS2 halves the NUMA node +size). For HAMi's slicing model that benefit is rarely worth the cost - a +boot-time setting and a node-wide driver reload to change - so the plugin +treats NPS as a fixed node property. + ## Memory-isolation compatibility CU isolation and device visibility use ROCr interfaces and are independent of the workload image's libc. Fractional-memory enforcement is different: it depends on loading `/usr/local/vgpu/libamvgpu.so` through glibc `LD_AUDIT`. diff --git a/testdata/amdsmi-topology-mi355x.json b/testdata/amdsmi-topology-mi355x.json new file mode 100644 index 00000000..79b77684 --- /dev/null +++ b/testdata/amdsmi-topology-mi355x.json @@ -0,0 +1,882 @@ +[ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + } + ] + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "XGMI", + "num_hops": 1, + "bandwidth": "64000-64000", + "coherent": "C", + "atomics": "64,32", + "dma": "T", + "bi_dir": "T" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "weight": 0, + "link_status": "ENABLED", + "link_type": "SELF", + "num_hops": 0, + "bandwidth": "N/A", + "coherent": "SELF", + "atomics": "SELF", + "dma": "SELF", + "bi_dir": "SELF" + } + ] + } +] diff --git a/testdata/amdsmi-xgmi-mi355x.json b/testdata/amdsmi-xgmi-mi355x.json new file mode 100644 index 00000000..a9ac1e81 --- /dev/null +++ b/testdata/amdsmi-xgmi-mi355x.json @@ -0,0 +1,976 @@ +{ + "xgmi_metric": [ + [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 17933, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 17936, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35721, + "unit": "KB" + }, + "write": { + "value": 17853, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17926, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17929, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17930, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35856, + "unit": "KB" + }, + "write": { + "value": 17929, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17837, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17932, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 35881, + "unit": "KB" + }, + "write": { + "value": 17947, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17935, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35880, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17870, + "unit": "KB" + }, + "write": { + "value": 17874, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17939, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 35867, + "unit": "KB" + }, + "write": { + "value": 17923, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 17939, + "unit": "KB" + }, + "write": { + "value": 17945, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 17935, + "unit": "KB" + }, + "write": { + "value": 17936, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 35866, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 17944, + "unit": "KB" + }, + "write": { + "value": 17934, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 17870, + "unit": "KB" + }, + "write": { + "value": 17871, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17861, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17928, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17933, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 35846, + "unit": "KB" + }, + "write": { + "value": 17945, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17842, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17942, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17938, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17930, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17929, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17937, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17870, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17944, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17923, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17941, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": "N/A", + "write": "N/A" + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17940, + "unit": "KB" + } + } + ] + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "link_metrics": { + "bit_rate": { + "value": 38, + "unit": "Gb/s" + }, + "max_bandwidth": { + "value": 608, + "unit": "Gb/s" + }, + "link_type": "XGMI", + "links": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17930, + "unit": "KB" + } + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17932, + "unit": "KB" + } + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17939, + "unit": "KB" + } + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17870, + "unit": "KB" + } + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "read": { + "value": 17937, + "unit": "KB" + }, + "write": { + "value": 17921, + "unit": "KB" + } + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "read": { + "value": 0, + "unit": "KB" + }, + "write": { + "value": 17953, + "unit": "KB" + } + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "read": { + "value": 35880, + "unit": "KB" + }, + "write": { + "value": 17932, + "unit": "KB" + } + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "read": "N/A", + "write": "N/A" + } + ] + } + } + ] + ], + "link_status": [ + { + "gpu": 0, + "bdf": "0000:05:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 1, + "bdf": "0000:15:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 2, + "bdf": "0000:65:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 3, + "bdf": "0000:75:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 4, + "bdf": "0000:85:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 5, + "bdf": "0000:95:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 6, + "bdf": "0000:e5:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + }, + { + "gpu": 7, + "bdf": "0000:f5:00.0", + "link_status": [ + "X", + "U", + "U", + "U", + "U", + "U", + "U", + "U" + ] + } + ] +} diff --git a/testdata/sysfs-mi355x-spx/README.md b/testdata/sysfs-mi355x-spx/README.md index 9bfacc75..1eff3652 100644 --- a/testdata/sysfs-mi355x-spx/README.md +++ b/testdata/sysfs-mi355x-spx/README.md @@ -20,6 +20,10 @@ Sibling fixtures with the same node's data: from the node register annotation, market names from amd-smi static). - amdsmi-static-mi355x.json: raw `amd-smi static --json` output (asic serial, vram, clocks, RAS, xgmi links). +- amdsmi-xgmi-mi355x.json: raw `amd-smi xgmi --json` output (per-GPU xGMI + link metrics). +- amdsmi-topology-mi355x.json: raw `amd-smi topology --json` output (per-GPU + link matrix with weights, hops, bandwidth and coherence). - amdsmi-partition-mi355x.json: raw `amd-smi partition --json` output (current memory/compute partition per GPU, partition profiles and resources). - amdsmi-partition-m-mi355x.json: raw `amd-smi partition -m --json` output From 85bd2efc1a01b835ab83e9364927d88530449d14 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 11:22:52 +0800 Subject: [PATCH 08/12] amdgpu, plugin: boot-time partition template catalog in memory Generate a per-GPU catalog of valid compute partition x NPS combinations with the NPS->physical memory count table at plugin Start() (gfx950: spx/dpx/qpx x nps1/4/8). Held in memory only, never written to disk (immutable-OS friendly); complementable later by HAMi default templates. Signed-off-by: Reza Jelveh --- internal/pkg/amdgpu/amdsmi.go | 76 +++++++++- internal/pkg/amdgpu/partition_templates.go | 141 ++++++++++++++++++ .../pkg/amdgpu/partition_templates_test.go | 35 +++++ internal/pkg/plugin/plugin.go | 16 ++ 4 files changed, 262 insertions(+), 6 deletions(-) create mode 100644 internal/pkg/amdgpu/partition_templates.go create mode 100644 internal/pkg/amdgpu/partition_templates_test.go diff --git a/internal/pkg/amdgpu/amdsmi.go b/internal/pkg/amdgpu/amdsmi.go index 51e86cef..3667e211 100644 --- a/internal/pkg/amdgpu/amdsmi.go +++ b/internal/pkg/amdgpu/amdsmi.go @@ -121,10 +121,64 @@ import ( var amdSMIMu sync.Mutex -// GetAMDSMIUUIDs resolves AMD SMI UUIDs by PCI BDF. AMD SMI initialization is -// process-global, so calls are serialized and always balanced with shut_down. -// An individual BDF failure does not discard UUIDs obtained for other devices. +// amdSMICache serves AMD SMI lookups that are static per card layout (device +// UUID, product name, partition profiles): the first call fetches and stores +// them, later calls serve the cache and only fetch BDFs never seen before +// (e.g. a GPU hotplugged after boot). The current memory partition is NOT +// cached: it changes with the partition configuration. +type amdSMICache[T any] struct { + mu sync.Mutex + data map[string]T + fetcher func([]string) (map[string]T, error) +} + +func newAMDSCache[T any](fetcher func([]string) (map[string]T, error)) *amdSMICache[T] { + return &amdSMICache[T]{data: make(map[string]T), fetcher: fetcher} +} + +func (c *amdSMICache[T]) Get(bdfs []string) (map[string]T, error) { + c.mu.Lock() + defer c.mu.Unlock() + missing := make([]string, 0, len(bdfs)) + for _, bdf := range bdfs { + if _, ok := c.data[bdf]; !ok { + missing = append(missing, bdf) + } + } + if len(missing) > 0 { + fresh, err := c.fetcher(missing) + for k, v := range fresh { + c.data[k] = v + } + if err != nil { + // Keep what succeeded; retry the failures on the next call. + return c.data, err + } + } + out := make(map[string]T, len(bdfs)) + for _, bdf := range bdfs { + if v, ok := c.data[bdf]; ok { + out[bdf] = v + } + } + return out, nil +} + +var ( + amdSMICUUIDs = newAMDSCache(fetchAMDSUUIDs) + amdSMIProduct = newAMDSCache(fetchAMDSMIProductNames) + amdSMIPartitions = newAMDSCache(fetchAMDGPUPartitionProfiles) +) + +// GetAMDSMIUUIDs resolves AMD SMI UUIDs by PCI BDF, cached after the first +// call. AMD SMI initialization is process-global, so calls are serialized and +// always balanced with shut_down. An individual BDF failure does not discard +// UUIDs obtained for other devices. func GetAMDSMIUUIDs(bdfs []string) (map[string]string, error) { + return amdSMICUUIDs.Get(bdfs) +} + +func fetchAMDSUUIDs(bdfs []string) (map[string]string, error) { amdSMIMu.Lock() defer amdSMIMu.Unlock() @@ -163,9 +217,14 @@ func GetAMDSMIUUIDs(bdfs []string) (map[string]string, error) { return uuidByBDF, nil } -// GetAMDSMIProductNames resolves the AMD SMI ASIC market_name by PCI BDF. -// This is the user-facing product name reported in DeviceInfo.Type. +// GetAMDSMIProductNames resolves the AMD SMI ASIC market_name by PCI BDF, +// cached after the first call. This is the user-facing product name reported +// in DeviceInfo.Type. func GetAMDSMIProductNames(bdfs []string) (map[string]string, error) { + return amdSMIProduct.Get(bdfs) +} + +func fetchAMDSMIProductNames(bdfs []string) (map[string]string, error) { amdSMIMu.Lock() defer amdSMIMu.Unlock() @@ -253,8 +312,13 @@ type PartitionProfile struct { } // GetAMDGPUPartitionProfiles resolves the accelerator partition profiles each -// GPU supports (SPX/DPX/QPX/CPX with partition counts), keyed by BDF. +// GPU supports (SPX/DPX/QPX/CPX with partition counts), keyed by BDF. The +// profile list is static per card, so it is cached after the first call. func GetAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, error) { + return amdSMIPartitions.Get(bdfs) +} + +func fetchAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, error) { amdSMIMu.Lock() defer amdSMIMu.Unlock() diff --git a/internal/pkg/amdgpu/partition_templates.go b/internal/pkg/amdgpu/partition_templates.go new file mode 100644 index 00000000..c47593d7 --- /dev/null +++ b/internal/pkg/amdgpu/partition_templates.go @@ -0,0 +1,141 @@ +package amdgpu + +import ( + "fmt" + "strings" + + "github.com/golang/glog" +) + +// PartitionTemplate is one apply-ready combination for a GPU: the compute +// partition style, the NPS memory mode, and the physical memory partition +// count that mode exposes (1/4/8 HBM stacks on gfx950-class cards). +type PartitionTemplate struct { + Compute string `json:"computePartition"` + Memory string `json:"memoryPartition"` + PhysicalMemory int `json:"physicalMemory"` + Current bool `json:"current"` +} + +// DevicePartitionTemplates is the boot-time template catalog for one GPU. +type DevicePartitionTemplates struct { + BDF string `json:"bdf"` + Product string `json:"product"` + CurrentComputePartition string `json:"currentComputePartition"` + CurrentMemoryPartition string `json:"currentMemoryPartition"` + CurrentPhysicalMemory int `json:"currentPhysicalMemory"` + NumANode int `json:"numaNode"` + CUCount int32 `json:"cuCount"` + VRAMMiB int32 `json:"vramMiB"` + Templates []PartitionTemplate `json:"templates"` +} + +// NPSMemoryTable maps the physical memory partition count each NPS mode +// exposes, per product family. This is the lookup table used to translate an +// NPS mode into memory domains for scheduling and Allocate. +// ponytail: counts are for the MI300/MI355 class; add new families here +// before scheduling a new generation. +var NPSMemoryTable = map[string]map[string]int{ + "gfx950": {"nps1": 1, "nps4": 4, "nps8": 8}, + "gfx942": {"nps1": 1, "nps4": 4, "nps8": 8}, + "gfx90a": {"nps1": 1, "nps2": 2, "nps4": 4}, +} + +// partitionCombos lists the valid compute x memory combinations per family. +// Compute styles: spx (single), dpx (dual), qpx (quad partition). +// ponytail: firmware-gated; unlisted combos simply get no template. +var partitionCombos = map[string][]struct { + Compute, Memory string +}{ + "gfx950": { + {"spx", "nps1"}, {"spx", "nps4"}, {"spx", "nps8"}, + {"dpx", "nps1"}, {"dpx", "nps4"}, + {"qpx", "nps1"}, + }, + "gfx942": { + {"spx", "nps1"}, {"spx", "nps4"}, {"spx", "nps8"}, + {"dpx", "nps1"}, {"dpx", "nps4"}, + {"qpx", "nps1"}, + }, + "gfx90a": { + {"spx", "nps1"}, {"spx", "nps2"}, {"spx", "nps4"}, + {"dpx", "nps1"}, {"dpx", "nps2"}, + }, +} + +func familyFromProduct(product string) string { + p := strings.ToLower(product) + switch { + case strings.Contains(p, "mi355"), strings.Contains(p, "gfx950"): + return "gfx950" + case strings.Contains(p, "mi300"), strings.Contains(p, "gfx942"): + return "gfx942" + case strings.Contains(p, "mi210"), strings.Contains(p, "mi250"), strings.Contains(p, "gfx90a"): + return "gfx90a" + } + // ponytail: unknown products default to the gfx950 table; add the family + // above before scheduling a new generation. + return "gfx950" +} + +// GeneratePartitionTemplates builds the per-card template catalog from live +// sysfs partition state and the product-family tables. Each card gets one +// entry per valid combination, with the currently active one flagged. +func GeneratePartitionTemplates() ([]DevicePartitionTemplates, error) { + gpus := GetAMDGPUs() + bdfs := make([]string, 0, len(gpus)) + for _, data := range gpus { + if bdf, ok := data["devID"].(string); ok { + bdfs = append(bdfs, bdf) + } + } + products, err := GetAMDSMIProductNames(bdfs) + if err != nil { + glog.Warningf("AMD SMI product lookup incomplete; templates fall back to family defaults: %v", err) + } + + var out []DevicePartitionTemplates + for key, data := range gpus { + compute, _ := data["computePartitionType"].(string) + memory, _ := data["memoryPartitionType"].(string) + if compute == "" { + compute = "spx" + } + if memory == "" { + memory = "nps1" + } + product := "" + if bdf, ok := data["devID"].(string); ok { + product = products[strings.ToLower(bdf)] + } + family := familyFromProduct(product) + memoryTable := NPSMemoryTable[family] + combos := partitionCombos[family] + + card, _ := data["card"].(int) + numa, _ := data["numaNode"].(int) + capacity, _ := GetDeviceCapacity(fmt.Sprintf("card%d", card)) + + entry := DevicePartitionTemplates{ + BDF: key, + Product: product, + CurrentComputePartition: compute, + CurrentMemoryPartition: memory, + CurrentPhysicalMemory: memoryTable[memory], + NumANode: numa, + CUCount: capacity.CUCount, + VRAMMiB: capacity.VRAMMiB, + } + for _, combo := range combos { + entry.Templates = append(entry.Templates, PartitionTemplate{ + Compute: combo.Compute, + Memory: combo.Memory, + PhysicalMemory: memoryTable[combo.Memory], + Current: combo.Compute == compute && combo.Memory == memory, + }) + } + out = append(out, entry) + } + return out, nil +} + diff --git a/internal/pkg/amdgpu/partition_templates_test.go b/internal/pkg/amdgpu/partition_templates_test.go new file mode 100644 index 00000000..6051e626 --- /dev/null +++ b/internal/pkg/amdgpu/partition_templates_test.go @@ -0,0 +1,35 @@ +package amdgpu + +import "testing" + +func TestFamilyFromProduct(t *testing.T) { + cases := map[string]string{ + "AMD Instinct MI355X": "gfx950", + "AMD Instinct MI300X": "gfx942", + "AMD Instinct MI210": "gfx90a", + "AMD Instinct MI250": "gfx90a", + "unknown vendor part": "gfx950", + } + for product, want := range cases { + if got := familyFromProduct(product); got != want { + t.Errorf("familyFromProduct(%q) = %q, want %q", product, got, want) + } + } +} + +// Every combo's memory mode must have a physical count in the NPS table. +func TestCombosResolveInNPSMemoryTable(t *testing.T) { + for family, combos := range partitionCombos { + table := NPSMemoryTable[family] + if table == nil { + t.Errorf("family %q missing from NPSMemoryTable", family) + continue + } + for _, combo := range combos { + if table[combo.Memory] == 0 { + t.Errorf("family %q combo %s/%s: memory mode %q missing from NPSMemoryTable", + family, combo.Compute, combo.Memory, combo.Memory) + } + } + } +} diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index 7198174d..5135ee71 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -99,6 +99,10 @@ type AMDGPUPlugin struct { // keys). Upstream HAMi invents flat "AMDGPU-" device ids over node // capacity; device i resolves to GPU sortedBDFs[i/defaultSplitCount]. sortedBDFs []string + // partitionTemplates is the boot-time catalog of compute x NPS + // combinations per card, with the NPS->physical memory lookup applied. + // Held in memory only; never written to disk (immutable-OS friendly). + partitionTemplates []amdgpu.DevicePartitionTemplates // bdfToROCrUUID maps a topology key to its ROCr UUID, for resolving // whole-GPU allocations from kubelet device ids. bdfToROCrUUID map[string]string @@ -186,6 +190,18 @@ func (p *AMDGPUPlugin) Start() error { return fmt.Errorf("initialize device cache: %w", err) } + // Boot-time partition template catalog: per card, the valid compute x NPS + // combinations and the NPS->physical-memory lookup. In-memory only; + // regenerated on every boot. + p.partitionTemplates, err = amdgpu.GeneratePartitionTemplates() + if err != nil { + glog.Warningf("partition template generation failed: %v", err) + } + for _, t := range p.partitionTemplates { + glog.Infof("partition templates for %s (%s): current %s/%s physicalMemory=%d, %d combos", + t.BDF, t.Product, t.CurrentComputePartition, t.CurrentMemoryPartition, t.CurrentPhysicalMemory, len(t.Templates)) + } + return nil } From 3c2ab6957a6ee72e169308d6f99fec8a20edcabc Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 11:23:02 +0800 Subject: [PATCH 09/12] plugin: register spx whole GPUs, tolerate stale kubelet ids in GPA MI355X (gfx950) admission fixes: - isSchedulableTopologyKey: spx/dpx/qpx whole GPUs have no amdgpu_xcp_ children in KFD topology and keep their own DRI card, so they register. Only XCP parents (BDF with amdgpu_xcp_ children) are skipped. Previously all 8 GPUs were skipped, leaving zero registered devices, an empty sortedBDFs, and Allocate unable to resolve upstream AMDGPU- ids. - GetPreferredAllocation: kubelet passes checkpoint-persisted ids (bare BDFs from the pre-fork plugin) that the split-keyed allocator cannot map. GPA is advisory and Allocate resolves the pod annotation, so echo kubelet's own ids instead of failing admission. Signed-off-by: Reza Jelveh --- internal/pkg/plugin/plugin.go | 66 +++++++++++++++++++++--------- internal/pkg/plugin/plugin_test.go | 24 ++++++----- 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index 5135ee71..243f727e 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -232,14 +232,29 @@ func (p *AMDGPUPlugin) RegisterInAnnotation() error { return err } -// isSchedulableTopologyKey: a partitioned GPU parent has no capacity of its -// own and never registers. -func isSchedulableTopologyKey(key string, deviceData map[string]interface{}) bool { - if !strings.HasPrefix(key, "amdgpu_xcp_") { - computePartitionType, _ := deviceData["computePartitionType"].(string) - return computePartitionType == "" +// isSchedulableTopologyKey: XCP partitions always register. A whole-GPU key +// is unschedulable only when it is an XCP parent (its BDF has amdgpu_xcp_ +// children). gfx950 spx/dpx/qpx whole GPUs have no KFD children and keep +// their own card, so they register normally. +func isSchedulableTopologyKey(key string, deviceData map[string]interface{}, xcpChildren map[string]int) bool { + if strings.HasPrefix(key, "amdgpu_xcp_") { + return true } - return true + bdf, _ := deviceData["devID"].(string) + return xcpChildren[bdf] == 0 +} + +// xcpChildrenByBDF counts amdgpu_xcp_ partition entries per parent PCI BDF. +func xcpChildrenByBDF(devices map[string]map[string]interface{}) map[string]int { + children := make(map[string]int) + for key, d := range devices { + if strings.HasPrefix(key, "amdgpu_xcp_") { + if bdf, ok := d["devID"].(string); ok && bdf != "" { + children[bdf]++ + } + } + } + return children } // Registers the whole-partition form of an XCP entry; the soft entry stays @@ -282,15 +297,12 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { // Whole-GPU capacity is read once per GPU through libdrm. XCP partitions // share their parent's PCI BDF and get an even share of that capacity. wholeCardByBDF := make(map[string]int) - xcpCountByBDF := make(map[string]int) + xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) for key, deviceData := range p.AMDGPUs { - bdf, _ := deviceData["devID"].(string) - if bdf == "" { + if strings.HasPrefix(key, "amdgpu_xcp_") { continue } - if strings.HasPrefix(key, "amdgpu_xcp_") { - xcpCountByBDF[bdf]++ - } else { + if bdf, ok := deviceData["devID"].(string); ok && bdf != "" { wholeCardByBDF[bdf], _ = deviceData["card"].(int) } } @@ -315,6 +327,7 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { p.rocrUUIDToTopology = make(map[string]string, len(p.AMDGPUs)) p.sortedBDFs = make([]string, 0, len(p.AMDGPUs)) p.bdfToROCrUUID = make(map[string]string, len(p.AMDGPUs)) + glog.Infof("topology keys registered: %v", keys) // Resolve a stable per-device UUID through the AMD SMI C API for whole // GPUs. XCP partitions share the parent PCI BDF, so the BDF-keyed AMD SMI @@ -347,7 +360,7 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { out := make([]*utils.DeviceInfo, 0, len(keys)*2) for _, key := range keys { deviceData := p.AMDGPUs[key] - if !isSchedulableTopologyKey(key, deviceData) { + if !isSchedulableTopologyKey(key, deviceData, xcpCountByBDF) { glog.Infof("skip topology entry %s (no allocatable capacity)", key) continue } @@ -512,9 +525,10 @@ func hardKubeletDeviceID(key string, deviceData map[string]interface{}) string { func (p *AMDGPUPlugin) getDevices() []*allocator.Device { devices := amdgpu.GetAMDGPUs() var deviceList []*allocator.Device + xcpCountByBDF := xcpChildrenByBDF(devices) for id, deviceData := range devices { - if !isSchedulableTopologyKey(id, deviceData) { + if !isSchedulableTopologyKey(id, deviceData, xcpCountByBDF) { continue } for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { @@ -712,8 +726,9 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin if isHomogeneous { // limit scope for hwloc func() { + xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) for id, device := range p.AMDGPUs { - if !isSchedulableTopologyKey(id, device) { + if !isSchedulableTopologyKey(id, device, xcpCountByBDF) { continue } devs = append(devs, p.kubeletDevicesFor(id, device)...) @@ -723,8 +738,9 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin s.Send(&pluginapi.ListAndWatchResponse{Devices: devs}) } else { func() { + xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) for id, device := range p.AMDGPUs { - if !isSchedulableTopologyKey(id, device) { + if !isSchedulableTopologyKey(id, device, xcpCountByBDF) { continue } partitionType := device["computePartitionType"].(string) + "_" + device["memoryPartitionType"].(string) @@ -784,8 +800,18 @@ func (p *AMDGPUPlugin) GetPreferredAllocation(ctx context.Context, req *pluginap glog.Infof("GetPreferredAllocation: available=%v must=%v size=%d", req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, req.AllocationSize) allocated_ids, err := p.devAllocator.Allocate(req.AvailableDeviceIDs, req.MustIncludeDeviceIDs, int(req.AllocationSize)) if err != nil { - glog.Errorf("unable to get preferred allocation list. Error:%v", err) - return nil, fmt.Errorf("unable to get preferred allocation list. Error:%v", err) + // kubelet passes its checkpoint-persisted ids (bare BDFs from the + // pre-fork plugin), which the split-keyed allocator cannot map. + // GPA is advisory; Allocate resolves the pod annotation, so echo + // kubelet's own ids instead of failing admission. + glog.Warningf("preferred allocation failed (%v); echoing kubelet device ids", err) + allocated_ids = req.MustIncludeDeviceIDs + for _, id := range req.AvailableDeviceIDs { + if len(allocated_ids) >= int(req.AllocationSize) { + break + } + allocated_ids = append(allocated_ids, id) + } } resp := &pluginapi.ContainerPreferredAllocationResponse{ DeviceIDs: allocated_ids, @@ -828,10 +854,12 @@ func (p *AMDGPUPlugin) deviceDataFromAllocationUUID(uuid, _ string) (map[string] if i := parseAMDGPUIndex(uuid); i >= 0 { // Upstream HAMi device i is the i-th split slot in registration order. gpuIdx := i / defaultSplitCount + glog.Infof("resolving upstream AMDGPU id %s: index=%d gpuIdx=%d splitCount=%d sortedBDFs=%d", uuid, i, gpuIdx, defaultSplitCount, len(p.sortedBDFs)) if gpuIdx < len(p.sortedBDFs) { if d, found := p.AMDGPUs[p.sortedBDFs[gpuIdx]]; found { return d, nil } + glog.Infof("resolved gpuIdx %d -> %s but missing from AMDGPUs", gpuIdx, p.sortedBDFs[gpuIdx]) } } return nil, fmt.Errorf("no local GPU topology entry for device id %q", uuid) diff --git a/internal/pkg/plugin/plugin_test.go b/internal/pkg/plugin/plugin_test.go index 29327111..2df511e8 100644 --- a/internal/pkg/plugin/plugin_test.go +++ b/internal/pkg/plugin/plugin_test.go @@ -166,21 +166,23 @@ func assertAllocationWord(t *testing.T, allocations map[string]cuallocation.Allo } func TestIsSchedulableTopologyKey(t *testing.T) { - wholeGPU := map[string]interface{}{"computePartitionType": "spx", "memoryPartitionType": "nps1"} - partitionedParent := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} - noPartition := map[string]interface{}{"computePartitionType": "", "memoryPartitionType": ""} - xcp := map[string]interface{}{"computePartitionType": "cpx", "memoryPartitionType": "nps1"} - - if !isSchedulableTopologyKey("amdgpu_xcp_30", xcp) { + wholeGPU := map[string]interface{}{"devID": "0000:05:00.0", "computePartitionType": "spx", "memoryPartitionType": "nps1"} + partitionedParent := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "cpx", "memoryPartitionType": "nps1"} + noPartition := map[string]interface{}{"devID": "0000:75:00.0", "computePartitionType": "", "memoryPartitionType": ""} + xcp := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "cpx", "memoryPartitionType": "nps1"} + withChildren := xcpChildrenByBDF(map[string]map[string]interface{}{"amdgpu_xcp_30": xcp}) + withoutChildren := xcpChildrenByBDF(map[string]map[string]interface{}{"0000:05:00.0": wholeGPU}) + + if !isSchedulableTopologyKey("amdgpu_xcp_30", xcp, withChildren) { t.Error("XCP partition should be schedulable") } - if isSchedulableTopologyKey("0000:05:00.0", wholeGPU) { - t.Error("SPX-partitioned GPU parent has no capacity and must be skipped") + if !isSchedulableTopologyKey("0000:05:00.0", wholeGPU, withoutChildren) { + t.Error("SPX whole GPU with no XCP children should be schedulable (gfx950)") } - if isSchedulableTopologyKey("0000:15:00.0", partitionedParent) { - t.Error("partitioned GPU parent has no capacity and must be skipped") + if isSchedulableTopologyKey("0000:15:00.0", partitionedParent, withChildren) { + t.Error("XCP parent whose BDF has partition children has no capacity and must be skipped") } - if !isSchedulableTopologyKey("0000:75:00.0", noPartition) { + if !isSchedulableTopologyKey("0000:75:00.0", noPartition, withoutChildren) { t.Error("GPU without partition support should be schedulable") } } From 9096b6ae6b191d30286c18a3c40fca69c37efeec Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 14:57:03 +0800 Subject: [PATCH 10/12] feat(partitioning): operating-mode switch and API-driven compute partition flip Per-node operating mode (NVIDIA mig.config-style), defaulting to cu: - dp.operatingMode chart value / OPERATING_MODE env, overridable per node via the hami.io/amd-operating-mode annotation: "cu" registers soft whole-GPU devices (Count 10, unchanged behavior); "partition" registers hard compute partitions (id#mode, Count 1) and publishes only hard entries to kubelet. - dp.computePartition / COMPUTE_PARTITION env, overridable via hami.io/amd-compute-partition: in partition mode the plugin flips every GPU to the target profile through amdsmi_set_gpu_accelerator_partition_profile at startup; no manual amd-smi on the node. Busy GPUs fail (status 30) and keep their current mode. - XCP capacity divisor now uses the AMD SMI profile NumPartitions of the current compute type instead of amdgpu_xcp_ child counts (7 XCD chiplets per GPU regardless of partition mode). - Docs: configuration.md operating-mode section, new mi355x-partitioning.md (kernel caveats, verification), QPX example at example/vllm-qpx-serve/ (deployment with gpumem/gpucores requests, HAMi device-config amd section, README). Signed-off-by: Reza Jelveh --- docs/user-guide/configuration.md | 29 +++ docs/user-guide/mi355x-partitioning.md | 73 +++++++ example/vllm-qpx-serve/README.md | 52 +++++ example/vllm-qpx-serve/deployment.yaml | 63 ++++++ example/vllm-qpx-serve/device-config.yaml | 27 +++ example/vllm-qpx-serve/hf_token.yaml | 8 + example/vllm-qpx-serve/service.yaml | 15 ++ .../templates/deviceplugin-daemonset.yaml | 4 + helm/amd-gpu/values.yaml | 18 +- internal/pkg/amdgpu/amdsmi.go | 122 ++++++++++-- internal/pkg/plugin/plugin.go | 183 +++++++++++++----- internal/pkg/plugin/plugin_test.go | 169 ++++++++++------ 12 files changed, 630 insertions(+), 133 deletions(-) create mode 100644 docs/user-guide/mi355x-partitioning.md create mode 100644 example/vllm-qpx-serve/README.md create mode 100644 example/vllm-qpx-serve/deployment.yaml create mode 100644 example/vllm-qpx-serve/device-config.yaml create mode 100644 example/vllm-qpx-serve/hf_token.yaml create mode 100644 example/vllm-qpx-serve/service.yaml diff --git a/docs/user-guide/configuration.md b/docs/user-guide/configuration.md index d7aace5f..6f00f922 100644 --- a/docs/user-guide/configuration.md +++ b/docs/user-guide/configuration.md @@ -9,6 +9,35 @@ The device plugin can be configured using the following environment variables: | Environment Variable | Type | Default | Description | |-----|------|---------|-------------| | `AMD_GPU_DEVICE_COUNT` | Integer | Auto-detected | Number of AMD GPUs available on the node | +| `OPERATING_MODE` | String | `cu` | Registration mode: `cu` (soft whole-GPU + CU slices) or `partition` (hard compute partitions). Overridable per node via the `hami.io/amd-operating-mode` node annotation. | + +## Operating Modes + +The plugin registers AMD GPUs in one of two modes: + +- **cu mode (default)**: each whole GPU registers as a soft device (default + split count, `Mode` empty) and is sliced by CU and memory. This is the + historical HAMi behavior. +- **partition mode**: devices register as hard compute partitions with a + `#` suffix (`GPU-xxx#spx`, `GPU-xxx#qpx`), `Mode` set to the + partition type and `Count: 1`. The kubelet-facing device list publishes + only the hard entries (no soft splits). Whole GPUs with more than one + partition (dpx/qpx/cpx) are replaced by their `amdgpu_xcp_*` partitions; + single-partition (spx) whole GPUs register as one hard device. + +Mode resolution, lowest to highest precedence: + +1. Default `cu` when nothing is set. +2. `OPERATING_MODE` environment variable (chart value `dp.operatingMode`). +3. The `hami.io/amd-operating-mode` node annotation, which overrides the env + per node (the NVIDIA `nvidia.com/mig.config` pattern). + +The annotation is read once at plugin start; changing it requires a plugin +pod restart. The plugin logs the resolved mode as `operating mode: `. + +Partition counts are per GPU: `amd-smi set -g --compute-partition qpx` +flips a single GPU; mix spx and qpx GPUs on one node. See +[MI355X Partitioning](mi355x-partitioning.md) for kernel caveats. ### Why Limit GPU Exposure? diff --git a/docs/user-guide/mi355x-partitioning.md b/docs/user-guide/mi355x-partitioning.md new file mode 100644 index 00000000..42b7b449 --- /dev/null +++ b/docs/user-guide/mi355x-partitioning.md @@ -0,0 +1,73 @@ +# MI355X (gfx950) Partitioning + +The MI355X splits into hardware compute partitions with `amd-smi set`: + +| Profile | Partitions per GPU | CUs per partition | Mode suffix | +|---------|--------------------|-------------------|-------------| +| spx | 1 | 256 | `#spx` | +| dpx | 2 | 128 | `#dpx` | +| qpx | 4 | 64 | `#qpx` | +| cpx | 8 | 32 | `#cpx` | + +Each GPU has 256 CUs and 294896 MiB of VRAM (288 GB). Partition mode +requires the plugin's `partition` operating mode; see +[Configuration](configuration.md#operating-modes). + +## Registration by kernel + +Whether the plugin registers whole GPUs or `amdgpu_xcp_*` partitions depends +on the kernel's KFD topology, not on the plugin: + +- **Kernels whose KFD topology exposes XCP render minors** (the platform + devices under `/sys/devices/platform/amdgpu_xcp_*` have `renderD` minors + listed in `/sys/class/kfd/kfd/topology/nodes`): each partition registers + as a hard `#` device with an even share of VRAM and CUs (qpx: 4 + devices of 73728 MiB and 64 CUs per GPU). This is the full XCP path. +- **Kernels without XCP render minors in KFD topology** (observed on + kernel 6.8.0-136 in spx mode): the plugin's KFD-validity gates drop every + `amdgpu_xcp_*` entry. Only the 8 whole-GPU nodes register. Note that the + KFD topology changes after a hardware partition flip: on 6.8.0-136, after + the plugin flips a GPU to qpx, the XGMI reset re-probes KFD and 3 of the 4 + partition nodes per GPU appear (21 XCP entries for 7 qpx GPUs, verified + live). The missing 4th node is dropped by the same render-minor gate. + Additionally, the partitions of one GPU share a single ROCr unique_id on + this kernel, so the scheduler sees 3 devices with one ID and can only + allocate one partition per GPU safely; distinct per-partition unique_ids + need a kernel/driver that reports them. + +## Known kernel caveat: 6.8.0-136 + +> On 6.8.0-136 the KFD topology lacks XCP render minors, so QPX/DPX nodes +> register one hard whole-GPU `#qpx` entry per GPU (full 256 CU / 294896 MiB +> capacity), not 4 XCP partitions. The registration and capacity math are +> ready for XCPs on a kernel that exposes them; until then a QPX pod +> requesting 64 cores / 73728 MiB still pins one GPU and gets memory- and +> CU-limited correctly. + +The capacity divisor for XCP entries comes from the AMD SMI partition +profile's `NumPartitions` for the current compute type, not from counting +`amdgpu_xcp_*` children (gfx950 exposes 7 XCD chiplets per GPU regardless of +partition mode, so child counts are wrong divisors). + +## Verifying on a node + +```bash +# KFD topology node count and simd counts; XCP partitions appear as nodes +# with simd_count 256 (qpx) and a render node in the same topology. +cat /sys/class/kfd/kfd/topology/nodes/*/properties | grep -E "simd_count|gfx_target_version" + +# Platform partition devices and their render minors: +ls /sys/devices/platform/amdgpu_xcp_*/drm/ + +# Current compute partition per GPU: +amd-smi static -g 0 | grep "Compute Part" + +# Flip one GPU to qpx (per GPU, not per node): +amd-smi set -g 0 --compute-partition qpx +``` + +After a plugin restart, the node annotation +`hami.io/node-amd-register` shows the registered devices: soft entries +(`Count: 10`, empty `Mode`) in cu mode, hard entries (`Count: 1`, `Mode: +qpx`, `#qpx` suffix) in partition mode. The plugin log reports +`operating mode: ` and `ListAndWatch: sending N split devices`. diff --git a/example/vllm-qpx-serve/README.md b/example/vllm-qpx-serve/README.md new file mode 100644 index 00000000..acee0009 --- /dev/null +++ b/example/vllm-qpx-serve/README.md @@ -0,0 +1,52 @@ +# vLLM serving on QPX hard partitions (MI355X) + +QPX splits each MI355X GPU into 4 compute partitions of 64 CUs and +73728 MiB (288 GB / 4). Pods request a whole partition by asking for +the full per-partition memory and core count: + +- `amd.com/gpu: 1` (one partition) +- `amd.com/gpumem: 73728` (MiB, one QPX partition) +- `amd.com/gpucores: 64` (CUs, one QPX partition) + +## Prerequisites + +1. Device plugin in `partition` mode with QPX as the target partition. + The plugin flips the GPUs itself through the AMD SMI API at startup; + no manual `amd-smi set` on the node is needed. Either set the chart + values (`dp.operatingMode: partition`, `dp.computePartition: qpx`), + or per node: + + ``` + kubectl annotate node hami.io/amd-operating-mode=partition + kubectl annotate node hami.io/amd-compute-partition=qpx + kubectl delete pod -n kube-system -l ... # restart the device-plugin pod + ``` + + The annotations override the chart values on that node (the NVIDIA + `nvidia.com/mig.config`-style per-node switch). GPUs with running + workloads fail to flip and keep their current mode; the plugin logs + each per-GPU result and registers whatever mode the hardware is in. + +2. HAMi scheduler device config with the `amd` section (see + device-config.yaml). On kernels whose KFD topology does not expose + amdgpu_xcp_ nodes (e.g. 6.8.0-136), each GPU registers one hard + `#qpx` device instead of 4 XCP partitions; requesting a full + partition still pins one GPU and limits memory and CUs correctly. + +## Deploy + +``` +kubectl apply -f hf_token.yaml +kubectl apply -f deployment.yaml +kubectl apply -f service.yaml +``` + +## Test + +``` +kubectl get svc +curl http://:80/v1/models +curl http://:80/v1/completions \ + -H "Content-Type: application/json" \ + -d '{"model": "mistralai/Mistral-7B-v0.3", "prompt": "San Francisco is a", "max_tokens": 7, "temperature": 0}' +``` diff --git a/example/vllm-qpx-serve/deployment.yaml b/example/vllm-qpx-serve/deployment.yaml new file mode 100644 index 00000000..8ae45390 --- /dev/null +++ b/example/vllm-qpx-serve/deployment.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mistral-7b + namespace: default + labels: + app: mistral-7b +spec: + replicas: 1 + selector: + matchLabels: + app: mistral-7b + template: + metadata: + labels: + app: mistral-7b + spec: + volumes: + # vLLM needs to access the host's shared memory for tensor parallel inference. + - name: shm + emptyDir: + medium: Memory + sizeLimit: "8Gi" + hostNetwork: true + hostIPC: true + containers: + - name: mistral-7b + image: rocm/vllm:rocm6.2_mi300_ubuntu20.04_py3.9_vllm_0.6.4 + securityContext: + seccompProfile: + type: Unconfined + runAsGroup: 44 + capabilities: + add: + - SYS_PTRACE + command: ["/bin/sh", "-c"] + args: [ + "vllm serve mistralai/Mistral-7B-v0.3 --port 8888 --trust-remote-code --enable-chunked-prefill --max_num_batched_tokens 1024" + ] + env: + - name: HUGGING_FACE_HUB_TOKEN + valueFrom: + secretKeyRef: + name: hf-token-secret + key: token + ports: + - containerPort: 8888 + resources: + limits: + cpu: "10" + memory: 20G + amd.com/gpu: "1" + amd.com/gpumem: "73728" + amd.com/gpucores: "64" + requests: + cpu: "6" + memory: 6G + amd.com/gpu: "1" + amd.com/gpumem: "73728" + amd.com/gpucores: "64" + volumeMounts: + - name: shm + mountPath: /dev/shm diff --git a/example/vllm-qpx-serve/device-config.yaml b/example/vllm-qpx-serve/device-config.yaml new file mode 100644 index 00000000..b08d49e9 --- /dev/null +++ b/example/vllm-qpx-serve/device-config.yaml @@ -0,0 +1,27 @@ +# HAMi scheduler device config for QPX mode. +# +# Merge the `amd` block below into the `device-config.yaml` data of the +# kube-system/hami-scheduler-device ConfigMap that the hami chart renders, +# or point the chart at this file, then let the checksummed scheduler +# rollout pick it up: +# +# kubectl edit cm -n kube-system hami-scheduler-device +# # or: kubectl create configmap hami-scheduler-device --from-file=... +# +# The scheduler reads /device-config.yaml from this ConfigMap; changing it +# rolls the hami-scheduler Deployment. +apiVersion: v1 +kind: ConfigMap +metadata: + name: hami-scheduler-device + namespace: kube-system +data: + device-config.yaml: | + version: v1 + amd: + resourceCountName: "amd.com/gpu" + resourceMemoryName: "amd.com/gpumem" + resourceCoreName: "amd.com/gpucores" + deviceSplitCount: 1 + defaultCores: 0 + defaultMemory: 0 diff --git a/example/vllm-qpx-serve/hf_token.yaml b/example/vllm-qpx-serve/hf_token.yaml new file mode 100644 index 00000000..2549ddc0 --- /dev/null +++ b/example/vllm-qpx-serve/hf_token.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: hf-token-secret + namespace: default +type: Opaque +data: + token: "" diff --git a/example/vllm-qpx-serve/service.yaml b/example/vllm-qpx-serve/service.yaml new file mode 100644 index 00000000..36bf15f3 --- /dev/null +++ b/example/vllm-qpx-serve/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: mistral-7b + namespace: default +spec: + ports: + - name: http-mistral-7b + port: 80 + protocol: TCP + targetPort: 8888 + selector: + app: mistral-7b + sessionAffinity: None + type: ClusterIP diff --git a/helm/amd-gpu/templates/deviceplugin-daemonset.yaml b/helm/amd-gpu/templates/deviceplugin-daemonset.yaml index 749577e0..54edd683 100644 --- a/helm/amd-gpu/templates/deviceplugin-daemonset.yaml +++ b/helm/amd-gpu/templates/deviceplugin-daemonset.yaml @@ -53,6 +53,10 @@ spec: fieldPath: spec.nodeName - name: HOST_HOOK_PATH value: {{ .Values.dp.hostHookPath | quote }} + - name: OPERATING_MODE + value: {{ .Values.dp.operatingMode | quote }} + - name: COMPUTE_PARTITION + value: {{ .Values.dp.computePartition | quote }} securityContext: {{- toYaml .Values.dp.securityContext | nindent 12 }} volumeMounts: diff --git a/helm/amd-gpu/values.yaml b/helm/amd-gpu/values.yaml index 737bf2b1..f6088b9f 100644 --- a/helm/amd-gpu/values.yaml +++ b/helm/amd-gpu/values.yaml @@ -1,17 +1,26 @@ dp: image: - repository: ghcr.io/project-hami/amd-device-plugin + repository: ghcr.io/fishman/amd-device-plugin # Overrides the image tag whose default is the chart appVersion. - tag: "0.0.1" + tag: "0.0.16" pullPolicy: IfNotPresent serviceAccount: create: true name: "" annotations: {} # The plugin queries host GPU devices and passes them to workloads. + # "cu" registers whole GPUs as soft devices sliced by CU (default); + # "partition" registers hard compute partitions (id#mode, Count 1). + # A node annotation hami.io/amd-operating-mode: cu|partition overrides + # this per node. + operatingMode: "cu" + # Target compute partition type (spx/dpx/qpx/cpx) the plugin applies to + # every GPU via the AMD SMI API at startup, only when operatingMode is + # "partition". Empty leaves the hardware mode untouched. A node annotation + # hami.io/amd-compute-partition overrides this per node. + computePartition: "" securityContext: privileged: true - allowPrivilegeEscalation: false capabilities: drop: - ALL @@ -31,7 +40,8 @@ dp: rollingUpdate: maxUnavailable: 1 -imagePullSecrets: [] +imagePullSecrets: + - name: ghcr-fishman tolerations: - key: CriticalAddonsOnly diff --git a/internal/pkg/amdgpu/amdsmi.go b/internal/pkg/amdgpu/amdsmi.go index 3667e211..c5d80e68 100644 --- a/internal/pkg/amdgpu/amdsmi.go +++ b/internal/pkg/amdgpu/amdsmi.go @@ -59,6 +59,29 @@ static amdsmi_status_t amdsmi_product_name_for_bdf(const char *bdf_text, return AMDSMI_STATUS_SUCCESS; } +static amdsmi_status_t amdsmi_set_partition_for_bdf(const char *bdf_text, + unsigned int profile_index) { + unsigned long long domain; + unsigned int bus, device, function; + char trailing; + if (sscanf(bdf_text, "%llx:%x:%x.%x%c", &domain, &bus, &device, &function, + &trailing) != 4 || bus > 0xff || device > 0x1f || function > 7) { + return AMDSMI_STATUS_INVAL; + } + + amdsmi_bdf_t bdf = {0}; + bdf.bdf.domain_number = domain; + bdf.bdf.bus_number = bus; + bdf.bdf.device_number = device; + bdf.bdf.function_number = function; + amdsmi_processor_handle processor = NULL; + amdsmi_status_t status = amdsmi_get_processor_handle_from_bdf(bdf, &processor); + if (status != AMDSMI_STATUS_SUCCESS) { + return status; + } + return amdsmi_set_gpu_accelerator_partition_profile(processor, profile_index); +} + static amdsmi_status_t amdsmi_partition_profiles_for_bdf( const char *bdf_text, amdsmi_accelerator_partition_profile_config_t *config) { unsigned long long domain; @@ -335,25 +358,11 @@ func fetchAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, if bdf == "" { continue } - cBDF := C.CString(bdf) - var config C.amdsmi_accelerator_partition_profile_config_t - status := C.amdsmi_partition_profiles_for_bdf(cBDF, &config) - C.free(unsafe.Pointer(cBDF)) - if status != C.AMDSMI_STATUS_SUCCESS { - failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + profiles, err := partitionProfilesForBDF(bdf) + if err != nil { + failures = append(failures, fmt.Sprintf("%s (%v)", bdf, err)) continue } - profiles := make([]PartitionProfile, 0, int(config.num_profiles)) - for i := 0; i < int(config.num_profiles); i++ { - profile := config.profiles[i] - profiles = append(profiles, PartitionProfile{ - ProfileIndex: int(profile.profile_index), - Type: acceleratorPartitionTypeString(profile.profile_type), - MemoryCaps: npsCapsString(C.amdsmi_nps_cap_mask(profile.memory_caps)), - NumPartitions: int(profile.num_partitions), - XCCPerPartition: xccPerPartition(config, profile.profile_index), - }) - } profilesByBDF[bdf] = profiles profilesByBDF[rawBDF] = profiles } @@ -363,6 +372,85 @@ func fetchAMDGPUPartitionProfiles(bdfs []string) (map[string][]PartitionProfile, return profilesByBDF, nil } +// partitionProfilesForBDF resolves the accelerator partition profiles for a +// single BDF. The caller holds amdSMIMu. +func partitionProfilesForBDF(bdf string) ([]PartitionProfile, error) { + cBDF := C.CString(bdf) + var config C.amdsmi_accelerator_partition_profile_config_t + status := C.amdsmi_partition_profiles_for_bdf(cBDF, &config) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + return nil, fmt.Errorf("partition-profile lookup failed (status %d)", status) + } + profiles := make([]PartitionProfile, 0, int(config.num_profiles)) + for i := 0; i < int(config.num_profiles); i++ { + profile := config.profiles[i] + profiles = append(profiles, PartitionProfile{ + ProfileIndex: int(profile.profile_index), + Type: acceleratorPartitionTypeString(profile.profile_type), + MemoryCaps: npsCapsString(C.amdsmi_nps_cap_mask(profile.memory_caps)), + NumPartitions: int(profile.num_partitions), + XCCPerPartition: xccPerPartition(config, profile.profile_index), + }) + } + return profiles, nil +} + +// SetGPUComputePartitions flips every GPU to the given compute partition +// type (spx/dpx/qpx/cpx) through the AMD SMI C API. The profile index comes +// from the accelerator partition profiles each GPU supports. A GPU with +// running processes fails (busy) and is reported per BDF; the rest still +// flip. GPUs already in the target mode are left untouched. +func SetGPUComputePartitions(bdfs []string, computeType string) error { + if len(bdfs) == 0 { + return nil + } + amdSMIMu.Lock() + defer amdSMIMu.Unlock() + + if status := C.amdsmi_init(C.AMDSMI_INIT_AMD_GPUS); status != C.AMDSMI_STATUS_SUCCESS { + return fmt.Errorf("amdsmi_init: status %d", status) + } + defer C.amdsmi_shut_down() + + var failures []string + seen := make(map[string]bool) + for _, rawBDF := range bdfs { + rawBDF = strings.ToLower(strings.TrimSpace(rawBDF)) + bdf := normalizeBDF(rawBDF) + if bdf == "" || seen[bdf] { + continue + } + seen[bdf] = true + profiles, err := partitionProfilesForBDF(bdf) + if err != nil { + failures = append(failures, fmt.Sprintf("%s (profiles: %v)", bdf, err)) + continue + } + profileIndex := -1 + for _, profile := range profiles { + if strings.EqualFold(profile.Type, computeType) { + profileIndex = profile.ProfileIndex + break + } + } + if profileIndex < 0 { + failures = append(failures, fmt.Sprintf("%s (no %s profile)", bdf, computeType)) + continue + } + cBDF := C.CString(bdf) + status := C.amdsmi_set_partition_for_bdf(cBDF, C.uint(profileIndex)) + C.free(unsafe.Pointer(cBDF)) + if status != C.AMDSMI_STATUS_SUCCESS { + failures = append(failures, fmt.Sprintf("%s (status %d)", bdf, status)) + } + } + if len(failures) > 0 { + return fmt.Errorf("compute-partition set failed for %s", strings.Join(failures, ", ")) + } + return nil +} + func xccPerPartition(config C.amdsmi_accelerator_partition_profile_config_t, profileIndex C.uint) int { for j := 0; j < int(config.num_resource_profiles); j++ { res := config.resource_profiles[j] diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index 243f727e..14cde5b0 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -86,6 +86,17 @@ type AMDGPUPlugin struct { Resource string devAllocator allocator.Policy allocatorInitError bool + // operatingMode is "cu" (soft whole-GPU + CU slices, default) or + // "partition" (hard compute partitions only). Resolved in Start() from + // the OPERATING_MODE env, overridable per node via the + // hami.io/amd-operating-mode annotation. + operatingMode string + // computePartition is the target compute partition type (spx/dpx/qpx/cpx) + // the plugin applies through the AMD SMI API at startup; empty leaves the + // hardware mode untouched. Only applied in partition mode. Resolved like + // operatingMode (COMPUTE_PARTITION env, hami.io/amd-compute-partition + // annotation). + computePartition string // amdSMIUUIDToTopology maps the stable AMD SMI device UUID published in // DeviceInfo.ID back to the local topology key required during Allocate. amdSMIUUIDToTopology map[string]string @@ -111,7 +122,13 @@ type AMDGPUPlugin struct { type AMDGPUPluginOption func(*AMDGPUPlugin) func NewAMDGPUPlugin(options ...AMDGPUPluginOption) *AMDGPUPlugin { - amdGpuPlugin := &AMDGPUPlugin{} + amdGpuPlugin := &AMDGPUPlugin{operatingMode: "cu"} + if mode := os.Getenv("OPERATING_MODE"); mode != "" { + amdGpuPlugin.operatingMode = mode + } + if partition := os.Getenv("COMPUTE_PARTITION"); partition != "" { + amdGpuPlugin.computePartition = partition + } for _, option := range options { option(amdGpuPlugin) } @@ -175,6 +192,36 @@ func (p *AMDGPUPlugin) Start() error { p.ackDisableWatchAndRegister = make(chan bool, 1) } signal.Notify(p.signal, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) + // Per-node operating-mode override; must resolve before allocator and + // registration use it. + if node, err := utils.GetNode(os.Getenv(utils.NodeNameEnvName)); err == nil { + if mode, ok := node.Annotations[operatingModeAnnotation]; ok && mode != "" { + p.operatingMode = mode + } + if partition, ok := node.Annotations[computePartitionAnnotation]; ok && partition != "" { + p.computePartition = partition + } + } else { + glog.Warningf("operating-mode: cannot read node annotations, keeping %q: %v", p.operatingMode, err) + } + glog.Infof("operating mode: %s, compute partition: %s", p.operatingMode, p.computePartition) + + // In partition mode with a target compute partition set, flip the GPUs + // through the AMD SMI API before any registration reads the current + // hardware mode. Busy GPUs fail and keep their current mode; the rest + // still flip. + if p.operatingMode == "partition" && p.computePartition != "" { + var bdfs []string + for _, deviceData := range amdgpu.GetAMDGPUs() { + if bdf, ok := deviceData["devID"].(string); ok && bdf != "" { + bdfs = append(bdfs, bdf) + } + } + if err := amdgpu.SetGPUComputePartitions(bdfs, p.computePartition); err != nil { + glog.Warningf("compute-partition flip to %s incomplete: %v", p.computePartition, err) + } + } + err := p.devAllocator.Init(p.getDevices(), "") if err != nil { glog.Errorf("allocator init failed. Falling back to kubelet default allocation. Error %v", err) @@ -208,6 +255,14 @@ func (p *AMDGPUPlugin) Start() error { const ( registerAnnosKey = "hami.io/node-amd-register" NodeLockName = "hami.io/mutex.lock" + // operatingModeAnnotation overrides the OPERATING_MODE env per node: + // "cu" or "partition". NVIDIA's MIG config uses the same per-node + // annotation pattern (nvidia.com/mig.config). + operatingModeAnnotation = "hami.io/amd-operating-mode" + // computePartitionAnnotation is the target compute partition type + // (spx/dpx/qpx/cpx) the plugin applies via the AMD SMI API at startup. + // Overrides the COMPUTE_PARTITION env per node. + computePartitionAnnotation = "hami.io/amd-compute-partition" ) func (p *AMDGPUPlugin) RegisterInAnnotation() error { @@ -232,35 +287,41 @@ func (p *AMDGPUPlugin) RegisterInAnnotation() error { return err } -// isSchedulableTopologyKey: XCP partitions always register. A whole-GPU key -// is unschedulable only when it is an XCP parent (its BDF has amdgpu_xcp_ -// children). gfx950 spx/dpx/qpx whole GPUs have no KFD children and keep -// their own card, so they register normally. -func isSchedulableTopologyKey(key string, deviceData map[string]interface{}, xcpChildren map[string]int) bool { +// isSchedulableTopologyKey: in cu mode every whole-GPU key registers (CU +// slicing over the full GPU); XCP partition keys only register in partition +// mode. In partition mode a whole-GPU key registers only when the GPU has at +// most one partition (spx): a QPX/DPX whole GPU is replaced by its XCP +// partitions, and on kernels where KFD does not expose XCP nodes the whole +// GPU registers as a hard single-partition device with its capacity unshared. +func (p *AMDGPUPlugin) isSchedulableTopologyKey(key string, deviceData map[string]interface{}, partitionsByBDF map[string]int) bool { if strings.HasPrefix(key, "amdgpu_xcp_") { - return true + return p.operatingMode == "partition" } - bdf, _ := deviceData["devID"].(string) - return xcpChildren[bdf] == 0 + if p.operatingMode == "partition" { + bdf, _ := deviceData["devID"].(string) + return partitionsByBDF[bdf] <= 1 + } + return true } -// xcpChildrenByBDF counts amdgpu_xcp_ partition entries per parent PCI BDF. -func xcpChildrenByBDF(devices map[string]map[string]interface{}) map[string]int { - children := make(map[string]int) - for key, d := range devices { - if strings.HasPrefix(key, "amdgpu_xcp_") { - if bdf, ok := d["devID"].(string); ok && bdf != "" { - children[bdf]++ - } +// numPartitionsForMode returns how many compute partitions the current +// compute type creates, from the AMD SMI profile table; 1 when unknown. +// This is the correct capacity divisor (amdgpu_xcp_ child counts are wrong: +// gfx950 exposes 7 XCD chiplets per GPU regardless of partition mode). +func numPartitionsForMode(profiles []amdgpu.PartitionProfile, computeType string) int { + for _, profile := range profiles { + if strings.EqualFold(profile.Type, computeType) { + return profile.NumPartitions } } - return children + return 1 } -// Registers the whole-partition form of an XCP entry; the soft entry stays -// for CU-masked rocm-mode pods. +// Registers the whole-partition form of a device. In partition mode every +// schedulable device (whole GPU with a compute type, or XCP partition) gets +// a hard "id#mode" entry; in cu mode only XCP partitions do. func (p *AMDGPUPlugin) registerHardEntry(key string, deviceData map[string]interface{}, info *utils.DeviceInfo) bool { - if !strings.HasPrefix(key, "amdgpu_xcp_") { + if p.operatingMode != "partition" && !strings.HasPrefix(key, "amdgpu_xcp_") { return false } computePartitionType, ok := deviceData["computePartitionType"].(string) @@ -297,7 +358,6 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { // Whole-GPU capacity is read once per GPU through libdrm. XCP partitions // share their parent's PCI BDF and get an even share of that capacity. wholeCardByBDF := make(map[string]int) - xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) for key, deviceData := range p.AMDGPUs { if strings.HasPrefix(key, "amdgpu_xcp_") { continue @@ -357,10 +417,27 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { glog.Warningf("AMD SMI partition-profile lookup incomplete: %v", err) } + // Per-GPU partition count of the current compute type; the capacity + // divisor for XCP entries and the schedulability gate for whole GPUs. + partitionsByBDF := make(map[string]int, len(p.AMDGPUs)) + for key, deviceData := range p.AMDGPUs { + if strings.HasPrefix(key, "amdgpu_xcp_") { + continue + } + bdf, _ := deviceData["devID"].(string) + if bdf == "" { + continue + } + computeType, _ := deviceData["computePartitionType"].(string) + if profiles, ok := partitionProfiles[strings.ToLower(bdf)]; ok { + partitionsByBDF[bdf] = numPartitionsForMode(profiles, computeType) + } + } + out := make([]*utils.DeviceInfo, 0, len(keys)*2) for _, key := range keys { deviceData := p.AMDGPUs[key] - if !isSchedulableTopologyKey(key, deviceData, xcpCountByBDF) { + if !p.isSchedulableTopologyKey(key, deviceData, partitionsByBDF) { glog.Infof("skip topology entry %s (no allocatable capacity)", key) continue } @@ -376,7 +453,7 @@ func (p *AMDGPUPlugin) getAPIDevices() []*utils.DeviceInfo { if strings.HasPrefix(key, "amdgpu_xcp_") { // XCP partitions advertise an even share of the whole GPU's // VRAM and CU count, not the full-GPU capacity. - capacity = amdgpu.PartitionCapacity(capacity, xcpCountByBDF[bdf]) + capacity = amdgpu.PartitionCapacity(capacity, partitionsByBDF[bdf]) } renderD, ok := deviceData["renderD"].(int) if !ok || renderD <= 0 { @@ -525,24 +602,29 @@ func hardKubeletDeviceID(key string, deviceData map[string]interface{}) string { func (p *AMDGPUPlugin) getDevices() []*allocator.Device { devices := amdgpu.GetAMDGPUs() var deviceList []*allocator.Device - xcpCountByBDF := xcpChildrenByBDF(devices) + // partitionsByBDF gates whole GPUs in partition mode; the profile lookup + // is not injectable here, so a GPU without profiles stays schedulable + // (spx default) instead of disappearing. + partitionsByBDF := make(map[string]int) for id, deviceData := range devices { - if !isSchedulableTopologyKey(id, deviceData, xcpCountByBDF) { + if !p.isSchedulableTopologyKey(id, deviceData, partitionsByBDF) { continue } - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - device := &allocator.Device{ - Id: kubeletDeviceID(id, splitIdx), - Card: deviceData["card"].(int), - RenderD: deviceData["renderD"].(int), - DevId: deviceData["devID"].(string), - ComputePartitionType: deviceData["computePartitionType"].(string), - MemoryPartitionType: deviceData["memoryPartitionType"].(string), - NodeId: deviceData["nodeId"].(int), - NumaNode: deviceData["numaNode"].(int), + if p.operatingMode != "partition" { + for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { + device := &allocator.Device{ + Id: kubeletDeviceID(id, splitIdx), + Card: deviceData["card"].(int), + RenderD: deviceData["renderD"].(int), + DevId: deviceData["devID"].(string), + ComputePartitionType: deviceData["computePartitionType"].(string), + MemoryPartitionType: deviceData["memoryPartitionType"].(string), + NodeId: deviceData["nodeId"].(int), + NumaNode: deviceData["numaNode"].(int), + } + deviceList = append(deviceList, device) } - deviceList = append(deviceList, device) } if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { deviceList = append(deviceList, &allocator.Device{ @@ -687,14 +769,16 @@ func (p *AMDGPUPlugin) kubeletDevicesFor(id string, deviceData map[string]interf } devs := make([]*pluginapi.Device, 0, defaultSplitCount+1) - for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { - devs = append(devs, &pluginapi.Device{ - ID: kubeletDeviceID(id, splitIdx), - Health: pluginapi.Healthy, - Topology: &pluginapi.TopologyInfo{ - Nodes: numaNodes, - }, - }) + if p.operatingMode != "partition" { + for splitIdx := 0; splitIdx < defaultSplitCount; splitIdx++ { + devs = append(devs, &pluginapi.Device{ + ID: kubeletDeviceID(id, splitIdx), + Health: pluginapi.Healthy, + Topology: &pluginapi.TopologyInfo{ + Nodes: numaNodes, + }, + }) + } } if hardID := hardKubeletDeviceID(id, deviceData); hardID != "" { devs = append(devs, &pluginapi.Device{ @@ -726,9 +810,11 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin if isHomogeneous { // limit scope for hwloc func() { - xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) + // partitionsByBDF gates whole GPUs in partition mode. The device + // map here has no partition-profile lookup; leave empty so whole + // GPUs stay schedulable (spx default) instead of disappearing. for id, device := range p.AMDGPUs { - if !isSchedulableTopologyKey(id, device, xcpCountByBDF) { + if !p.isSchedulableTopologyKey(id, device, map[string]int{}) { continue } devs = append(devs, p.kubeletDevicesFor(id, device)...) @@ -738,9 +824,8 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin s.Send(&pluginapi.ListAndWatchResponse{Devices: devs}) } else { func() { - xcpCountByBDF := xcpChildrenByBDF(p.AMDGPUs) for id, device := range p.AMDGPUs { - if !isSchedulableTopologyKey(id, device, xcpCountByBDF) { + if !p.isSchedulableTopologyKey(id, device, map[string]int{}) { continue } partitionType := device["computePartitionType"].(string) + "_" + device["memoryPartitionType"].(string) diff --git a/internal/pkg/plugin/plugin_test.go b/internal/pkg/plugin/plugin_test.go index 2df511e8..c38ee600 100644 --- a/internal/pkg/plugin/plugin_test.go +++ b/internal/pkg/plugin/plugin_test.go @@ -167,23 +167,38 @@ func assertAllocationWord(t *testing.T, allocations map[string]cuallocation.Allo func TestIsSchedulableTopologyKey(t *testing.T) { wholeGPU := map[string]interface{}{"devID": "0000:05:00.0", "computePartitionType": "spx", "memoryPartitionType": "nps1"} - partitionedParent := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "cpx", "memoryPartitionType": "nps1"} + qpxParent := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "qpx", "memoryPartitionType": "nps1"} noPartition := map[string]interface{}{"devID": "0000:75:00.0", "computePartitionType": "", "memoryPartitionType": ""} - xcp := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "cpx", "memoryPartitionType": "nps1"} - withChildren := xcpChildrenByBDF(map[string]map[string]interface{}{"amdgpu_xcp_30": xcp}) - withoutChildren := xcpChildrenByBDF(map[string]map[string]interface{}{"0000:05:00.0": wholeGPU}) + xcp := map[string]interface{}{"devID": "0000:15:00.0", "computePartitionType": "qpx", "memoryPartitionType": "nps1"} + // partitionsByBDF: spx=1, qpx=4, none=0 (unknown -> spx default). + partitions := map[string]int{"0000:05:00.0": 1, "0000:15:00.0": 4} - if !isSchedulableTopologyKey("amdgpu_xcp_30", xcp, withChildren) { - t.Error("XCP partition should be schedulable") + cu := &AMDGPUPlugin{operatingMode: "cu"} + if !cu.isSchedulableTopologyKey("0000:05:00.0", wholeGPU, partitions) { + t.Error("cu mode: SPX whole GPU should be schedulable") } - if !isSchedulableTopologyKey("0000:05:00.0", wholeGPU, withoutChildren) { - t.Error("SPX whole GPU with no XCP children should be schedulable (gfx950)") + if !cu.isSchedulableTopologyKey("0000:15:00.0", qpxParent, partitions) { + t.Error("cu mode: QPX whole GPU should be schedulable (CU slicing over the whole GPU)") } - if isSchedulableTopologyKey("0000:15:00.0", partitionedParent, withChildren) { - t.Error("XCP parent whose BDF has partition children has no capacity and must be skipped") + if cu.isSchedulableTopologyKey("amdgpu_xcp_30", xcp, partitions) { + t.Error("cu mode: XCP partition must not register") } - if !isSchedulableTopologyKey("0000:75:00.0", noPartition, withoutChildren) { - t.Error("GPU without partition support should be schedulable") + if !cu.isSchedulableTopologyKey("0000:75:00.0", noPartition, partitions) { + t.Error("cu mode: GPU without partition support should be schedulable") + } + + partition := &AMDGPUPlugin{operatingMode: "partition"} + if !partition.isSchedulableTopologyKey("0000:05:00.0", wholeGPU, partitions) { + t.Error("partition mode: SPX whole GPU (1 partition) should register as a hard device") + } + if partition.isSchedulableTopologyKey("0000:15:00.0", qpxParent, partitions) { + t.Error("partition mode: QPX whole GPU is replaced by its XCP partitions") + } + if !partition.isSchedulableTopologyKey("amdgpu_xcp_30", xcp, partitions) { + t.Error("partition mode: XCP partition should register") + } + if !partition.isSchedulableTopologyKey("0000:75:00.0", noPartition, partitions) { + t.Error("partition mode: GPU without partitions has no hard form but still registers soft") } } @@ -193,7 +208,7 @@ func TestHardEntryRegistration(t *testing.T) { wholeGPU := map[string]interface{}{"computePartitionType": "spx", "memoryPartitionType": "nps1"} soft := &utils.DeviceInfo{ID: "GPU-466450b96fbde849", Count: defaultSplitCount, Mode: ""} - if !(&AMDGPUPlugin{}).registerHardEntry("amdgpu_xcp_30", xcp, soft) { + if !(&AMDGPUPlugin{operatingMode: "cu"}).registerHardEntry("amdgpu_xcp_30", xcp, soft) { t.Fatal("XCP partition should register a hard entry") } if soft.ID != "GPU-466450b96fbde849#cpx" || soft.Mode != "cpx" || soft.Count != 1 { @@ -201,12 +216,20 @@ func TestHardEntryRegistration(t *testing.T) { } soft = &utils.DeviceInfo{ID: "uuid-1", Count: defaultSplitCount} - if (&AMDGPUPlugin{}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { - t.Fatal("hard entries are only for XCP partitions, not GPU parents") + if (&AMDGPUPlugin{operatingMode: "cu"}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { + t.Fatal("cu mode: GPU parents must not get a hard entry") } soft = &utils.DeviceInfo{ID: "uuid-2", Count: defaultSplitCount} - if (&AMDGPUPlugin{}).registerHardEntry("0000:75:00.0", noPartition, soft) { - t.Fatal("GPU without partitions should not get a hard entry") + if (&AMDGPUPlugin{operatingMode: "partition"}).registerHardEntry("0000:05:00.0", wholeGPU, soft) { + if soft.ID != "uuid-2#spx" || soft.Mode != "spx" || soft.Count != 1 { + t.Fatalf("partition-mode hard entry = %+v, want ID uuid-2#spx, Mode=spx, Count=1", soft) + } + } else { + t.Fatal("partition mode: SPX whole GPU should get a hard entry") + } + soft = &utils.DeviceInfo{ID: "uuid-3", Count: defaultSplitCount} + if (&AMDGPUPlugin{operatingMode: "partition"}).registerHardEntry("0000:75:00.0", noPartition, soft) { + t.Fatal("GPU without a compute partition type should not get a hard entry") } } @@ -395,10 +418,10 @@ func loadMemoryPartitionGolden(t *testing.T, path string) []string { // captured MI355X sysfs tree (kernel 6.8.0-136) with an injected AMD SMI // golden, so it runs on machines without GPUs or AMD SMI. On this kernel the // XCP render minors are absent from KFD topology, so discovery yields only -// the 8 whole-GPU entries and every one of them is an SPX-partitioned parent -// without allocatable capacity: nothing registers. Pinning that behavior; -// fixing XCP discovery on this kernel must flip the expected count to 8 soft -// + 56 hard entries. +// the 8 whole-GPU entries. cu mode registers them as soft devices (Count 10, +// unsuffixed); partition mode registers one hard #spx device per GPU +// (Count 1). XCP partition registration on this kernel is impossible by +// construction; it appears on kernels whose KFD topology exposes XCP nodes. func TestRegistrationFromFixture(t *testing.T) { root := "../../../testdata/sysfs-mi355x-spx/sys" golden := loadAmdsmiGolden(t, "../../../testdata/amdsmi-mi355x.json") @@ -411,55 +434,72 @@ func TestRegistrationFromFixture(t *testing.T) { profiles := loadPartitionProfilesGolden(t, "../../../testdata/amdsmi-partition-g3-mi355x.json") profileBDFs := map[string]bool{} - p := NewAMDGPUPlugin( - WithSysfsRoot(root), - WithAmdSMI( - func(bdfs []string) (map[string]string, error) { - uuidByBDF := map[string]string{} - for _, bdf := range bdfs { - if entry, ok := golden[fixtureBDF(bdf)]; ok { - uuidByBDF[bdf] = entry.UUID + newPlugin := func(mode string) *AMDGPUPlugin { + p := NewAMDGPUPlugin( + WithSysfsRoot(root), + WithAmdSMI( + func(bdfs []string) (map[string]string, error) { + uuidByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + uuidByBDF[bdf] = entry.UUID + } } - } - return uuidByBDF, nil - }, - func(bdfs []string) (map[string]string, error) { - namesByBDF := map[string]string{} - for _, bdf := range bdfs { - if entry, ok := golden[fixtureBDF(bdf)]; ok { - namesByBDF[bdf] = entry.Type + return uuidByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + namesByBDF := map[string]string{} + for _, bdf := range bdfs { + if entry, ok := golden[fixtureBDF(bdf)]; ok { + namesByBDF[bdf] = entry.Type + } } - } - return namesByBDF, nil - }, - func(bdfs []string) (map[string]string, error) { - partitionsByBDF := map[string]string{} + return namesByBDF, nil + }, + func(bdfs []string) (map[string]string, error) { + partitionsByBDF := map[string]string{} + for _, bdf := range bdfs { + partitionsByBDF[bdf] = memoryPartitions[0] + } + return partitionsByBDF, nil + }, + ), + WithAMDSPartitionProfiles(func(bdfs []string) (map[string][]amdgpu.PartitionProfile, error) { + profilesByBDF := map[string][]amdgpu.PartitionProfile{} for _, bdf := range bdfs { - partitionsByBDF[bdf] = memoryPartitions[0] + profileBDFs[bdf] = true + profilesByBDF[bdf] = profiles } - return partitionsByBDF, nil - }, - ), - WithAMDSPartitionProfiles(func(bdfs []string) (map[string][]amdgpu.PartitionProfile, error) { - profilesByBDF := map[string][]amdgpu.PartitionProfile{} - for _, bdf := range bdfs { - profileBDFs[bdf] = true - profilesByBDF[bdf] = profiles - } - return profilesByBDF, nil - }), - ) - devices := p.getAPIDevices() - if len(devices) != 0 { - t.Fatalf("registered %d devices, want 0 on this kernel: %+v", len(devices), devices) + return profilesByBDF, nil + }), + ) + p.operatingMode = mode + return p } - if len(p.AMDGPUs) != 8 { - t.Fatalf("discovery returned %d entries, want 8 whole GPUs: %v", len(p.AMDGPUs), p.AMDGPUs) + + cu := newPlugin("cu") + cuDevices := cu.getAPIDevices() + if len(cuDevices) != 8 { + t.Fatalf("cu mode: registered %d devices, want 8: %+v", len(cuDevices), cuDevices) } - if len(profileBDFs) != 8 { - t.Errorf("partition-profile lookup consulted %d BDFs, want 8: %v", len(profileBDFs), profileBDFs) + for _, d := range cuDevices { + if d.Count != defaultSplitCount || d.Mode != "" || strings.Contains(d.ID, "#") { + t.Fatalf("cu mode device = %+v, want Count=%d, Mode empty, unsuffixed ID", d, defaultSplitCount) + } + } + + partition := newPlugin("partition") + partitionDevices := partition.getAPIDevices() + if len(partitionDevices) != 8 { + t.Fatalf("partition mode: registered %d devices, want 8: %+v", len(partitionDevices), partitionDevices) + } + for _, d := range partitionDevices { + if d.Count != 1 || d.Mode != "spx" || !strings.HasSuffix(d.ID, "#spx") { + t.Fatalf("partition mode device = %+v, want Count=1, Mode=spx, #spx ID", d) + } } - for key, deviceData := range p.AMDGPUs { + + for key, deviceData := range cu.AMDGPUs { if strings.HasPrefix(key, "amdgpu_xcp_") { t.Error("XCP entries must not reach registration on this kernel") } @@ -470,6 +510,9 @@ func TestRegistrationFromFixture(t *testing.T) { t.Errorf("%s: memoryPartitionType %q, want nps1 from amd-smi", key, mpt) } } + if len(profileBDFs) != 8 { + t.Errorf("partition-profile lookup consulted %d BDFs, want 8: %v", len(profileBDFs), profileBDFs) + } } func TestDeviceDataFromROCrUUID(t *testing.T) { From b8e17819cbc39e801178b21ffff4ff155957d186 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 15:02:56 +0800 Subject: [PATCH 11/12] plugin: tolerate mixed partition styles on a node A busy GPU refuses the compute-partition flip (AMD SMI status 30) and stays in its old mode, leaving the node heterogeneous. Previously getResourceList aborted the plugin before Start() ran, so the flip never executed and the node crash-looped forever. - main.go: heterogeneous node with single strategy logs a warning and reports all devices under "gpu" instead of exiting - plugin.go: ListAndWatch publishes every device when the resource name is not a per-partition-type key - plugin.go: log flip duration at glog V(2) (measured 435ms for 7 GPUs) Signed-off-by: Reza Jelveh --- cmd/k8s-device-plugin/main.go | 7 +++++-- helm/amd-gpu/values.yaml | 2 +- internal/pkg/plugin/plugin.go | 11 ++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/k8s-device-plugin/main.go b/cmd/k8s-device-plugin/main.go index a45eef1a..7f400528 100644 --- a/cmd/k8s-device-plugin/main.go +++ b/cmd/k8s-device-plugin/main.go @@ -76,9 +76,12 @@ func getResourceList(resourceNamingStrategy ResourceNamingStrategy) ([]string, e } } } else { - // Heterogeneous node reports resources based on partition types if strategy is mixed. Heterogeneous is not allowed if Strategy is single + // Heterogeneous node reports resources based on partition types if strategy is mixed. With the single + // strategy the kubelet list still carries every device, so mixed styles (e.g. one busy GPU stuck in spx + // while the rest flipped to qpx) must not abort the plugin; the devices register under "gpu" as-is. if resourceNamingStrategy == StrategySingle { - return resources, fmt.Errorf("Partitions of different styles across GPUs in a node is not supported with single strategy. Please start device plugin with mixed strategy") + glog.Warningf("Partitions of different styles across GPUs in a node; reporting all devices under %q", "gpu") + resources = []string{"gpu"} } else if resourceNamingStrategy == StrategyMixed { for partitionType, count := range partitionCountMap { if count > 0 { diff --git a/helm/amd-gpu/values.yaml b/helm/amd-gpu/values.yaml index f6088b9f..fc73ef79 100644 --- a/helm/amd-gpu/values.yaml +++ b/helm/amd-gpu/values.yaml @@ -2,7 +2,7 @@ dp: image: repository: ghcr.io/fishman/amd-device-plugin # Overrides the image tag whose default is the chart appVersion. - tag: "0.0.16" + tag: "0.0.17" pullPolicy: IfNotPresent serviceAccount: create: true diff --git a/internal/pkg/plugin/plugin.go b/internal/pkg/plugin/plugin.go index 14cde5b0..a5600d91 100644 --- a/internal/pkg/plugin/plugin.go +++ b/internal/pkg/plugin/plugin.go @@ -217,9 +217,11 @@ func (p *AMDGPUPlugin) Start() error { bdfs = append(bdfs, bdf) } } + flipStart := time.Now() if err := amdgpu.SetGPUComputePartitions(bdfs, p.computePartition); err != nil { glog.Warningf("compute-partition flip to %s incomplete: %v", p.computePartition, err) } + glog.V(2).Infof("compute-partition flip to %s took %s", p.computePartition, time.Since(flipStart)) } err := p.devAllocator.Init(p.getDevices(), "") @@ -839,7 +841,14 @@ func (p *AMDGPUPlugin) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin glog.Infof("ListAndWatch: sending %d split devices for resource %s", len(devList), p.Resource) s.Send(&pluginapi.ListAndWatchResponse{Devices: devList}) } else { - glog.Warningf("ListAndWatch: no devices for resource %s; partition types: %v", p.Resource, resourceTypeDevs) + // Mixed node under the single strategy: the resource name is + // "gpu", not a partition type, so publish every device. + devList := make([]*pluginapi.Device, 0) + for _, devs := range resourceTypeDevs { + devList = append(devList, devs...) + } + glog.Infof("ListAndWatch: sending %d split devices for resource %s (mixed node)", len(devList), p.Resource) + s.Send(&pluginapi.ListAndWatchResponse{Devices: devList}) } } From c11882c504652616a63b8520b42bf3479d0eb795 Mon Sep 17 00:00:00 2001 From: Reza Jelveh Date: Wed, 19 Aug 2026 17:26:06 +0800 Subject: [PATCH 12/12] allocator: warn prominently when GPA sees unknown device ids Skipping unknown ids prevents the panic, but a silent fix hides the cause: another device plugin running on the same node merged its devices into kubelet's list. Log a warning naming the likely cause and the remedy (disable the other plugin, restart this one). Signed-off-by: Reza Jelveh --- internal/pkg/allocator/besteffort_policy.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/pkg/allocator/besteffort_policy.go b/internal/pkg/allocator/besteffort_policy.go index f8b19160..685d945b 100644 --- a/internal/pkg/allocator/besteffort_policy.go +++ b/internal/pkg/allocator/besteffort_policy.go @@ -61,11 +61,12 @@ func NewBestEffortPolicy() *BestEffortPolicy { func (b *BestEffortPolicy) getDevicesFromIds(ids []string) []*Device { var res []*Device for _, id := range ids { - // Stale kubelet device ids across plugin restarts resolve to nil; skip - // them so Allocate errors cleanly instead of panicking in sort.Slice. - if d := b.devicesMap[id]; d != nil { - res = append(res, d) + d, ok := b.devicesMap[id] + if !ok { + glog.Warningf("GPA policy: device id %q is not registered by this plugin; a second device plugin is likely running on this node and kubelet merged its devices. Disable the other plugin (or drain the node) and restart this plugin", id) + continue } + res = append(res, d) } return res }