mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-27 06:19:34 +00:00
106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
|
/*
|
||
|
* Copyright (c) NVIDIA CORPORATION. All rights reserved.
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
package nvpci
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// PCIMellanoxVendorID represents PCI vendor id for Mellanox
|
||
|
PCIMellanoxVendorID uint16 = 0x15b3
|
||
|
// PCINetworkControllerClass represents the PCI class for network controllers
|
||
|
PCINetworkControllerClass uint32 = 0x020000
|
||
|
// PCIBridgeClass represents the PCI class for network controllers
|
||
|
PCIBridgeClass uint32 = 0x060400
|
||
|
)
|
||
|
|
||
|
// GetNetworkControllers returns all Mellanox Network Controller PCI devices on the system
|
||
|
func (p *nvpci) GetNetworkControllers() ([]*NvidiaPCIDevice, error) {
|
||
|
devices, err := p.GetAllDevices()
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("error getting all NVIDIA devices: %v", err)
|
||
|
}
|
||
|
|
||
|
var filtered []*NvidiaPCIDevice
|
||
|
for _, d := range devices {
|
||
|
if d.IsNetworkController() {
|
||
|
filtered = append(filtered, d)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return filtered, nil
|
||
|
}
|
||
|
|
||
|
// GetPciBridges retrieves all Mellanox PCI(e) Bridges
|
||
|
func (p *nvpci) GetPciBridges() ([]*NvidiaPCIDevice, error) {
|
||
|
devices, err := p.GetAllDevices()
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("error getting all NVIDIA devices: %v", err)
|
||
|
}
|
||
|
|
||
|
var filtered []*NvidiaPCIDevice
|
||
|
for _, d := range devices {
|
||
|
if d.IsPciBridge() {
|
||
|
filtered = append(filtered, d)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return filtered, nil
|
||
|
}
|
||
|
|
||
|
// IsNetworkController if class == 0x300
|
||
|
func (d *NvidiaPCIDevice) IsNetworkController() bool {
|
||
|
return d.Class == PCINetworkControllerClass
|
||
|
}
|
||
|
|
||
|
// IsPciBridge if class == 0x0604
|
||
|
func (d *NvidiaPCIDevice) IsPciBridge() bool {
|
||
|
return d.Class == PCIBridgeClass
|
||
|
}
|
||
|
|
||
|
// IsDPU returns if a device is a DPU
|
||
|
func (d *NvidiaPCIDevice) IsDPU() bool {
|
||
|
if !strings.Contains(d.DeviceName, "BlueField") {
|
||
|
return false
|
||
|
}
|
||
|
// DPU is a multifunction device hence look only for the .0 function
|
||
|
// and ignore subfunctions like .1, .2, etc.
|
||
|
if strings.HasSuffix(d.Address, ".0") {
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// GetDPUs returns all Mellanox DPU devices on the system
|
||
|
func (p *nvpci) GetDPUs() ([]*NvidiaPCIDevice, error) {
|
||
|
devices, err := p.GetNetworkControllers()
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("error getting all network controllers: %v", err)
|
||
|
}
|
||
|
|
||
|
var filtered []*NvidiaPCIDevice
|
||
|
for _, d := range devices {
|
||
|
if d.IsDPU() {
|
||
|
filtered = append(filtered, d)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return filtered, nil
|
||
|
}
|