90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
//
|
|
// Use and distribution licensed under the Apache license version 2.
|
|
//
|
|
// See the COPYING file in the root project directory for full text.
|
|
//
|
|
|
|
package ghw
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type GraphicsCard struct {
|
|
// the PCI address where the graphics card can be found
|
|
Address string `json:"address"`
|
|
// The "index" of the card on the bus (generally not useful information,
|
|
// but might as well include it)
|
|
Index int `json:"index"`
|
|
// pointer to a PCIDevice struct that describes the vendor and product
|
|
// model, etc
|
|
// TODO(jaypipes): Rename this field to PCI, instead of DeviceInfo
|
|
DeviceInfo *PCIDevice `json:"pci"`
|
|
// Topology node that the graphics card is affined to. Will be nil if the
|
|
// architecture is not NUMA.
|
|
Node *TopologyNode `json:"node,omitempty"`
|
|
}
|
|
|
|
func (card *GraphicsCard) String() string {
|
|
deviceStr := card.Address
|
|
if card.DeviceInfo != nil {
|
|
deviceStr = card.DeviceInfo.String()
|
|
}
|
|
nodeStr := ""
|
|
if card.Node != nil {
|
|
nodeStr = fmt.Sprintf(" [affined to NUMA node %d]", card.Node.Id)
|
|
}
|
|
return fmt.Sprintf(
|
|
"card #%d %s@%s",
|
|
card.Index,
|
|
nodeStr,
|
|
deviceStr,
|
|
)
|
|
}
|
|
|
|
type GPUInfo struct {
|
|
GraphicsCards []*GraphicsCard `json:"cards"`
|
|
}
|
|
|
|
func GPU(opts ...*WithOption) (*GPUInfo, error) {
|
|
mergeOpts := mergeOptions(opts...)
|
|
ctx := &context{
|
|
chroot: *mergeOpts.Chroot,
|
|
}
|
|
info := &GPUInfo{}
|
|
if err := ctx.gpuFillInfo(info); err != nil {
|
|
return nil, err
|
|
}
|
|
return info, nil
|
|
}
|
|
|
|
func (i *GPUInfo) String() string {
|
|
numCardsStr := "cards"
|
|
if len(i.GraphicsCards) == 1 {
|
|
numCardsStr = "card"
|
|
}
|
|
return fmt.Sprintf(
|
|
"gpu (%d graphics %s)",
|
|
len(i.GraphicsCards),
|
|
numCardsStr,
|
|
)
|
|
}
|
|
|
|
// simple private struct used to encapsulate gpu information in a top-level
|
|
// "gpu" YAML/JSON map/object key
|
|
type gpuPrinter struct {
|
|
Info *GPUInfo `json:"gpu"`
|
|
}
|
|
|
|
// YAMLString returns a string with the gpu information formatted as YAML
|
|
// under a top-level "gpu:" key
|
|
func (i *GPUInfo) YAMLString() string {
|
|
return safeYAML(gpuPrinter{i})
|
|
}
|
|
|
|
// JSONString returns a string with the gpu information formatted as JSON
|
|
// under a top-level "gpu:" key
|
|
func (i *GPUInfo) JSONString(indent bool) string {
|
|
return safeJSON(gpuPrinter{i}, indent)
|
|
}
|